From 8a5588fd179fcf54d597f99a819e94d402dd23f5 Mon Sep 17 00:00:00 2001 From: klaxalk Date: Sat, 9 Dec 2023 08:13:53 +0000 Subject: [PATCH] deploy: 11301872a1f9574cea1adb650c5d71968cf6e1a4 --- .nojekyll | 0 annotated.html | 202 ++ annotated_dup.js | 21 + attitude__converter_8h.html | 208 ++ attitude__converter_8h.js | 19 + attitude__converter_8h__dep__incl.map | 4 + attitude__converter_8h__dep__incl.md5 | 1 + attitude__converter_8h__dep__incl.png | Bin 0 -> 5804 bytes attitude__converter_8h__incl.map | 16 + attitude__converter_8h__incl.md5 | 1 + attitude__converter_8h__incl.png | Bin 0 -> 51351 bytes attitude__converter_8h_source.html | 397 +++ batch__visualizer_8h.html | 163 ++ batch__visualizer_8h.js | 5 + batch__visualizer_8h__incl.map | 16 + batch__visualizer_8h__incl.md5 | 1 + batch__visualizer_8h__incl.png | Bin 0 -> 44941 bytes batch__visualizer_8h_source.html | 227 ++ bc_s.png | Bin 0 -> 676 bytes bdwn.png | Bin 0 -> 147 bytes citelist.html | 124 + classDynamicPublisher_1_1impl-members.html | 107 + classDynamicPublisher_1_1impl.html | 120 + classDynamicPublisher_1_1impl.js | 6 + classSubObject-members.html | 106 + classSubObject.html | 121 + classSubObject.js | 5 + classThreadTimer_1_1Impl-members.html | 114 + classThreadTimer_1_1Impl.html | 144 + classThreadTimer_1_1Impl.js | 13 + classVectorConverterTest.html | 127 + classVectorConverterTest__coll__graph.map | 4 + classVectorConverterTest__coll__graph.md5 | 1 + classVectorConverterTest__coll__graph.png | Bin 0 -> 3651 bytes classVectorConverterTest__inherit__graph.map | 4 + classVectorConverterTest__inherit__graph.md5 | 1 + classVectorConverterTest__inherit__graph.png | Bin 0 -> 3651 bytes classes.html | 265 ++ classmrs__lib_1_1AtomicScopeFlag-members.html | 106 + classmrs__lib_1_1AtomicScopeFlag.html | 172 ++ classmrs__lib_1_1AtomicScopeFlag.js | 5 + ...mrs__lib_1_1AttitudeConverter-members.html | 137 + classmrs__lib_1_1AttitudeConverter.html | 1026 +++++++ classmrs__lib_1_1AttitudeConverter.js | 41 + classmrs__lib_1_1BatchVisualizer-members.html | 125 + classmrs__lib_1_1BatchVisualizer.html | 984 +++++++ classmrs__lib_1_1BatchVisualizer.js | 24 + classmrs__lib_1_1DKF-members.html | 141 + classmrs__lib_1_1DKF.html | 532 ++++ classmrs__lib_1_1DKF.js | 22 + classmrs__lib_1_1DKF__coll__graph.map | 5 + classmrs__lib_1_1DKF__coll__graph.md5 | 1 + classmrs__lib_1_1DKF__coll__graph.png | Bin 0 -> 6620 bytes classmrs__lib_1_1DKF__inherit__graph.map | 5 + classmrs__lib_1_1DKF__inherit__graph.md5 | 1 + classmrs__lib_1_1DKF__inherit__graph.png | Bin 0 -> 6620 bytes ...smrs__lib_1_1DynamicPublisher-members.html | 107 + classmrs__lib_1_1DynamicPublisher.html | 213 ++ classmrs__lib_1_1DynamicPublisher.js | 6 + ..._lib_1_1DynamicReconfigureMgr-members.html | 113 + classmrs__lib_1_1DynamicReconfigureMgr.html | 150 + classmrs__lib_1_1DynamicReconfigureMgr.js | 12 + classmrs__lib_1_1EulerAttitude-members.html | 108 + classmrs__lib_1_1EulerAttitude.html | 241 ++ classmrs__lib_1_1EulerAttitude.js | 7 + classmrs__lib_1_1IirFilter-members.html | 106 + classmrs__lib_1_1IirFilter.html | 119 + classmrs__lib_1_1IirFilter.js | 5 + classmrs__lib_1_1ImagePublisher-members.html | 106 + classmrs__lib_1_1ImagePublisher.html | 119 + classmrs__lib_1_1ImagePublisher.js | 5 + classmrs__lib_1_1JLKF-members.html | 131 + classmrs__lib_1_1JLKF.html | 477 +++ classmrs__lib_1_1JLKF.js | 25 + classmrs__lib_1_1JLKF__coll__graph.map | 4 + classmrs__lib_1_1JLKF__coll__graph.md5 | 1 + classmrs__lib_1_1JLKF__coll__graph.png | Bin 0 -> 7408 bytes classmrs__lib_1_1JLKF__inherit__graph.map | 4 + classmrs__lib_1_1JLKF__inherit__graph.md5 | 1 + classmrs__lib_1_1JLKF__inherit__graph.png | Bin 0 -> 7408 bytes classmrs__lib_1_1KalmanFilter-members.html | 115 + classmrs__lib_1_1KalmanFilter.html | 327 +++ classmrs__lib_1_1KalmanFilter.js | 12 + ..._lib_1_1KalmanFilterAloamGarm-members.html | 115 + classmrs__lib_1_1KalmanFilterAloamGarm.html | 318 ++ classmrs__lib_1_1KalmanFilterAloamGarm.js | 12 + ...1KalmanFilterAloamGarm__inherit__graph.map | 4 + ...1KalmanFilterAloamGarm__inherit__graph.md5 | 1 + ...1KalmanFilterAloamGarm__inherit__graph.png | Bin 0 -> 6393 bytes ...s__lib_1_1KalmanFilter__inherit__graph.map | 13 + ...s__lib_1_1KalmanFilter__inherit__graph.md5 | 1 + ...s__lib_1_1KalmanFilter__inherit__graph.png | Bin 0 -> 37414 bytes classmrs__lib_1_1LKF-members.html | 134 + classmrs__lib_1_1LKF.html | 541 ++++ classmrs__lib_1_1LKF.js | 25 + classmrs__lib_1_1LKF__MRS__odom-members.html | 143 + classmrs__lib_1_1LKF__MRS__odom.html | 370 +++ classmrs__lib_1_1LKF__MRS__odom.js | 23 + ...rs__lib_1_1LKF__MRS__odom__coll__graph.map | 5 + ...rs__lib_1_1LKF__MRS__odom__coll__graph.md5 | 1 + ...rs__lib_1_1LKF__MRS__odom__coll__graph.png | Bin 0 -> 7144 bytes ..._lib_1_1LKF__MRS__odom__inherit__graph.map | 5 + ..._lib_1_1LKF__MRS__odom__inherit__graph.md5 | 1 + ..._lib_1_1LKF__MRS__odom__inherit__graph.png | Bin 0 -> 7144 bytes classmrs__lib_1_1LKF__coll__graph.map | 4 + classmrs__lib_1_1LKF__coll__graph.md5 | 1 + classmrs__lib_1_1LKF__coll__graph.png | Bin 0 -> 5902 bytes classmrs__lib_1_1LKF__inherit__graph.map | 7 + classmrs__lib_1_1LKF__inherit__graph.md5 | 1 + classmrs__lib_1_1LKF__inherit__graph.png | Bin 0 -> 17709 bytes classmrs__lib_1_1MRSTimer-members.html | 115 + classmrs__lib_1_1MRSTimer.html | 244 ++ classmrs__lib_1_1MRSTimer.js | 14 + classmrs__lib_1_1MRSTimer__inherit__graph.map | 5 + classmrs__lib_1_1MRSTimer__inherit__graph.md5 | 1 + classmrs__lib_1_1MRSTimer__inherit__graph.png | Bin 0 -> 5845 bytes classmrs__lib_1_1MedianFilter-members.html | 121 + classmrs__lib_1_1MedianFilter.html | 628 ++++ classmrs__lib_1_1MedianFilter.js | 20 + classmrs__lib_1_1NCLKF-members.html | 138 + classmrs__lib_1_1NCLKF.html | 487 ++++ classmrs__lib_1_1NCLKF.js | 19 + classmrs__lib_1_1NCLKF__coll__graph.map | 5 + classmrs__lib_1_1NCLKF__coll__graph.md5 | 1 + classmrs__lib_1_1NCLKF__coll__graph.png | Bin 0 -> 9084 bytes classmrs__lib_1_1NCLKF__inherit__graph.map | 6 + classmrs__lib_1_1NCLKF__inherit__graph.md5 | 1 + classmrs__lib_1_1NCLKF__inherit__graph.png | Bin 0 -> 12568 bytes classmrs__lib_1_1NCLKF__partial-members.html | 145 + classmrs__lib_1_1NCLKF__partial.html | 789 +++++ classmrs__lib_1_1NCLKF__partial.js | 22 + ...rs__lib_1_1NCLKF__partial__coll__graph.map | 6 + ...rs__lib_1_1NCLKF__partial__coll__graph.md5 | 1 + ...rs__lib_1_1NCLKF__partial__coll__graph.png | Bin 0 -> 13292 bytes ..._lib_1_1NCLKF__partial__inherit__graph.map | 6 + ..._lib_1_1NCLKF__partial__inherit__graph.md5 | 1 + ..._lib_1_1NCLKF__partial__inherit__graph.png | Bin 0 -> 13292 bytes classmrs__lib_1_1NCUKF-members.html | 148 + classmrs__lib_1_1NCUKF.html | 415 +++ classmrs__lib_1_1NCUKF.js | 22 + classmrs__lib_1_1NCUKF__coll__graph.map | 5 + classmrs__lib_1_1NCUKF__coll__graph.md5 | 1 + classmrs__lib_1_1NCUKF__coll__graph.png | Bin 0 -> 9276 bytes classmrs__lib_1_1NCUKF__inherit__graph.map | 5 + classmrs__lib_1_1NCUKF__inherit__graph.md5 | 1 + classmrs__lib_1_1NCUKF__inherit__graph.png | Bin 0 -> 9276 bytes classmrs__lib_1_1NotchFilter-members.html | 106 + classmrs__lib_1_1NotchFilter.html | 119 + classmrs__lib_1_1NotchFilter.js | 5 + classmrs__lib_1_1ParamLoader-members.html | 145 + classmrs__lib_1_1ParamLoader.html | 2339 +++++++++++++++ classmrs__lib_1_1ParamLoader.js | 44 + classmrs__lib_1_1ParamProvider-members.html | 108 + classmrs__lib_1_1ParamProvider.html | 289 ++ classmrs__lib_1_1ParamProvider.js | 7 + classmrs__lib_1_1Polygon-members.html | 110 + classmrs__lib_1_1Polygon.html | 141 + classmrs__lib_1_1Polygon.js | 12 + classmrs__lib_1_1Profiler-members.html | 110 + classmrs__lib_1_1Profiler.html | 310 ++ classmrs__lib_1_1Profiler.js | 9 + ...smrs__lib_1_1PublisherHandler-members.html | 113 + classmrs__lib_1_1PublisherHandler.html | 377 +++ classmrs__lib_1_1PublisherHandler.js | 12 + ...lib_1_1PublisherHandler__impl-members.html | 111 + classmrs__lib_1_1PublisherHandler__impl.html | 314 ++ classmrs__lib_1_1PublisherHandler__impl.js | 10 + classmrs__lib_1_1RHEIV-members.html | 130 + classmrs__lib_1_1RHEIV.html | 773 +++++ classmrs__lib_1_1RHEIV.js | 26 + classmrs__lib_1_1ROSTimer-members.html | 125 + classmrs__lib_1_1ROSTimer.html | 430 +++ classmrs__lib_1_1ROSTimer.js | 17 + classmrs__lib_1_1ROSTimer__coll__graph.map | 4 + classmrs__lib_1_1ROSTimer__coll__graph.md5 | 1 + classmrs__lib_1_1ROSTimer__coll__graph.png | Bin 0 -> 3528 bytes classmrs__lib_1_1ROSTimer__inherit__graph.map | 4 + classmrs__lib_1_1ROSTimer__inherit__graph.md5 | 1 + classmrs__lib_1_1ROSTimer__inherit__graph.png | Bin 0 -> 3528 bytes classmrs__lib_1_1Repredictor-members.html | 131 + classmrs__lib_1_1Repredictor.html | 1025 +++++++ classmrs__lib_1_1Repredictor.js | 30 + ...__lib_1_1RepredictorAloamgarm-members.html | 132 + classmrs__lib_1_1RepredictorAloamgarm.html | 383 +++ classmrs__lib_1_1RepredictorAloamgarm.js | 13 + ...b_1_1RepredictorAloamgarm__coll__graph.map | 4 + ...b_1_1RepredictorAloamgarm__coll__graph.md5 | 1 + ...b_1_1RepredictorAloamgarm__coll__graph.png | Bin 0 -> 5946 bytes ..._1RepredictorAloamgarm__inherit__graph.map | 4 + ..._1RepredictorAloamgarm__inherit__graph.md5 | 1 + ..._1RepredictorAloamgarm__inherit__graph.png | Bin 0 -> 5946 bytes classmrs__lib_1_1Routine-members.html | 108 + classmrs__lib_1_1Routine.html | 122 + classmrs__lib_1_1Routine.js | 7 + classmrs__lib_1_1SafetyZone-members.html | 110 + classmrs__lib_1_1SafetyZone.html | 134 + classmrs__lib_1_1SafetyZone.js | 10 + classmrs__lib_1_1ScopeTimer-members.html | 110 + classmrs__lib_1_1ScopeTimer.html | 170 ++ classmrs__lib_1_1ScopeTimer.js | 10 + ...smrs__lib_1_1ScopeTimerLogger-members.html | 112 + classmrs__lib_1_1ScopeTimerLogger.html | 155 + classmrs__lib_1_1ScopeTimerLogger.js | 11 + ...__lib_1_1ServiceClientHandler-members.html | 116 + classmrs__lib_1_1ServiceClientHandler.html | 530 ++++ classmrs__lib_1_1ServiceClientHandler.js | 15 + ...1_1ServiceClientHandler__impl-members.html | 113 + ...rs__lib_1_1ServiceClientHandler__impl.html | 425 +++ ...smrs__lib_1_1ServiceClientHandler__impl.js | 12 + ...smrs__lib_1_1SubscribeHandler-members.html | 132 + classmrs__lib_1_1SubscribeHandler.html | 1069 +++++++ classmrs__lib_1_1SubscribeHandler.js | 33 + ...b_1_1SubscribeHandler_1_1Impl-members.html | 137 + ...smrs__lib_1_1SubscribeHandler_1_1Impl.html | 235 ++ classmrs__lib_1_1SubscribeHandler_1_1Impl.js | 36 + ...ribeHandler_1_1ImplThreadsafe-members.html | 139 + ...1_1SubscribeHandler_1_1ImplThreadsafe.html | 258 ++ ...b_1_1SubscribeHandler_1_1ImplThreadsafe.js | 18 + ...Handler_1_1ImplThreadsafe__coll__graph.map | 4 + ...Handler_1_1ImplThreadsafe__coll__graph.md5 | 1 + ...Handler_1_1ImplThreadsafe__coll__graph.png | Bin 0 -> 8548 bytes ...dler_1_1ImplThreadsafe__inherit__graph.map | 4 + ...dler_1_1ImplThreadsafe__inherit__graph.md5 | 1 + ...dler_1_1ImplThreadsafe__inherit__graph.png | Bin 0 -> 8548 bytes ...bscribeHandler_1_1Impl__inherit__graph.map | 4 + ...bscribeHandler_1_1Impl__inherit__graph.md5 | 1 + ...bscribeHandler_1_1Impl__inherit__graph.png | Bin 0 -> 8735 bytes classmrs__lib_1_1ThreadTimer-members.html | 123 + classmrs__lib_1_1ThreadTimer.html | 512 ++++ classmrs__lib_1_1ThreadTimer.js | 15 + classmrs__lib_1_1ThreadTimer__coll__graph.map | 4 + classmrs__lib_1_1ThreadTimer__coll__graph.md5 | 1 + classmrs__lib_1_1ThreadTimer__coll__graph.png | Bin 0 -> 3366 bytes ...rs__lib_1_1ThreadTimer__inherit__graph.map | 4 + ...rs__lib_1_1ThreadTimer__inherit__graph.md5 | 1 + ...rs__lib_1_1ThreadTimer__inherit__graph.png | Bin 0 -> 3366 bytes classmrs__lib_1_1TimeoutManager-members.html | 116 + classmrs__lib_1_1TimeoutManager.html | 192 ++ classmrs__lib_1_1TimeoutManager.js | 15 + ...__lib_1_1TransformBroadcaster-members.html | 107 + classmrs__lib_1_1TransformBroadcaster.html | 183 ++ classmrs__lib_1_1TransformBroadcaster.js | 6 + classmrs__lib_1_1Transformer-members.html | 135 + classmrs__lib_1_1Transformer.html | 1541 ++++++++++ classmrs__lib_1_1Transformer.js | 29 + classmrs__lib_1_1UKF-members.html | 145 + classmrs__lib_1_1UKF.html | 626 ++++ classmrs__lib_1_1UKF.js | 40 + classmrs__lib_1_1UKF__coll__graph.map | 4 + classmrs__lib_1_1UKF__coll__graph.md5 | 1 + classmrs__lib_1_1UKF__coll__graph.png | Bin 0 -> 5988 bytes classmrs__lib_1_1UKF__inherit__graph.map | 5 + classmrs__lib_1_1UKF__inherit__graph.md5 | 1 + classmrs__lib_1_1UKF__inherit__graph.png | Bin 0 -> 9258 bytes ...smrs__lib_1_1Vector3Converter-members.html | 111 + classmrs__lib_1_1Vector3Converter.html | 333 +++ classmrs__lib_1_1Vector3Converter.js | 10 + classmrs__lib_1_1VisualObject-members.html | 121 + classmrs__lib_1_1VisualObject.html | 164 ++ classmrs__lib_1_1VisualObject.js | 20 + ...smrs__lib_1_1geometry_1_1Cone-members.html | 114 + classmrs__lib_1_1geometry_1_1Cone.html | 352 +++ classmrs__lib_1_1geometry_1_1Cone.js | 13 + ...rs__lib_1_1geometry_1_1Cuboid-members.html | 113 + classmrs__lib_1_1geometry_1_1Cuboid.html | 405 +++ classmrs__lib_1_1geometry_1_1Cuboid.js | 12 + ...__lib_1_1geometry_1_1Cylinder-members.html | 114 + classmrs__lib_1_1geometry_1_1Cylinder.html | 315 ++ classmrs__lib_1_1geometry_1_1Cylinder.js | 13 + ...s__lib_1_1geometry_1_1Ellipse-members.html | 111 + classmrs__lib_1_1geometry_1_1Ellipse.html | 276 ++ classmrs__lib_1_1geometry_1_1Ellipse.js | 10 + classmrs__lib_1_1geometry_1_1Ray-members.html | 112 + classmrs__lib_1_1geometry_1_1Ray.html | 341 +++ classmrs__lib_1_1geometry_1_1Ray.js | 9 + ..._lib_1_1geometry_1_1Rectangle-members.html | 119 + classmrs__lib_1_1geometry_1_1Rectangle.html | 498 ++++ classmrs__lib_1_1geometry_1_1Rectangle.js | 18 + ...__lib_1_1geometry_1_1Triangle-members.html | 114 + classmrs__lib_1_1geometry_1_1Triangle.html | 356 +++ classmrs__lib_1_1geometry_1_1Triangle.js | 13 + classmrs__lib_1_1varstepLKF-members.html | 138 + classmrs__lib_1_1varstepLKF.html | 476 +++ classmrs__lib_1_1varstepLKF.js | 18 + classmrs__lib_1_1varstepLKF__coll__graph.map | 5 + classmrs__lib_1_1varstepLKF__coll__graph.md5 | 1 + classmrs__lib_1_1varstepLKF__coll__graph.png | Bin 0 -> 9118 bytes ...mrs__lib_1_1varstepLKF__inherit__graph.map | 5 + ...mrs__lib_1_1varstepLKF__inherit__graph.md5 | 1 + ...mrs__lib_1_1varstepLKF__inherit__graph.png | Bin 0 -> 9118 bytes closed.png | Bin 0 -> 132 bytes conversions_8h_source.html | 109 + conversions__eigen_8h_source.html | 139 + conversions__opencv_8h_source.html | 130 + cyclic_8h.html | 302 ++ cyclic_8h.js | 11 + cyclic_8h__dep__incl.map | 4 + cyclic_8h__dep__incl.md5 | 1 + cyclic_8h__dep__incl.png | Bin 0 -> 5919 bytes cyclic_8h__incl.map | 5 + cyclic_8h__incl.md5 | 1 + cyclic_8h__incl.png | Bin 0 -> 6145 bytes cyclic_8h_source.html | 387 +++ cyclic__example_8cpp.html | 161 + cyclic__example_8cpp.js | 9 + cyclic__example_8cpp__incl.map | 8 + cyclic__example_8cpp__incl.md5 | 1 + cyclic__example_8cpp__incl.png | Bin 0 -> 11822 bytes dir_000002_000003.html | 98 + dir_000002_000004.html | 98 + dir_000008_000001.html | 98 + dir_000009_000001.html | 98 + dir_000010_000001.html | 98 + dir_000012_000001.html | 98 + dir_000013_000001.html | 98 + dir_000014_000001.html | 98 + dir_000015_000001.html | 98 + dir_000016_000001.html | 98 + dir_000017_000001.html | 98 + dir_000018_000001.html | 98 + dir_000019_000001.html | 98 + dir_000020_000001.html | 98 + dir_000021_000001.html | 98 + dir_000023_000001.html | 98 + dir_000024_000001.html | 98 + dir_000025_000001.html | 98 + dir_000027_000001.html | 98 + dir_000028_000001.html | 98 + dir_000031_000001.html | 98 + dir_000032_000001.html | 98 + dir_000035_000001.html | 98 + dir_000036_000001.html | 98 + dir_000037_000001.html | 98 + dir_000038_000001.html | 98 + dir_000039_000001.html | 98 + dir_000040_000001.html | 98 + dir_000041_000001.html | 98 + dir_000043_000001.html | 98 + dir_000044_000001.html | 98 + dir_000045_000001.html | 98 + dir_000046_000001.html | 98 + dir_000047_000001.html | 98 + dir_000048_000001.html | 98 + dir_000049_000001.html | 98 + dir_000050_000001.html | 98 + dir_137818f07b93cd14b6ce92e51caad2df.html | 115 + dir_137818f07b93cd14b6ce92e51caad2df.js | 4 + dir_137818f07b93cd14b6ce92e51caad2df_dep.map | 6 + dir_137818f07b93cd14b6ce92e51caad2df_dep.md5 | 1 + dir_137818f07b93cd14b6ce92e51caad2df_dep.png | Bin 0 -> 2915 bytes dir_13e138d54eb8818da29c3992edef070a.html | 146 + dir_13e138d54eb8818da29c3992edef070a.js | 4 + dir_13e138d54eb8818da29c3992edef070a_dep.map | 33 + dir_13e138d54eb8818da29c3992edef070a_dep.md5 | 1 + dir_13e138d54eb8818da29c3992edef070a_dep.png | Bin 0 -> 36192 bytes dir_2489d4eba4efb8e04d8467655cf06abd.html | 115 + dir_2489d4eba4efb8e04d8467655cf06abd_dep.map | 6 + dir_2489d4eba4efb8e04d8467655cf06abd_dep.md5 | 1 + dir_2489d4eba4efb8e04d8467655cf06abd_dep.png | Bin 0 -> 3689 bytes dir_313caf1132e152dd9b58bea13a4052ca.html | 115 + dir_313caf1132e152dd9b58bea13a4052ca_dep.map | 6 + dir_313caf1132e152dd9b58bea13a4052ca_dep.md5 | 1 + dir_313caf1132e152dd9b58bea13a4052ca_dep.png | Bin 0 -> 2752 bytes dir_405fd32de3649961a5f009c7a3fe84df.html | 122 + dir_405fd32de3649961a5f009c7a3fe84df.js | 4 + dir_405fd32de3649961a5f009c7a3fe84df_dep.map | 6 + dir_405fd32de3649961a5f009c7a3fe84df_dep.md5 | 1 + dir_405fd32de3649961a5f009c7a3fe84df_dep.png | Bin 0 -> 3954 bytes dir_459eb1320bcc4da5aac4b85751529118.html | 122 + dir_459eb1320bcc4da5aac4b85751529118.js | 4 + dir_459eb1320bcc4da5aac4b85751529118_dep.map | 6 + dir_459eb1320bcc4da5aac4b85751529118_dep.md5 | 1 + dir_459eb1320bcc4da5aac4b85751529118_dep.png | Bin 0 -> 3663 bytes dir_47f9543a1dcda4cfb704fcee5b674cab.html | 115 + dir_47f9543a1dcda4cfb704fcee5b674cab_dep.map | 6 + dir_47f9543a1dcda4cfb704fcee5b674cab_dep.md5 | 1 + dir_47f9543a1dcda4cfb704fcee5b674cab_dep.png | Bin 0 -> 3798 bytes dir_4c2e94721b2acbf7eee2d1efd59bf8db.html | 122 + dir_4c2e94721b2acbf7eee2d1efd59bf8db.js | 4 + dir_4c2e94721b2acbf7eee2d1efd59bf8db_dep.map | 6 + dir_4c2e94721b2acbf7eee2d1efd59bf8db_dep.md5 | 1 + dir_4c2e94721b2acbf7eee2d1efd59bf8db_dep.png | Bin 0 -> 4155 bytes dir_4e76df18d944fae8b852653d4ae3a030.html | 109 + dir_4e76df18d944fae8b852653d4ae3a030.js | 4 + dir_52bd7864aeac0cbd0134df90af2e1447.html | 115 + dir_52bd7864aeac0cbd0134df90af2e1447_dep.map | 6 + dir_52bd7864aeac0cbd0134df90af2e1447_dep.md5 | 1 + dir_52bd7864aeac0cbd0134df90af2e1447_dep.png | Bin 0 -> 3271 bytes dir_53e6fa9553ac22a5646d2a2b2d7b97a1.html | 102 + dir_59dc5f73bda78a76f6ce4f5474a95632.html | 115 + dir_59dc5f73bda78a76f6ce4f5474a95632_dep.map | 6 + dir_59dc5f73bda78a76f6ce4f5474a95632_dep.md5 | 1 + dir_59dc5f73bda78a76f6ce4f5474a95632_dep.png | Bin 0 -> 4267 bytes dir_5b7f8725d4f972ca8245f6a979e7a433.html | 115 + dir_5b7f8725d4f972ca8245f6a979e7a433_dep.map | 6 + dir_5b7f8725d4f972ca8245f6a979e7a433_dep.md5 | 1 + dir_5b7f8725d4f972ca8245f6a979e7a433_dep.png | Bin 0 -> 2996 bytes dir_5cd313a56eb052b35bf1996eeb3f0983.html | 115 + dir_5cd313a56eb052b35bf1996eeb3f0983_dep.map | 6 + dir_5cd313a56eb052b35bf1996eeb3f0983_dep.md5 | 1 + dir_5cd313a56eb052b35bf1996eeb3f0983_dep.png | Bin 0 -> 3856 bytes dir_627f9e3e44b98db30b77a80b8afbb9e4.html | 115 + dir_627f9e3e44b98db30b77a80b8afbb9e4_dep.map | 6 + dir_627f9e3e44b98db30b77a80b8afbb9e4_dep.md5 | 1 + dir_627f9e3e44b98db30b77a80b8afbb9e4_dep.png | Bin 0 -> 2740 bytes dir_6584bc0d88c193127476cb5dc95baf39.html | 102 + dir_68267d1309a1af8e8297ef4c3efbcdba.html | 165 ++ dir_68267d1309a1af8e8297ef4c3efbcdba.js | 13 + dir_68267d1309a1af8e8297ef4c3efbcdba_dep.map | 52 + dir_68267d1309a1af8e8297ef4c3efbcdba_dep.md5 | 1 + dir_68267d1309a1af8e8297ef4c3efbcdba_dep.png | Bin 0 -> 63373 bytes dir_6aa5eb41b348da9a1414d58156a58f5e.html | 115 + dir_6aa5eb41b348da9a1414d58156a58f5e_dep.map | 6 + dir_6aa5eb41b348da9a1414d58156a58f5e_dep.md5 | 1 + dir_6aa5eb41b348da9a1414d58156a58f5e_dep.png | Bin 0 -> 4065 bytes dir_7164529cd9c8f96b25598799ea656806.html | 123 + dir_7164529cd9c8f96b25598799ea656806.js | 13 + dir_7164529cd9c8f96b25598799ea656806_dep.map | 4 + dir_7164529cd9c8f96b25598799ea656806_dep.md5 | 1 + dir_7164529cd9c8f96b25598799ea656806_dep.png | Bin 0 -> 1708 bytes dir_85b0de967ad5400027712e30c95ca897.html | 115 + dir_85b0de967ad5400027712e30c95ca897.js | 17 + dir_8607dcdb705c79ef4c5b76c004c42748.html | 115 + dir_8607dcdb705c79ef4c5b76c004c42748_dep.map | 6 + dir_8607dcdb705c79ef4c5b76c004c42748_dep.md5 | 1 + dir_8607dcdb705c79ef4c5b76c004c42748_dep.png | Bin 0 -> 3484 bytes dir_8727baefb60589e29135367809dcd3f5.html | 102 + dir_8c35c1873c2690b478a9950d0638d637.html | 102 + dir_90cd026696fbcd71297c0f7b96e13f91.html | 115 + dir_90cd026696fbcd71297c0f7b96e13f91_dep.map | 6 + dir_90cd026696fbcd71297c0f7b96e13f91_dep.md5 | 1 + dir_90cd026696fbcd71297c0f7b96e13f91_dep.png | Bin 0 -> 3994 bytes dir_9940084939548468b1ec99592b6e2693.html | 115 + dir_9940084939548468b1ec99592b6e2693_dep.map | 6 + dir_9940084939548468b1ec99592b6e2693_dep.md5 | 1 + dir_9940084939548468b1ec99592b6e2693_dep.png | Bin 0 -> 3814 bytes dir_9dc292e6fbe26797bd73250f006569d0.html | 115 + dir_9dc292e6fbe26797bd73250f006569d0_dep.map | 6 + dir_9dc292e6fbe26797bd73250f006569d0_dep.md5 | 1 + dir_9dc292e6fbe26797bd73250f006569d0_dep.png | Bin 0 -> 2848 bytes dir_9de178b262a8e864e9086749ac0a3a65.html | 115 + dir_9de178b262a8e864e9086749ac0a3a65_dep.map | 6 + dir_9de178b262a8e864e9086749ac0a3a65_dep.md5 | 1 + dir_9de178b262a8e864e9086749ac0a3a65_dep.png | Bin 0 -> 3504 bytes dir_9e9e485811fd7b0342cca4e7c3cf123b.html | 109 + dir_9e9e485811fd7b0342cca4e7c3cf123b.js | 4 + dir_a1544262e4e34d2792f5ebccef9b84d2.html | 115 + dir_a1544262e4e34d2792f5ebccef9b84d2_dep.map | 6 + dir_a1544262e4e34d2792f5ebccef9b84d2_dep.md5 | 1 + dir_a1544262e4e34d2792f5ebccef9b84d2_dep.png | Bin 0 -> 3617 bytes dir_a17ab943082f893adca96bf9769a804b.html | 115 + dir_a17ab943082f893adca96bf9769a804b_dep.map | 6 + dir_a17ab943082f893adca96bf9769a804b_dep.md5 | 1 + dir_a17ab943082f893adca96bf9769a804b_dep.png | Bin 0 -> 3811 bytes dir_a5078ef47331b4526bf3f96e987ee465.html | 122 + dir_a5078ef47331b4526bf3f96e987ee465.js | 4 + dir_a5078ef47331b4526bf3f96e987ee465_dep.map | 6 + dir_a5078ef47331b4526bf3f96e987ee465_dep.md5 | 1 + dir_a5078ef47331b4526bf3f96e987ee465_dep.png | Bin 0 -> 2693 bytes dir_a801eb2785f54179a3e523b657d76987.html | 102 + dir_a891666b40284627c385858212667a8e.html | 115 + dir_a891666b40284627c385858212667a8e_dep.map | 6 + dir_a891666b40284627c385858212667a8e_dep.md5 | 1 + dir_a891666b40284627c385858212667a8e_dep.png | Bin 0 -> 3748 bytes dir_a91f64f59277207d470dc7e676106e2d.html | 115 + dir_a91f64f59277207d470dc7e676106e2d_dep.map | 6 + dir_a91f64f59277207d470dc7e676106e2d_dep.md5 | 1 + dir_a91f64f59277207d470dc7e676106e2d_dep.png | Bin 0 -> 3497 bytes dir_aa9be1b82c48662217aefeaa0c6781c6.html | 115 + dir_aa9be1b82c48662217aefeaa0c6781c6_dep.map | 6 + dir_aa9be1b82c48662217aefeaa0c6781c6_dep.md5 | 1 + dir_aa9be1b82c48662217aefeaa0c6781c6_dep.png | Bin 0 -> 2801 bytes dir_ae9a93452e2a84339148a16bcf2eb561.html | 115 + dir_ae9a93452e2a84339148a16bcf2eb561_dep.map | 6 + dir_ae9a93452e2a84339148a16bcf2eb561_dep.md5 | 1 + dir_ae9a93452e2a84339148a16bcf2eb561_dep.png | Bin 0 -> 2864 bytes dir_b45211e520e4a09b6829419ceab557b0.html | 102 + dir_b45211e520e4a09b6829419ceab557b0.js | 6 + dir_b51f180547f8d0f0e77de7f16caceac3.html | 201 ++ dir_b51f180547f8d0f0e77de7f16caceac3.js | 84 + dir_b51f180547f8d0f0e77de7f16caceac3_dep.map | 9 + dir_b51f180547f8d0f0e77de7f16caceac3_dep.md5 | 1 + dir_b51f180547f8d0f0e77de7f16caceac3_dep.png | Bin 0 -> 6452 bytes dir_bd43be0586985cbd0dfeaf1ebce92195.html | 115 + dir_bd43be0586985cbd0dfeaf1ebce92195_dep.map | 6 + dir_bd43be0586985cbd0dfeaf1ebce92195_dep.md5 | 1 + dir_bd43be0586985cbd0dfeaf1ebce92195_dep.png | Bin 0 -> 2919 bytes dir_c34e1a38474b6d602bc9081a27b1a010.html | 115 + dir_c34e1a38474b6d602bc9081a27b1a010_dep.map | 6 + dir_c34e1a38474b6d602bc9081a27b1a010_dep.md5 | 1 + dir_c34e1a38474b6d602bc9081a27b1a010_dep.png | Bin 0 -> 3858 bytes dir_cfc0c72890b8d1e009b6260caa55cd65.html | 115 + dir_cfc0c72890b8d1e009b6260caa55cd65_dep.map | 6 + dir_cfc0c72890b8d1e009b6260caa55cd65_dep.md5 | 1 + dir_cfc0c72890b8d1e009b6260caa55cd65_dep.png | Bin 0 -> 3058 bytes dir_d20a67be47c1454b19aa07d8b0143440.html | 122 + dir_d20a67be47c1454b19aa07d8b0143440.js | 4 + dir_d20a67be47c1454b19aa07d8b0143440_dep.map | 6 + dir_d20a67be47c1454b19aa07d8b0143440_dep.md5 | 1 + dir_d20a67be47c1454b19aa07d8b0143440_dep.png | Bin 0 -> 2894 bytes dir_d44c64559bbebec7f509842c48db8b23.html | 117 + dir_d44c64559bbebec7f509842c48db8b23.js | 4 + dir_d44c64559bbebec7f509842c48db8b23_dep.map | 4 + dir_d44c64559bbebec7f509842c48db8b23_dep.md5 | 1 + dir_d44c64559bbebec7f509842c48db8b23_dep.png | Bin 0 -> 1821 bytes dir_d49d4fe2bb593f3112f8bcbe6fb5f73b.html | 115 + dir_d49d4fe2bb593f3112f8bcbe6fb5f73b_dep.map | 6 + dir_d49d4fe2bb593f3112f8bcbe6fb5f73b_dep.md5 | 1 + dir_d49d4fe2bb593f3112f8bcbe6fb5f73b_dep.png | Bin 0 -> 3937 bytes dir_d81f13436e73f242cdf25a742f3a9678.html | 122 + dir_d81f13436e73f242cdf25a742f3a9678.js | 4 + dir_d81f13436e73f242cdf25a742f3a9678_dep.map | 6 + dir_d81f13436e73f242cdf25a742f3a9678_dep.md5 | 1 + dir_d81f13436e73f242cdf25a742f3a9678_dep.png | Bin 0 -> 3537 bytes dir_dbeb4cbddd5bb6f84539c6e271d9141e.html | 115 + dir_dbeb4cbddd5bb6f84539c6e271d9141e_dep.map | 6 + dir_dbeb4cbddd5bb6f84539c6e271d9141e_dep.md5 | 1 + dir_dbeb4cbddd5bb6f84539c6e271d9141e_dep.png | Bin 0 -> 3655 bytes dir_dcbbf3bfcdb3d005110c6ee2b744bf08.html | 122 + dir_dcbbf3bfcdb3d005110c6ee2b744bf08.js | 4 + dir_dcbbf3bfcdb3d005110c6ee2b744bf08_dep.map | 6 + dir_dcbbf3bfcdb3d005110c6ee2b744bf08_dep.md5 | 1 + dir_dcbbf3bfcdb3d005110c6ee2b744bf08_dep.png | Bin 0 -> 3906 bytes dir_df4ba55d073265bfa281b5d186f7d37a.html | 115 + dir_df4ba55d073265bfa281b5d186f7d37a_dep.map | 6 + dir_df4ba55d073265bfa281b5d186f7d37a_dep.md5 | 1 + dir_df4ba55d073265bfa281b5d186f7d37a_dep.png | Bin 0 -> 4313 bytes dir_e6bb757187894633b963babd59fca1e5.html | 106 + dir_f003de2bf99885e59674f01f3665fb82.html | 125 + dir_f003de2bf99885e59674f01f3665fb82.js | 5 + dir_f003de2bf99885e59674f01f3665fb82_dep.map | 6 + dir_f003de2bf99885e59674f01f3665fb82_dep.md5 | 1 + dir_f003de2bf99885e59674f01f3665fb82_dep.png | Bin 0 -> 4161 bytes dir_fbb9f35580885fae6f87a033a53c348d.html | 102 + dkf_8h_source.html | 200 ++ doc.png | Bin 0 -> 746 bytes doxygen.css | 1771 +++++++++++ doxygen.png | Bin 0 -> 3779 bytes dynamic__publisher_2example_8cpp.html | 143 + dynamic__publisher_2example_8cpp.js | 4 + dynamic__publisher_2example_8cpp__incl.map | 14 + dynamic__publisher_2example_8cpp__incl.md5 | 1 + dynamic__publisher_2example_8cpp__incl.png | Bin 0 -> 31829 bytes dynamic__publisher_8h.html | 161 + dynamic__publisher_8h__dep__incl.map | 4 + dynamic__publisher_8h__dep__incl.md5 | 1 + dynamic__publisher_8h__dep__incl.png | Bin 0 -> 5168 bytes dynamic__publisher_8h__incl.map | 11 + dynamic__publisher_8h__incl.md5 | 1 + dynamic__publisher_8h__incl.png | Bin 0 -> 28954 bytes dynamic__publisher_8h_source.html | 138 + dynamic__publisher_8hpp_source.html | 152 + dynamic__reconfigure__mgr_8h.html | 160 + dynamic__reconfigure__mgr_8h__incl.map | 18 + dynamic__reconfigure__mgr_8h__incl.md5 | 1 + dynamic__reconfigure__mgr_8h__incl.png | Bin 0 -> 64585 bytes dynamic__reconfigure__mgr_8h_source.html | 362 +++ dynamic_publisher_2example_8cpp-example.html | 147 + dynsections.js | 120 + examples.html | 123 + examples.js | 13 + files.html | 192 ++ files_dup.js | 6 + folderclosed.png | Bin 0 -> 616 bytes folderopen.png | Bin 0 -> 597 bytes formula.repository | 64 + functions.html | 186 ++ functions_b.html | 129 + functions_c.html | 168 ++ functions_d.html | 132 + functions_dup.js | 30 + functions_e.html | 110 + functions_f.html | 122 + functions_func.html | 173 ++ functions_func.js | 26 + functions_func_b.html | 112 + functions_func_c.html | 165 ++ functions_func_d.html | 123 + functions_func_e.html | 107 + functions_func_f.html | 116 + functions_func_g.html | 169 ++ functions_func_h.html | 108 + functions_func_i.html | 127 + functions_func_j.html | 104 + functions_func_l.html | 146 + functions_func_m.html | 107 + functions_func_n.html | 114 + functions_func_o.html | 158 + functions_func_p.html | 157 + functions_func_r.html | 136 + functions_func_s.html | 196 ++ functions_func_t.html | 140 + functions_func_u.html | 110 + functions_func_v.html | 115 + functions_func_w.html | 112 + functions_func_y.html | 104 + functions_func_~.html | 149 + functions_g.html | 169 ++ functions_h.html | 124 + functions_i.html | 130 + functions_j.html | 104 + functions_k.html | 115 + functions_l.html | 152 + functions_m.html | 129 + functions_n.html | 135 + functions_o.html | 167 ++ functions_p.html | 194 ++ functions_q.html | 115 + functions_r.html | 150 + functions_rela.html | 105 + functions_s.html | 211 ++ functions_t.html | 164 ++ functions_type.html | 368 +++ functions_u.html | 122 + functions_v.html | 115 + functions_vars.html | 263 ++ functions_w.html | 118 + functions_x.html | 126 + functions_y.html | 104 + functions_z.html | 119 + functions_~.html | 149 + geometry_2cyclic_example_8cpp-example.html | 324 +++ gps__conversions_8h.html | 186 ++ gps__conversions_8h.js | 18 + gps__conversions_8h__incl.map | 7 + gps__conversions_8h__incl.md5 | 1 + gps__conversions_8h__incl.png | Bin 0 -> 9200 bytes gps__conversions_8h_source.html | 366 +++ graph_legend.html | 161 + graph_legend.md5 | 1 + graph_legend.png | Bin 0 -> 20615 bytes hierarchy.html | 208 ++ hierarchy.js | 121 + iir__filter_8h.html | 144 + iir__filter_8h__dep__incl.map | 4 + iir__filter_8h__dep__incl.md5 | 1 + iir__filter_8h__dep__incl.png | Bin 0 -> 4437 bytes iir__filter_8h__incl.map | 4 + iir__filter_8h__incl.md5 | 1 + iir__filter_8h__incl.png | Bin 0 -> 3597 bytes iir__filter_8h_source.html | 131 + image__publisher_8h_source.html | 151 + index.html | 125 + inherit_graph_0.map | 3 + inherit_graph_0.md5 | 1 + inherit_graph_0.png | Bin 0 -> 1861 bytes inherit_graph_1.map | 3 + inherit_graph_1.md5 | 1 + inherit_graph_1.png | Bin 0 -> 2119 bytes inherit_graph_10.map | 4 + inherit_graph_10.md5 | 1 + inherit_graph_10.png | Bin 0 -> 3541 bytes inherit_graph_11.map | 4 + inherit_graph_11.md5 | 1 + inherit_graph_11.png | Bin 0 -> 3528 bytes inherit_graph_12.map | 4 + inherit_graph_12.md5 | 1 + inherit_graph_12.png | Bin 0 -> 3816 bytes inherit_graph_13.map | 4 + inherit_graph_13.md5 | 1 + inherit_graph_13.png | Bin 0 -> 3899 bytes inherit_graph_14.map | 4 + inherit_graph_14.md5 | 1 + inherit_graph_14.png | Bin 0 -> 3902 bytes inherit_graph_15.map | 3 + inherit_graph_15.md5 | 1 + inherit_graph_15.png | Bin 0 -> 2900 bytes inherit_graph_16.map | 3 + inherit_graph_16.md5 | 1 + inherit_graph_16.png | Bin 0 -> 2366 bytes inherit_graph_17.map | 3 + inherit_graph_17.md5 | 1 + inherit_graph_17.png | Bin 0 -> 2097 bytes inherit_graph_18.map | 3 + inherit_graph_18.md5 | 1 + inherit_graph_18.png | Bin 0 -> 1890 bytes inherit_graph_19.map | 3 + inherit_graph_19.md5 | 1 + inherit_graph_19.png | Bin 0 -> 2495 bytes inherit_graph_2.map | 3 + inherit_graph_2.md5 | 1 + inherit_graph_2.png | Bin 0 -> 2029 bytes inherit_graph_20.map | 3 + inherit_graph_20.md5 | 1 + inherit_graph_20.png | Bin 0 -> 2298 bytes inherit_graph_21.map | 3 + inherit_graph_21.md5 | 1 + inherit_graph_21.png | Bin 0 -> 1271 bytes inherit_graph_22.map | 3 + inherit_graph_22.md5 | 1 + inherit_graph_22.png | Bin 0 -> 1851 bytes inherit_graph_23.map | 3 + inherit_graph_23.md5 | 1 + inherit_graph_23.png | Bin 0 -> 1676 bytes inherit_graph_24.map | 3 + inherit_graph_24.md5 | 1 + inherit_graph_24.png | Bin 0 -> 1493 bytes inherit_graph_25.map | 13 + inherit_graph_25.md5 | 1 + inherit_graph_25.png | Bin 0 -> 38366 bytes inherit_graph_26.map | 3 + inherit_graph_26.md5 | 1 + inherit_graph_26.png | Bin 0 -> 3879 bytes inherit_graph_27.map | 4 + inherit_graph_27.md5 | 1 + inherit_graph_27.png | Bin 0 -> 5829 bytes inherit_graph_28.map | 3 + inherit_graph_28.md5 | 1 + inherit_graph_28.png | Bin 0 -> 4242 bytes inherit_graph_29.map | 3 + inherit_graph_29.md5 | 1 + inherit_graph_29.png | Bin 0 -> 1630 bytes inherit_graph_3.map | 17 + inherit_graph_3.md5 | 1 + inherit_graph_3.png | Bin 0 -> 77520 bytes inherit_graph_30.map | 5 + inherit_graph_30.md5 | 1 + inherit_graph_30.png | Bin 0 -> 4061 bytes inherit_graph_31.map | 3 + inherit_graph_31.md5 | 1 + inherit_graph_31.png | Bin 0 -> 1595 bytes inherit_graph_32.map | 3 + inherit_graph_32.md5 | 1 + inherit_graph_32.png | Bin 0 -> 1614 bytes inherit_graph_33.map | 3 + inherit_graph_33.md5 | 1 + inherit_graph_33.png | Bin 0 -> 1736 bytes inherit_graph_34.map | 3 + inherit_graph_34.md5 | 1 + inherit_graph_34.png | Bin 0 -> 1530 bytes inherit_graph_35.map | 3 + inherit_graph_35.md5 | 1 + inherit_graph_35.png | Bin 0 -> 1509 bytes inherit_graph_36.map | 3 + inherit_graph_36.md5 | 1 + inherit_graph_36.png | Bin 0 -> 2678 bytes inherit_graph_37.map | 3 + inherit_graph_37.md5 | 1 + inherit_graph_37.png | Bin 0 -> 2686 bytes inherit_graph_38.map | 3 + inherit_graph_38.md5 | 1 + inherit_graph_38.png | Bin 0 -> 2640 bytes inherit_graph_39.map | 4 + inherit_graph_39.md5 | 1 + inherit_graph_39.png | Bin 0 -> 3604 bytes inherit_graph_4.map | 3 + inherit_graph_4.md5 | 1 + inherit_graph_4.png | Bin 0 -> 1962 bytes inherit_graph_40.map | 3 + inherit_graph_40.md5 | 1 + inherit_graph_40.png | Bin 0 -> 3205 bytes inherit_graph_41.map | 3 + inherit_graph_41.md5 | 1 + inherit_graph_41.png | Bin 0 -> 2760 bytes inherit_graph_42.map | 3 + inherit_graph_42.md5 | 1 + inherit_graph_42.png | Bin 0 -> 1653 bytes inherit_graph_43.map | 3 + inherit_graph_43.md5 | 1 + inherit_graph_43.png | Bin 0 -> 1894 bytes inherit_graph_44.map | 3 + inherit_graph_44.md5 | 1 + inherit_graph_44.png | Bin 0 -> 1579 bytes inherit_graph_45.map | 3 + inherit_graph_45.md5 | 1 + inherit_graph_45.png | Bin 0 -> 1926 bytes inherit_graph_46.map | 3 + inherit_graph_46.md5 | 1 + inherit_graph_46.png | Bin 0 -> 1843 bytes inherit_graph_47.map | 3 + inherit_graph_47.md5 | 1 + inherit_graph_47.png | Bin 0 -> 3147 bytes inherit_graph_48.map | 3 + inherit_graph_48.md5 | 1 + inherit_graph_48.png | Bin 0 -> 3177 bytes inherit_graph_49.map | 3 + inherit_graph_49.md5 | 1 + inherit_graph_49.png | Bin 0 -> 3391 bytes inherit_graph_5.map | 3 + inherit_graph_5.md5 | 1 + inherit_graph_5.png | Bin 0 -> 2101 bytes inherit_graph_50.map | 4 + inherit_graph_50.md5 | 1 + inherit_graph_50.png | Bin 0 -> 5328 bytes inherit_graph_51.map | 3 + inherit_graph_51.md5 | 1 + inherit_graph_51.png | Bin 0 -> 2864 bytes inherit_graph_52.map | 3 + inherit_graph_52.md5 | 1 + inherit_graph_52.png | Bin 0 -> 1919 bytes inherit_graph_53.map | 3 + inherit_graph_53.md5 | 1 + inherit_graph_53.png | Bin 0 -> 2053 bytes inherit_graph_54.map | 3 + inherit_graph_54.md5 | 1 + inherit_graph_54.png | Bin 0 -> 1663 bytes inherit_graph_55.map | 3 + inherit_graph_55.md5 | 1 + inherit_graph_55.png | Bin 0 -> 2102 bytes inherit_graph_56.map | 3 + inherit_graph_56.md5 | 1 + inherit_graph_56.png | Bin 0 -> 2043 bytes inherit_graph_57.map | 3 + inherit_graph_57.md5 | 1 + inherit_graph_57.png | Bin 0 -> 1021 bytes inherit_graph_58.map | 3 + inherit_graph_58.md5 | 1 + inherit_graph_58.png | Bin 0 -> 738 bytes inherit_graph_59.map | 3 + inherit_graph_59.md5 | 1 + inherit_graph_59.png | Bin 0 -> 3596 bytes inherit_graph_6.map | 3 + inherit_graph_6.md5 | 1 + inherit_graph_6.png | Bin 0 -> 3558 bytes inherit_graph_60.map | 3 + inherit_graph_60.md5 | 1 + inherit_graph_60.png | Bin 0 -> 3458 bytes inherit_graph_61.map | 3 + inherit_graph_61.md5 | 1 + inherit_graph_61.png | Bin 0 -> 3558 bytes inherit_graph_62.map | 3 + inherit_graph_62.md5 | 1 + inherit_graph_62.png | Bin 0 -> 3139 bytes inherit_graph_63.map | 3 + inherit_graph_63.md5 | 1 + inherit_graph_63.png | Bin 0 -> 1425 bytes inherit_graph_64.map | 3 + inherit_graph_64.md5 | 1 + inherit_graph_64.png | Bin 0 -> 1271 bytes inherit_graph_65.map | 4 + inherit_graph_65.md5 | 1 + inherit_graph_65.png | Bin 0 -> 2562 bytes inherit_graph_7.map | 3 + inherit_graph_7.md5 | 1 + inherit_graph_7.png | Bin 0 -> 1588 bytes inherit_graph_8.map | 3 + inherit_graph_8.md5 | 1 + inherit_graph_8.png | Bin 0 -> 1879 bytes inherit_graph_9.map | 3 + inherit_graph_9.md5 | 1 + inherit_graph_9.png | Bin 0 -> 2373 bytes inherits.html | 470 +++ jlkf_8h_source.html | 389 +++ jquery.js | 35 + kalman__filter_8h.html | 162 ++ kalman__filter_8h__dep__incl.map | 12 + kalman__filter_8h__dep__incl.md5 | 1 + kalman__filter_8h__dep__incl.png | Bin 0 -> 27411 bytes kalman__filter_8h__incl.map | 5 + kalman__filter_8h__incl.md5 | 1 + kalman__filter_8h__incl.png | Bin 0 -> 6396 bytes kalman__filter_8h_source.html | 164 ++ kalman__filter__aloamgarm_8h.html | 156 + kalman__filter__aloamgarm_8h__dep__incl.map | 4 + kalman__filter__aloamgarm_8h__dep__incl.md5 | 1 + kalman__filter__aloamgarm_8h__dep__incl.png | Bin 0 -> 5399 bytes kalman__filter__aloamgarm_8h__incl.map | 6 + kalman__filter__aloamgarm_8h__incl.md5 | 1 + kalman__filter__aloamgarm_8h__incl.png | Bin 0 -> 9666 bytes kalman__filter__aloamgarm_8h_source.html | 182 ++ line__operations_8h_source.html | 126 + lkf_2example_8cpp-example.html | 281 ++ lkf_2example_8cpp.html | 255 ++ lkf_2example_8cpp.js | 52 + lkf_2example_8cpp__incl.map | 9 + lkf_2example_8cpp__incl.md5 | 1 + lkf_2example_8cpp__incl.png | Bin 0 -> 16142 bytes lkf_8h_source.html | 409 +++ math_8h.html | 138 + math_8h.js | 4 + math_8h__incl.map | 4 + math_8h__incl.md5 | 1 + math_8h__incl.png | Bin 0 -> 3098 bytes math_8h_source.html | 122 + median__filter_8h.html | 148 + median__filter_8h__incl.map | 8 + median__filter_8h__incl.md5 | 1 + median__filter_8h__incl.png | Bin 0 -> 11904 bytes median__filter_8h_source.html | 184 ++ menu.js | 50 + menudata.js | 139 + misc_8h.html | 937 ++++++ misc_8h.js | 30 + misc_8h__dep__incl.map | 7 + misc_8h__dep__incl.md5 | 1 + misc_8h__dep__incl.png | Bin 0 -> 14656 bytes misc_8h__incl.map | 7 + misc_8h__incl.md5 | 1 + misc_8h__incl.png | Bin 0 -> 12610 bytes misc_8h_source.html | 252 ++ mrs__lib_8h_source.html | 106 + mrs_logo.png | Bin 0 -> 2656 bytes msg__extractor_8h.html | 288 ++ msg__extractor_8h.js | 47 + msg__extractor_8h__incl.map | 21 + msg__extractor_8h__incl.md5 | 1 + msg__extractor_8h__incl.png | Bin 0 -> 63802 bytes msg__extractor_8h_source.html | 492 ++++ mutex_8h.html | 182 ++ mutex_8h.js | 11 + mutex_8h__dep__incl.map | 4 + mutex_8h__dep__incl.md5 | 1 + mutex_8h__dep__incl.png | Bin 0 -> 4739 bytes mutex_8h__incl.map | 6 + mutex_8h__incl.md5 | 1 + mutex_8h__incl.png | Bin 0 -> 5337 bytes mutex_8h_source.html | 195 ++ namespacemembers.html | 172 ++ namespacemembers_func.html | 165 ++ namespacemembers_type.html | 102 + namespacemrs__lib.html | 2589 +++++++++++++++++ namespacemrs__lib.js | 69 + namespaces.html | 106 + namespaces_dup.js | 4 + nav_f.png | Bin 0 -> 153 bytes nav_g.png | Bin 0 -> 95 bytes nav_h.png | Bin 0 -> 98 bytes navtree.css | 146 + navtree.js | 544 ++++ navtreedata.js | 69 + navtreeindex0.js | 253 ++ navtreeindex1.js | 253 ++ navtreeindex2.js | 253 ++ navtreeindex3.js | 253 ++ navtreeindex4.js | 253 ++ navtreeindex5.js | 178 ++ nckf_8h_source.html | 508 ++++ nckf__tests_8cpp.html | 205 ++ nckf__tests_8cpp.js | 21 + nckf__tests_8cpp__incl.map | 12 + nckf__tests_8cpp__incl.md5 | 1 + nckf__tests_8cpp__incl.png | Bin 0 -> 20533 bytes notch__filter_8h.html | 137 + notch__filter_8h__incl.map | 6 + notch__filter_8h__incl.md5 | 1 + notch__filter_8h__incl.png | Bin 0 -> 10084 bytes notch__filter_8h_source.html | 132 + open.png | Bin 0 -> 123 bytes pages.html | 106 + param__loader_2example_8cpp.html | 142 + param__loader_2example_8cpp.js | 4 + param__loader_2example_8cpp__incl.map | 15 + param__loader_2example_8cpp__incl.md5 | 1 + param__loader_2example_8cpp__incl.png | Bin 0 -> 28890 bytes param__loader_8h.html | 179 ++ param__loader_8h.js | 6 + param__loader_8h__dep__incl.map | 5 + param__loader_8h__dep__incl.md5 | 1 + param__loader_8h__dep__incl.png | Bin 0 -> 7930 bytes param__loader_8h__incl.map | 14 + param__loader_8h__incl.md5 | 1 + param__loader_8h__incl.png | Bin 0 -> 27291 bytes param__loader_8h_source.html | 955 ++++++ param__provider_8h.html | 156 + param__provider_8h__dep__incl.map | 7 + param__provider_8h__dep__incl.md5 | 1 + param__provider_8h__dep__incl.png | Bin 0 -> 15342 bytes param__provider_8h__incl.map | 6 + param__provider_8h__incl.md5 | 1 + param__provider_8h__incl.png | Bin 0 -> 10598 bytes param__provider_8h_source.html | 150 + param__provider_8hpp_source.html | 153 + param_loader_2example_8cpp-example.html | 183 ++ polygon_8h_source.html | 159 + probit__gts_8h_source.html | 512 ++++ profiler_8h.html | 143 + profiler_8h__incl.map | 6 + profiler_8h__incl.md5 | 1 + profiler_8h__incl.png | Bin 0 -> 7767 bytes profiler_8h_source.html | 179 ++ publisher__handler_8h.html | 163 ++ publisher__handler_8h__dep__incl.map | 5 + publisher__handler_8h__dep__incl.md5 | 1 + publisher__handler_8h__dep__incl.png | Bin 0 -> 8123 bytes publisher__handler_8h__incl.map | 9 + publisher__handler_8h__incl.md5 | 1 + publisher__handler_8h__incl.png | Bin 0 -> 15457 bytes publisher__handler_8h_source.html | 196 ++ publisher__handler_8hpp_source.html | 359 +++ quadratic__throttle__model_8h_source.html | 137 + repredictor_2example_8cpp-example.html | 388 +++ repredictor_2example_8cpp.html | 298 ++ repredictor_2example_8cpp.js | 47 + repredictor_2example_8cpp__incl.map | 24 + repredictor_2example_8cpp__incl.md5 | 1 + repredictor_2example_8cpp__incl.png | Bin 0 -> 60574 bytes repredictor_8h_source.html | 509 ++++ repredictor__aloamgarm_8h_source.html | 163 ++ resize.js | 137 + rheiv_2example_8cpp-example.html | 176 ++ rheiv_2example_8cpp.html | 182 ++ rheiv_2example_8cpp.js | 14 + rheiv_2example_8cpp__incl.map | 8 + rheiv_2example_8cpp__incl.md5 | 1 + rheiv_2example_8cpp__incl.png | Bin 0 -> 11620 bytes rheiv_8h.html | 156 + rheiv_8h__dep__incl.map | 4 + rheiv_8h__dep__incl.md5 | 1 + rheiv_8h__dep__incl.png | Bin 0 -> 3971 bytes rheiv_8h__incl.map | 6 + rheiv_8h__incl.md5 | 1 + rheiv_8h__incl.png | Bin 0 -> 7414 bytes rheiv_8h_source.html | 574 ++++ safety__zone_8h_source.html | 143 + scope__timer_8h.html | 153 + scope__timer_8h__incl.map | 9 + scope__timer_8h__incl.md5 | 1 + scope__timer_8h__incl.png | Bin 0 -> 12742 bytes scope__timer_8h_source.html | 229 ++ search/all_0.html | 30 + search/all_0.js | 31 + search/all_1.html | 30 + search/all_1.js | 11 + search/all_10.html | 30 + search/all_10.js | 8 + search/all_11.html | 30 + search/all_11.js | 23 + search/all_12.html | 30 + search/all_12.js | 51 + search/all_13.html | 30 + search/all_13.js | 31 + search/all_14.html | 30 + search/all_14.js | 10 + search/all_15.html | 30 + search/all_15.js | 12 + search/all_16.html | 30 + search/all_16.js | 10 + search/all_17.html | 30 + search/all_17.js | 7 + search/all_18.html | 30 + search/all_18.js | 4 + search/all_19.html | 30 + search/all_19.js | 5 + search/all_1a.html | 30 + search/all_1a.js | 19 + search/all_2.html | 30 + search/all_2.js | 31 + search/all_3.html | 30 + search/all_3.js | 17 + search/all_4.html | 30 + search/all_4.js | 10 + search/all_5.html | 30 + search/all_5.js | 10 + search/all_6.html | 30 + search/all_6.js | 33 + search/all_7.html | 30 + search/all_7.js | 10 + search/all_8.html | 30 + search/all_8.js | 22 + search/all_9.html | 30 + search/all_9.js | 4 + search/all_a.html | 30 + search/all_a.js | 10 + search/all_b.html | 30 + search/all_b.js | 23 + search/all_c.html | 30 + search/all_c.js | 21 + search/all_d.html | 30 + search/all_d.js | 16 + search/all_e.html | 30 + search/all_e.js | 24 + search/all_f.html | 30 + search/all_f.js | 30 + search/classes_0.html | 30 + search/classes_0.js | 5 + search/classes_1.html | 30 + search/classes_1.js | 5 + search/classes_10.html | 30 + search/classes_10.js | 13 + search/classes_11.html | 30 + search/classes_11.js | 4 + search/classes_12.html | 30 + search/classes_12.js | 7 + search/classes_13.html | 30 + search/classes_13.js | 5 + search/classes_2.html | 30 + search/classes_2.js | 12 + search/classes_3.html | 30 + search/classes_3.js | 7 + search/classes_4.html | 30 + search/classes_4.js | 8 + search/classes_5.html | 30 + search/classes_5.js | 4 + search/classes_6.html | 30 + search/classes_6.js | 11 + search/classes_7.html | 30 + search/classes_7.js | 4 + search/classes_8.html | 30 + search/classes_8.js | 5 + search/classes_9.html | 30 + search/classes_9.js | 7 + search/classes_a.html | 30 + search/classes_a.js | 8 + search/classes_b.html | 30 + search/classes_b.js | 7 + search/classes_c.html | 30 + search/classes_c.js | 4 + search/classes_d.html | 30 + search/classes_d.js | 9 + search/classes_e.html | 30 + search/classes_e.js | 12 + search/classes_f.html | 30 + search/classes_f.js | 16 + search/close.png | Bin 0 -> 273 bytes search/files_0.html | 30 + search/files_0.js | 4 + search/files_1.html | 30 + search/files_1.js | 4 + search/files_2.html | 30 + search/files_2.js | 5 + search/files_3.html | 30 + search/files_3.js | 5 + search/files_4.html | 30 + search/files_4.js | 4 + search/files_5.html | 30 + search/files_5.js | 4 + search/files_6.html | 30 + search/files_6.js | 4 + search/files_7.html | 30 + search/files_7.js | 5 + search/files_8.html | 30 + search/files_8.js | 8 + search/files_9.html | 30 + search/files_9.js | 5 + search/files_a.html | 30 + search/files_a.js | 7 + search/files_b.html | 30 + search/files_b.js | 4 + search/files_c.html | 30 + search/files_c.js | 8 + search/files_d.html | 30 + search/files_d.js | 4 + search/files_e.html | 30 + search/files_e.js | 6 + search/files_f.html | 30 + search/files_f.js | 6 + search/functions_0.html | 30 + search/functions_0.js | 28 + search/functions_1.html | 30 + search/functions_1.js | 6 + search/functions_10.html | 30 + search/functions_10.js | 17 + search/functions_11.html | 30 + search/functions_11.js | 36 + search/functions_12.html | 30 + search/functions_12.js | 17 + search/functions_13.html | 30 + search/functions_13.js | 6 + search/functions_14.html | 30 + search/functions_14.js | 7 + search/functions_15.html | 30 + search/functions_15.js | 6 + search/functions_16.html | 30 + search/functions_16.js | 4 + search/functions_17.html | 30 + search/functions_17.js | 19 + search/functions_2.html | 30 + search/functions_2.js | 23 + search/functions_3.html | 30 + search/functions_3.js | 10 + search/functions_4.html | 30 + search/functions_4.js | 5 + search/functions_5.html | 30 + search/functions_5.js | 8 + search/functions_6.html | 30 + search/functions_6.js | 31 + search/functions_7.html | 30 + search/functions_7.js | 7 + search/functions_8.html | 30 + search/functions_8.js | 12 + search/functions_9.html | 30 + search/functions_9.js | 4 + search/functions_a.html | 30 + search/functions_a.js | 18 + search/functions_b.html | 30 + search/functions_b.js | 5 + search/functions_c.html | 30 + search/functions_c.js | 7 + search/functions_d.html | 30 + search/functions_d.js | 20 + search/functions_e.html | 30 + search/functions_e.js | 21 + search/functions_f.html | 30 + search/functions_f.js | 6 + search/mag_sel.png | Bin 0 -> 465 bytes search/namespaces_0.html | 30 + search/namespaces_0.js | 4 + search/nomatches.html | 12 + search/pages_0.html | 30 + search/pages_0.js | 4 + search/pages_1.html | 30 + search/pages_1.js | 4 + search/related_0.html | 30 + search/related_0.js | 5 + search/search.css | 271 ++ search/search.js | 814 ++++++ search/search_l.png | Bin 0 -> 567 bytes search/search_m.png | Bin 0 -> 158 bytes search/search_r.png | Bin 0 -> 553 bytes search/searchdata.js | 39 + search/typedefs_0.html | 30 + search/typedefs_0.js | 4 + search/typedefs_1.html | 30 + search/typedefs_1.js | 5 + search/typedefs_10.html | 30 + search/typedefs_10.js | 4 + search/typedefs_11.html | 30 + search/typedefs_11.js | 4 + search/typedefs_12.html | 30 + search/typedefs_12.js | 6 + search/typedefs_13.html | 30 + search/typedefs_13.js | 5 + search/typedefs_2.html | 30 + search/typedefs_2.js | 4 + search/typedefs_3.html | 30 + search/typedefs_3.js | 6 + search/typedefs_4.html | 30 + search/typedefs_4.js | 4 + search/typedefs_5.html | 30 + search/typedefs_5.js | 5 + search/typedefs_6.html | 30 + search/typedefs_6.js | 5 + search/typedefs_7.html | 30 + search/typedefs_7.js | 4 + search/typedefs_8.html | 30 + search/typedefs_8.js | 5 + search/typedefs_9.html | 30 + search/typedefs_9.js | 6 + search/typedefs_a.html | 30 + search/typedefs_a.js | 4 + search/typedefs_b.html | 30 + search/typedefs_b.js | 6 + search/typedefs_c.html | 30 + search/typedefs_c.js | 4 + search/typedefs_d.html | 30 + search/typedefs_d.js | 4 + search/typedefs_e.html | 30 + search/typedefs_e.js | 4 + search/typedefs_f.html | 30 + search/typedefs_f.js | 6 + search/variables_0.html | 30 + search/variables_0.js | 5 + search/variables_1.html | 30 + search/variables_1.js | 4 + search/variables_2.html | 30 + search/variables_2.js | 5 + search/variables_3.html | 30 + search/variables_3.js | 4 + search/variables_4.html | 30 + search/variables_4.js | 5 + search/variables_5.html | 30 + search/variables_5.js | 5 + search/variables_6.html | 30 + search/variables_6.js | 8 + search/variables_7.html | 30 + search/variables_7.js | 4 + search/variables_8.html | 30 + search/variables_8.js | 4 + search/variables_9.html | 30 + search/variables_9.js | 4 + search/variables_a.html | 30 + search/variables_a.js | 5 + search/variables_b.html | 30 + search/variables_b.js | 8 + search/variables_c.html | 30 + search/variables_c.js | 4 + search/variables_d.html | 30 + search/variables_d.js | 4 + service__client__handler_8h.html | 151 + service__client__handler_8h__incl.map | 9 + service__client__handler_8h__incl.md5 | 1 + service__client__handler_8h__incl.png | Bin 0 -> 16525 bytes service__client__handler_8h_source.html | 211 ++ service__client__handler_8hpp_source.html | 432 +++ shapes_8h.html | 172 ++ shapes_8h__dep__incl.map | 5 + shapes_8h__dep__incl.md5 | 1 + shapes_8h__dep__incl.png | Bin 0 -> 11793 bytes shapes_8h__incl.map | 5 + shapes_8h__incl.md5 | 1 + shapes_8h__incl.png | Bin 0 -> 7598 bytes shapes_8h_source.html | 427 +++ simple__example_8cpp.html | 143 + simple__example_8cpp.js | 4 + simple__example_8cpp__incl.map | 15 + simple__example_8cpp__incl.md5 | 1 + simple__example_8cpp__incl.png | Bin 0 -> 50194 bytes splitbar.png | Bin 0 -> 314 bytes structMyPoint-members.html | 107 + structMyPoint.html | 124 + structMyPoint.js | 6 + structdegrees-members.html | 138 + structdegrees.html | 256 ++ structdegrees__coll__graph.map | 4 + structdegrees__coll__graph.md5 | 1 + structdegrees__coll__graph.png | Bin 0 -> 4944 bytes structdegrees__inherit__graph.map | 4 + structdegrees__inherit__graph.md5 | 1 + structdegrees__inherit__graph.png | Bin 0 -> 4944 bytes ...erter_1_1EulerFormatException-members.html | 105 + ...tudeConverter_1_1EulerFormatException.html | 144 + ...titudeConverter_1_1EulerFormatException.js | 4 + ...r_1_1EulerFormatException__coll__graph.map | 4 + ...r_1_1EulerFormatException__coll__graph.md5 | 1 + ...r_1_1EulerFormatException__coll__graph.png | Bin 0 -> 5354 bytes ..._1EulerFormatException__inherit__graph.map | 4 + ..._1EulerFormatException__inherit__graph.md5 | 1 + ..._1EulerFormatException__inherit__graph.png | Bin 0 -> 5354 bytes ...verter_1_1GetHeadingException-members.html | 105 + ...itudeConverter_1_1GetHeadingException.html | 144 + ...ttitudeConverter_1_1GetHeadingException.js | 4 + ...er_1_1GetHeadingException__coll__graph.map | 4 + ...er_1_1GetHeadingException__coll__graph.md5 | 1 + ...er_1_1GetHeadingException__coll__graph.png | Bin 0 -> 5615 bytes ...1_1GetHeadingException__inherit__graph.map | 4 + ...1_1GetHeadingException__inherit__graph.md5 | 1 + ...1_1GetHeadingException__inherit__graph.png | Bin 0 -> 5615 bytes ...r_1_1InvalidAttitudeException-members.html | 105 + ...Converter_1_1InvalidAttitudeException.html | 144 + ...deConverter_1_1InvalidAttitudeException.js | 4 + ...1InvalidAttitudeException__coll__graph.map | 4 + ...1InvalidAttitudeException__coll__graph.md5 | 1 + ...1InvalidAttitudeException__coll__graph.png | Bin 0 -> 5232 bytes ...validAttitudeException__inherit__graph.map | 4 + ...validAttitudeException__inherit__graph.md5 | 1 + ...validAttitudeException__inherit__graph.png | Bin 0 -> 5232 bytes ...nverter_1_1MathErrorException-members.html | 105 + ...titudeConverter_1_1MathErrorException.html | 144 + ...AttitudeConverter_1_1MathErrorException.js | 4 + ...ter_1_1MathErrorException__coll__graph.map | 4 + ...ter_1_1MathErrorException__coll__graph.md5 | 1 + ...ter_1_1MathErrorException__coll__graph.png | Bin 0 -> 5444 bytes ..._1_1MathErrorException__inherit__graph.map | 4 + ..._1_1MathErrorException__inherit__graph.md5 | 1 + ..._1_1MathErrorException__inherit__graph.png | Bin 0 -> 5444 bytes ...verter_1_1SetHeadingException-members.html | 105 + ...itudeConverter_1_1SetHeadingException.html | 144 + ...ttitudeConverter_1_1SetHeadingException.js | 4 + ...er_1_1SetHeadingException__coll__graph.map | 4 + ...er_1_1SetHeadingException__coll__graph.md5 | 1 + ...er_1_1SetHeadingException__coll__graph.png | Bin 0 -> 5732 bytes ...1_1SetHeadingException__inherit__graph.map | 4 + ...1_1SetHeadingException__inherit__graph.md5 | 1 + ...1_1SetHeadingException__inherit__graph.png | Bin 0 -> 5732 bytes ...mrs__lib_1_1ImagePubliserData-members.html | 109 + structmrs__lib_1_1ImagePubliserData.html | 131 + structmrs__lib_1_1ImagePubliserData.js | 8 + structmrs__lib_1_1Intersection-members.html | 108 + structmrs__lib_1_1Intersection.html | 129 + structmrs__lib_1_1Intersection.js | 7 + ...1_1JLKF_1_1inverse__exception-members.html | 105 + ...rs__lib_1_1JLKF_1_1inverse__exception.html | 185 ++ ...tmrs__lib_1_1JLKF_1_1inverse__exception.js | 4 + ...LKF_1_1inverse__exception__coll__graph.map | 4 + ...LKF_1_1inverse__exception__coll__graph.md5 | 1 + ...LKF_1_1inverse__exception__coll__graph.png | Bin 0 -> 5273 bytes ..._1_1inverse__exception__inherit__graph.map | 4 + ..._1_1inverse__exception__inherit__graph.md5 | 1 + ..._1_1inverse__exception__inherit__graph.png | Bin 0 -> 5273 bytes ...ilterAloamGarm_1_1statecov__t-members.html | 110 + ...1KalmanFilterAloamGarm_1_1statecov__t.html | 146 + ...1_1KalmanFilterAloamGarm_1_1statecov__t.js | 9 + ..._1KalmanFilter_1_1statecov__t-members.html | 107 + ...s__lib_1_1KalmanFilter_1_1statecov__t.html | 134 + ...mrs__lib_1_1KalmanFilter_1_1statecov__t.js | 6 + ..._1_1LKF_1_1inverse__exception-members.html | 105 + ...mrs__lib_1_1LKF_1_1inverse__exception.html | 185 ++ ...ctmrs__lib_1_1LKF_1_1inverse__exception.js | 4 + ...LKF_1_1inverse__exception__coll__graph.map | 4 + ...LKF_1_1inverse__exception__coll__graph.md5 | 1 + ...LKF_1_1inverse__exception__coll__graph.png | Bin 0 -> 5134 bytes ..._1_1inverse__exception__inherit__graph.map | 4 + ..._1_1inverse__exception__inherit__graph.md5 | 1 + ..._1_1inverse__exception__inherit__graph.png | Bin 0 -> 5134 bytes ...b_1_1Polygon_1_1ExtraVertices-members.html | 105 + ...tmrs__lib_1_1Polygon_1_1ExtraVertices.html | 137 + structmrs__lib_1_1Polygon_1_1ExtraVertices.js | 4 + ...1Polygon_1_1ExtraVertices__coll__graph.map | 4 + ...1Polygon_1_1ExtraVertices__coll__graph.md5 | 1 + ...1Polygon_1_1ExtraVertices__coll__graph.png | Bin 0 -> 4712 bytes ...lygon_1_1ExtraVertices__inherit__graph.map | 4 + ...lygon_1_1ExtraVertices__inherit__graph.md5 | 1 + ...lygon_1_1ExtraVertices__inherit__graph.png | Bin 0 -> 4712 bytes ...lygon_1_1WrongNumberOfColumns-members.html | 105 + ...ib_1_1Polygon_1_1WrongNumberOfColumns.html | 137 + ..._lib_1_1Polygon_1_1WrongNumberOfColumns.js | 4 + ...n_1_1WrongNumberOfColumns__coll__graph.map | 4 + ...n_1_1WrongNumberOfColumns__coll__graph.md5 | 1 + ...n_1_1WrongNumberOfColumns__coll__graph.png | Bin 0 -> 5196 bytes ..._1WrongNumberOfColumns__inherit__graph.map | 4 + ..._1WrongNumberOfColumns__inherit__graph.md5 | 1 + ..._1WrongNumberOfColumns__inherit__graph.png | Bin 0 -> 5196 bytes ...ygon_1_1WrongNumberOfVertices-members.html | 105 + ...b_1_1Polygon_1_1WrongNumberOfVertices.html | 137 + ...lib_1_1Polygon_1_1WrongNumberOfVertices.js | 4 + ..._1_1WrongNumberOfVertices__coll__graph.map | 4 + ..._1_1WrongNumberOfVertices__coll__graph.md5 | 1 + ..._1_1WrongNumberOfVertices__coll__graph.png | Bin 0 -> 5423 bytes ...1WrongNumberOfVertices__inherit__graph.map | 4 + ...1WrongNumberOfVertices__inherit__graph.md5 | 1 + ...1WrongNumberOfVertices__inherit__graph.png | Bin 0 -> 5423 bytes ..._1_1SafetyZone_1_1BorderError-members.html | 105 + ...mrs__lib_1_1SafetyZone_1_1BorderError.html | 137 + ...ctmrs__lib_1_1SafetyZone_1_1BorderError.js | 4 + ...SafetyZone_1_1BorderError__coll__graph.map | 4 + ...SafetyZone_1_1BorderError__coll__graph.md5 | 1 + ...SafetyZone_1_1BorderError__coll__graph.png | Bin 0 -> 4714 bytes ...etyZone_1_1BorderError__inherit__graph.map | 4 + ...etyZone_1_1BorderError__inherit__graph.md5 | 1 + ...etyZone_1_1BorderError__inherit__graph.png | Bin 0 -> 4714 bytes ..._1_1ScopeTimer_1_1time__point-members.html | 110 + ...mrs__lib_1_1ScopeTimer_1_1time__point.html | 138 + ...ctmrs__lib_1_1ScopeTimer_1_1time__point.js | 9 + ...ib_1_1SubscribeHandlerOptions-members.html | 116 + ...ctmrs__lib_1_1SubscribeHandlerOptions.html | 169 ++ structmrs__lib_1_1SubscribeHandlerOptions.js | 15 + ..._1_1UKF_1_1inverse__exception-members.html | 105 + ...mrs__lib_1_1UKF_1_1inverse__exception.html | 147 + ...ctmrs__lib_1_1UKF_1_1inverse__exception.js | 4 + ...UKF_1_1inverse__exception__coll__graph.map | 4 + ...UKF_1_1inverse__exception__coll__graph.md5 | 1 + ...UKF_1_1inverse__exception__coll__graph.png | Bin 0 -> 5529 bytes ..._1_1inverse__exception__inherit__graph.map | 4 + ..._1_1inverse__exception__inherit__graph.md5 | 1 + ..._1_1inverse__exception__inherit__graph.png | Bin 0 -> 5529 bytes ...KF_1_1square__root__exception-members.html | 105 + ...lib_1_1UKF_1_1square__root__exception.html | 147 + ...__lib_1_1UKF_1_1square__root__exception.js | 4 + ..._1square__root__exception__coll__graph.map | 4 + ..._1square__root__exception__coll__graph.md5 | 1 + ..._1square__root__exception__coll__graph.png | Bin 0 -> 5338 bytes ...quare__root__exception__inherit__graph.map | 4 + ...quare__root__exception__inherit__graph.md5 | 1 + ...quare__root__exception__inherit__graph.png | Bin 0 -> 5338 bytes ...lib_1_1eigenvector__exception-members.html | 105 + structmrs__lib_1_1eigenvector__exception.html | 184 ++ structmrs__lib_1_1eigenvector__exception.js | 4 + ...1_1eigenvector__exception__coll__graph.map | 4 + ...1_1eigenvector__exception__coll__graph.md5 | 1 + ...1_1eigenvector__exception__coll__graph.png | Bin 0 -> 4419 bytes ...eigenvector__exception__inherit__graph.map | 4 + ...eigenvector__exception__inherit__graph.md5 | 1 + ...eigenvector__exception__inherit__graph.png | Bin 0 -> 4419 bytes ...rs__lib_1_1geometry_1_1cyclic-members.html | 140 + structmrs__lib_1_1geometry_1_1cyclic.html | 1373 +++++++++ structmrs__lib_1_1geometry_1_1cyclic.js | 17 + ...s__lib_1_1geometry_1_1degrees-members.html | 138 + structmrs__lib_1_1geometry_1_1degrees.html | 260 ++ ...ib_1_1geometry_1_1degrees__coll__graph.map | 4 + ...ib_1_1geometry_1_1degrees__coll__graph.md5 | 1 + ...ib_1_1geometry_1_1degrees__coll__graph.png | Bin 0 -> 5545 bytes ...1_1geometry_1_1degrees__inherit__graph.map | 4 + ...1_1geometry_1_1degrees__inherit__graph.md5 | 1 + ...1_1geometry_1_1degrees__inherit__graph.png | Bin 0 -> 5545 bytes ...s__lib_1_1geometry_1_1radians-members.html | 138 + structmrs__lib_1_1geometry_1_1radians.html | 262 ++ ...ib_1_1geometry_1_1radians__coll__graph.map | 4 + ...ib_1_1geometry_1_1radians__coll__graph.md5 | 1 + ...ib_1_1geometry_1_1radians__coll__graph.png | Bin 0 -> 5698 bytes ...1_1geometry_1_1radians__inherit__graph.map | 4 + ...1_1geometry_1_1radians__inherit__graph.md5 | 1 + ...1_1geometry_1_1radians__inherit__graph.png | Bin 0 -> 5698 bytes ...__lib_1_1geometry_1_1sdegrees-members.html | 138 + structmrs__lib_1_1geometry_1_1sdegrees.html | 260 ++ ...b_1_1geometry_1_1sdegrees__coll__graph.map | 4 + ...b_1_1geometry_1_1sdegrees__coll__graph.md5 | 1 + ...b_1_1geometry_1_1sdegrees__coll__graph.png | Bin 0 -> 6199 bytes ..._1geometry_1_1sdegrees__inherit__graph.map | 4 + ..._1geometry_1_1sdegrees__inherit__graph.md5 | 1 + ..._1geometry_1_1sdegrees__inherit__graph.png | Bin 0 -> 6199 bytes ...__lib_1_1geometry_1_1sradians-members.html | 138 + structmrs__lib_1_1geometry_1_1sradians.html | 262 ++ ...b_1_1geometry_1_1sradians__coll__graph.map | 4 + ...b_1_1geometry_1_1sradians__coll__graph.md5 | 1 + ...b_1_1geometry_1_1sradians__coll__graph.png | Bin 0 -> 6292 bytes ..._1geometry_1_1sradians__inherit__graph.map | 4 + ..._1geometry_1_1sradians__inherit__graph.md5 | 1 + ..._1geometry_1_1sradians__inherit__graph.png | Bin 0 -> 6292 bytes ...ttle__model_1_1MotorParams__t-members.html | 107 + ...ic__throttle__model_1_1MotorParams__t.html | 121 + ...atic__throttle__model_1_1MotorParams__t.js | 6 + structobj__t-members.html | 124 + structobj__t.html | 176 ++ structobj__t.js | 23 + ...lib_1_1AttitudeConverter_01_4-members.html | 105 + ..._01mrs__lib_1_1AttitudeConverter_01_4.html | 115 + ...00_01mrs__lib_1_1AttitudeConverter_01_4.js | 4 + ...lib_1_1AttitudeConverter_01_4-members.html | 105 + ..._01mrs__lib_1_1AttitudeConverter_01_4.html | 115 + ...00_01mrs__lib_1_1AttitudeConverter_01_4.js | 4 + ...lib_1_1AttitudeConverter_01_4-members.html | 105 + ..._01mrs__lib_1_1AttitudeConverter_01_4.html | 115 + ...00_01mrs__lib_1_1AttitudeConverter_01_4.js | 4 + ...lib_1_1AttitudeConverter_01_4-members.html | 105 + ..._01mrs__lib_1_1AttitudeConverter_01_4.html | 115 + subscribe__handler_2example_8cpp.html | 163 ++ subscribe__handler_2example_8cpp.js | 8 + subscribe__handler_2example_8cpp__incl.map | 15 + subscribe__handler_2example_8cpp__incl.md5 | 1 + subscribe__handler_2example_8cpp__incl.png | Bin 0 -> 49162 bytes subscribe__handler_8h.html | 182 ++ subscribe__handler_8h.js | 7 + subscribe__handler_8h__dep__incl.map | 6 + subscribe__handler_8h__dep__incl.md5 | 1 + subscribe__handler_8h__dep__incl.png | Bin 0 -> 14646 bytes subscribe__handler_8h__incl.map | 13 + subscribe__handler_8h__incl.md5 | 1 + subscribe__handler_8h__incl.png | Bin 0 -> 43738 bytes subscribe__handler_8h_source.html | 408 +++ subscribe__handler_8hpp_source.html | 457 +++ subscribe_handler_2example_8cpp-example.html | 190 ++ ..._handler_2simple_example_8cpp-example.html | 148 + sync_off.png | Bin 0 -> 853 bytes sync_on.png | Bin 0 -> 845 bytes tab_a.png | Bin 0 -> 142 bytes tab_b.png | Bin 0 -> 169 bytes tab_h.png | Bin 0 -> 177 bytes tab_s.png | Bin 0 -> 184 bytes tabs.css | 1 + timeout__manager_8h.html | 152 + timeout__manager_8h__dep__incl.map | 7 + timeout__manager_8h__dep__incl.md5 | 1 + timeout__manager_8h__dep__incl.png | Bin 0 -> 17860 bytes timeout__manager_8h__incl.map | 4 + timeout__manager_8h__incl.md5 | 1 + timeout__manager_8h__incl.png | Bin 0 -> 4174 bytes timeout__manager_8h_source.html | 177 ++ timer_8h_source.html | 240 ++ timer_8hpp_source.html | 198 ++ transform__broadcaster_8h_source.html | 135 + transformer_8h_source.html | 504 ++++ transformer_8hpp_source.html | 303 ++ ukf_2example_8cpp-example.html | 269 ++ ukf_2example_8cpp.html | 234 ++ ukf_2example_8cpp.js | 45 + ukf_2example_8cpp__incl.map | 9 + ukf_2example_8cpp__incl.md5 | 1 + ukf_2example_8cpp__incl.png | Bin 0 -> 20044 bytes ukf_8h.html | 164 ++ ukf_8h__dep__incl.map | 7 + ukf_8h__dep__incl.md5 | 1 + ukf_8h__dep__incl.png | Bin 0 -> 12790 bytes ukf_8h__incl.map | 7 + ukf_8h__incl.md5 | 1 + ukf_8h__incl.png | Bin 0 -> 11828 bytes ukf_8h_source.html | 246 ++ ukf_8hpp.html | 151 + ukf_8hpp__dep__incl.map | 7 + ukf_8hpp__dep__incl.md5 | 1 + ukf_8hpp__dep__incl.png | Bin 0 -> 11555 bytes ukf_8hpp__incl.map | 7 + ukf_8hpp__incl.md5 | 1 + ukf_8hpp__incl.png | Bin 0 -> 12715 bytes ukf_8hpp_source.html | 400 +++ utils_8h.html | 189 ++ utils_8h.js | 10 + utils_8h__dep__incl.map | 6 + utils_8h__dep__incl.md5 | 1 + utils_8h__dep__incl.png | Bin 0 -> 14340 bytes utils_8h__incl.map | 7 + utils_8h__incl.md5 | 1 + utils_8h__incl.png | Bin 0 -> 7654 bytes utils_8h_source.html | 190 ++ vector__converter_2example_8cpp.html | 159 + vector__converter_2example_8cpp.js | 7 + vector__converter_2example_8cpp__incl.map | 10 + vector__converter_2example_8cpp__incl.md5 | 1 + vector__converter_2example_8cpp__incl.png | Bin 0 -> 22008 bytes vector__converter_8h.html | 153 + vector__converter_8h.js | 4 + vector__converter_8h__dep__incl.map | 4 + vector__converter_8h__dep__incl.md5 | 1 + vector__converter_8h__dep__incl.png | Bin 0 -> 4959 bytes vector__converter_8h__incl.map | 6 + vector__converter_8h__incl.md5 | 1 + vector__converter_8h__incl.png | Bin 0 -> 9950 bytes vector__converter_8h_source.html | 128 + vector__converter_8hpp.html | 267 ++ vector__converter_8hpp.js | 15 + vector__converter_8hpp__dep__incl.map | 5 + vector__converter_8hpp__dep__incl.md5 | 1 + vector__converter_8hpp__dep__incl.png | Bin 0 -> 8593 bytes vector__converter_8hpp__incl.map | 4 + vector__converter_8hpp__incl.md5 | 1 + vector__converter_8hpp__incl.png | Bin 0 -> 5113 bytes vector__converter_8hpp_source.html | 189 ++ vector__converter__types_8h_source.html | 110 + vector_converter_2example_8cpp-example.html | 180 ++ visual__object_8h.html | 176 ++ visual__object_8h.js | 10 + visual__object_8h__dep__incl.map | 4 + visual__object_8h__dep__incl.md5 | 1 + visual__object_8h__dep__incl.png | Bin 0 -> 5709 bytes visual__object_8h__incl.map | 11 + visual__object_8h__incl.md5 | 1 + visual__object_8h__incl.png | Bin 0 -> 21912 bytes visual__object_8h_source.html | 206 ++ 1597 files changed, 104510 insertions(+) create mode 100644 .nojekyll create mode 100644 annotated.html create mode 100644 annotated_dup.js create mode 100644 attitude__converter_8h.html create mode 100644 attitude__converter_8h.js create mode 100644 attitude__converter_8h__dep__incl.map create mode 100644 attitude__converter_8h__dep__incl.md5 create mode 100644 attitude__converter_8h__dep__incl.png create mode 100644 attitude__converter_8h__incl.map create mode 100644 attitude__converter_8h__incl.md5 create mode 100644 attitude__converter_8h__incl.png create mode 100644 attitude__converter_8h_source.html create mode 100644 batch__visualizer_8h.html create mode 100644 batch__visualizer_8h.js create mode 100644 batch__visualizer_8h__incl.map create mode 100644 batch__visualizer_8h__incl.md5 create mode 100644 batch__visualizer_8h__incl.png create mode 100644 batch__visualizer_8h_source.html create mode 100644 bc_s.png create mode 100644 bdwn.png create mode 100644 citelist.html create mode 100644 classDynamicPublisher_1_1impl-members.html create mode 100644 classDynamicPublisher_1_1impl.html create mode 100644 classDynamicPublisher_1_1impl.js create mode 100644 classSubObject-members.html create mode 100644 classSubObject.html create mode 100644 classSubObject.js create mode 100644 classThreadTimer_1_1Impl-members.html create mode 100644 classThreadTimer_1_1Impl.html create mode 100644 classThreadTimer_1_1Impl.js create mode 100644 classVectorConverterTest.html create mode 100644 classVectorConverterTest__coll__graph.map create mode 100644 classVectorConverterTest__coll__graph.md5 create mode 100644 classVectorConverterTest__coll__graph.png create mode 100644 classVectorConverterTest__inherit__graph.map create mode 100644 classVectorConverterTest__inherit__graph.md5 create mode 100644 classVectorConverterTest__inherit__graph.png create mode 100644 classes.html create mode 100644 classmrs__lib_1_1AtomicScopeFlag-members.html create mode 100644 classmrs__lib_1_1AtomicScopeFlag.html create mode 100644 classmrs__lib_1_1AtomicScopeFlag.js create mode 100644 classmrs__lib_1_1AttitudeConverter-members.html create mode 100644 classmrs__lib_1_1AttitudeConverter.html create mode 100644 classmrs__lib_1_1AttitudeConverter.js create mode 100644 classmrs__lib_1_1BatchVisualizer-members.html create mode 100644 classmrs__lib_1_1BatchVisualizer.html create mode 100644 classmrs__lib_1_1BatchVisualizer.js create mode 100644 classmrs__lib_1_1DKF-members.html create mode 100644 classmrs__lib_1_1DKF.html create mode 100644 classmrs__lib_1_1DKF.js create mode 100644 classmrs__lib_1_1DKF__coll__graph.map create mode 100644 classmrs__lib_1_1DKF__coll__graph.md5 create mode 100644 classmrs__lib_1_1DKF__coll__graph.png create mode 100644 classmrs__lib_1_1DKF__inherit__graph.map create mode 100644 classmrs__lib_1_1DKF__inherit__graph.md5 create mode 100644 classmrs__lib_1_1DKF__inherit__graph.png create mode 100644 classmrs__lib_1_1DynamicPublisher-members.html create mode 100644 classmrs__lib_1_1DynamicPublisher.html create mode 100644 classmrs__lib_1_1DynamicPublisher.js create mode 100644 classmrs__lib_1_1DynamicReconfigureMgr-members.html create mode 100644 classmrs__lib_1_1DynamicReconfigureMgr.html create mode 100644 classmrs__lib_1_1DynamicReconfigureMgr.js create mode 100644 classmrs__lib_1_1EulerAttitude-members.html create mode 100644 classmrs__lib_1_1EulerAttitude.html create mode 100644 classmrs__lib_1_1EulerAttitude.js create mode 100644 classmrs__lib_1_1IirFilter-members.html create mode 100644 classmrs__lib_1_1IirFilter.html create mode 100644 classmrs__lib_1_1IirFilter.js create mode 100644 classmrs__lib_1_1ImagePublisher-members.html create mode 100644 classmrs__lib_1_1ImagePublisher.html create mode 100644 classmrs__lib_1_1ImagePublisher.js create mode 100644 classmrs__lib_1_1JLKF-members.html create mode 100644 classmrs__lib_1_1JLKF.html create mode 100644 classmrs__lib_1_1JLKF.js create mode 100644 classmrs__lib_1_1JLKF__coll__graph.map create mode 100644 classmrs__lib_1_1JLKF__coll__graph.md5 create mode 100644 classmrs__lib_1_1JLKF__coll__graph.png create mode 100644 classmrs__lib_1_1JLKF__inherit__graph.map create mode 100644 classmrs__lib_1_1JLKF__inherit__graph.md5 create mode 100644 classmrs__lib_1_1JLKF__inherit__graph.png create mode 100644 classmrs__lib_1_1KalmanFilter-members.html create mode 100644 classmrs__lib_1_1KalmanFilter.html create mode 100644 classmrs__lib_1_1KalmanFilter.js create mode 100644 classmrs__lib_1_1KalmanFilterAloamGarm-members.html create mode 100644 classmrs__lib_1_1KalmanFilterAloamGarm.html create mode 100644 classmrs__lib_1_1KalmanFilterAloamGarm.js create mode 100644 classmrs__lib_1_1KalmanFilterAloamGarm__inherit__graph.map create mode 100644 classmrs__lib_1_1KalmanFilterAloamGarm__inherit__graph.md5 create mode 100644 classmrs__lib_1_1KalmanFilterAloamGarm__inherit__graph.png create mode 100644 classmrs__lib_1_1KalmanFilter__inherit__graph.map create mode 100644 classmrs__lib_1_1KalmanFilter__inherit__graph.md5 create mode 100644 classmrs__lib_1_1KalmanFilter__inherit__graph.png create mode 100644 classmrs__lib_1_1LKF-members.html create mode 100644 classmrs__lib_1_1LKF.html create mode 100644 classmrs__lib_1_1LKF.js create mode 100644 classmrs__lib_1_1LKF__MRS__odom-members.html create mode 100644 classmrs__lib_1_1LKF__MRS__odom.html create mode 100644 classmrs__lib_1_1LKF__MRS__odom.js create mode 100644 classmrs__lib_1_1LKF__MRS__odom__coll__graph.map create mode 100644 classmrs__lib_1_1LKF__MRS__odom__coll__graph.md5 create mode 100644 classmrs__lib_1_1LKF__MRS__odom__coll__graph.png create mode 100644 classmrs__lib_1_1LKF__MRS__odom__inherit__graph.map create mode 100644 classmrs__lib_1_1LKF__MRS__odom__inherit__graph.md5 create mode 100644 classmrs__lib_1_1LKF__MRS__odom__inherit__graph.png create mode 100644 classmrs__lib_1_1LKF__coll__graph.map create mode 100644 classmrs__lib_1_1LKF__coll__graph.md5 create mode 100644 classmrs__lib_1_1LKF__coll__graph.png create mode 100644 classmrs__lib_1_1LKF__inherit__graph.map create mode 100644 classmrs__lib_1_1LKF__inherit__graph.md5 create mode 100644 classmrs__lib_1_1LKF__inherit__graph.png create mode 100644 classmrs__lib_1_1MRSTimer-members.html create mode 100644 classmrs__lib_1_1MRSTimer.html create mode 100644 classmrs__lib_1_1MRSTimer.js create mode 100644 classmrs__lib_1_1MRSTimer__inherit__graph.map create mode 100644 classmrs__lib_1_1MRSTimer__inherit__graph.md5 create mode 100644 classmrs__lib_1_1MRSTimer__inherit__graph.png create mode 100644 classmrs__lib_1_1MedianFilter-members.html create mode 100644 classmrs__lib_1_1MedianFilter.html create mode 100644 classmrs__lib_1_1MedianFilter.js create mode 100644 classmrs__lib_1_1NCLKF-members.html create mode 100644 classmrs__lib_1_1NCLKF.html create mode 100644 classmrs__lib_1_1NCLKF.js create mode 100644 classmrs__lib_1_1NCLKF__coll__graph.map create mode 100644 classmrs__lib_1_1NCLKF__coll__graph.md5 create mode 100644 classmrs__lib_1_1NCLKF__coll__graph.png create mode 100644 classmrs__lib_1_1NCLKF__inherit__graph.map create mode 100644 classmrs__lib_1_1NCLKF__inherit__graph.md5 create mode 100644 classmrs__lib_1_1NCLKF__inherit__graph.png create mode 100644 classmrs__lib_1_1NCLKF__partial-members.html create mode 100644 classmrs__lib_1_1NCLKF__partial.html create mode 100644 classmrs__lib_1_1NCLKF__partial.js create mode 100644 classmrs__lib_1_1NCLKF__partial__coll__graph.map create mode 100644 classmrs__lib_1_1NCLKF__partial__coll__graph.md5 create mode 100644 classmrs__lib_1_1NCLKF__partial__coll__graph.png create mode 100644 classmrs__lib_1_1NCLKF__partial__inherit__graph.map create mode 100644 classmrs__lib_1_1NCLKF__partial__inherit__graph.md5 create mode 100644 classmrs__lib_1_1NCLKF__partial__inherit__graph.png create mode 100644 classmrs__lib_1_1NCUKF-members.html create mode 100644 classmrs__lib_1_1NCUKF.html create mode 100644 classmrs__lib_1_1NCUKF.js create mode 100644 classmrs__lib_1_1NCUKF__coll__graph.map create mode 100644 classmrs__lib_1_1NCUKF__coll__graph.md5 create mode 100644 classmrs__lib_1_1NCUKF__coll__graph.png create mode 100644 classmrs__lib_1_1NCUKF__inherit__graph.map create mode 100644 classmrs__lib_1_1NCUKF__inherit__graph.md5 create mode 100644 classmrs__lib_1_1NCUKF__inherit__graph.png create mode 100644 classmrs__lib_1_1NotchFilter-members.html create mode 100644 classmrs__lib_1_1NotchFilter.html create mode 100644 classmrs__lib_1_1NotchFilter.js create mode 100644 classmrs__lib_1_1ParamLoader-members.html create mode 100644 classmrs__lib_1_1ParamLoader.html create mode 100644 classmrs__lib_1_1ParamLoader.js create mode 100644 classmrs__lib_1_1ParamProvider-members.html create mode 100644 classmrs__lib_1_1ParamProvider.html create mode 100644 classmrs__lib_1_1ParamProvider.js create mode 100644 classmrs__lib_1_1Polygon-members.html create mode 100644 classmrs__lib_1_1Polygon.html create mode 100644 classmrs__lib_1_1Polygon.js create mode 100644 classmrs__lib_1_1Profiler-members.html create mode 100644 classmrs__lib_1_1Profiler.html create mode 100644 classmrs__lib_1_1Profiler.js create mode 100644 classmrs__lib_1_1PublisherHandler-members.html create mode 100644 classmrs__lib_1_1PublisherHandler.html create mode 100644 classmrs__lib_1_1PublisherHandler.js create mode 100644 classmrs__lib_1_1PublisherHandler__impl-members.html create mode 100644 classmrs__lib_1_1PublisherHandler__impl.html create mode 100644 classmrs__lib_1_1PublisherHandler__impl.js create mode 100644 classmrs__lib_1_1RHEIV-members.html create mode 100644 classmrs__lib_1_1RHEIV.html create mode 100644 classmrs__lib_1_1RHEIV.js create mode 100644 classmrs__lib_1_1ROSTimer-members.html create mode 100644 classmrs__lib_1_1ROSTimer.html create mode 100644 classmrs__lib_1_1ROSTimer.js create mode 100644 classmrs__lib_1_1ROSTimer__coll__graph.map create mode 100644 classmrs__lib_1_1ROSTimer__coll__graph.md5 create mode 100644 classmrs__lib_1_1ROSTimer__coll__graph.png create mode 100644 classmrs__lib_1_1ROSTimer__inherit__graph.map create mode 100644 classmrs__lib_1_1ROSTimer__inherit__graph.md5 create mode 100644 classmrs__lib_1_1ROSTimer__inherit__graph.png create mode 100644 classmrs__lib_1_1Repredictor-members.html create mode 100644 classmrs__lib_1_1Repredictor.html create mode 100644 classmrs__lib_1_1Repredictor.js create mode 100644 classmrs__lib_1_1RepredictorAloamgarm-members.html create mode 100644 classmrs__lib_1_1RepredictorAloamgarm.html create mode 100644 classmrs__lib_1_1RepredictorAloamgarm.js create mode 100644 classmrs__lib_1_1RepredictorAloamgarm__coll__graph.map create mode 100644 classmrs__lib_1_1RepredictorAloamgarm__coll__graph.md5 create mode 100644 classmrs__lib_1_1RepredictorAloamgarm__coll__graph.png create mode 100644 classmrs__lib_1_1RepredictorAloamgarm__inherit__graph.map create mode 100644 classmrs__lib_1_1RepredictorAloamgarm__inherit__graph.md5 create mode 100644 classmrs__lib_1_1RepredictorAloamgarm__inherit__graph.png create mode 100644 classmrs__lib_1_1Routine-members.html create mode 100644 classmrs__lib_1_1Routine.html create mode 100644 classmrs__lib_1_1Routine.js create mode 100644 classmrs__lib_1_1SafetyZone-members.html create mode 100644 classmrs__lib_1_1SafetyZone.html create mode 100644 classmrs__lib_1_1SafetyZone.js create mode 100644 classmrs__lib_1_1ScopeTimer-members.html create mode 100644 classmrs__lib_1_1ScopeTimer.html create mode 100644 classmrs__lib_1_1ScopeTimer.js create mode 100644 classmrs__lib_1_1ScopeTimerLogger-members.html create mode 100644 classmrs__lib_1_1ScopeTimerLogger.html create mode 100644 classmrs__lib_1_1ScopeTimerLogger.js create mode 100644 classmrs__lib_1_1ServiceClientHandler-members.html create mode 100644 classmrs__lib_1_1ServiceClientHandler.html create mode 100644 classmrs__lib_1_1ServiceClientHandler.js create mode 100644 classmrs__lib_1_1ServiceClientHandler__impl-members.html create mode 100644 classmrs__lib_1_1ServiceClientHandler__impl.html create mode 100644 classmrs__lib_1_1ServiceClientHandler__impl.js create mode 100644 classmrs__lib_1_1SubscribeHandler-members.html create mode 100644 classmrs__lib_1_1SubscribeHandler.html create mode 100644 classmrs__lib_1_1SubscribeHandler.js create mode 100644 classmrs__lib_1_1SubscribeHandler_1_1Impl-members.html create mode 100644 classmrs__lib_1_1SubscribeHandler_1_1Impl.html create mode 100644 classmrs__lib_1_1SubscribeHandler_1_1Impl.js create mode 100644 classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe-members.html create mode 100644 classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe.html create mode 100644 classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe.js create mode 100644 classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe__coll__graph.map create mode 100644 classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe__coll__graph.md5 create mode 100644 classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe__coll__graph.png create mode 100644 classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe__inherit__graph.map create mode 100644 classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe__inherit__graph.md5 create mode 100644 classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe__inherit__graph.png create mode 100644 classmrs__lib_1_1SubscribeHandler_1_1Impl__inherit__graph.map create mode 100644 classmrs__lib_1_1SubscribeHandler_1_1Impl__inherit__graph.md5 create mode 100644 classmrs__lib_1_1SubscribeHandler_1_1Impl__inherit__graph.png create mode 100644 classmrs__lib_1_1ThreadTimer-members.html create mode 100644 classmrs__lib_1_1ThreadTimer.html create mode 100644 classmrs__lib_1_1ThreadTimer.js create mode 100644 classmrs__lib_1_1ThreadTimer__coll__graph.map create mode 100644 classmrs__lib_1_1ThreadTimer__coll__graph.md5 create mode 100644 classmrs__lib_1_1ThreadTimer__coll__graph.png create mode 100644 classmrs__lib_1_1ThreadTimer__inherit__graph.map create mode 100644 classmrs__lib_1_1ThreadTimer__inherit__graph.md5 create mode 100644 classmrs__lib_1_1ThreadTimer__inherit__graph.png create mode 100644 classmrs__lib_1_1TimeoutManager-members.html create mode 100644 classmrs__lib_1_1TimeoutManager.html create mode 100644 classmrs__lib_1_1TimeoutManager.js create mode 100644 classmrs__lib_1_1TransformBroadcaster-members.html create mode 100644 classmrs__lib_1_1TransformBroadcaster.html create mode 100644 classmrs__lib_1_1TransformBroadcaster.js create mode 100644 classmrs__lib_1_1Transformer-members.html create mode 100644 classmrs__lib_1_1Transformer.html create mode 100644 classmrs__lib_1_1Transformer.js create mode 100644 classmrs__lib_1_1UKF-members.html create mode 100644 classmrs__lib_1_1UKF.html create mode 100644 classmrs__lib_1_1UKF.js create mode 100644 classmrs__lib_1_1UKF__coll__graph.map create mode 100644 classmrs__lib_1_1UKF__coll__graph.md5 create mode 100644 classmrs__lib_1_1UKF__coll__graph.png create mode 100644 classmrs__lib_1_1UKF__inherit__graph.map create mode 100644 classmrs__lib_1_1UKF__inherit__graph.md5 create mode 100644 classmrs__lib_1_1UKF__inherit__graph.png create mode 100644 classmrs__lib_1_1Vector3Converter-members.html create mode 100644 classmrs__lib_1_1Vector3Converter.html create mode 100644 classmrs__lib_1_1Vector3Converter.js create mode 100644 classmrs__lib_1_1VisualObject-members.html create mode 100644 classmrs__lib_1_1VisualObject.html create mode 100644 classmrs__lib_1_1VisualObject.js create mode 100644 classmrs__lib_1_1geometry_1_1Cone-members.html create mode 100644 classmrs__lib_1_1geometry_1_1Cone.html create mode 100644 classmrs__lib_1_1geometry_1_1Cone.js create mode 100644 classmrs__lib_1_1geometry_1_1Cuboid-members.html create mode 100644 classmrs__lib_1_1geometry_1_1Cuboid.html create mode 100644 classmrs__lib_1_1geometry_1_1Cuboid.js create mode 100644 classmrs__lib_1_1geometry_1_1Cylinder-members.html create mode 100644 classmrs__lib_1_1geometry_1_1Cylinder.html create mode 100644 classmrs__lib_1_1geometry_1_1Cylinder.js create mode 100644 classmrs__lib_1_1geometry_1_1Ellipse-members.html create mode 100644 classmrs__lib_1_1geometry_1_1Ellipse.html create mode 100644 classmrs__lib_1_1geometry_1_1Ellipse.js create mode 100644 classmrs__lib_1_1geometry_1_1Ray-members.html create mode 100644 classmrs__lib_1_1geometry_1_1Ray.html create mode 100644 classmrs__lib_1_1geometry_1_1Ray.js create mode 100644 classmrs__lib_1_1geometry_1_1Rectangle-members.html create mode 100644 classmrs__lib_1_1geometry_1_1Rectangle.html create mode 100644 classmrs__lib_1_1geometry_1_1Rectangle.js create mode 100644 classmrs__lib_1_1geometry_1_1Triangle-members.html create mode 100644 classmrs__lib_1_1geometry_1_1Triangle.html create mode 100644 classmrs__lib_1_1geometry_1_1Triangle.js create mode 100644 classmrs__lib_1_1varstepLKF-members.html create mode 100644 classmrs__lib_1_1varstepLKF.html create mode 100644 classmrs__lib_1_1varstepLKF.js create mode 100644 classmrs__lib_1_1varstepLKF__coll__graph.map create mode 100644 classmrs__lib_1_1varstepLKF__coll__graph.md5 create mode 100644 classmrs__lib_1_1varstepLKF__coll__graph.png create mode 100644 classmrs__lib_1_1varstepLKF__inherit__graph.map create mode 100644 classmrs__lib_1_1varstepLKF__inherit__graph.md5 create mode 100644 classmrs__lib_1_1varstepLKF__inherit__graph.png create mode 100644 closed.png create mode 100644 conversions_8h_source.html create mode 100644 conversions__eigen_8h_source.html create mode 100644 conversions__opencv_8h_source.html create mode 100644 cyclic_8h.html create mode 100644 cyclic_8h.js create mode 100644 cyclic_8h__dep__incl.map create mode 100644 cyclic_8h__dep__incl.md5 create mode 100644 cyclic_8h__dep__incl.png create mode 100644 cyclic_8h__incl.map create mode 100644 cyclic_8h__incl.md5 create mode 100644 cyclic_8h__incl.png create mode 100644 cyclic_8h_source.html create mode 100644 cyclic__example_8cpp.html create mode 100644 cyclic__example_8cpp.js create mode 100644 cyclic__example_8cpp__incl.map create mode 100644 cyclic__example_8cpp__incl.md5 create mode 100644 cyclic__example_8cpp__incl.png create mode 100644 dir_000002_000003.html create mode 100644 dir_000002_000004.html create mode 100644 dir_000008_000001.html create mode 100644 dir_000009_000001.html create mode 100644 dir_000010_000001.html create mode 100644 dir_000012_000001.html create mode 100644 dir_000013_000001.html create mode 100644 dir_000014_000001.html create mode 100644 dir_000015_000001.html create mode 100644 dir_000016_000001.html create mode 100644 dir_000017_000001.html create mode 100644 dir_000018_000001.html create mode 100644 dir_000019_000001.html create mode 100644 dir_000020_000001.html create mode 100644 dir_000021_000001.html create mode 100644 dir_000023_000001.html create mode 100644 dir_000024_000001.html create mode 100644 dir_000025_000001.html create mode 100644 dir_000027_000001.html create mode 100644 dir_000028_000001.html create mode 100644 dir_000031_000001.html create mode 100644 dir_000032_000001.html create mode 100644 dir_000035_000001.html create mode 100644 dir_000036_000001.html create mode 100644 dir_000037_000001.html create mode 100644 dir_000038_000001.html create mode 100644 dir_000039_000001.html create mode 100644 dir_000040_000001.html create mode 100644 dir_000041_000001.html create mode 100644 dir_000043_000001.html create mode 100644 dir_000044_000001.html create mode 100644 dir_000045_000001.html create mode 100644 dir_000046_000001.html create mode 100644 dir_000047_000001.html create mode 100644 dir_000048_000001.html create mode 100644 dir_000049_000001.html create mode 100644 dir_000050_000001.html create mode 100644 dir_137818f07b93cd14b6ce92e51caad2df.html create mode 100644 dir_137818f07b93cd14b6ce92e51caad2df.js create mode 100644 dir_137818f07b93cd14b6ce92e51caad2df_dep.map create mode 100644 dir_137818f07b93cd14b6ce92e51caad2df_dep.md5 create mode 100644 dir_137818f07b93cd14b6ce92e51caad2df_dep.png create mode 100644 dir_13e138d54eb8818da29c3992edef070a.html create mode 100644 dir_13e138d54eb8818da29c3992edef070a.js create mode 100644 dir_13e138d54eb8818da29c3992edef070a_dep.map create mode 100644 dir_13e138d54eb8818da29c3992edef070a_dep.md5 create mode 100644 dir_13e138d54eb8818da29c3992edef070a_dep.png create mode 100644 dir_2489d4eba4efb8e04d8467655cf06abd.html create mode 100644 dir_2489d4eba4efb8e04d8467655cf06abd_dep.map create mode 100644 dir_2489d4eba4efb8e04d8467655cf06abd_dep.md5 create mode 100644 dir_2489d4eba4efb8e04d8467655cf06abd_dep.png create mode 100644 dir_313caf1132e152dd9b58bea13a4052ca.html create mode 100644 dir_313caf1132e152dd9b58bea13a4052ca_dep.map create mode 100644 dir_313caf1132e152dd9b58bea13a4052ca_dep.md5 create mode 100644 dir_313caf1132e152dd9b58bea13a4052ca_dep.png create mode 100644 dir_405fd32de3649961a5f009c7a3fe84df.html create mode 100644 dir_405fd32de3649961a5f009c7a3fe84df.js create mode 100644 dir_405fd32de3649961a5f009c7a3fe84df_dep.map create mode 100644 dir_405fd32de3649961a5f009c7a3fe84df_dep.md5 create mode 100644 dir_405fd32de3649961a5f009c7a3fe84df_dep.png create mode 100644 dir_459eb1320bcc4da5aac4b85751529118.html create mode 100644 dir_459eb1320bcc4da5aac4b85751529118.js create mode 100644 dir_459eb1320bcc4da5aac4b85751529118_dep.map create mode 100644 dir_459eb1320bcc4da5aac4b85751529118_dep.md5 create mode 100644 dir_459eb1320bcc4da5aac4b85751529118_dep.png create mode 100644 dir_47f9543a1dcda4cfb704fcee5b674cab.html create mode 100644 dir_47f9543a1dcda4cfb704fcee5b674cab_dep.map create mode 100644 dir_47f9543a1dcda4cfb704fcee5b674cab_dep.md5 create mode 100644 dir_47f9543a1dcda4cfb704fcee5b674cab_dep.png create mode 100644 dir_4c2e94721b2acbf7eee2d1efd59bf8db.html create mode 100644 dir_4c2e94721b2acbf7eee2d1efd59bf8db.js create mode 100644 dir_4c2e94721b2acbf7eee2d1efd59bf8db_dep.map create mode 100644 dir_4c2e94721b2acbf7eee2d1efd59bf8db_dep.md5 create mode 100644 dir_4c2e94721b2acbf7eee2d1efd59bf8db_dep.png create mode 100644 dir_4e76df18d944fae8b852653d4ae3a030.html create mode 100644 dir_4e76df18d944fae8b852653d4ae3a030.js create mode 100644 dir_52bd7864aeac0cbd0134df90af2e1447.html create mode 100644 dir_52bd7864aeac0cbd0134df90af2e1447_dep.map create mode 100644 dir_52bd7864aeac0cbd0134df90af2e1447_dep.md5 create mode 100644 dir_52bd7864aeac0cbd0134df90af2e1447_dep.png create mode 100644 dir_53e6fa9553ac22a5646d2a2b2d7b97a1.html create mode 100644 dir_59dc5f73bda78a76f6ce4f5474a95632.html create mode 100644 dir_59dc5f73bda78a76f6ce4f5474a95632_dep.map create mode 100644 dir_59dc5f73bda78a76f6ce4f5474a95632_dep.md5 create mode 100644 dir_59dc5f73bda78a76f6ce4f5474a95632_dep.png create mode 100644 dir_5b7f8725d4f972ca8245f6a979e7a433.html create mode 100644 dir_5b7f8725d4f972ca8245f6a979e7a433_dep.map create mode 100644 dir_5b7f8725d4f972ca8245f6a979e7a433_dep.md5 create mode 100644 dir_5b7f8725d4f972ca8245f6a979e7a433_dep.png create mode 100644 dir_5cd313a56eb052b35bf1996eeb3f0983.html create mode 100644 dir_5cd313a56eb052b35bf1996eeb3f0983_dep.map create mode 100644 dir_5cd313a56eb052b35bf1996eeb3f0983_dep.md5 create mode 100644 dir_5cd313a56eb052b35bf1996eeb3f0983_dep.png create mode 100644 dir_627f9e3e44b98db30b77a80b8afbb9e4.html create mode 100644 dir_627f9e3e44b98db30b77a80b8afbb9e4_dep.map create mode 100644 dir_627f9e3e44b98db30b77a80b8afbb9e4_dep.md5 create mode 100644 dir_627f9e3e44b98db30b77a80b8afbb9e4_dep.png create mode 100644 dir_6584bc0d88c193127476cb5dc95baf39.html create mode 100644 dir_68267d1309a1af8e8297ef4c3efbcdba.html create mode 100644 dir_68267d1309a1af8e8297ef4c3efbcdba.js create mode 100644 dir_68267d1309a1af8e8297ef4c3efbcdba_dep.map create mode 100644 dir_68267d1309a1af8e8297ef4c3efbcdba_dep.md5 create mode 100644 dir_68267d1309a1af8e8297ef4c3efbcdba_dep.png create mode 100644 dir_6aa5eb41b348da9a1414d58156a58f5e.html create mode 100644 dir_6aa5eb41b348da9a1414d58156a58f5e_dep.map create mode 100644 dir_6aa5eb41b348da9a1414d58156a58f5e_dep.md5 create mode 100644 dir_6aa5eb41b348da9a1414d58156a58f5e_dep.png create mode 100644 dir_7164529cd9c8f96b25598799ea656806.html create mode 100644 dir_7164529cd9c8f96b25598799ea656806.js create mode 100644 dir_7164529cd9c8f96b25598799ea656806_dep.map create mode 100644 dir_7164529cd9c8f96b25598799ea656806_dep.md5 create mode 100644 dir_7164529cd9c8f96b25598799ea656806_dep.png create mode 100644 dir_85b0de967ad5400027712e30c95ca897.html create mode 100644 dir_85b0de967ad5400027712e30c95ca897.js create mode 100644 dir_8607dcdb705c79ef4c5b76c004c42748.html create mode 100644 dir_8607dcdb705c79ef4c5b76c004c42748_dep.map create mode 100644 dir_8607dcdb705c79ef4c5b76c004c42748_dep.md5 create mode 100644 dir_8607dcdb705c79ef4c5b76c004c42748_dep.png create mode 100644 dir_8727baefb60589e29135367809dcd3f5.html create mode 100644 dir_8c35c1873c2690b478a9950d0638d637.html create mode 100644 dir_90cd026696fbcd71297c0f7b96e13f91.html create mode 100644 dir_90cd026696fbcd71297c0f7b96e13f91_dep.map create mode 100644 dir_90cd026696fbcd71297c0f7b96e13f91_dep.md5 create mode 100644 dir_90cd026696fbcd71297c0f7b96e13f91_dep.png create mode 100644 dir_9940084939548468b1ec99592b6e2693.html create mode 100644 dir_9940084939548468b1ec99592b6e2693_dep.map create mode 100644 dir_9940084939548468b1ec99592b6e2693_dep.md5 create mode 100644 dir_9940084939548468b1ec99592b6e2693_dep.png create mode 100644 dir_9dc292e6fbe26797bd73250f006569d0.html create mode 100644 dir_9dc292e6fbe26797bd73250f006569d0_dep.map create mode 100644 dir_9dc292e6fbe26797bd73250f006569d0_dep.md5 create mode 100644 dir_9dc292e6fbe26797bd73250f006569d0_dep.png create mode 100644 dir_9de178b262a8e864e9086749ac0a3a65.html create mode 100644 dir_9de178b262a8e864e9086749ac0a3a65_dep.map create mode 100644 dir_9de178b262a8e864e9086749ac0a3a65_dep.md5 create mode 100644 dir_9de178b262a8e864e9086749ac0a3a65_dep.png create mode 100644 dir_9e9e485811fd7b0342cca4e7c3cf123b.html create mode 100644 dir_9e9e485811fd7b0342cca4e7c3cf123b.js create mode 100644 dir_a1544262e4e34d2792f5ebccef9b84d2.html create mode 100644 dir_a1544262e4e34d2792f5ebccef9b84d2_dep.map create mode 100644 dir_a1544262e4e34d2792f5ebccef9b84d2_dep.md5 create mode 100644 dir_a1544262e4e34d2792f5ebccef9b84d2_dep.png create mode 100644 dir_a17ab943082f893adca96bf9769a804b.html create mode 100644 dir_a17ab943082f893adca96bf9769a804b_dep.map create mode 100644 dir_a17ab943082f893adca96bf9769a804b_dep.md5 create mode 100644 dir_a17ab943082f893adca96bf9769a804b_dep.png create mode 100644 dir_a5078ef47331b4526bf3f96e987ee465.html create mode 100644 dir_a5078ef47331b4526bf3f96e987ee465.js create mode 100644 dir_a5078ef47331b4526bf3f96e987ee465_dep.map create mode 100644 dir_a5078ef47331b4526bf3f96e987ee465_dep.md5 create mode 100644 dir_a5078ef47331b4526bf3f96e987ee465_dep.png create mode 100644 dir_a801eb2785f54179a3e523b657d76987.html create mode 100644 dir_a891666b40284627c385858212667a8e.html create mode 100644 dir_a891666b40284627c385858212667a8e_dep.map create mode 100644 dir_a891666b40284627c385858212667a8e_dep.md5 create mode 100644 dir_a891666b40284627c385858212667a8e_dep.png create mode 100644 dir_a91f64f59277207d470dc7e676106e2d.html create mode 100644 dir_a91f64f59277207d470dc7e676106e2d_dep.map create mode 100644 dir_a91f64f59277207d470dc7e676106e2d_dep.md5 create mode 100644 dir_a91f64f59277207d470dc7e676106e2d_dep.png create mode 100644 dir_aa9be1b82c48662217aefeaa0c6781c6.html create mode 100644 dir_aa9be1b82c48662217aefeaa0c6781c6_dep.map create mode 100644 dir_aa9be1b82c48662217aefeaa0c6781c6_dep.md5 create mode 100644 dir_aa9be1b82c48662217aefeaa0c6781c6_dep.png create mode 100644 dir_ae9a93452e2a84339148a16bcf2eb561.html create mode 100644 dir_ae9a93452e2a84339148a16bcf2eb561_dep.map create mode 100644 dir_ae9a93452e2a84339148a16bcf2eb561_dep.md5 create mode 100644 dir_ae9a93452e2a84339148a16bcf2eb561_dep.png create mode 100644 dir_b45211e520e4a09b6829419ceab557b0.html create mode 100644 dir_b45211e520e4a09b6829419ceab557b0.js create mode 100644 dir_b51f180547f8d0f0e77de7f16caceac3.html create mode 100644 dir_b51f180547f8d0f0e77de7f16caceac3.js create mode 100644 dir_b51f180547f8d0f0e77de7f16caceac3_dep.map create mode 100644 dir_b51f180547f8d0f0e77de7f16caceac3_dep.md5 create mode 100644 dir_b51f180547f8d0f0e77de7f16caceac3_dep.png create mode 100644 dir_bd43be0586985cbd0dfeaf1ebce92195.html create mode 100644 dir_bd43be0586985cbd0dfeaf1ebce92195_dep.map create mode 100644 dir_bd43be0586985cbd0dfeaf1ebce92195_dep.md5 create mode 100644 dir_bd43be0586985cbd0dfeaf1ebce92195_dep.png create mode 100644 dir_c34e1a38474b6d602bc9081a27b1a010.html create mode 100644 dir_c34e1a38474b6d602bc9081a27b1a010_dep.map create mode 100644 dir_c34e1a38474b6d602bc9081a27b1a010_dep.md5 create mode 100644 dir_c34e1a38474b6d602bc9081a27b1a010_dep.png create mode 100644 dir_cfc0c72890b8d1e009b6260caa55cd65.html create mode 100644 dir_cfc0c72890b8d1e009b6260caa55cd65_dep.map create mode 100644 dir_cfc0c72890b8d1e009b6260caa55cd65_dep.md5 create mode 100644 dir_cfc0c72890b8d1e009b6260caa55cd65_dep.png create mode 100644 dir_d20a67be47c1454b19aa07d8b0143440.html create mode 100644 dir_d20a67be47c1454b19aa07d8b0143440.js create mode 100644 dir_d20a67be47c1454b19aa07d8b0143440_dep.map create mode 100644 dir_d20a67be47c1454b19aa07d8b0143440_dep.md5 create mode 100644 dir_d20a67be47c1454b19aa07d8b0143440_dep.png create mode 100644 dir_d44c64559bbebec7f509842c48db8b23.html create mode 100644 dir_d44c64559bbebec7f509842c48db8b23.js create mode 100644 dir_d44c64559bbebec7f509842c48db8b23_dep.map create mode 100644 dir_d44c64559bbebec7f509842c48db8b23_dep.md5 create mode 100644 dir_d44c64559bbebec7f509842c48db8b23_dep.png create mode 100644 dir_d49d4fe2bb593f3112f8bcbe6fb5f73b.html create mode 100644 dir_d49d4fe2bb593f3112f8bcbe6fb5f73b_dep.map create mode 100644 dir_d49d4fe2bb593f3112f8bcbe6fb5f73b_dep.md5 create mode 100644 dir_d49d4fe2bb593f3112f8bcbe6fb5f73b_dep.png create mode 100644 dir_d81f13436e73f242cdf25a742f3a9678.html create mode 100644 dir_d81f13436e73f242cdf25a742f3a9678.js create mode 100644 dir_d81f13436e73f242cdf25a742f3a9678_dep.map create mode 100644 dir_d81f13436e73f242cdf25a742f3a9678_dep.md5 create mode 100644 dir_d81f13436e73f242cdf25a742f3a9678_dep.png create mode 100644 dir_dbeb4cbddd5bb6f84539c6e271d9141e.html create mode 100644 dir_dbeb4cbddd5bb6f84539c6e271d9141e_dep.map create mode 100644 dir_dbeb4cbddd5bb6f84539c6e271d9141e_dep.md5 create mode 100644 dir_dbeb4cbddd5bb6f84539c6e271d9141e_dep.png create mode 100644 dir_dcbbf3bfcdb3d005110c6ee2b744bf08.html create mode 100644 dir_dcbbf3bfcdb3d005110c6ee2b744bf08.js create mode 100644 dir_dcbbf3bfcdb3d005110c6ee2b744bf08_dep.map create mode 100644 dir_dcbbf3bfcdb3d005110c6ee2b744bf08_dep.md5 create mode 100644 dir_dcbbf3bfcdb3d005110c6ee2b744bf08_dep.png create mode 100644 dir_df4ba55d073265bfa281b5d186f7d37a.html create mode 100644 dir_df4ba55d073265bfa281b5d186f7d37a_dep.map create mode 100644 dir_df4ba55d073265bfa281b5d186f7d37a_dep.md5 create mode 100644 dir_df4ba55d073265bfa281b5d186f7d37a_dep.png create mode 100644 dir_e6bb757187894633b963babd59fca1e5.html create mode 100644 dir_f003de2bf99885e59674f01f3665fb82.html create mode 100644 dir_f003de2bf99885e59674f01f3665fb82.js create mode 100644 dir_f003de2bf99885e59674f01f3665fb82_dep.map create mode 100644 dir_f003de2bf99885e59674f01f3665fb82_dep.md5 create mode 100644 dir_f003de2bf99885e59674f01f3665fb82_dep.png create mode 100644 dir_fbb9f35580885fae6f87a033a53c348d.html create mode 100644 dkf_8h_source.html create mode 100644 doc.png create mode 100644 doxygen.css create mode 100644 doxygen.png create mode 100644 dynamic__publisher_2example_8cpp.html create mode 100644 dynamic__publisher_2example_8cpp.js create mode 100644 dynamic__publisher_2example_8cpp__incl.map create mode 100644 dynamic__publisher_2example_8cpp__incl.md5 create mode 100644 dynamic__publisher_2example_8cpp__incl.png create mode 100644 dynamic__publisher_8h.html create mode 100644 dynamic__publisher_8h__dep__incl.map create mode 100644 dynamic__publisher_8h__dep__incl.md5 create mode 100644 dynamic__publisher_8h__dep__incl.png create mode 100644 dynamic__publisher_8h__incl.map create mode 100644 dynamic__publisher_8h__incl.md5 create mode 100644 dynamic__publisher_8h__incl.png create mode 100644 dynamic__publisher_8h_source.html create mode 100644 dynamic__publisher_8hpp_source.html create mode 100644 dynamic__reconfigure__mgr_8h.html create mode 100644 dynamic__reconfigure__mgr_8h__incl.map create mode 100644 dynamic__reconfigure__mgr_8h__incl.md5 create mode 100644 dynamic__reconfigure__mgr_8h__incl.png create mode 100644 dynamic__reconfigure__mgr_8h_source.html create mode 100644 dynamic_publisher_2example_8cpp-example.html create mode 100644 dynsections.js create mode 100644 examples.html create mode 100644 examples.js create mode 100644 files.html create mode 100644 files_dup.js create mode 100644 folderclosed.png create mode 100644 folderopen.png create mode 100644 formula.repository create mode 100644 functions.html create mode 100644 functions_b.html create mode 100644 functions_c.html create mode 100644 functions_d.html create mode 100644 functions_dup.js create mode 100644 functions_e.html create mode 100644 functions_f.html create mode 100644 functions_func.html create mode 100644 functions_func.js create mode 100644 functions_func_b.html create mode 100644 functions_func_c.html create mode 100644 functions_func_d.html create mode 100644 functions_func_e.html create mode 100644 functions_func_f.html create mode 100644 functions_func_g.html create mode 100644 functions_func_h.html create mode 100644 functions_func_i.html create mode 100644 functions_func_j.html create mode 100644 functions_func_l.html create mode 100644 functions_func_m.html create mode 100644 functions_func_n.html create mode 100644 functions_func_o.html create mode 100644 functions_func_p.html create mode 100644 functions_func_r.html create mode 100644 functions_func_s.html create mode 100644 functions_func_t.html create mode 100644 functions_func_u.html create mode 100644 functions_func_v.html create mode 100644 functions_func_w.html create mode 100644 functions_func_y.html create mode 100644 functions_func_~.html create mode 100644 functions_g.html create mode 100644 functions_h.html create mode 100644 functions_i.html create mode 100644 functions_j.html create mode 100644 functions_k.html create mode 100644 functions_l.html create mode 100644 functions_m.html create mode 100644 functions_n.html create mode 100644 functions_o.html create mode 100644 functions_p.html create mode 100644 functions_q.html create mode 100644 functions_r.html create mode 100644 functions_rela.html create mode 100644 functions_s.html create mode 100644 functions_t.html create mode 100644 functions_type.html create mode 100644 functions_u.html create mode 100644 functions_v.html create mode 100644 functions_vars.html create mode 100644 functions_w.html create mode 100644 functions_x.html create mode 100644 functions_y.html create mode 100644 functions_z.html create mode 100644 functions_~.html create mode 100644 geometry_2cyclic_example_8cpp-example.html create mode 100644 gps__conversions_8h.html create mode 100644 gps__conversions_8h.js create mode 100644 gps__conversions_8h__incl.map create mode 100644 gps__conversions_8h__incl.md5 create mode 100644 gps__conversions_8h__incl.png create mode 100644 gps__conversions_8h_source.html create mode 100644 graph_legend.html create mode 100644 graph_legend.md5 create mode 100644 graph_legend.png create mode 100644 hierarchy.html create mode 100644 hierarchy.js create mode 100644 iir__filter_8h.html create mode 100644 iir__filter_8h__dep__incl.map create mode 100644 iir__filter_8h__dep__incl.md5 create mode 100644 iir__filter_8h__dep__incl.png create mode 100644 iir__filter_8h__incl.map create mode 100644 iir__filter_8h__incl.md5 create mode 100644 iir__filter_8h__incl.png create mode 100644 iir__filter_8h_source.html create mode 100644 image__publisher_8h_source.html create mode 100644 index.html create mode 100644 inherit_graph_0.map create mode 100644 inherit_graph_0.md5 create mode 100644 inherit_graph_0.png create mode 100644 inherit_graph_1.map create mode 100644 inherit_graph_1.md5 create mode 100644 inherit_graph_1.png create mode 100644 inherit_graph_10.map create mode 100644 inherit_graph_10.md5 create mode 100644 inherit_graph_10.png create mode 100644 inherit_graph_11.map create mode 100644 inherit_graph_11.md5 create mode 100644 inherit_graph_11.png create mode 100644 inherit_graph_12.map create mode 100644 inherit_graph_12.md5 create mode 100644 inherit_graph_12.png create mode 100644 inherit_graph_13.map create mode 100644 inherit_graph_13.md5 create mode 100644 inherit_graph_13.png create mode 100644 inherit_graph_14.map create mode 100644 inherit_graph_14.md5 create mode 100644 inherit_graph_14.png create mode 100644 inherit_graph_15.map create mode 100644 inherit_graph_15.md5 create mode 100644 inherit_graph_15.png create mode 100644 inherit_graph_16.map create mode 100644 inherit_graph_16.md5 create mode 100644 inherit_graph_16.png create mode 100644 inherit_graph_17.map create mode 100644 inherit_graph_17.md5 create mode 100644 inherit_graph_17.png create mode 100644 inherit_graph_18.map create mode 100644 inherit_graph_18.md5 create mode 100644 inherit_graph_18.png create mode 100644 inherit_graph_19.map create mode 100644 inherit_graph_19.md5 create mode 100644 inherit_graph_19.png create mode 100644 inherit_graph_2.map create mode 100644 inherit_graph_2.md5 create mode 100644 inherit_graph_2.png create mode 100644 inherit_graph_20.map create mode 100644 inherit_graph_20.md5 create mode 100644 inherit_graph_20.png create mode 100644 inherit_graph_21.map create mode 100644 inherit_graph_21.md5 create mode 100644 inherit_graph_21.png create mode 100644 inherit_graph_22.map create mode 100644 inherit_graph_22.md5 create mode 100644 inherit_graph_22.png create mode 100644 inherit_graph_23.map create mode 100644 inherit_graph_23.md5 create mode 100644 inherit_graph_23.png create mode 100644 inherit_graph_24.map create mode 100644 inherit_graph_24.md5 create mode 100644 inherit_graph_24.png create mode 100644 inherit_graph_25.map create mode 100644 inherit_graph_25.md5 create mode 100644 inherit_graph_25.png create mode 100644 inherit_graph_26.map create mode 100644 inherit_graph_26.md5 create mode 100644 inherit_graph_26.png create mode 100644 inherit_graph_27.map create mode 100644 inherit_graph_27.md5 create mode 100644 inherit_graph_27.png create mode 100644 inherit_graph_28.map create mode 100644 inherit_graph_28.md5 create mode 100644 inherit_graph_28.png create mode 100644 inherit_graph_29.map create mode 100644 inherit_graph_29.md5 create mode 100644 inherit_graph_29.png create mode 100644 inherit_graph_3.map create mode 100644 inherit_graph_3.md5 create mode 100644 inherit_graph_3.png create mode 100644 inherit_graph_30.map create mode 100644 inherit_graph_30.md5 create mode 100644 inherit_graph_30.png create mode 100644 inherit_graph_31.map create mode 100644 inherit_graph_31.md5 create mode 100644 inherit_graph_31.png create mode 100644 inherit_graph_32.map create mode 100644 inherit_graph_32.md5 create mode 100644 inherit_graph_32.png create mode 100644 inherit_graph_33.map create mode 100644 inherit_graph_33.md5 create mode 100644 inherit_graph_33.png create mode 100644 inherit_graph_34.map create mode 100644 inherit_graph_34.md5 create mode 100644 inherit_graph_34.png create mode 100644 inherit_graph_35.map create mode 100644 inherit_graph_35.md5 create mode 100644 inherit_graph_35.png create mode 100644 inherit_graph_36.map create mode 100644 inherit_graph_36.md5 create mode 100644 inherit_graph_36.png create mode 100644 inherit_graph_37.map create mode 100644 inherit_graph_37.md5 create mode 100644 inherit_graph_37.png create mode 100644 inherit_graph_38.map create mode 100644 inherit_graph_38.md5 create mode 100644 inherit_graph_38.png create mode 100644 inherit_graph_39.map create mode 100644 inherit_graph_39.md5 create mode 100644 inherit_graph_39.png create mode 100644 inherit_graph_4.map create mode 100644 inherit_graph_4.md5 create mode 100644 inherit_graph_4.png create mode 100644 inherit_graph_40.map create mode 100644 inherit_graph_40.md5 create mode 100644 inherit_graph_40.png create mode 100644 inherit_graph_41.map create mode 100644 inherit_graph_41.md5 create mode 100644 inherit_graph_41.png create mode 100644 inherit_graph_42.map create mode 100644 inherit_graph_42.md5 create mode 100644 inherit_graph_42.png create mode 100644 inherit_graph_43.map create mode 100644 inherit_graph_43.md5 create mode 100644 inherit_graph_43.png create mode 100644 inherit_graph_44.map create mode 100644 inherit_graph_44.md5 create mode 100644 inherit_graph_44.png create mode 100644 inherit_graph_45.map create mode 100644 inherit_graph_45.md5 create mode 100644 inherit_graph_45.png create mode 100644 inherit_graph_46.map create mode 100644 inherit_graph_46.md5 create mode 100644 inherit_graph_46.png create mode 100644 inherit_graph_47.map create mode 100644 inherit_graph_47.md5 create mode 100644 inherit_graph_47.png create mode 100644 inherit_graph_48.map create mode 100644 inherit_graph_48.md5 create mode 100644 inherit_graph_48.png create mode 100644 inherit_graph_49.map create mode 100644 inherit_graph_49.md5 create mode 100644 inherit_graph_49.png create mode 100644 inherit_graph_5.map create mode 100644 inherit_graph_5.md5 create mode 100644 inherit_graph_5.png create mode 100644 inherit_graph_50.map create mode 100644 inherit_graph_50.md5 create mode 100644 inherit_graph_50.png create mode 100644 inherit_graph_51.map create mode 100644 inherit_graph_51.md5 create mode 100644 inherit_graph_51.png create mode 100644 inherit_graph_52.map create mode 100644 inherit_graph_52.md5 create mode 100644 inherit_graph_52.png create mode 100644 inherit_graph_53.map create mode 100644 inherit_graph_53.md5 create mode 100644 inherit_graph_53.png create mode 100644 inherit_graph_54.map create mode 100644 inherit_graph_54.md5 create mode 100644 inherit_graph_54.png create mode 100644 inherit_graph_55.map create mode 100644 inherit_graph_55.md5 create mode 100644 inherit_graph_55.png create mode 100644 inherit_graph_56.map create mode 100644 inherit_graph_56.md5 create mode 100644 inherit_graph_56.png create mode 100644 inherit_graph_57.map create mode 100644 inherit_graph_57.md5 create mode 100644 inherit_graph_57.png create mode 100644 inherit_graph_58.map create mode 100644 inherit_graph_58.md5 create mode 100644 inherit_graph_58.png create mode 100644 inherit_graph_59.map create mode 100644 inherit_graph_59.md5 create mode 100644 inherit_graph_59.png create mode 100644 inherit_graph_6.map create mode 100644 inherit_graph_6.md5 create mode 100644 inherit_graph_6.png create mode 100644 inherit_graph_60.map create mode 100644 inherit_graph_60.md5 create mode 100644 inherit_graph_60.png create mode 100644 inherit_graph_61.map create mode 100644 inherit_graph_61.md5 create mode 100644 inherit_graph_61.png create mode 100644 inherit_graph_62.map create mode 100644 inherit_graph_62.md5 create mode 100644 inherit_graph_62.png create mode 100644 inherit_graph_63.map create mode 100644 inherit_graph_63.md5 create mode 100644 inherit_graph_63.png create mode 100644 inherit_graph_64.map create mode 100644 inherit_graph_64.md5 create mode 100644 inherit_graph_64.png create mode 100644 inherit_graph_65.map create mode 100644 inherit_graph_65.md5 create mode 100644 inherit_graph_65.png create mode 100644 inherit_graph_7.map create mode 100644 inherit_graph_7.md5 create mode 100644 inherit_graph_7.png create mode 100644 inherit_graph_8.map create mode 100644 inherit_graph_8.md5 create mode 100644 inherit_graph_8.png create mode 100644 inherit_graph_9.map create mode 100644 inherit_graph_9.md5 create mode 100644 inherit_graph_9.png create mode 100644 inherits.html create mode 100644 jlkf_8h_source.html create mode 100644 jquery.js create mode 100644 kalman__filter_8h.html create mode 100644 kalman__filter_8h__dep__incl.map create mode 100644 kalman__filter_8h__dep__incl.md5 create mode 100644 kalman__filter_8h__dep__incl.png create mode 100644 kalman__filter_8h__incl.map create mode 100644 kalman__filter_8h__incl.md5 create mode 100644 kalman__filter_8h__incl.png create mode 100644 kalman__filter_8h_source.html create mode 100644 kalman__filter__aloamgarm_8h.html create mode 100644 kalman__filter__aloamgarm_8h__dep__incl.map create mode 100644 kalman__filter__aloamgarm_8h__dep__incl.md5 create mode 100644 kalman__filter__aloamgarm_8h__dep__incl.png create mode 100644 kalman__filter__aloamgarm_8h__incl.map create mode 100644 kalman__filter__aloamgarm_8h__incl.md5 create mode 100644 kalman__filter__aloamgarm_8h__incl.png create mode 100644 kalman__filter__aloamgarm_8h_source.html create mode 100644 line__operations_8h_source.html create mode 100644 lkf_2example_8cpp-example.html create mode 100644 lkf_2example_8cpp.html create mode 100644 lkf_2example_8cpp.js create mode 100644 lkf_2example_8cpp__incl.map create mode 100644 lkf_2example_8cpp__incl.md5 create mode 100644 lkf_2example_8cpp__incl.png create mode 100644 lkf_8h_source.html create mode 100644 math_8h.html create mode 100644 math_8h.js create mode 100644 math_8h__incl.map create mode 100644 math_8h__incl.md5 create mode 100644 math_8h__incl.png create mode 100644 math_8h_source.html create mode 100644 median__filter_8h.html create mode 100644 median__filter_8h__incl.map create mode 100644 median__filter_8h__incl.md5 create mode 100644 median__filter_8h__incl.png create mode 100644 median__filter_8h_source.html create mode 100644 menu.js create mode 100644 menudata.js create mode 100644 misc_8h.html create mode 100644 misc_8h.js create mode 100644 misc_8h__dep__incl.map create mode 100644 misc_8h__dep__incl.md5 create mode 100644 misc_8h__dep__incl.png create mode 100644 misc_8h__incl.map create mode 100644 misc_8h__incl.md5 create mode 100644 misc_8h__incl.png create mode 100644 misc_8h_source.html create mode 100644 mrs__lib_8h_source.html create mode 100644 mrs_logo.png create mode 100644 msg__extractor_8h.html create mode 100644 msg__extractor_8h.js create mode 100644 msg__extractor_8h__incl.map create mode 100644 msg__extractor_8h__incl.md5 create mode 100644 msg__extractor_8h__incl.png create mode 100644 msg__extractor_8h_source.html create mode 100644 mutex_8h.html create mode 100644 mutex_8h.js create mode 100644 mutex_8h__dep__incl.map create mode 100644 mutex_8h__dep__incl.md5 create mode 100644 mutex_8h__dep__incl.png create mode 100644 mutex_8h__incl.map create mode 100644 mutex_8h__incl.md5 create mode 100644 mutex_8h__incl.png create mode 100644 mutex_8h_source.html create mode 100644 namespacemembers.html create mode 100644 namespacemembers_func.html create mode 100644 namespacemembers_type.html create mode 100644 namespacemrs__lib.html create mode 100644 namespacemrs__lib.js create mode 100644 namespaces.html create mode 100644 namespaces_dup.js create mode 100644 nav_f.png create mode 100644 nav_g.png create mode 100644 nav_h.png create mode 100644 navtree.css create mode 100644 navtree.js create mode 100644 navtreedata.js create mode 100644 navtreeindex0.js create mode 100644 navtreeindex1.js create mode 100644 navtreeindex2.js create mode 100644 navtreeindex3.js create mode 100644 navtreeindex4.js create mode 100644 navtreeindex5.js create mode 100644 nckf_8h_source.html create mode 100644 nckf__tests_8cpp.html create mode 100644 nckf__tests_8cpp.js create mode 100644 nckf__tests_8cpp__incl.map create mode 100644 nckf__tests_8cpp__incl.md5 create mode 100644 nckf__tests_8cpp__incl.png create mode 100644 notch__filter_8h.html create mode 100644 notch__filter_8h__incl.map create mode 100644 notch__filter_8h__incl.md5 create mode 100644 notch__filter_8h__incl.png create mode 100644 notch__filter_8h_source.html create mode 100644 open.png create mode 100644 pages.html create mode 100644 param__loader_2example_8cpp.html create mode 100644 param__loader_2example_8cpp.js create mode 100644 param__loader_2example_8cpp__incl.map create mode 100644 param__loader_2example_8cpp__incl.md5 create mode 100644 param__loader_2example_8cpp__incl.png create mode 100644 param__loader_8h.html create mode 100644 param__loader_8h.js create mode 100644 param__loader_8h__dep__incl.map create mode 100644 param__loader_8h__dep__incl.md5 create mode 100644 param__loader_8h__dep__incl.png create mode 100644 param__loader_8h__incl.map create mode 100644 param__loader_8h__incl.md5 create mode 100644 param__loader_8h__incl.png create mode 100644 param__loader_8h_source.html create mode 100644 param__provider_8h.html create mode 100644 param__provider_8h__dep__incl.map create mode 100644 param__provider_8h__dep__incl.md5 create mode 100644 param__provider_8h__dep__incl.png create mode 100644 param__provider_8h__incl.map create mode 100644 param__provider_8h__incl.md5 create mode 100644 param__provider_8h__incl.png create mode 100644 param__provider_8h_source.html create mode 100644 param__provider_8hpp_source.html create mode 100644 param_loader_2example_8cpp-example.html create mode 100644 polygon_8h_source.html create mode 100644 probit__gts_8h_source.html create mode 100644 profiler_8h.html create mode 100644 profiler_8h__incl.map create mode 100644 profiler_8h__incl.md5 create mode 100644 profiler_8h__incl.png create mode 100644 profiler_8h_source.html create mode 100644 publisher__handler_8h.html create mode 100644 publisher__handler_8h__dep__incl.map create mode 100644 publisher__handler_8h__dep__incl.md5 create mode 100644 publisher__handler_8h__dep__incl.png create mode 100644 publisher__handler_8h__incl.map create mode 100644 publisher__handler_8h__incl.md5 create mode 100644 publisher__handler_8h__incl.png create mode 100644 publisher__handler_8h_source.html create mode 100644 publisher__handler_8hpp_source.html create mode 100644 quadratic__throttle__model_8h_source.html create mode 100644 repredictor_2example_8cpp-example.html create mode 100644 repredictor_2example_8cpp.html create mode 100644 repredictor_2example_8cpp.js create mode 100644 repredictor_2example_8cpp__incl.map create mode 100644 repredictor_2example_8cpp__incl.md5 create mode 100644 repredictor_2example_8cpp__incl.png create mode 100644 repredictor_8h_source.html create mode 100644 repredictor__aloamgarm_8h_source.html create mode 100644 resize.js create mode 100644 rheiv_2example_8cpp-example.html create mode 100644 rheiv_2example_8cpp.html create mode 100644 rheiv_2example_8cpp.js create mode 100644 rheiv_2example_8cpp__incl.map create mode 100644 rheiv_2example_8cpp__incl.md5 create mode 100644 rheiv_2example_8cpp__incl.png create mode 100644 rheiv_8h.html create mode 100644 rheiv_8h__dep__incl.map create mode 100644 rheiv_8h__dep__incl.md5 create mode 100644 rheiv_8h__dep__incl.png create mode 100644 rheiv_8h__incl.map create mode 100644 rheiv_8h__incl.md5 create mode 100644 rheiv_8h__incl.png create mode 100644 rheiv_8h_source.html create mode 100644 safety__zone_8h_source.html create mode 100644 scope__timer_8h.html create mode 100644 scope__timer_8h__incl.map create mode 100644 scope__timer_8h__incl.md5 create mode 100644 scope__timer_8h__incl.png create mode 100644 scope__timer_8h_source.html create mode 100644 search/all_0.html create mode 100644 search/all_0.js create mode 100644 search/all_1.html create mode 100644 search/all_1.js create mode 100644 search/all_10.html create mode 100644 search/all_10.js create mode 100644 search/all_11.html create mode 100644 search/all_11.js create mode 100644 search/all_12.html create mode 100644 search/all_12.js create mode 100644 search/all_13.html create mode 100644 search/all_13.js create mode 100644 search/all_14.html create mode 100644 search/all_14.js create mode 100644 search/all_15.html create mode 100644 search/all_15.js create mode 100644 search/all_16.html create mode 100644 search/all_16.js create mode 100644 search/all_17.html create mode 100644 search/all_17.js create mode 100644 search/all_18.html create mode 100644 search/all_18.js create mode 100644 search/all_19.html create mode 100644 search/all_19.js create mode 100644 search/all_1a.html create mode 100644 search/all_1a.js create mode 100644 search/all_2.html create mode 100644 search/all_2.js create mode 100644 search/all_3.html create mode 100644 search/all_3.js create mode 100644 search/all_4.html create mode 100644 search/all_4.js create mode 100644 search/all_5.html create mode 100644 search/all_5.js create mode 100644 search/all_6.html create mode 100644 search/all_6.js create mode 100644 search/all_7.html create mode 100644 search/all_7.js create mode 100644 search/all_8.html create mode 100644 search/all_8.js create mode 100644 search/all_9.html create mode 100644 search/all_9.js create mode 100644 search/all_a.html create mode 100644 search/all_a.js create mode 100644 search/all_b.html create mode 100644 search/all_b.js create mode 100644 search/all_c.html create mode 100644 search/all_c.js create mode 100644 search/all_d.html create mode 100644 search/all_d.js create mode 100644 search/all_e.html create mode 100644 search/all_e.js create mode 100644 search/all_f.html create mode 100644 search/all_f.js create mode 100644 search/classes_0.html create mode 100644 search/classes_0.js create mode 100644 search/classes_1.html create mode 100644 search/classes_1.js create mode 100644 search/classes_10.html create mode 100644 search/classes_10.js create mode 100644 search/classes_11.html create mode 100644 search/classes_11.js create mode 100644 search/classes_12.html create mode 100644 search/classes_12.js create mode 100644 search/classes_13.html create mode 100644 search/classes_13.js create mode 100644 search/classes_2.html create mode 100644 search/classes_2.js create mode 100644 search/classes_3.html create mode 100644 search/classes_3.js create mode 100644 search/classes_4.html create mode 100644 search/classes_4.js create mode 100644 search/classes_5.html create mode 100644 search/classes_5.js create mode 100644 search/classes_6.html create mode 100644 search/classes_6.js create mode 100644 search/classes_7.html create mode 100644 search/classes_7.js create mode 100644 search/classes_8.html create mode 100644 search/classes_8.js create mode 100644 search/classes_9.html create mode 100644 search/classes_9.js create mode 100644 search/classes_a.html create mode 100644 search/classes_a.js create mode 100644 search/classes_b.html create mode 100644 search/classes_b.js create mode 100644 search/classes_c.html create mode 100644 search/classes_c.js create mode 100644 search/classes_d.html create mode 100644 search/classes_d.js create mode 100644 search/classes_e.html create mode 100644 search/classes_e.js create mode 100644 search/classes_f.html create mode 100644 search/classes_f.js create mode 100644 search/close.png create mode 100644 search/files_0.html create mode 100644 search/files_0.js create mode 100644 search/files_1.html create mode 100644 search/files_1.js create mode 100644 search/files_2.html create mode 100644 search/files_2.js create mode 100644 search/files_3.html create mode 100644 search/files_3.js create mode 100644 search/files_4.html create mode 100644 search/files_4.js create mode 100644 search/files_5.html create mode 100644 search/files_5.js create mode 100644 search/files_6.html create mode 100644 search/files_6.js create mode 100644 search/files_7.html create mode 100644 search/files_7.js create mode 100644 search/files_8.html create mode 100644 search/files_8.js create mode 100644 search/files_9.html create mode 100644 search/files_9.js create mode 100644 search/files_a.html create mode 100644 search/files_a.js create mode 100644 search/files_b.html create mode 100644 search/files_b.js create mode 100644 search/files_c.html create mode 100644 search/files_c.js create mode 100644 search/files_d.html create mode 100644 search/files_d.js create mode 100644 search/files_e.html create mode 100644 search/files_e.js create mode 100644 search/files_f.html create mode 100644 search/files_f.js create mode 100644 search/functions_0.html create mode 100644 search/functions_0.js create mode 100644 search/functions_1.html create mode 100644 search/functions_1.js create mode 100644 search/functions_10.html create mode 100644 search/functions_10.js create mode 100644 search/functions_11.html create mode 100644 search/functions_11.js create mode 100644 search/functions_12.html create mode 100644 search/functions_12.js create mode 100644 search/functions_13.html create mode 100644 search/functions_13.js create mode 100644 search/functions_14.html create mode 100644 search/functions_14.js create mode 100644 search/functions_15.html create mode 100644 search/functions_15.js create mode 100644 search/functions_16.html create mode 100644 search/functions_16.js create mode 100644 search/functions_17.html create mode 100644 search/functions_17.js create mode 100644 search/functions_2.html create mode 100644 search/functions_2.js create mode 100644 search/functions_3.html create mode 100644 search/functions_3.js create mode 100644 search/functions_4.html create mode 100644 search/functions_4.js create mode 100644 search/functions_5.html create mode 100644 search/functions_5.js create mode 100644 search/functions_6.html create mode 100644 search/functions_6.js create mode 100644 search/functions_7.html create mode 100644 search/functions_7.js create mode 100644 search/functions_8.html create mode 100644 search/functions_8.js create mode 100644 search/functions_9.html create mode 100644 search/functions_9.js create mode 100644 search/functions_a.html create mode 100644 search/functions_a.js create mode 100644 search/functions_b.html create mode 100644 search/functions_b.js create mode 100644 search/functions_c.html create mode 100644 search/functions_c.js create mode 100644 search/functions_d.html create mode 100644 search/functions_d.js create mode 100644 search/functions_e.html create mode 100644 search/functions_e.js create mode 100644 search/functions_f.html create mode 100644 search/functions_f.js create mode 100644 search/mag_sel.png create mode 100644 search/namespaces_0.html create mode 100644 search/namespaces_0.js create mode 100644 search/nomatches.html create mode 100644 search/pages_0.html create mode 100644 search/pages_0.js create mode 100644 search/pages_1.html create mode 100644 search/pages_1.js create mode 100644 search/related_0.html create mode 100644 search/related_0.js create mode 100644 search/search.css create mode 100644 search/search.js create mode 100644 search/search_l.png create mode 100644 search/search_m.png create mode 100644 search/search_r.png create mode 100644 search/searchdata.js create mode 100644 search/typedefs_0.html create mode 100644 search/typedefs_0.js create mode 100644 search/typedefs_1.html create mode 100644 search/typedefs_1.js create mode 100644 search/typedefs_10.html create mode 100644 search/typedefs_10.js create mode 100644 search/typedefs_11.html create mode 100644 search/typedefs_11.js create mode 100644 search/typedefs_12.html create mode 100644 search/typedefs_12.js create mode 100644 search/typedefs_13.html create mode 100644 search/typedefs_13.js create mode 100644 search/typedefs_2.html create mode 100644 search/typedefs_2.js create mode 100644 search/typedefs_3.html create mode 100644 search/typedefs_3.js create mode 100644 search/typedefs_4.html create mode 100644 search/typedefs_4.js create mode 100644 search/typedefs_5.html create mode 100644 search/typedefs_5.js create mode 100644 search/typedefs_6.html create mode 100644 search/typedefs_6.js create mode 100644 search/typedefs_7.html create mode 100644 search/typedefs_7.js create mode 100644 search/typedefs_8.html create mode 100644 search/typedefs_8.js create mode 100644 search/typedefs_9.html create mode 100644 search/typedefs_9.js create mode 100644 search/typedefs_a.html create mode 100644 search/typedefs_a.js create mode 100644 search/typedefs_b.html create mode 100644 search/typedefs_b.js create mode 100644 search/typedefs_c.html create mode 100644 search/typedefs_c.js create mode 100644 search/typedefs_d.html create mode 100644 search/typedefs_d.js create mode 100644 search/typedefs_e.html create mode 100644 search/typedefs_e.js create mode 100644 search/typedefs_f.html create mode 100644 search/typedefs_f.js create mode 100644 search/variables_0.html create mode 100644 search/variables_0.js create mode 100644 search/variables_1.html create mode 100644 search/variables_1.js create mode 100644 search/variables_2.html create mode 100644 search/variables_2.js create mode 100644 search/variables_3.html create mode 100644 search/variables_3.js create mode 100644 search/variables_4.html create mode 100644 search/variables_4.js create mode 100644 search/variables_5.html create mode 100644 search/variables_5.js create mode 100644 search/variables_6.html create mode 100644 search/variables_6.js create mode 100644 search/variables_7.html create mode 100644 search/variables_7.js create mode 100644 search/variables_8.html create mode 100644 search/variables_8.js create mode 100644 search/variables_9.html create mode 100644 search/variables_9.js create mode 100644 search/variables_a.html create mode 100644 search/variables_a.js create mode 100644 search/variables_b.html create mode 100644 search/variables_b.js create mode 100644 search/variables_c.html create mode 100644 search/variables_c.js create mode 100644 search/variables_d.html create mode 100644 search/variables_d.js create mode 100644 service__client__handler_8h.html create mode 100644 service__client__handler_8h__incl.map create mode 100644 service__client__handler_8h__incl.md5 create mode 100644 service__client__handler_8h__incl.png create mode 100644 service__client__handler_8h_source.html create mode 100644 service__client__handler_8hpp_source.html create mode 100644 shapes_8h.html create mode 100644 shapes_8h__dep__incl.map create mode 100644 shapes_8h__dep__incl.md5 create mode 100644 shapes_8h__dep__incl.png create mode 100644 shapes_8h__incl.map create mode 100644 shapes_8h__incl.md5 create mode 100644 shapes_8h__incl.png create mode 100644 shapes_8h_source.html create mode 100644 simple__example_8cpp.html create mode 100644 simple__example_8cpp.js create mode 100644 simple__example_8cpp__incl.map create mode 100644 simple__example_8cpp__incl.md5 create mode 100644 simple__example_8cpp__incl.png create mode 100644 splitbar.png create mode 100644 structMyPoint-members.html create mode 100644 structMyPoint.html create mode 100644 structMyPoint.js create mode 100644 structdegrees-members.html create mode 100644 structdegrees.html create mode 100644 structdegrees__coll__graph.map create mode 100644 structdegrees__coll__graph.md5 create mode 100644 structdegrees__coll__graph.png create mode 100644 structdegrees__inherit__graph.map create mode 100644 structdegrees__inherit__graph.md5 create mode 100644 structdegrees__inherit__graph.png create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException-members.html create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException.html create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException.js create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException__coll__graph.map create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException__coll__graph.md5 create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException__coll__graph.png create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException__inherit__graph.map create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException__inherit__graph.md5 create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException__inherit__graph.png create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException-members.html create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException.html create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException.js create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException__coll__graph.map create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException__coll__graph.md5 create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException__coll__graph.png create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException__inherit__graph.map create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException__inherit__graph.md5 create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException__inherit__graph.png create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException-members.html create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException.html create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException.js create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException__coll__graph.map create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException__coll__graph.md5 create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException__coll__graph.png create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException__inherit__graph.map create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException__inherit__graph.md5 create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException__inherit__graph.png create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1MathErrorException-members.html create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1MathErrorException.html create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1MathErrorException.js create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1MathErrorException__coll__graph.map create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1MathErrorException__coll__graph.md5 create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1MathErrorException__coll__graph.png create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1MathErrorException__inherit__graph.map create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1MathErrorException__inherit__graph.md5 create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1MathErrorException__inherit__graph.png create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException-members.html create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException.html create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException.js create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException__coll__graph.map create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException__coll__graph.md5 create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException__coll__graph.png create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException__inherit__graph.map create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException__inherit__graph.md5 create mode 100644 structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException__inherit__graph.png create mode 100644 structmrs__lib_1_1ImagePubliserData-members.html create mode 100644 structmrs__lib_1_1ImagePubliserData.html create mode 100644 structmrs__lib_1_1ImagePubliserData.js create mode 100644 structmrs__lib_1_1Intersection-members.html create mode 100644 structmrs__lib_1_1Intersection.html create mode 100644 structmrs__lib_1_1Intersection.js create mode 100644 structmrs__lib_1_1JLKF_1_1inverse__exception-members.html create mode 100644 structmrs__lib_1_1JLKF_1_1inverse__exception.html create mode 100644 structmrs__lib_1_1JLKF_1_1inverse__exception.js create mode 100644 structmrs__lib_1_1JLKF_1_1inverse__exception__coll__graph.map create mode 100644 structmrs__lib_1_1JLKF_1_1inverse__exception__coll__graph.md5 create mode 100644 structmrs__lib_1_1JLKF_1_1inverse__exception__coll__graph.png create mode 100644 structmrs__lib_1_1JLKF_1_1inverse__exception__inherit__graph.map create mode 100644 structmrs__lib_1_1JLKF_1_1inverse__exception__inherit__graph.md5 create mode 100644 structmrs__lib_1_1JLKF_1_1inverse__exception__inherit__graph.png create mode 100644 structmrs__lib_1_1KalmanFilterAloamGarm_1_1statecov__t-members.html create mode 100644 structmrs__lib_1_1KalmanFilterAloamGarm_1_1statecov__t.html create mode 100644 structmrs__lib_1_1KalmanFilterAloamGarm_1_1statecov__t.js create mode 100644 structmrs__lib_1_1KalmanFilter_1_1statecov__t-members.html create mode 100644 structmrs__lib_1_1KalmanFilter_1_1statecov__t.html create mode 100644 structmrs__lib_1_1KalmanFilter_1_1statecov__t.js create mode 100644 structmrs__lib_1_1LKF_1_1inverse__exception-members.html create mode 100644 structmrs__lib_1_1LKF_1_1inverse__exception.html create mode 100644 structmrs__lib_1_1LKF_1_1inverse__exception.js create mode 100644 structmrs__lib_1_1LKF_1_1inverse__exception__coll__graph.map create mode 100644 structmrs__lib_1_1LKF_1_1inverse__exception__coll__graph.md5 create mode 100644 structmrs__lib_1_1LKF_1_1inverse__exception__coll__graph.png create mode 100644 structmrs__lib_1_1LKF_1_1inverse__exception__inherit__graph.map create mode 100644 structmrs__lib_1_1LKF_1_1inverse__exception__inherit__graph.md5 create mode 100644 structmrs__lib_1_1LKF_1_1inverse__exception__inherit__graph.png create mode 100644 structmrs__lib_1_1Polygon_1_1ExtraVertices-members.html create mode 100644 structmrs__lib_1_1Polygon_1_1ExtraVertices.html create mode 100644 structmrs__lib_1_1Polygon_1_1ExtraVertices.js create mode 100644 structmrs__lib_1_1Polygon_1_1ExtraVertices__coll__graph.map create mode 100644 structmrs__lib_1_1Polygon_1_1ExtraVertices__coll__graph.md5 create mode 100644 structmrs__lib_1_1Polygon_1_1ExtraVertices__coll__graph.png create mode 100644 structmrs__lib_1_1Polygon_1_1ExtraVertices__inherit__graph.map create mode 100644 structmrs__lib_1_1Polygon_1_1ExtraVertices__inherit__graph.md5 create mode 100644 structmrs__lib_1_1Polygon_1_1ExtraVertices__inherit__graph.png create mode 100644 structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns-members.html create mode 100644 structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns.html create mode 100644 structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns.js create mode 100644 structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns__coll__graph.map create mode 100644 structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns__coll__graph.md5 create mode 100644 structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns__coll__graph.png create mode 100644 structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns__inherit__graph.map create mode 100644 structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns__inherit__graph.md5 create mode 100644 structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns__inherit__graph.png create mode 100644 structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices-members.html create mode 100644 structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices.html create mode 100644 structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices.js create mode 100644 structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices__coll__graph.map create mode 100644 structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices__coll__graph.md5 create mode 100644 structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices__coll__graph.png create mode 100644 structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices__inherit__graph.map create mode 100644 structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices__inherit__graph.md5 create mode 100644 structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices__inherit__graph.png create mode 100644 structmrs__lib_1_1SafetyZone_1_1BorderError-members.html create mode 100644 structmrs__lib_1_1SafetyZone_1_1BorderError.html create mode 100644 structmrs__lib_1_1SafetyZone_1_1BorderError.js create mode 100644 structmrs__lib_1_1SafetyZone_1_1BorderError__coll__graph.map create mode 100644 structmrs__lib_1_1SafetyZone_1_1BorderError__coll__graph.md5 create mode 100644 structmrs__lib_1_1SafetyZone_1_1BorderError__coll__graph.png create mode 100644 structmrs__lib_1_1SafetyZone_1_1BorderError__inherit__graph.map create mode 100644 structmrs__lib_1_1SafetyZone_1_1BorderError__inherit__graph.md5 create mode 100644 structmrs__lib_1_1SafetyZone_1_1BorderError__inherit__graph.png create mode 100644 structmrs__lib_1_1ScopeTimer_1_1time__point-members.html create mode 100644 structmrs__lib_1_1ScopeTimer_1_1time__point.html create mode 100644 structmrs__lib_1_1ScopeTimer_1_1time__point.js create mode 100644 structmrs__lib_1_1SubscribeHandlerOptions-members.html create mode 100644 structmrs__lib_1_1SubscribeHandlerOptions.html create mode 100644 structmrs__lib_1_1SubscribeHandlerOptions.js create mode 100644 structmrs__lib_1_1UKF_1_1inverse__exception-members.html create mode 100644 structmrs__lib_1_1UKF_1_1inverse__exception.html create mode 100644 structmrs__lib_1_1UKF_1_1inverse__exception.js create mode 100644 structmrs__lib_1_1UKF_1_1inverse__exception__coll__graph.map create mode 100644 structmrs__lib_1_1UKF_1_1inverse__exception__coll__graph.md5 create mode 100644 structmrs__lib_1_1UKF_1_1inverse__exception__coll__graph.png create mode 100644 structmrs__lib_1_1UKF_1_1inverse__exception__inherit__graph.map create mode 100644 structmrs__lib_1_1UKF_1_1inverse__exception__inherit__graph.md5 create mode 100644 structmrs__lib_1_1UKF_1_1inverse__exception__inherit__graph.png create mode 100644 structmrs__lib_1_1UKF_1_1square__root__exception-members.html create mode 100644 structmrs__lib_1_1UKF_1_1square__root__exception.html create mode 100644 structmrs__lib_1_1UKF_1_1square__root__exception.js create mode 100644 structmrs__lib_1_1UKF_1_1square__root__exception__coll__graph.map create mode 100644 structmrs__lib_1_1UKF_1_1square__root__exception__coll__graph.md5 create mode 100644 structmrs__lib_1_1UKF_1_1square__root__exception__coll__graph.png create mode 100644 structmrs__lib_1_1UKF_1_1square__root__exception__inherit__graph.map create mode 100644 structmrs__lib_1_1UKF_1_1square__root__exception__inherit__graph.md5 create mode 100644 structmrs__lib_1_1UKF_1_1square__root__exception__inherit__graph.png create mode 100644 structmrs__lib_1_1eigenvector__exception-members.html create mode 100644 structmrs__lib_1_1eigenvector__exception.html create mode 100644 structmrs__lib_1_1eigenvector__exception.js create mode 100644 structmrs__lib_1_1eigenvector__exception__coll__graph.map create mode 100644 structmrs__lib_1_1eigenvector__exception__coll__graph.md5 create mode 100644 structmrs__lib_1_1eigenvector__exception__coll__graph.png create mode 100644 structmrs__lib_1_1eigenvector__exception__inherit__graph.map create mode 100644 structmrs__lib_1_1eigenvector__exception__inherit__graph.md5 create mode 100644 structmrs__lib_1_1eigenvector__exception__inherit__graph.png create mode 100644 structmrs__lib_1_1geometry_1_1cyclic-members.html create mode 100644 structmrs__lib_1_1geometry_1_1cyclic.html create mode 100644 structmrs__lib_1_1geometry_1_1cyclic.js create mode 100644 structmrs__lib_1_1geometry_1_1degrees-members.html create mode 100644 structmrs__lib_1_1geometry_1_1degrees.html create mode 100644 structmrs__lib_1_1geometry_1_1degrees__coll__graph.map create mode 100644 structmrs__lib_1_1geometry_1_1degrees__coll__graph.md5 create mode 100644 structmrs__lib_1_1geometry_1_1degrees__coll__graph.png create mode 100644 structmrs__lib_1_1geometry_1_1degrees__inherit__graph.map create mode 100644 structmrs__lib_1_1geometry_1_1degrees__inherit__graph.md5 create mode 100644 structmrs__lib_1_1geometry_1_1degrees__inherit__graph.png create mode 100644 structmrs__lib_1_1geometry_1_1radians-members.html create mode 100644 structmrs__lib_1_1geometry_1_1radians.html create mode 100644 structmrs__lib_1_1geometry_1_1radians__coll__graph.map create mode 100644 structmrs__lib_1_1geometry_1_1radians__coll__graph.md5 create mode 100644 structmrs__lib_1_1geometry_1_1radians__coll__graph.png create mode 100644 structmrs__lib_1_1geometry_1_1radians__inherit__graph.map create mode 100644 structmrs__lib_1_1geometry_1_1radians__inherit__graph.md5 create mode 100644 structmrs__lib_1_1geometry_1_1radians__inherit__graph.png create mode 100644 structmrs__lib_1_1geometry_1_1sdegrees-members.html create mode 100644 structmrs__lib_1_1geometry_1_1sdegrees.html create mode 100644 structmrs__lib_1_1geometry_1_1sdegrees__coll__graph.map create mode 100644 structmrs__lib_1_1geometry_1_1sdegrees__coll__graph.md5 create mode 100644 structmrs__lib_1_1geometry_1_1sdegrees__coll__graph.png create mode 100644 structmrs__lib_1_1geometry_1_1sdegrees__inherit__graph.map create mode 100644 structmrs__lib_1_1geometry_1_1sdegrees__inherit__graph.md5 create mode 100644 structmrs__lib_1_1geometry_1_1sdegrees__inherit__graph.png create mode 100644 structmrs__lib_1_1geometry_1_1sradians-members.html create mode 100644 structmrs__lib_1_1geometry_1_1sradians.html create mode 100644 structmrs__lib_1_1geometry_1_1sradians__coll__graph.map create mode 100644 structmrs__lib_1_1geometry_1_1sradians__coll__graph.md5 create mode 100644 structmrs__lib_1_1geometry_1_1sradians__coll__graph.png create mode 100644 structmrs__lib_1_1geometry_1_1sradians__inherit__graph.map create mode 100644 structmrs__lib_1_1geometry_1_1sradians__inherit__graph.md5 create mode 100644 structmrs__lib_1_1geometry_1_1sradians__inherit__graph.png create mode 100644 structmrs__lib_1_1quadratic__throttle__model_1_1MotorParams__t-members.html create mode 100644 structmrs__lib_1_1quadratic__throttle__model_1_1MotorParams__t.html create mode 100644 structmrs__lib_1_1quadratic__throttle__model_1_1MotorParams__t.js create mode 100644 structobj__t-members.html create mode 100644 structobj__t.html create mode 100644 structobj__t.js create mode 100644 structstd_1_1tuple__element_3_010_00_01mrs__lib_1_1AttitudeConverter_01_4-members.html create mode 100644 structstd_1_1tuple__element_3_010_00_01mrs__lib_1_1AttitudeConverter_01_4.html create mode 100644 structstd_1_1tuple__element_3_010_00_01mrs__lib_1_1AttitudeConverter_01_4.js create mode 100644 structstd_1_1tuple__element_3_011_00_01mrs__lib_1_1AttitudeConverter_01_4-members.html create mode 100644 structstd_1_1tuple__element_3_011_00_01mrs__lib_1_1AttitudeConverter_01_4.html create mode 100644 structstd_1_1tuple__element_3_011_00_01mrs__lib_1_1AttitudeConverter_01_4.js create mode 100644 structstd_1_1tuple__element_3_012_00_01mrs__lib_1_1AttitudeConverter_01_4-members.html create mode 100644 structstd_1_1tuple__element_3_012_00_01mrs__lib_1_1AttitudeConverter_01_4.html create mode 100644 structstd_1_1tuple__element_3_012_00_01mrs__lib_1_1AttitudeConverter_01_4.js create mode 100644 structstd_1_1tuple__size_3_01mrs__lib_1_1AttitudeConverter_01_4-members.html create mode 100644 structstd_1_1tuple__size_3_01mrs__lib_1_1AttitudeConverter_01_4.html create mode 100644 subscribe__handler_2example_8cpp.html create mode 100644 subscribe__handler_2example_8cpp.js create mode 100644 subscribe__handler_2example_8cpp__incl.map create mode 100644 subscribe__handler_2example_8cpp__incl.md5 create mode 100644 subscribe__handler_2example_8cpp__incl.png create mode 100644 subscribe__handler_8h.html create mode 100644 subscribe__handler_8h.js create mode 100644 subscribe__handler_8h__dep__incl.map create mode 100644 subscribe__handler_8h__dep__incl.md5 create mode 100644 subscribe__handler_8h__dep__incl.png create mode 100644 subscribe__handler_8h__incl.map create mode 100644 subscribe__handler_8h__incl.md5 create mode 100644 subscribe__handler_8h__incl.png create mode 100644 subscribe__handler_8h_source.html create mode 100644 subscribe__handler_8hpp_source.html create mode 100644 subscribe_handler_2example_8cpp-example.html create mode 100644 subscribe_handler_2simple_example_8cpp-example.html create mode 100644 sync_off.png create mode 100644 sync_on.png create mode 100644 tab_a.png create mode 100644 tab_b.png create mode 100644 tab_h.png create mode 100644 tab_s.png create mode 100644 tabs.css create mode 100644 timeout__manager_8h.html create mode 100644 timeout__manager_8h__dep__incl.map create mode 100644 timeout__manager_8h__dep__incl.md5 create mode 100644 timeout__manager_8h__dep__incl.png create mode 100644 timeout__manager_8h__incl.map create mode 100644 timeout__manager_8h__incl.md5 create mode 100644 timeout__manager_8h__incl.png create mode 100644 timeout__manager_8h_source.html create mode 100644 timer_8h_source.html create mode 100644 timer_8hpp_source.html create mode 100644 transform__broadcaster_8h_source.html create mode 100644 transformer_8h_source.html create mode 100644 transformer_8hpp_source.html create mode 100644 ukf_2example_8cpp-example.html create mode 100644 ukf_2example_8cpp.html create mode 100644 ukf_2example_8cpp.js create mode 100644 ukf_2example_8cpp__incl.map create mode 100644 ukf_2example_8cpp__incl.md5 create mode 100644 ukf_2example_8cpp__incl.png create mode 100644 ukf_8h.html create mode 100644 ukf_8h__dep__incl.map create mode 100644 ukf_8h__dep__incl.md5 create mode 100644 ukf_8h__dep__incl.png create mode 100644 ukf_8h__incl.map create mode 100644 ukf_8h__incl.md5 create mode 100644 ukf_8h__incl.png create mode 100644 ukf_8h_source.html create mode 100644 ukf_8hpp.html create mode 100644 ukf_8hpp__dep__incl.map create mode 100644 ukf_8hpp__dep__incl.md5 create mode 100644 ukf_8hpp__dep__incl.png create mode 100644 ukf_8hpp__incl.map create mode 100644 ukf_8hpp__incl.md5 create mode 100644 ukf_8hpp__incl.png create mode 100644 ukf_8hpp_source.html create mode 100644 utils_8h.html create mode 100644 utils_8h.js create mode 100644 utils_8h__dep__incl.map create mode 100644 utils_8h__dep__incl.md5 create mode 100644 utils_8h__dep__incl.png create mode 100644 utils_8h__incl.map create mode 100644 utils_8h__incl.md5 create mode 100644 utils_8h__incl.png create mode 100644 utils_8h_source.html create mode 100644 vector__converter_2example_8cpp.html create mode 100644 vector__converter_2example_8cpp.js create mode 100644 vector__converter_2example_8cpp__incl.map create mode 100644 vector__converter_2example_8cpp__incl.md5 create mode 100644 vector__converter_2example_8cpp__incl.png create mode 100644 vector__converter_8h.html create mode 100644 vector__converter_8h.js create mode 100644 vector__converter_8h__dep__incl.map create mode 100644 vector__converter_8h__dep__incl.md5 create mode 100644 vector__converter_8h__dep__incl.png create mode 100644 vector__converter_8h__incl.map create mode 100644 vector__converter_8h__incl.md5 create mode 100644 vector__converter_8h__incl.png create mode 100644 vector__converter_8h_source.html create mode 100644 vector__converter_8hpp.html create mode 100644 vector__converter_8hpp.js create mode 100644 vector__converter_8hpp__dep__incl.map create mode 100644 vector__converter_8hpp__dep__incl.md5 create mode 100644 vector__converter_8hpp__dep__incl.png create mode 100644 vector__converter_8hpp__incl.map create mode 100644 vector__converter_8hpp__incl.md5 create mode 100644 vector__converter_8hpp__incl.png create mode 100644 vector__converter_8hpp_source.html create mode 100644 vector__converter__types_8h_source.html create mode 100644 vector_converter_2example_8cpp-example.html create mode 100644 visual__object_8h.html create mode 100644 visual__object_8h.js create mode 100644 visual__object_8h__dep__incl.map create mode 100644 visual__object_8h__dep__incl.md5 create mode 100644 visual__object_8h__dep__incl.png create mode 100644 visual__object_8h__incl.map create mode 100644 visual__object_8h__incl.md5 create mode 100644 visual__object_8h__incl.png create mode 100644 visual__object_8h_source.html diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/annotated.html b/annotated.html new file mode 100644 index 00000000..a1f698ac --- /dev/null +++ b/annotated.html @@ -0,0 +1,202 @@ + + + + + + + +mrs_lib: Class List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Class List
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+
[detail level 123]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 NDynamicPublisher
 Cimpl
 Nmrs_libAll mrs_lib functions, classes, variables and definitions are contained in this namespace
 Ngeometry
 CConeGeometric representaiton of a cone
 CCuboidGeometric representation of a cuboid
 CcyclicImplementation of the a general cyclic value (such as angles in radians/degrees etc)
 CCylinderGeometric representation of a cylinder
 CdegreesConvenience specialization of the cyclic class for unsigned degrees (from $0$ to $360$)
 CEllipseGeometric representation of an ellipse
 CradiansConvenience specialization of the cyclic class for unsigned radians (from $0$ to $2\pi$)
 CRayGeometric representation of a ray. Instantiate it by two input Vector3. Use static methods for from-to raycast, or a point-direction raycast
 CRectangleGeometric representation of a rectangle (can represent any quadrilateral)
 CsdegreesConvenience specialization of the cyclic class for signed degrees (from $-180$ to $180$)
 CsradiansConvenience specialization of the cyclic class for signed radians (from $-\pi$ to $\pi$)
 CTriangleGeometric representation of a triangle. Instantiate a new triangle by providing three vertices
 Nquadratic_throttle_model
 CMotorParams_t
 CAtomicScopeFlagConvenience class for automatically setting and unsetting an atomic boolean based on the object's scope. Useful e.g. for indicating whether a thread is running or not
 CAttitudeConverterThe main convertor class. Instantiate with any type in constructor and get the value in any other type by assigning the instance to your variable, as: tf::Quaternion tf1_quaternion = AttitudeConverter(roll, pitch, yaw); All the default Euler angles are in the extrinsic RPY notation
 CEulerFormatExceptionThrown when the Euler angle format is set wrongly
 CGetHeadingExceptionThrown when calculating of heading is not possible due to atan2 exception
 CInvalidAttitudeExceptionThrown when the internal attitude becomes invalid
 CMathErrorExceptionThrown when math breaks
 CSetHeadingExceptionThrown when the heading cannot be set to an existing attitude
 CBatchVisualizerLibrary for drawing large amounts of geometric objects in RVIZ at the same time
 CDKFImplementation of the Degenerate measurement Linear Kalman filter
 CDynamicPublisherA helper class for easy publishing of ROS messages for debugging purposes
 CDynamicReconfigureMgr
 Ceigenvector_exceptionThis exception may be thrown when solving the generalized eigenvalue problem with the M and N matrices
 CEulerAttitudeA small class for storing the Euler angles
 CIirFilter
 CImagePubliserData
 CImagePublisher
 CIntersection
 CJLKF
 Cinverse_exceptionThis exception is thrown when taking the inverse of a matrix fails
 CKalmanFilterThis abstract class defines common interfaces and types for a generic Kalman filter
 Cstatecov_tHelper struct for passing around the state and its covariance in one variable
 CKalmanFilterAloamGarmThis abstract class defines common interfaces and types for a generic Kalman filter
 Cstatecov_tHelper struct for passing around the state and its covariance in one variable
 CLKFImplementation of the Linear Kalman filter [3]
 Cinverse_exceptionThis exception is thrown when taking the inverse of a matrix fails
 CLKF_MRS_odom
 CMedianFilterImplementation of a median filter with a fixed-length buffer
 CMRSTimerCommon wrapper representing the functionality of the ros::Timer
 CNCLKFThis class implements the norm-constrained linear Kalman filter [5]
 CNCLKF_partialThis class implements the partially norm-constrained linear Kalman filter [5]
 CNCUKF
 CNotchFilter
 CParamLoaderConvenience class for loading parameters from rosparam server
 CParamProviderHelper class for ParamLoader
 CPolygon
 CExtraVertices
 CWrongNumberOfColumns
 CWrongNumberOfVertices
 CProfiler
 CPublisherHandlerUser wrapper of the publisher handler implementation
 CPublisherHandler_implImplementation of the publisher handler
 CRepredictorImplementation of the Repredictor for fusing measurements with variable delays
 CRepredictorAloamgarmImplementation of the RepredictorAloamgarm for fusing measurements with variable delays
 CRHEIVImplementation of the Reduced Heteroscedastic Errors In Variables surface fitting algorithm [2]
 CROSTimerRos::Timer wrapper. The interface is the same as with ros::Timer, except for the initialization method
 CRoutine
 CSafetyZone
 CBorderError
 CScopeTimerSimple timer which will time a duration of a scope and checkpoints inside the scope in ros time and std::chrono time
 Ctime_point
 CScopeTimerLoggerSimple file logger of scope timer and its checkpoints
 CServiceClientHandlerUser wrapper of the service client handler implementation
 CServiceClientHandler_implImplementation of the service client handler
 CSubscribeHandlerThe main class for ROS topic subscription, message timeout handling etc
 CImpl
 CImplThreadsafe
 CSubscribeHandlerOptionsA helper class to simplify setup of SubscribeHandler construction. This class is passed to the SubscribeHandler constructor and specifies its common options
 CThreadTimerCustom thread-based Timers with the same interface as mrs_lib::ROSTimer
 CTimeoutManagerTODO
 CTransformBroadcasterWrapper for the tf2_ros::TransformBroadcaster. With each sendTransform() command, the message is checked against the last message with the same frame IDs. If the transform was already published in this ros::Time step, then the transform is skipped. Prevents endless stream of warnings from spamming the console output
 CTransformerA convenience wrapper class for ROS's native TF2 API to simplify transforming of various messages
 CUKFImplementation of the Unscented Kalman filter [4]
 Cinverse_exceptionThrown when taking the inverse of a matrix fails during kalman gain calculation
 Csquare_root_exceptionThrown when taking the square root of a matrix fails during sigma generation
 CvarstepLKF
 CVector3ConverterConverter of Vector3 representations. Instantiate it with any type of vector3 in constructor and convert it by assigning it to any other type of vector3 variable
 CVisualObject
 Nstd
 Ctuple_element< 0, mrs_lib::AttitudeConverter >
 Ctuple_element< 1, mrs_lib::AttitudeConverter >
 Ctuple_element< 2, mrs_lib::AttitudeConverter >
 Ctuple_size< mrs_lib::AttitudeConverter >
 NThreadTimer
 CImpl
 Cdegrees
 CMyPoint
 Cobj_t
 CSubObject
 CVectorConverterTest
+
+
+
+ + + + diff --git a/annotated_dup.js b/annotated_dup.js new file mode 100644 index 00000000..f167bd9a --- /dev/null +++ b/annotated_dup.js @@ -0,0 +1,21 @@ +var annotated_dup = +[ + [ "DynamicPublisher", null, [ + [ "impl", "classDynamicPublisher_1_1impl.html", "classDynamicPublisher_1_1impl" ] + ] ], + [ "mrs_lib", "namespacemrs__lib.html", "namespacemrs__lib" ], + [ "std", null, [ + [ "tuple_element< 0, mrs_lib::AttitudeConverter >", "structstd_1_1tuple__element_3_010_00_01mrs__lib_1_1AttitudeConverter_01_4.html", "structstd_1_1tuple__element_3_010_00_01mrs__lib_1_1AttitudeConverter_01_4" ], + [ "tuple_element< 1, mrs_lib::AttitudeConverter >", "structstd_1_1tuple__element_3_011_00_01mrs__lib_1_1AttitudeConverter_01_4.html", "structstd_1_1tuple__element_3_011_00_01mrs__lib_1_1AttitudeConverter_01_4" ], + [ "tuple_element< 2, mrs_lib::AttitudeConverter >", "structstd_1_1tuple__element_3_012_00_01mrs__lib_1_1AttitudeConverter_01_4.html", "structstd_1_1tuple__element_3_012_00_01mrs__lib_1_1AttitudeConverter_01_4" ], + [ "tuple_size< mrs_lib::AttitudeConverter >", "structstd_1_1tuple__size_3_01mrs__lib_1_1AttitudeConverter_01_4.html", null ] + ] ], + [ "ThreadTimer", null, [ + [ "Impl", "classThreadTimer_1_1Impl.html", "classThreadTimer_1_1Impl" ] + ] ], + [ "degrees", "structdegrees.html", null ], + [ "MyPoint", "structMyPoint.html", "structMyPoint" ], + [ "obj_t", "structobj__t.html", "structobj__t" ], + [ "SubObject", "classSubObject.html", "classSubObject" ], + [ "VectorConverterTest", "classVectorConverterTest.html", null ] +]; \ No newline at end of file diff --git a/attitude__converter_8h.html b/attitude__converter_8h.html new file mode 100644 index 00000000..5b9ff022 --- /dev/null +++ b/attitude__converter_8h.html @@ -0,0 +1,208 @@ + + + + + + + +mrs_lib: include/mrs_lib/attitude_converter.h File Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
attitude_converter.h File Reference
+
+
+ +

Conversions between various representations of object attitude in 3D. Supports Quaternions, Euler angles, Angle-axis and Rotational matrices from tf, tf2, Eigen and geometry_msgs libraries. The default Euler angle notation is the extrinsic RPY. +More...

+
#include <vector>
+#include <cmath>
+#include <Eigen/Dense>
+#include <tuple>
+#include <tf2_ros/transform_listener.h>
+#include <tf2_ros/buffer.h>
+#include <tf2_eigen/tf2_eigen.h>
+#include <tf2_geometry_msgs/tf2_geometry_msgs.h>
+#include <tf/transform_datatypes.h>
+#include <tf_conversions/tf_eigen.h>
+#include <mrs_lib/geometry/misc.h>
+
+ + Include dependency graph for attitude_converter.h:
+
+
+ +
+ + This graph shows which files directly or indirectly include this file:
+
+
+ +
+

Go to the source code of this file.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Classes

class  mrs_lib::EulerAttitude
 A small class for storing the Euler angles. More...
 
class  mrs_lib::Vector3Converter
 Converter of Vector3 representations. Instantiate it with any type of vector3 in constructor and convert it by assigning it to any other type of vector3 variable. More...
 
class  mrs_lib::AttitudeConverter
 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, as: tf::Quaternion tf1_quaternion = AttitudeConverter(roll, pitch, yaw); All the default Euler angles are in the extrinsic RPY notation. More...
 
struct  mrs_lib::AttitudeConverter::GetHeadingException
 is thrown when calculating of heading is not possible due to atan2 exception More...
 
struct  mrs_lib::AttitudeConverter::MathErrorException
 is thrown when math breaks More...
 
struct  mrs_lib::AttitudeConverter::InvalidAttitudeException
 is thrown when the internal attitude becomes invalid More...
 
struct  mrs_lib::AttitudeConverter::EulerFormatException
 is thrown when the Euler angle format is set wrongly More...
 
struct  mrs_lib::AttitudeConverter::SetHeadingException
 is thrown when the heading cannot be set to an existing attitude More...
 
struct  std::tuple_size< mrs_lib::AttitudeConverter >
 
struct  std::tuple_element< 0, mrs_lib::AttitudeConverter >
 
struct  std::tuple_element< 1, mrs_lib::AttitudeConverter >
 
struct  std::tuple_element< 2, mrs_lib::AttitudeConverter >
 
+ + + + +

+Namespaces

 mrs_lib
 All mrs_lib functions, classes, variables and definitions are contained in this namespace.
 
+ + + +

+Enumerations

enum  RPY_convention_t { RPY_INTRINSIC = 1, +RPY_EXTRINSIC = 2 + }
 
+

Detailed Description

+

Conversions between various representations of object attitude in 3D. Supports Quaternions, Euler angles, Angle-axis and Rotational matrices from tf, tf2, Eigen and geometry_msgs libraries. The default Euler angle notation is the extrinsic RPY.

+
Author
Tomas Baca
+
+
+ + + + diff --git a/attitude__converter_8h.js b/attitude__converter_8h.js new file mode 100644 index 00000000..64dd9e0e --- /dev/null +++ b/attitude__converter_8h.js @@ -0,0 +1,19 @@ +var attitude__converter_8h = +[ + [ "EulerAttitude", "classmrs__lib_1_1EulerAttitude.html", "classmrs__lib_1_1EulerAttitude" ], + [ "Vector3Converter", "classmrs__lib_1_1Vector3Converter.html", "classmrs__lib_1_1Vector3Converter" ], + [ "AttitudeConverter", "classmrs__lib_1_1AttitudeConverter.html", "classmrs__lib_1_1AttitudeConverter" ], + [ "GetHeadingException", "structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException.html", "structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException" ], + [ "MathErrorException", "structmrs__lib_1_1AttitudeConverter_1_1MathErrorException.html", "structmrs__lib_1_1AttitudeConverter_1_1MathErrorException" ], + [ "InvalidAttitudeException", "structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException.html", "structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException" ], + [ "EulerFormatException", "structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException.html", "structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException" ], + [ "SetHeadingException", "structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException.html", "structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException" ], + [ "tuple_size< mrs_lib::AttitudeConverter >", "structstd_1_1tuple__size_3_01mrs__lib_1_1AttitudeConverter_01_4.html", null ], + [ "tuple_element< 0, mrs_lib::AttitudeConverter >", "structstd_1_1tuple__element_3_010_00_01mrs__lib_1_1AttitudeConverter_01_4.html", "structstd_1_1tuple__element_3_010_00_01mrs__lib_1_1AttitudeConverter_01_4" ], + [ "tuple_element< 1, mrs_lib::AttitudeConverter >", "structstd_1_1tuple__element_3_011_00_01mrs__lib_1_1AttitudeConverter_01_4.html", "structstd_1_1tuple__element_3_011_00_01mrs__lib_1_1AttitudeConverter_01_4" ], + [ "tuple_element< 2, mrs_lib::AttitudeConverter >", "structstd_1_1tuple__element_3_012_00_01mrs__lib_1_1AttitudeConverter_01_4.html", "structstd_1_1tuple__element_3_012_00_01mrs__lib_1_1AttitudeConverter_01_4" ], + [ "RPY_convention_t", "attitude__converter_8h.html#aeebfeed9c234fa645d39c864fa3ecaab", [ + [ "RPY_INTRINSIC", "attitude__converter_8h.html#aeebfeed9c234fa645d39c864fa3ecaabafe6a6511417aaee7441f6a708cd217b1", null ], + [ "RPY_EXTRINSIC", "attitude__converter_8h.html#aeebfeed9c234fa645d39c864fa3ecaaba79f06980715846067ad2fee2cc6b8cbb", null ] + ] ] +]; \ No newline at end of file diff --git a/attitude__converter_8h__dep__incl.map b/attitude__converter_8h__dep__incl.map new file mode 100644 index 00000000..49c47712 --- /dev/null +++ b/attitude__converter_8h__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/attitude__converter_8h__dep__incl.md5 b/attitude__converter_8h__dep__incl.md5 new file mode 100644 index 00000000..2deb0006 --- /dev/null +++ b/attitude__converter_8h__dep__incl.md5 @@ -0,0 +1 @@ +4a465cd595e63cbd8f2500074903ff12 \ No newline at end of file diff --git a/attitude__converter_8h__dep__incl.png b/attitude__converter_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..5dec1282d5a302c22a6fef4bfdc008be6f6390e5 GIT binary patch literal 5804 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 + + + + + + + + + + + + + + + diff --git a/attitude__converter_8h__incl.md5 b/attitude__converter_8h__incl.md5 new file mode 100644 index 00000000..41575f42 --- /dev/null +++ b/attitude__converter_8h__incl.md5 @@ -0,0 +1 @@ +c308a608ece69e9a97e1dec3570b7651 \ No newline at end of file diff --git a/attitude__converter_8h__incl.png b/attitude__converter_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..7f09bc5123a1c17123964ebfb72c3831a475d7d8 GIT binary patch literal 51351 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

#@e2x{)A@go8P)*;d0 zgbG}?{j|!e*1HXj4QY{4g{L^dV03Yrmd-z!gy;tm80NvjL8y=g zBaeheBQ&%JrENUTl8U}1K`sMWMlAxOf!Lb~;}rL0{gPYvy~ZCeDqYmC&}Q!_opK)I z%}ISN_jz(M29#eS+ih%YglDe)@;VMmM)CkHdU8%o5cEJKZkBd-RDOPIYO5PPnyZ-i ze>YBzwvPB+h}diKPzP*t3uASLPev{%FBWr230ZCAhY$L+=m4ALt(_q>=MVs}du^9Y zp;Sxo|F4Uf=LMYVz=@|I=_AU%10x;z`lTX83gDZcC_Wc1e)gjU!U<->o-8m9olmvp(2G3i60|WpMS4D?9kX%px#*?`Ku#$#@vBP7zNNs0cD4OVw|r_q zErW`j@}WZ{-abC&9@m86y?#CKF5eU39q%6>j{?6;Qd066bXK9JhTEy`>pz-6-1PAD z%sFK`<2}-qV6{(N938toAmlEpIhv*1y!o?6-^Xu_&{GgHHglDEEFTu*qb#xbYO4PQ zTGvKb|BX&OY0?AgTi#3V*|TS?y+CP;ui{5dkXR{58_}b`g8$hEes&u!u z9-w^cP;?7rM2E-;=UzP@TL%X^5DANNZx5;Q%)YA`A_5hj*y5|OqA<>Y|9Uy~y5Q-Q z|6MxL{`>v^{t)HEU4MJ`*!jDpf^Ysu<@s!l%rD@XEnlSfED4^&Dq6~UiWUL?4+o1A AMgRZ+ literal 0 HcmV?d00001 diff --git a/attitude__converter_8h_source.html b/attitude__converter_8h_source.html new file mode 100644 index 00000000..12f39745 --- /dev/null +++ b/attitude__converter_8h_source.html @@ -0,0 +1,397 @@ + + + + + + + +mrs_lib: include/mrs_lib/attitude_converter.h Source File + + + + + + + + + + + + + +

+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+
AttitudeConverter(const double &roll, const double &pitch, const double &yaw, const RPY_convention_t &format=RPY_EXTRINSIC)
Euler angles constructor.
Definition: attitude_converter.cpp:78
+
double getHeading(void)
get the angle of the rotated x-axis in the original XY plane, a.k.a
Definition: attitude_converter.cpp:254
+
Vector3Converter getVectorY(void)
get a unit vector pointing in the Y direction
Definition: attitude_converter.cpp:354
+
is thrown when calculating of heading is not possible due to atan2 exception
Definition: attitude_converter.h:158
+
Vector3Converter(const tf2::Vector3 &vector3)
Constructor with tf2::Vector3.
Definition: attitude_converter.h:97
+
AttitudeConverter(const Eigen::AngleAxis< T > angle_axis)
Eigen::AngleAxis constructor.
Definition: attitude_converter.h:253
+
std::tuple< double, double, double > getIntrinsicRPY()
get the Roll, Pitch, Yaw angles in the Intrinsic convention
Definition: attitude_converter.cpp:381
+
double getYawRateIntrinsic(const double &heading_rate)
get the intrinsic yaw rate from a heading rate
Definition: attitude_converter.cpp:267
+
double getYaw(void)
get the yaw angle
Definition: attitude_converter.cpp:233
+
is thrown when math breaks
Definition: attitude_converter.h:166
+
double getRoll(void)
get the roll angle
Definition: attitude_converter.cpp:240
+
The main convertor class. Instantiate with any type in constructor and get the value in any other typ...
Definition: attitude_converter.h:153
+
double pitch(void) const
get the pitch angle
Definition: attitude_converter.cpp:20
+
Vector3Converter getVectorZ(void)
get a unit vector pointing in the Z direction
Definition: attitude_converter.cpp:363
+
std::tuple< double, double, double > getExtrinsicRPY()
get the Roll, Pitch, Yaw angles in the Extrinsic convention. The same as the default AttitudeConverte...
Definition: attitude_converter.cpp:372
+
Defines useful geometry utilities and functions.
+
AttitudeConverter setYaw(const double &new_yaw)
Updates the extrinsic yaw of the current orientation.
Definition: attitude_converter.cpp:394
+
double roll(void) const
get the roll angle
Definition: attitude_converter.cpp:16
+
EulerAttitude(const double &roll, const double &pitch, const double &yaw)
A simple class for storing the Euler angles.
Definition: attitude_converter.cpp:13
+
Vector3Converter getVectorX(void)
get a unit vector pointing in the X direction
Definition: attitude_converter.cpp:345
+
is thrown when the Euler angle format is set wrongly
Definition: attitude_converter.h:182
+
All mrs_lib functions, classes, variables and definitions are contained in this namespace.
Definition: attitude_converter.h:29
+
double yaw(void) const
get the yaw angle
Definition: attitude_converter.cpp:24
+
A small class for storing the Euler angles.
Definition: attitude_converter.h:46
+
double getPitch(void)
get the pitch angle
Definition: attitude_converter.cpp:247
+
Converter of Vector3 representations. Instantiate it with any type of vector3 in constructor and conv...
Definition: attitude_converter.h:90
+
AttitudeConverter setHeading(const double &heading)
Updates the heading of the current orientation by updating the intrinsic yaw.
Definition: attitude_converter.cpp:403
+
double getHeadingRate(const Vector3Converter &attitude_rate)
get heading rate base on the orientation and body-based attitude rate
Definition: attitude_converter.cpp:312
+
is thrown when the heading cannot be set to an existing attitude
Definition: attitude_converter.h:190
+
is thrown when the internal attitude becomes invalid
Definition: attitude_converter.h:174
+ + + + diff --git a/batch__visualizer_8h.html b/batch__visualizer_8h.html new file mode 100644 index 00000000..7c820798 --- /dev/null +++ b/batch__visualizer_8h.html @@ -0,0 +1,163 @@ + + + + + + + +mrs_lib: include/mrs_lib/batch_visualizer.h File Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
batch_visualizer.h File Reference
+
+
+ +

For convenient and computationally lightweight drawing of geometry in RVIZ using marker arrays. +More...

+
#include <vector>
+#include <ros/ros.h>
+#include <visualization_msgs/MarkerArray.h>
+#include <mrs_lib/geometry/shapes.h>
+#include <mrs_msgs/TrajectoryReference.h>
+#include <mrs_lib/visual_object.h>
+#include <set>
+
+ + Include dependency graph for batch_visualizer.h:
+
+
+ +
+

Go to the source code of this file.

+ + + + + +

+Classes

class  mrs_lib::BatchVisualizer
 library for drawing large amounts of geometric objects in RVIZ at the same time More...
 
+ + + + +

+Namespaces

 mrs_lib
 All mrs_lib functions, classes, variables and definitions are contained in this namespace.
 
+ + + +

+Macros

+#define DEFAULT_ELLIPSE_POINTS   64
 
+

Detailed Description

+

For convenient and computationally lightweight drawing of geometry in RVIZ using marker arrays.

+
Author
Petr Štibinger - stibi.nosp@m.pet@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz
+
+
+ + + + diff --git a/batch__visualizer_8h.js b/batch__visualizer_8h.js new file mode 100644 index 00000000..9ac69c6f --- /dev/null +++ b/batch__visualizer_8h.js @@ -0,0 +1,5 @@ +var batch__visualizer_8h = +[ + [ "BatchVisualizer", "classmrs__lib_1_1BatchVisualizer.html", "classmrs__lib_1_1BatchVisualizer" ], + [ "DEFAULT_ELLIPSE_POINTS", "batch__visualizer_8h.html#a51b7645de121a21302986b8fa7ff2759", null ] +]; \ No newline at end of file diff --git a/batch__visualizer_8h__incl.map b/batch__visualizer_8h__incl.map new file mode 100644 index 00000000..f76c2cd4 --- /dev/null +++ b/batch__visualizer_8h__incl.map @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/batch__visualizer_8h__incl.md5 b/batch__visualizer_8h__incl.md5 new file mode 100644 index 00000000..cf806639 --- /dev/null +++ b/batch__visualizer_8h__incl.md5 @@ -0,0 +1 @@ +e4ece8eb0ce4895455c2534d663bc252 \ No newline at end of file diff --git a/batch__visualizer_8h__incl.png b/batch__visualizer_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..45b2a7a0fb167caf870a97445ced8df17634f90a GIT binary patch literal 44941 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

~#5(mPn{C5ZjQ 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 JZ0$p5{|5}RHL3sr literal 0 HcmV?d00001 diff --git a/batch__visualizer_8h_source.html b/batch__visualizer_8h_source.html new file mode 100644 index 00000000..e72d2368 --- /dev/null +++ b/batch__visualizer_8h_source.html @@ -0,0 +1,227 @@ + + + + + + + +mrs_lib: include/mrs_lib/batch_visualizer.h Source File + + + + + + + + + + + + + +

+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
batch_visualizer.h
+
+
+Go to the documentation of this file.
1 
+
6 #ifndef BATCH_VISUALIZER_H
+
7 #define BATCH_VISUALIZER_H
+
8 
+
9 #include <vector>
+
10 #include <ros/ros.h>
+
11 #include <visualization_msgs/MarkerArray.h>
+ +
13 #include <mrs_msgs/TrajectoryReference.h>
+
14 #include <mrs_lib/visual_object.h>
+
15 #include <set>
+
16 
+
17 #define DEFAULT_ELLIPSE_POINTS 64
+
18 
+
19 namespace mrs_lib
+
20 {
+
21 
+ +
26 
+
27 public:
+ + +
43  BatchVisualizer(ros::NodeHandle &nh, std::string marker_topic_name, std::string parent_frame);
+
44 
+
55  void addPoint(const Eigen::Vector3d &point, const double r = 0.0, const double g = 1.0, const double b = 0.3, const double a = 1.0,
+
56  const ros::Duration &timeout = ros::Duration(0));
+
57 
+
68  void addRay(const mrs_lib::geometry::Ray &ray, const double r = 1.0, const double g = 0.0, const double b = 0.0, const double a = 1.0,
+
69  const ros::Duration &timeout = ros::Duration(0));
+
70 
+
82  void addTriangle(const mrs_lib::geometry::Triangle &tri, const double r = 0.5, const double g = 0.5, const double b = 0.0, const double a = 1.0,
+
83  const bool filled = true, const ros::Duration &timeout = ros::Duration(0));
+
84 
+
96  void addRectangle(const mrs_lib::geometry::Rectangle &rect, const double r = 0.5, const double g = 0.5, const double b = 0.0, const double a = 1.0,
+
97  const bool filled = true, const ros::Duration &timeout = ros::Duration(0));
+
98 
+
110  void addCuboid(const mrs_lib::geometry::Cuboid &cuboid, const double r = 0.5, const double g = 0.5, const double b = 0.0, const double a = 1.0,
+
111  const bool filled = true, const ros::Duration &timeout = ros::Duration(0));
+
112 
+
125  void addEllipse(const mrs_lib::geometry::Ellipse &ellipse, const double r = 0.0, const double g = 1.0, const double b = 1.0, const double a = 1.0,
+
126  const bool filled = true, const int num_points = DEFAULT_ELLIPSE_POINTS, const ros::Duration &timeout = ros::Duration(0));
+
127 
+
141  void addCylinder(const mrs_lib::geometry::Cylinder &cylinder, const double r = 0.7, const double g = 0.8, const double b = 0.3, const double a = 1.0,
+
142  const bool filled = true, const bool capped = true, const int sides = DEFAULT_ELLIPSE_POINTS,
+
143  const ros::Duration &timeout = ros::Duration(0));
+
157  void addCone(const mrs_lib::geometry::Cone &cone, const double r = 0.7, const double g = 0.8, const double b = 0.3, const double a = 1.0,
+
158  const bool filled = true, const bool capped = true, const int sides = DEFAULT_ELLIPSE_POINTS, const ros::Duration &timeout = ros::Duration(0));
+
159 
+
171  void addTrajectory(const mrs_msgs::TrajectoryReference &traj, const double r = 0.3, const double g = 1.0, const double b = 0.3, const double a = 1.0,
+
172  const bool filled = true, const ros::Duration &timeout = ros::Duration(0));
+
173 
+
177  void addNullPoint();
+
178 
+
182  void addNullLine();
+
183 
+
187  void addNullTriangle();
+
188 
+
194  void setPointsScale(const double scale);
+
195 
+
201  void setParentFrame(const std::string parent_frame);
+
202 
+
208  void setLinesScale(const double scale);
+
209 
+
213  void clearBuffers();
+
214 
+
218  void clearVisuals();
+
219 
+
223  void publish();
+
224 
+
225 private:
+
226  ros::Publisher visual_pub;
+
227  visualization_msgs::MarkerArray msg;
+
228 
+
229  std::string parent_frame; // coordinate frame id
+
230  std::string marker_topic_name;
+
231 
+
232  std::set<VisualObject> visual_objects; // buffer for objects to be visualized
+
233 
+
234  visualization_msgs::Marker points_marker;
+
235  visualization_msgs::Marker lines_marker;
+
236  visualization_msgs::Marker triangles_marker;
+
237 
+
238  bool initialized = false;
+
239  void initialize();
+
240 
+
241  double points_scale = 0.02;
+
242  double lines_scale = 0.04;
+
243 
+
244  unsigned long uuid = 0; // create unique ID for items in object buffer
+
245 };
+
246 
+
247 } // namespace mrs_lib
+
248 
+
249 #endif
+
+
+
void publish()
publish the visual markers ROS message and populates it with buffer content
Definition: batch_visualizer.cpp:270
+
void addEllipse(const mrs_lib::geometry::Ellipse &ellipse, const double r=0.0, const double g=1.0, const double b=1.0, const double a=1.0, const bool filled=true, const int num_points=DEFAULT_ELLIPSE_POINTS, const ros::Duration &timeout=ros::Duration(0))
add an ellipse to the buffer
Definition: batch_visualizer.cpp:136
+
void addNullTriangle()
helper function for adding an invisible triangle to the buffer
Definition: batch_visualizer.cpp:211
+
void addPoint(const Eigen::Vector3d &point, const double r=0.0, const double g=1.0, const double b=0.3, const double a=1.0, const ros::Duration &timeout=ros::Duration(0))
add a point to the buffer
Definition: batch_visualizer.cpp:93
+
~BatchVisualizer()
destructor
Definition: batch_visualizer.cpp:12
+
void setLinesScale(const double scale)
set the thickness of all lines
Definition: batch_visualizer.cpp:246
+
void clearBuffers()
remove all objects from the buffer
Definition: batch_visualizer.cpp:252
+
Object abstraction for the Batch Visualizer.
+
geometric representation of a ray. Instantiate it by two input Vector3. Use static methods for from-t...
Definition: shapes.h:24
+
void clearVisuals()
publishes an empty message. Removes all objects drawn onto the scene, but keeps them in buffer
Definition: batch_visualizer.cpp:258
+
geometric representation of a cuboid
Definition: shapes.h:317
+
void setParentFrame(const std::string parent_frame)
set the parent frame_id
Definition: batch_visualizer.cpp:27
+
void addCuboid(const mrs_lib::geometry::Cuboid &cuboid, const double r=0.5, const double g=0.5, const double b=0.0, const double a=1.0, const bool filled=true, const ros::Duration &timeout=ros::Duration(0))
add a cuboid to the buffer
Definition: batch_visualizer.cpp:127
+
void setPointsScale(const double scale)
set the scale of all points
Definition: batch_visualizer.cpp:240
+
void addCylinder(const mrs_lib::geometry::Cylinder &cylinder, const double r=0.7, const double g=0.8, const double b=0.3, const double a=1.0, const bool filled=true, const bool capped=true, const int sides=DEFAULT_ELLIPSE_POINTS, const ros::Duration &timeout=ros::Duration(0))
add a cylinder to the buffer
Definition: batch_visualizer.cpp:145
+
void addCone(const mrs_lib::geometry::Cone &cone, const double r=0.7, const double g=0.8, const double b=0.3, const double a=1.0, const bool filled=true, const bool capped=true, const int sides=DEFAULT_ELLIPSE_POINTS, const ros::Duration &timeout=ros::Duration(0))
add a cone to the buffer
Definition: batch_visualizer.cpp:153
+
void addTriangle(const mrs_lib::geometry::Triangle &tri, const double r=0.5, const double g=0.5, const double b=0.0, const double a=1.0, const bool filled=true, const ros::Duration &timeout=ros::Duration(0))
add a triangle to the buffer
Definition: batch_visualizer.cpp:109
+
geometric representation of an ellipse
Definition: shapes.h:426
+
All mrs_lib functions, classes, variables and definitions are contained in this namespace.
Definition: attitude_converter.h:29
+
void addNullPoint()
helper function for adding an invisible point to the object buffer
Definition: batch_visualizer.cpp:169
+
geometric representation of a rectangle (can represent any quadrilateral)
Definition: shapes.h:187
+
Defines various geometrical shapes and their relations.
+
void addRectangle(const mrs_lib::geometry::Rectangle &rect, const double r=0.5, const double g=0.5, const double b=0.0, const double a=1.0, const bool filled=true, const ros::Duration &timeout=ros::Duration(0))
add a rectangle to the buffer
Definition: batch_visualizer.cpp:118
+
void addRay(const mrs_lib::geometry::Ray &ray, const double r=1.0, const double g=0.0, const double b=0.0, const double a=1.0, const ros::Duration &timeout=ros::Duration(0))
add a ray to the buffer
Definition: batch_visualizer.cpp:101
+
geometric representation of a triangle. Instantiate a new triangle by providing three vertices
Definition: shapes.h:98
+
void addNullLine()
helper function for adding an invisible line to the object buffer
Definition: batch_visualizer.cpp:187
+
BatchVisualizer()
dummy constructor
Definition: batch_visualizer.cpp:9
+
geometric representation of a cylinder
Definition: shapes.h:490
+
geometric representaiton of a cone
Definition: shapes.h:573
+
void addTrajectory(const mrs_msgs::TrajectoryReference &traj, const double r=0.3, const double g=1.0, const double b=0.3, const double a=1.0, const bool filled=true, const ros::Duration &timeout=ros::Duration(0))
add a trajectory to the buffer
Definition: batch_visualizer.cpp:161
+
library for drawing large amounts of geometric objects in RVIZ at the same time
Definition: batch_visualizer.h:25
+ + + + diff --git a/bc_s.png b/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zcmV;V0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 HcmV?d00001 diff --git a/bdwn.png b/bdwn.png new file mode 100644 index 0000000000000000000000000000000000000000..940a0b950443a0bb1b216ac03c45b8a16c955452 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)H!3HEvS)PKZC{Gv1kP61Pb5HX&C2wk~_T + + + + + + +mrs_lib: Bibliography + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Bibliography
+
+
+
+
[1]
+

Stephen A. Chee and James R. Forbes. Norm-constrained unscented kalman filter with application to high area-to-mass ratio space-debris tracking. In AIAA Guidance, Navigation, and Control Conference, Jan 2016.

+

+
+
[2]
+

W. Chojnacki, M. J. Brooks, A. van den Hengel, and D. Gawley. FNS and HEIV: relating two vision parameter estimation frameworks. In 12th International Conference on Image Analysis and Processing, 2003.Proceedings., pages 152–157, Sep 2003.

+

+
+
[3]
+

Rudolph Emil Kalman. A new approach to linear filtering and prediction problems. Transactions of the ASME–Journal of Basic Engineering, 82(Series D):35–45, 1960.

+

+
+
[4]
+

E. A. Wan and R. Van Der Merwe. The unscented kalman filter for nonlinear estimation. In Proceedings of the IEEE 2000 Adaptive Systems for Signal Processing, Communications, and Control Symposium (Cat. No.00EX373), pages 153–158, Oct 2000.

+

+
+
[5]
+

Renato Zanetti, Manoranjan Majji, Robert H. Bishop, and Daniele Mortari. Norm-constrained kalman filtering. Journal of Guidance, Control, and Dynamics, 32(5):1458–1465, 2009.

+

+
+
+
+
+
+ + + + diff --git a/classDynamicPublisher_1_1impl-members.html b/classDynamicPublisher_1_1impl-members.html new file mode 100644 index 00000000..c597cd09 --- /dev/null +++ b/classDynamicPublisher_1_1impl-members.html @@ -0,0 +1,107 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
DynamicPublisher::impl Member List
+
+
+ +

This is the complete list of members for DynamicPublisher::impl, including all inherited members.

+ + + + +
impl()=default (defined in DynamicPublisher::impl)DynamicPublisher::impl
impl(const ros::NodeHandle &nh) (defined in DynamicPublisher::impl)DynamicPublisher::implinline
publish(const std::string name, const T &msg) (defined in DynamicPublisher::impl)DynamicPublisher::implinline
+
+ + + + diff --git a/classDynamicPublisher_1_1impl.html b/classDynamicPublisher_1_1impl.html new file mode 100644 index 00000000..014ac8e2 --- /dev/null +++ b/classDynamicPublisher_1_1impl.html @@ -0,0 +1,120 @@ + + + + + + + +mrs_lib: DynamicPublisher::impl Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
DynamicPublisher::impl Class Reference
+
+
+ + + + + + + +

+Public Member Functions

impl (const ros::NodeHandle &nh)
 
+template<class T >
void publish (const std::string name, const T &msg)
 
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/classDynamicPublisher_1_1impl.js b/classDynamicPublisher_1_1impl.js new file mode 100644 index 00000000..0a98de67 --- /dev/null +++ b/classDynamicPublisher_1_1impl.js @@ -0,0 +1,6 @@ +var classDynamicPublisher_1_1impl = +[ + [ "impl", "classDynamicPublisher_1_1impl.html#aaa45c2933f980559a9f92e672f325618", null ], + [ "impl", "classDynamicPublisher_1_1impl.html#a19f0bc67633228eb49d3fdfedab4bc6c", null ], + [ "publish", "classDynamicPublisher_1_1impl.html#a1fe7ec12024c0e3e1c907a34acfdfd64", null ] +]; \ No newline at end of file diff --git a/classSubObject-members.html b/classSubObject-members.html new file mode 100644 index 00000000..3dd17b85 --- /dev/null +++ b/classSubObject-members.html @@ -0,0 +1,106 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
SubObject Member List
+
+
+ +

This is the complete list of members for SubObject, including all inherited members.

+ + + +
callback_method(const std_msgs::String::ConstPtr msg) (defined in SubObject)SubObjectinline
timeout_method(const std::string &topic_name, const ros::Time &last_msg) (defined in SubObject)SubObjectinline
+
+ + + + diff --git a/classSubObject.html b/classSubObject.html new file mode 100644 index 00000000..ab272842 --- /dev/null +++ b/classSubObject.html @@ -0,0 +1,121 @@ + + + + + + + +mrs_lib: SubObject Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
SubObject Class Reference
+
+
+ + + + + + +

+Public Member Functions

+void callback_method (const std_msgs::String::ConstPtr msg)
 
+void timeout_method (const std::string &topic_name, const ros::Time &last_msg)
 
+

Detailed Description

+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/classSubObject.js b/classSubObject.js new file mode 100644 index 00000000..ed378c15 --- /dev/null +++ b/classSubObject.js @@ -0,0 +1,5 @@ +var classSubObject = +[ + [ "callback_method", "classSubObject.html#ab45ed0b3758cf60c77fd488b3b4da197", null ], + [ "timeout_method", "classSubObject.html#a9de6e819d64fe2536b93518dd1d08134", null ] +]; \ No newline at end of file diff --git a/classThreadTimer_1_1Impl-members.html b/classThreadTimer_1_1Impl-members.html new file mode 100644 index 00000000..193357e4 --- /dev/null +++ b/classThreadTimer_1_1Impl-members.html @@ -0,0 +1,114 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
ThreadTimer::Impl Member List
+
+
+ +

This is the complete list of members for ThreadTimer::Impl, including all inherited members.

+ + + + + + + + + + + +
Impl(const std::function< void(const ros::TimerEvent &)> &callback, const ros::Duration &delay_dur, const bool oneshot) (defined in ThreadTimer::Impl)ThreadTimer::Impl
Impl(const Impl &)=delete (defined in ThreadTimer::Impl)ThreadTimer::Impl
Impl(Impl &&)=delete (defined in ThreadTimer::Impl)ThreadTimer::Impl
operator=(const Impl &)=delete (defined in ThreadTimer::Impl)ThreadTimer::Impl
operator=(Impl &&)=delete (defined in ThreadTimer::Impl)ThreadTimer::Impl
setPeriod(const ros::Duration &duration, const bool reset=true) (defined in ThreadTimer::Impl)ThreadTimer::Impl
start() (defined in ThreadTimer::Impl)ThreadTimer::Impl
stop() (defined in ThreadTimer::Impl)ThreadTimer::Impl
ThreadTimer (defined in ThreadTimer::Impl)ThreadTimer::Implfriend
~Impl() (defined in ThreadTimer::Impl)ThreadTimer::Impl
+
+ + + + diff --git a/classThreadTimer_1_1Impl.html b/classThreadTimer_1_1Impl.html new file mode 100644 index 00000000..a0f9c13c --- /dev/null +++ b/classThreadTimer_1_1Impl.html @@ -0,0 +1,144 @@ + + + + + + + +mrs_lib: ThreadTimer::Impl Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
ThreadTimer::Impl Class Reference
+
+
+ + + + + + + + + + + + + + + + + + +

+Public Member Functions

Impl (const std::function< void(const ros::TimerEvent &)> &callback, const ros::Duration &delay_dur, const bool oneshot)
 
+void start ()
 
+void stop ()
 
+void setPeriod (const ros::Duration &duration, const bool reset=true)
 
Impl (const Impl &)=delete
 
Impl (Impl &&)=delete
 
+Imploperator= (const Impl &)=delete
 
+Imploperator= (Impl &&)=delete
 
+ + + +

+Friends

+class ThreadTimer
 
+
The documentation for this class was generated from the following files:
    +
  • include/mrs_lib/impl/timer.hpp
  • +
  • src/timer/timer.cpp
  • +
+
+
+ + + + diff --git a/classThreadTimer_1_1Impl.js b/classThreadTimer_1_1Impl.js new file mode 100644 index 00000000..40c52689 --- /dev/null +++ b/classThreadTimer_1_1Impl.js @@ -0,0 +1,13 @@ +var classThreadTimer_1_1Impl = +[ + [ "Impl", "classThreadTimer_1_1Impl.html#ac41581624c3ec1344bfac7069d7aa1f2", null ], + [ "~Impl", "classThreadTimer_1_1Impl.html#a323898b0ff0268b0adf327cfb9735921", null ], + [ "Impl", "classThreadTimer_1_1Impl.html#a274682763ef9406142b83725ef6ecff4", null ], + [ "Impl", "classThreadTimer_1_1Impl.html#a1cfc655ae5e4f4ac22a6db88a494729a", null ], + [ "operator=", "classThreadTimer_1_1Impl.html#a2f8003af63b8c5b9976912aa329483e8", null ], + [ "operator=", "classThreadTimer_1_1Impl.html#afbca04c3504c7fe8d24816a1caeca06e", null ], + [ "setPeriod", "classThreadTimer_1_1Impl.html#a5a0677c911b72f4316eef0d76d5bbb19", null ], + [ "start", "classThreadTimer_1_1Impl.html#add04d90e39bb09078c2af4e39a4d2f18", null ], + [ "stop", "classThreadTimer_1_1Impl.html#a2d0a406c6538f95f4d9b8fc14a6e6bab", null ], + [ "ThreadTimer", "classThreadTimer_1_1Impl.html#a3bfed848c47524c3e45cd469acf38701", null ] +]; \ No newline at end of file diff --git a/classVectorConverterTest.html b/classVectorConverterTest.html new file mode 100644 index 00000000..802d1e43 --- /dev/null +++ b/classVectorConverterTest.html @@ -0,0 +1,127 @@ + + + + + + + +mrs_lib: VectorConverterTest< T > Class Template Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
VectorConverterTest< T > Class Template Reference
+
+
+
+ + Inheritance diagram for VectorConverterTest< T >:
+
+
+ +
+ + Collaboration diagram for VectorConverterTest< T >:
+
+
+ +
The documentation for this class was generated from the following file:
    +
  • test/vector_converter/test.cpp
  • +
+
+
+ + + + diff --git a/classVectorConverterTest__coll__graph.map b/classVectorConverterTest__coll__graph.map new file mode 100644 index 00000000..140c735e --- /dev/null +++ b/classVectorConverterTest__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/classVectorConverterTest__coll__graph.md5 b/classVectorConverterTest__coll__graph.md5 new file mode 100644 index 00000000..044b10c0 --- /dev/null +++ b/classVectorConverterTest__coll__graph.md5 @@ -0,0 +1 @@ +76a94b650ded00cae09a8709fa89c221 \ No newline at end of file diff --git a/classVectorConverterTest__coll__graph.png b/classVectorConverterTest__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..243923492c1d6e9d0e56bd655bf868acc5579fdc GIT binary patch literal 3651 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 LTcgWRSMUE1tu7Np literal 0 HcmV?d00001 diff --git a/classVectorConverterTest__inherit__graph.map b/classVectorConverterTest__inherit__graph.map new file mode 100644 index 00000000..140c735e --- /dev/null +++ b/classVectorConverterTest__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/classVectorConverterTest__inherit__graph.md5 b/classVectorConverterTest__inherit__graph.md5 new file mode 100644 index 00000000..044b10c0 --- /dev/null +++ b/classVectorConverterTest__inherit__graph.md5 @@ -0,0 +1 @@ +76a94b650ded00cae09a8709fa89c221 \ No newline at end of file diff --git a/classVectorConverterTest__inherit__graph.png b/classVectorConverterTest__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..243923492c1d6e9d0e56bd655bf868acc5579fdc GIT binary patch literal 3651 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 LTcgWRSMUE1tu7Np literal 0 HcmV?d00001 diff --git a/classes.html b/classes.html new file mode 100644 index 00000000..1a477321 --- /dev/null +++ b/classes.html @@ -0,0 +1,265 @@ + + + + + + + +mrs_lib: Class Index + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Class Index
+
+
+
a | b | c | d | e | g | i | j | k | l | m | n | o | p | r | s | t | u | v | w
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  a  
+
Polygon::ExtraVertices (mrs_lib)   LKF_MRS_odom (mrs_lib)   Ray (mrs_lib::geometry)   TimeoutManager (mrs_lib)   
  g  
+
  m  
+
Rectangle (mrs_lib::geometry)   TransformBroadcaster (mrs_lib)   
AtomicScopeFlag (mrs_lib)   Repredictor (mrs_lib)   Transformer (mrs_lib)   
AttitudeConverter (mrs_lib)   AttitudeConverter::GetHeadingException (mrs_lib)   AttitudeConverter::MathErrorException (mrs_lib)   RepredictorAloamgarm (mrs_lib)   Triangle (mrs_lib::geometry)   
  b  
+
  i  
+
MedianFilter (mrs_lib)   RHEIV (mrs_lib)   tuple_element< 0, mrs_lib::AttitudeConverter > (std)   
MotorParams_t (mrs_lib::quadratic_throttle_model)   ROSTimer (mrs_lib)   tuple_element< 1, mrs_lib::AttitudeConverter > (std)   
BatchVisualizer (mrs_lib)   IirFilter (mrs_lib)   MRSTimer (mrs_lib)   Routine (mrs_lib)   tuple_element< 2, mrs_lib::AttitudeConverter > (std)   
SafetyZone::BorderError (mrs_lib)   ImagePubliserData (mrs_lib)   MyPoint   
  s  
+
tuple_size< mrs_lib::AttitudeConverter > (std)   
  c  
+
ImagePublisher (mrs_lib)   
  n  
+
  u  
+
impl (DynamicPublisher)   SafetyZone (mrs_lib)   
Cone (mrs_lib::geometry)   SubscribeHandler::Impl (mrs_lib)   NCLKF (mrs_lib)   ScopeTimer (mrs_lib)   UKF (mrs_lib)   
Cuboid (mrs_lib::geometry)   Impl (ThreadTimer)   NCLKF_partial (mrs_lib)   ScopeTimerLogger (mrs_lib)   
  v  
+
cyclic (mrs_lib::geometry)   SubscribeHandler::ImplThreadsafe (mrs_lib)   NCUKF (mrs_lib)   sdegrees (mrs_lib::geometry)   
Cylinder (mrs_lib::geometry)   Intersection (mrs_lib)   NotchFilter (mrs_lib)   ServiceClientHandler (mrs_lib)   varstepLKF (mrs_lib)   
  d  
+
AttitudeConverter::InvalidAttitudeException (mrs_lib)   
  o  
+
ServiceClientHandler_impl (mrs_lib)   Vector3Converter (mrs_lib)   
JLKF::inverse_exception (mrs_lib)   AttitudeConverter::SetHeadingException (mrs_lib)   VectorConverterTest   
degrees (mrs_lib::geometry)   UKF::inverse_exception (mrs_lib)   obj_t   UKF::square_root_exception (mrs_lib)   VisualObject (mrs_lib)   
degrees   LKF::inverse_exception (mrs_lib)   
  p  
+
sradians (mrs_lib::geometry)   
  w  
+
DKF (mrs_lib)   
  j  
+
KalmanFilter::statecov_t (mrs_lib)   
DynamicPublisher (mrs_lib)   ParamLoader (mrs_lib)   KalmanFilterAloamGarm::statecov_t (mrs_lib)   Polygon::WrongNumberOfColumns (mrs_lib)   
DynamicReconfigureMgr (mrs_lib)   JLKF (mrs_lib)   ParamProvider (mrs_lib)   SubObject   Polygon::WrongNumberOfVertices (mrs_lib)   
  e  
+
  k  
+
Polygon (mrs_lib)   SubscribeHandler (mrs_lib)   
Profiler (mrs_lib)   SubscribeHandlerOptions (mrs_lib)   
eigenvector_exception (mrs_lib)   KalmanFilter (mrs_lib)   PublisherHandler (mrs_lib)   
  t  
+
Ellipse (mrs_lib::geometry)   KalmanFilterAloamGarm (mrs_lib)   PublisherHandler_impl (mrs_lib)   
EulerAttitude (mrs_lib)   
  l  
+
  r  
+
ThreadTimer (mrs_lib)   
AttitudeConverter::EulerFormatException (mrs_lib)   ScopeTimer::time_point (mrs_lib)   
LKF (mrs_lib)   radians (mrs_lib::geometry)   
+
a | b | c | d | e | g | i | j | k | l | m | n | o | p | r | s | t | u | v | w
+
+
+ + + + diff --git a/classmrs__lib_1_1AtomicScopeFlag-members.html b/classmrs__lib_1_1AtomicScopeFlag-members.html new file mode 100644 index 00000000..7fcffd59 --- /dev/null +++ b/classmrs__lib_1_1AtomicScopeFlag-members.html @@ -0,0 +1,106 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::AtomicScopeFlag Member List
+
+
+ +

This is the complete list of members for mrs_lib::AtomicScopeFlag, including all inherited members.

+ + + +
AtomicScopeFlag(std::atomic< bool > &in)mrs_lib::AtomicScopeFlag
~AtomicScopeFlag()mrs_lib::AtomicScopeFlag
+
+ + + + diff --git a/classmrs__lib_1_1AtomicScopeFlag.html b/classmrs__lib_1_1AtomicScopeFlag.html new file mode 100644 index 00000000..9319f1ab --- /dev/null +++ b/classmrs__lib_1_1AtomicScopeFlag.html @@ -0,0 +1,172 @@ + + + + + + + +mrs_lib: mrs_lib::AtomicScopeFlag Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::AtomicScopeFlag Class Reference
+
+
+ +

Convenience class for automatically setting and unsetting an atomic boolean based on the object's scope. Useful e.g. for indicating whether a thread is running or not. + More...

+ +

#include <utils.h>

+ + + + + + + + +

+Public Member Functions

 AtomicScopeFlag (std::atomic< bool > &in)
 The constructor. Sets the flag in to true. More...
 
 ~AtomicScopeFlag ()
 The destructor. Resets the variable given in the constructor to false. More...
 
+

Detailed Description

+

Convenience class for automatically setting and unsetting an atomic boolean based on the object's scope. Useful e.g. for indicating whether a thread is running or not.

+

Constructor & Destructor Documentation

+ +

◆ AtomicScopeFlag()

+ +
+
+ + + + + + + + +
mrs_lib::AtomicScopeFlag::AtomicScopeFlag (std::atomic< bool > & in)
+
+ +

The constructor. Sets the flag in to true.

+
Parameters
+ + +
inThe flag to be set on construction of this object and reset (set to false) on its destruction.
+
+
+ +
+
+ +

◆ ~AtomicScopeFlag()

+ +
+
+ + + + + + + +
mrs_lib::AtomicScopeFlag::~AtomicScopeFlag ()
+
+ +

The destructor. Resets the variable given in the constructor to false.

+ +
+
+
The documentation for this class was generated from the following files:
    +
  • include/mrs_lib/utils.h
  • +
  • src/utils/utils.cpp
  • +
+
+
+ + + + diff --git a/classmrs__lib_1_1AtomicScopeFlag.js b/classmrs__lib_1_1AtomicScopeFlag.js new file mode 100644 index 00000000..d92bd72f --- /dev/null +++ b/classmrs__lib_1_1AtomicScopeFlag.js @@ -0,0 +1,5 @@ +var classmrs__lib_1_1AtomicScopeFlag = +[ + [ "AtomicScopeFlag", "classmrs__lib_1_1AtomicScopeFlag.html#a168dc1d0a0ae38b254d89a84afdc4cab", null ], + [ "~AtomicScopeFlag", "classmrs__lib_1_1AtomicScopeFlag.html#aafdf61c0af0bffada120eec2a8c858b1", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1AttitudeConverter-members.html b/classmrs__lib_1_1AttitudeConverter-members.html new file mode 100644 index 00000000..825b0917 --- /dev/null +++ b/classmrs__lib_1_1AttitudeConverter-members.html @@ -0,0 +1,137 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::AttitudeConverter Member List
+
+
+ +

This is the complete list of members for mrs_lib::AttitudeConverter, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttitudeConverter(const double &roll, const double &pitch, const double &yaw, const RPY_convention_t &format=RPY_EXTRINSIC)mrs_lib::AttitudeConverter
AttitudeConverter(const tf::Quaternion quaternion)mrs_lib::AttitudeConverter
AttitudeConverter(const geometry_msgs::Quaternion quaternion)mrs_lib::AttitudeConverter
AttitudeConverter(const mrs_lib::EulerAttitude &euler_attitude)mrs_lib::AttitudeConverter
AttitudeConverter(const Eigen::Quaterniond quaternion)mrs_lib::AttitudeConverter
AttitudeConverter(const Eigen::Matrix3d matrix)mrs_lib::AttitudeConverter
AttitudeConverter(const Eigen::AngleAxis< T > angle_axis)mrs_lib::AttitudeConverterinline
AttitudeConverter(const tf2::Quaternion quaternion)mrs_lib::AttitudeConverter
AttitudeConverter(const tf2::Matrix3x3 matrix)mrs_lib::AttitudeConverter
get() (defined in mrs_lib::AttitudeConverter)mrs_lib::AttitudeConverter
getExtrinsicRPY()mrs_lib::AttitudeConverter
getHeading(void)mrs_lib::AttitudeConverter
getHeadingRate(const Vector3Converter &attitude_rate)mrs_lib::AttitudeConverter
getIntrinsicRPY()mrs_lib::AttitudeConverter
getPitch(void)mrs_lib::AttitudeConverter
getRoll(void)mrs_lib::AttitudeConverter
getVectorX(void)mrs_lib::AttitudeConverter
getVectorY(void)mrs_lib::AttitudeConverter
getVectorZ(void)mrs_lib::AttitudeConverter
getYaw(void)mrs_lib::AttitudeConverter
getYawRateIntrinsic(const double &heading_rate)mrs_lib::AttitudeConverter
operator Eigen::AngleAxis< T >() constmrs_lib::AttitudeConverterinline
operator Eigen::Matrix3d() const (defined in mrs_lib::AttitudeConverter)mrs_lib::AttitudeConverter
operator Eigen::Quaternion< T >() constmrs_lib::AttitudeConverterinline
operator EulerAttitude() constmrs_lib::AttitudeConverter
operator geometry_msgs::Quaternion() constmrs_lib::AttitudeConverter
operator std::tuple< double &, double &, double & >()mrs_lib::AttitudeConverter
operator tf2::Matrix3x3() constmrs_lib::AttitudeConverter
operator tf2::Quaternion() constmrs_lib::AttitudeConverter
operator tf2::Transform() constmrs_lib::AttitudeConverter
operator tf::Quaternion() constmrs_lib::AttitudeConverter
setHeading(const double &heading)mrs_lib::AttitudeConverter
setYaw(const double &new_yaw)mrs_lib::AttitudeConverter
+
+ + + + diff --git a/classmrs__lib_1_1AttitudeConverter.html b/classmrs__lib_1_1AttitudeConverter.html new file mode 100644 index 00000000..382dbff0 --- /dev/null +++ b/classmrs__lib_1_1AttitudeConverter.html @@ -0,0 +1,1026 @@ + + + + + + + +mrs_lib: mrs_lib::AttitudeConverter Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::AttitudeConverter Class Reference
+
+
+ +

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, as: tf::Quaternion tf1_quaternion = AttitudeConverter(roll, pitch, yaw); All the default Euler angles are in the extrinsic RPY notation. + More...

+ +

#include <attitude_converter.h>

+ + + + + + + + + + + + + + + + + +

+Classes

struct  EulerFormatException
 is thrown when the Euler angle format is set wrongly More...
 
struct  GetHeadingException
 is thrown when calculating of heading is not possible due to atan2 exception More...
 
struct  InvalidAttitudeException
 is thrown when the internal attitude becomes invalid More...
 
struct  MathErrorException
 is thrown when math breaks More...
 
struct  SetHeadingException
 is thrown when the heading cannot be set to an existing attitude More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 AttitudeConverter (const double &roll, const double &pitch, const double &yaw, const RPY_convention_t &format=RPY_EXTRINSIC)
 Euler angles constructor. More...
 
 AttitudeConverter (const tf::Quaternion quaternion)
 tf::Quaternion constructor More...
 
 AttitudeConverter (const geometry_msgs::Quaternion quaternion)
 geometry_msgs::Quaternion constructor More...
 
 AttitudeConverter (const mrs_lib::EulerAttitude &euler_attitude)
 mrs_lib::EulerAttitude constructor More...
 
 AttitudeConverter (const Eigen::Quaterniond quaternion)
 Eigen::Quaterniond constructor. More...
 
 AttitudeConverter (const Eigen::Matrix3d matrix)
 Eigen::Matrix3d constructor. More...
 
template<class T >
 AttitudeConverter (const Eigen::AngleAxis< T > angle_axis)
 Eigen::AngleAxis constructor. More...
 
 AttitudeConverter (const tf2::Quaternion quaternion)
 tf2::Quaternion constructor More...
 
 AttitudeConverter (const tf2::Matrix3x3 matrix)
 tf2::Matrix3x3 constructor More...
 
 operator tf2::Quaternion () const
 typecast to tf2::Quaternion More...
 
 operator tf::Quaternion () const
 typecast to tf::Quaternion More...
 
 operator geometry_msgs::Quaternion () const
 typecast to geometry_msgs::Quaternion More...
 
 operator EulerAttitude () const
 typecast to EulerAttitude More...
 
template<class T >
 operator Eigen::AngleAxis< T > () const
 typecast to Eigen::AngleAxis More...
 
template<class T >
 operator Eigen::Quaternion< T > () const
 typecast to EulerAttitude Eigen::Quaternion More...
 
operator Eigen::Matrix3d () const
 
 operator std::tuple< double &, double &, double & > ()
 typecase to tuple of Euler angles in extrinsic RPY More...
 
 operator tf2::Matrix3x3 () const
 typecase to tf2::Matrix3x3 More...
 
 operator tf2::Transform () const
 typecase to tf2::Transform More...
 
double getRoll (void)
 get the roll angle More...
 
double getPitch (void)
 get the pitch angle More...
 
double getYaw (void)
 get the yaw angle More...
 
double getHeading (void)
 get the angle of the rotated x-axis in the original XY plane, a.k.a More...
 
double getHeadingRate (const Vector3Converter &attitude_rate)
 get heading rate base on the orientation and body-based attitude rate More...
 
double getYawRateIntrinsic (const double &heading_rate)
 get the intrinsic yaw rate from a heading rate More...
 
Vector3Converter getVectorX (void)
 get a unit vector pointing in the X direction More...
 
Vector3Converter getVectorY (void)
 get a unit vector pointing in the Y direction More...
 
Vector3Converter getVectorZ (void)
 get a unit vector pointing in the Z direction More...
 
std::tuple< double, double, double > getIntrinsicRPY ()
 get the Roll, Pitch, Yaw angles in the Intrinsic convention More...
 
std::tuple< double, double, double > getExtrinsicRPY ()
 get the Roll, Pitch, Yaw angles in the Extrinsic convention. The same as the default AttitudeConverter assignment. More...
 
AttitudeConverter setHeading (const double &heading)
 Updates the heading of the current orientation by updating the intrinsic yaw. More...
 
AttitudeConverter setYaw (const double &new_yaw)
 Updates the extrinsic yaw of the current orientation. More...
 
+template<std::size_t I>
constexpr auto get ()
 
+

Detailed Description

+

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, as: tf::Quaternion tf1_quaternion = AttitudeConverter(roll, pitch, yaw); All the default Euler angles are in the extrinsic RPY notation.

+

Constructor & Destructor Documentation

+ +

◆ AttitudeConverter() [1/9]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::AttitudeConverter::AttitudeConverter (const double & roll,
const double & pitch,
const double & yaw,
const RPY_convention_t & format = RPY_EXTRINSIC 
)
+
+ +

Euler angles constructor.

+
Parameters
+ + + + + +
roll
pitch
yaw
formatoptional, Euler angle convention, {"extrinsic", "intrinsic"}, defaults to "extrinsic"
+
+
+ +
+
+ +

◆ AttitudeConverter() [2/9]

+ +
+
+ + + + + + + + +
mrs_lib::AttitudeConverter::AttitudeConverter (const tf::Quaternion quaternion)
+
+ +

tf::Quaternion constructor

+
Parameters
+ + +
quaterniontf::Quaternion quaternion
+
+
+ +
+
+ +

◆ AttitudeConverter() [3/9]

+ +
+
+ + + + + + + + +
mrs_lib::AttitudeConverter::AttitudeConverter (const geometry_msgs::Quaternion quaternion)
+
+ +

geometry_msgs::Quaternion constructor

+
Parameters
+ + +
quaterniongeometry_msgs::Quaternion quaternion
+
+
+ +
+
+ +

◆ AttitudeConverter() [4/9]

+ +
+
+ + + + + + + + +
mrs_lib::AttitudeConverter::AttitudeConverter (const mrs_lib::EulerAttitudeeuler_attitude)
+
+ +

mrs_lib::EulerAttitude constructor

+
Parameters
+ + +
euler_attitudemrs_lib::EulerAttitude
+
+
+ +
+
+ +

◆ AttitudeConverter() [5/9]

+ +
+
+ + + + + + + + +
mrs_lib::AttitudeConverter::AttitudeConverter (const Eigen::Quaterniond quaternion)
+
+ +

Eigen::Quaterniond constructor.

+
Parameters
+ + +
quaternionEigen::Quaterniond quaternion
+
+
+ +
+
+ +

◆ AttitudeConverter() [6/9]

+ +
+
+ + + + + + + + +
mrs_lib::AttitudeConverter::AttitudeConverter (const Eigen::Matrix3d matrix)
+
+ +

Eigen::Matrix3d constructor.

+
Parameters
+ + +
matrixEigen::Matrix3d rotational matrix
+
+
+ +
+
+ +

◆ AttitudeConverter() [7/9]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
mrs_lib::AttitudeConverter::AttitudeConverter (const Eigen::AngleAxis< T > angle_axis)
+
+inline
+
+ +

Eigen::AngleAxis constructor.

+
Template Parameters
+ + +
Tangle-axis base type
+
+
+
Parameters
+ + +
angle_axisEigen::AngleAxis
+
+
+ +
+
+ +

◆ AttitudeConverter() [8/9]

+ +
+
+ + + + + + + + +
mrs_lib::AttitudeConverter::AttitudeConverter (const tf2::Quaternion quaternion)
+
+ +

tf2::Quaternion constructor

+
Parameters
+ + +
quaterniontf2::Quaternion
+
+
+ +
+
+ +

◆ AttitudeConverter() [9/9]

+ +
+
+ + + + + + + + +
mrs_lib::AttitudeConverter::AttitudeConverter (const tf2::Matrix3x3 matrix)
+
+ +

tf2::Matrix3x3 constructor

+
Parameters
+ + +
quaterniontf2::Matrix3x3
+
+
+ +
+
+

Member Function Documentation

+ +

◆ getExtrinsicRPY()

+ +
+
+ + + + + + + +
std::tuple< double, double, double > mrs_lib::AttitudeConverter::getExtrinsicRPY ()
+
+ +

get the Roll, Pitch, Yaw angles in the Extrinsic convention. The same as the default AttitudeConverter assignment.

+
Returns
RPY
+ +
+
+ +

◆ getHeading()

+ +
+
+ + + + + + + + +
double mrs_lib::AttitudeConverter::getHeading (void )
+
+ +

get the angle of the rotated x-axis in the original XY plane, a.k.a

+
Returns
heading
+ +
+
+ +

◆ getHeadingRate()

+ +
+
+ + + + + + + + +
double mrs_lib::AttitudeConverter::getHeadingRate (const Vector3Converterattitude_rate)
+
+ +

get heading rate base on the orientation and body-based attitude rate

+
Parameters
+ + +
attitude_ratein the body frame
+
+
+
Returns
heading rate in the world
+ +
+
+ +

◆ getIntrinsicRPY()

+ +
+
+ + + + + + + +
std::tuple< double, double, double > mrs_lib::AttitudeConverter::getIntrinsicRPY ()
+
+ +

get the Roll, Pitch, Yaw angles in the Intrinsic convention

+
Returns
RPY
+ +
+
+ +

◆ getPitch()

+ +
+
+ + + + + + + + +
double mrs_lib::AttitudeConverter::getPitch (void )
+
+ +

get the pitch angle

+
Returns
pitch
+ +
+
+ +

◆ getRoll()

+ +
+
+ + + + + + + + +
double mrs_lib::AttitudeConverter::getRoll (void )
+
+ +

get the roll angle

+
Returns
roll
+ +
+
+ +

◆ getVectorX()

+ +
+
+ + + + + + + + +
Vector3Converter mrs_lib::AttitudeConverter::getVectorX (void )
+
+ +

get a unit vector pointing in the X direction

+
Returns
the vector
+ +
+
+ +

◆ getVectorY()

+ +
+
+ + + + + + + + +
Vector3Converter mrs_lib::AttitudeConverter::getVectorY (void )
+
+ +

get a unit vector pointing in the Y direction

+
Returns
the vector
+ +
+
+ +

◆ getVectorZ()

+ +
+
+ + + + + + + + +
Vector3Converter mrs_lib::AttitudeConverter::getVectorZ (void )
+
+ +

get a unit vector pointing in the Z direction

+
Returns
the vector
+ +
+
+ +

◆ getYaw()

+ +
+
+ + + + + + + + +
double mrs_lib::AttitudeConverter::getYaw (void )
+
+ +

get the yaw angle

+
Returns
yaw
+ +
+
+ +

◆ getYawRateIntrinsic()

+ +
+
+ + + + + + + + +
double mrs_lib::AttitudeConverter::getYawRateIntrinsic (const double & heading_rate)
+
+ +

get the intrinsic yaw rate from a heading rate

+
Parameters
+ + +
heading_rate
+
+
+
Returns
intrinsic yaw rate
+ +
+
+ +

◆ operator Eigen::AngleAxis< T >()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
mrs_lib::AttitudeConverter::operator Eigen::AngleAxis< T > () const
+
+inline
+
+ +

typecast to Eigen::AngleAxis

+
Template Parameters
+ + +
Tangle-axis base type
+
+
+
Returns
orientation in EulerAttitude
+ +
+
+ +

◆ operator Eigen::Quaternion< T >()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
mrs_lib::AttitudeConverter::operator Eigen::Quaternion< T > () const
+
+inline
+
+ +

typecast to EulerAttitude Eigen::Quaternion

+
Template Parameters
+ + +
Tquaternion base type
+
+
+
Returns
orientation in Eigen::Quaternion
+ +
+
+ +

◆ operator EulerAttitude()

+ +
+
+ + + + + + + +
mrs_lib::AttitudeConverter::operator EulerAttitude () const
+
+ +

typecast to EulerAttitude

+
Returns
orientation in EulerAttitude
+ +
+
+ +

◆ operator geometry_msgs::Quaternion()

+ +
+
+ + + + + + + +
mrs_lib::AttitudeConverter::operator geometry_msgs::Quaternion () const
+
+ +

typecast to geometry_msgs::Quaternion

+
Returns
orientation in geometry_msgs::Quaternion
+ +
+
+ +

◆ operator std::tuple< double &, double &, double & >()

+ +
+
+ + + + + + + +
mrs_lib::AttitudeConverter::operator std::tuple< double &, double &, double & > ()
+
+ +

typecase to tuple of Euler angles in extrinsic RPY

+
Returns
std::tuple of extrinsic RPY
+ +
+
+ +

◆ operator tf2::Matrix3x3()

+ +
+
+ + + + + + + +
mrs_lib::AttitudeConverter::operator tf2::Matrix3x3 () const
+
+ +

typecase to tf2::Matrix3x3

+
Returns
tf2::Matrix3x3 rotational matrix
+ +
+
+ +

◆ operator tf2::Quaternion()

+ +
+
+ + + + + + + +
mrs_lib::AttitudeConverter::operator tf2::Quaternion () const
+
+ +

typecast to tf2::Quaternion

+
Returns
orientation in tf2::Quaternion
+ +
+
+ +

◆ operator tf2::Transform()

+ +
+
+ + + + + + + +
mrs_lib::AttitudeConverter::operator tf2::Transform () const
+
+ +

typecase to tf2::Transform

+
Returns
tf2::Transform
+ +
+
+ +

◆ operator tf::Quaternion()

+ +
+
+ + + + + + + +
mrs_lib::AttitudeConverter::operator tf::Quaternion () const
+
+ +

typecast to tf::Quaternion

+
Returns
orientation in tf::Quaternion
+ +
+
+ +

◆ setHeading()

+ +
+
+ + + + + + + + +
AttitudeConverter mrs_lib::AttitudeConverter::setHeading (const double & heading)
+
+ +

Updates the heading of the current orientation by updating the intrinsic yaw.

+
Parameters
+ + +
newheading
+
+
+
Returns
the orientation
+ +
+
+ +

◆ setYaw()

+ +
+
+ + + + + + + + +
AttitudeConverter mrs_lib::AttitudeConverter::setYaw (const double & new_yaw)
+
+ +

Updates the extrinsic yaw of the current orientation.

+
Parameters
+ + +
newyaw
+
+
+
Returns
the orientation
+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/classmrs__lib_1_1AttitudeConverter.js b/classmrs__lib_1_1AttitudeConverter.js new file mode 100644 index 00000000..d67ef003 --- /dev/null +++ b/classmrs__lib_1_1AttitudeConverter.js @@ -0,0 +1,41 @@ +var classmrs__lib_1_1AttitudeConverter = +[ + [ "EulerFormatException", "structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException.html", "structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException" ], + [ "GetHeadingException", "structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException.html", "structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException" ], + [ "InvalidAttitudeException", "structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException.html", "structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException" ], + [ "MathErrorException", "structmrs__lib_1_1AttitudeConverter_1_1MathErrorException.html", "structmrs__lib_1_1AttitudeConverter_1_1MathErrorException" ], + [ "SetHeadingException", "structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException.html", "structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException" ], + [ "AttitudeConverter", "classmrs__lib_1_1AttitudeConverter.html#a1a98367c2a004a298a2026d883cfc0eb", null ], + [ "AttitudeConverter", "classmrs__lib_1_1AttitudeConverter.html#a134453cd539536eea199763467690483", null ], + [ "AttitudeConverter", "classmrs__lib_1_1AttitudeConverter.html#a9f00a180ebe802b8b7e30e08cc688f26", null ], + [ "AttitudeConverter", "classmrs__lib_1_1AttitudeConverter.html#a28987247a78e426e03eb37d51c7b6d82", null ], + [ "AttitudeConverter", "classmrs__lib_1_1AttitudeConverter.html#a15e411e1c06cd3af16d10f660656718b", null ], + [ "AttitudeConverter", "classmrs__lib_1_1AttitudeConverter.html#ad50e60f2d412b2253221c00fbbff2ead", null ], + [ "AttitudeConverter", "classmrs__lib_1_1AttitudeConverter.html#a0046963fb6f70e1ecc1d50c9778fec44", null ], + [ "AttitudeConverter", "classmrs__lib_1_1AttitudeConverter.html#a7d3224c3f9b32c2a9c65f63f5a2644ea", null ], + [ "AttitudeConverter", "classmrs__lib_1_1AttitudeConverter.html#a24d9d274eb16af01c3630ecb32065652", null ], + [ "get", "classmrs__lib_1_1AttitudeConverter.html#a9d4a90673d6e7046dbc4b2ce340b295a", null ], + [ "getExtrinsicRPY", "classmrs__lib_1_1AttitudeConverter.html#a0a9b9b0d146b4ccdc50c9a9037aec346", null ], + [ "getHeading", "classmrs__lib_1_1AttitudeConverter.html#a6efdbb896bca9d52abdafb2eec0daf48", null ], + [ "getHeadingRate", "classmrs__lib_1_1AttitudeConverter.html#ab3ac6086b34f743ac5e78249640eeddd", null ], + [ "getIntrinsicRPY", "classmrs__lib_1_1AttitudeConverter.html#abe03466ce1c2aefb74d402a3f1433693", null ], + [ "getPitch", "classmrs__lib_1_1AttitudeConverter.html#a599afad1265aaa6fd32d518e4de7817f", null ], + [ "getRoll", "classmrs__lib_1_1AttitudeConverter.html#a82b32b4b7ff4de5bcf78b168f0c3c569", null ], + [ "getVectorX", "classmrs__lib_1_1AttitudeConverter.html#a131f7ba8484bd0c7465594625d19ae89", null ], + [ "getVectorY", "classmrs__lib_1_1AttitudeConverter.html#a901ca23ee140e6d42027b242f0dfac8b", null ], + [ "getVectorZ", "classmrs__lib_1_1AttitudeConverter.html#a4853f4582b8af4f224726d15a18e9fbc", null ], + [ "getYaw", "classmrs__lib_1_1AttitudeConverter.html#ab2e8185898d05e5c2c9f7c7bf597f9a3", null ], + [ "getYawRateIntrinsic", "classmrs__lib_1_1AttitudeConverter.html#afa7a3ddc0e143fe90bd966a6ba9f2913", null ], + [ "operator Eigen::AngleAxis< T >", "classmrs__lib_1_1AttitudeConverter.html#a10847ba4ce35fa86efbe5933ba488183", null ], + [ "operator Eigen::Matrix3d", "classmrs__lib_1_1AttitudeConverter.html#a7edeee77361b5991b8eff3a135b25d43", null ], + [ "operator Eigen::Quaternion< T >", "classmrs__lib_1_1AttitudeConverter.html#a6db421976b5060c086f495f00edca314", null ], + [ "operator EulerAttitude", "classmrs__lib_1_1AttitudeConverter.html#a03ef9a1c10a9963e650fa217f0f04707", null ], + [ "operator geometry_msgs::Quaternion", "classmrs__lib_1_1AttitudeConverter.html#abc1686c5d27246a937c661f313ca13d0", null ], + [ "operator std::tuple< double &, double &, double & >", "classmrs__lib_1_1AttitudeConverter.html#a8f7e3a434632e7546149d64b2ab2e191", null ], + [ "operator tf2::Matrix3x3", "classmrs__lib_1_1AttitudeConverter.html#a123b85369560e858a9d3aba19a49227a", null ], + [ "operator tf2::Quaternion", "classmrs__lib_1_1AttitudeConverter.html#a4dd088014d1f15da217c960e8a9dbd6f", null ], + [ "operator tf2::Transform", "classmrs__lib_1_1AttitudeConverter.html#a09cd3459f52f9071db33c1ac7a5161de", null ], + [ "operator tf::Quaternion", "classmrs__lib_1_1AttitudeConverter.html#a7b6d71e47ec12e76f25823ad408c704c", null ], + [ "setHeading", "classmrs__lib_1_1AttitudeConverter.html#ac818b4e515d614d5d473be95b5ee9024", null ], + [ "setYaw", "classmrs__lib_1_1AttitudeConverter.html#a945e6c80d148df27897391bfd69c0505", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1BatchVisualizer-members.html b/classmrs__lib_1_1BatchVisualizer-members.html new file mode 100644 index 00000000..a1ad8a2f --- /dev/null +++ b/classmrs__lib_1_1BatchVisualizer-members.html @@ -0,0 +1,125 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::BatchVisualizer Member List
+
+
+ +

This is the complete list of members for mrs_lib::BatchVisualizer, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + +
addCone(const mrs_lib::geometry::Cone &cone, const double r=0.7, const double g=0.8, const double b=0.3, const double a=1.0, const bool filled=true, const bool capped=true, const int sides=DEFAULT_ELLIPSE_POINTS, const ros::Duration &timeout=ros::Duration(0))mrs_lib::BatchVisualizer
addCuboid(const mrs_lib::geometry::Cuboid &cuboid, const double r=0.5, const double g=0.5, const double b=0.0, const double a=1.0, const bool filled=true, const ros::Duration &timeout=ros::Duration(0))mrs_lib::BatchVisualizer
addCylinder(const mrs_lib::geometry::Cylinder &cylinder, const double r=0.7, const double g=0.8, const double b=0.3, const double a=1.0, const bool filled=true, const bool capped=true, const int sides=DEFAULT_ELLIPSE_POINTS, const ros::Duration &timeout=ros::Duration(0))mrs_lib::BatchVisualizer
addEllipse(const mrs_lib::geometry::Ellipse &ellipse, const double r=0.0, const double g=1.0, const double b=1.0, const double a=1.0, const bool filled=true, const int num_points=DEFAULT_ELLIPSE_POINTS, const ros::Duration &timeout=ros::Duration(0))mrs_lib::BatchVisualizer
addNullLine()mrs_lib::BatchVisualizer
addNullPoint()mrs_lib::BatchVisualizer
addNullTriangle()mrs_lib::BatchVisualizer
addPoint(const Eigen::Vector3d &point, const double r=0.0, const double g=1.0, const double b=0.3, const double a=1.0, const ros::Duration &timeout=ros::Duration(0))mrs_lib::BatchVisualizer
addRay(const mrs_lib::geometry::Ray &ray, const double r=1.0, const double g=0.0, const double b=0.0, const double a=1.0, const ros::Duration &timeout=ros::Duration(0))mrs_lib::BatchVisualizer
addRectangle(const mrs_lib::geometry::Rectangle &rect, const double r=0.5, const double g=0.5, const double b=0.0, const double a=1.0, const bool filled=true, const ros::Duration &timeout=ros::Duration(0))mrs_lib::BatchVisualizer
addTrajectory(const mrs_msgs::TrajectoryReference &traj, const double r=0.3, const double g=1.0, const double b=0.3, const double a=1.0, const bool filled=true, const ros::Duration &timeout=ros::Duration(0))mrs_lib::BatchVisualizer
addTriangle(const mrs_lib::geometry::Triangle &tri, const double r=0.5, const double g=0.5, const double b=0.0, const double a=1.0, const bool filled=true, const ros::Duration &timeout=ros::Duration(0))mrs_lib::BatchVisualizer
BatchVisualizer()mrs_lib::BatchVisualizer
BatchVisualizer(ros::NodeHandle &nh, std::string marker_topic_name, std::string parent_frame)mrs_lib::BatchVisualizer
clearBuffers()mrs_lib::BatchVisualizer
clearVisuals()mrs_lib::BatchVisualizer
publish()mrs_lib::BatchVisualizer
setLinesScale(const double scale)mrs_lib::BatchVisualizer
setParentFrame(const std::string parent_frame)mrs_lib::BatchVisualizer
setPointsScale(const double scale)mrs_lib::BatchVisualizer
~BatchVisualizer()mrs_lib::BatchVisualizer
+
+ + + + diff --git a/classmrs__lib_1_1BatchVisualizer.html b/classmrs__lib_1_1BatchVisualizer.html new file mode 100644 index 00000000..0ff89028 --- /dev/null +++ b/classmrs__lib_1_1BatchVisualizer.html @@ -0,0 +1,984 @@ + + + + + + + +mrs_lib: mrs_lib::BatchVisualizer Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::BatchVisualizer Class Reference
+
+
+ +

library for drawing large amounts of geometric objects in RVIZ at the same time + More...

+ +

#include <batch_visualizer.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

BatchVisualizer ()
 dummy constructor
 
~BatchVisualizer ()
 destructor
 
 BatchVisualizer (ros::NodeHandle &nh, std::string marker_topic_name, std::string parent_frame)
 constructor to initialize the visualizer More...
 
void addPoint (const Eigen::Vector3d &point, const double r=0.0, const double g=1.0, const double b=0.3, const double a=1.0, const ros::Duration &timeout=ros::Duration(0))
 add a point to the buffer More...
 
void addRay (const mrs_lib::geometry::Ray &ray, const double r=1.0, const double g=0.0, const double b=0.0, const double a=1.0, const ros::Duration &timeout=ros::Duration(0))
 add a ray to the buffer More...
 
void addTriangle (const mrs_lib::geometry::Triangle &tri, const double r=0.5, const double g=0.5, const double b=0.0, const double a=1.0, const bool filled=true, const ros::Duration &timeout=ros::Duration(0))
 add a triangle to the buffer More...
 
void addRectangle (const mrs_lib::geometry::Rectangle &rect, const double r=0.5, const double g=0.5, const double b=0.0, const double a=1.0, const bool filled=true, const ros::Duration &timeout=ros::Duration(0))
 add a rectangle to the buffer More...
 
void addCuboid (const mrs_lib::geometry::Cuboid &cuboid, const double r=0.5, const double g=0.5, const double b=0.0, const double a=1.0, const bool filled=true, const ros::Duration &timeout=ros::Duration(0))
 add a cuboid to the buffer More...
 
void addEllipse (const mrs_lib::geometry::Ellipse &ellipse, const double r=0.0, const double g=1.0, const double b=1.0, const double a=1.0, const bool filled=true, const int num_points=DEFAULT_ELLIPSE_POINTS, const ros::Duration &timeout=ros::Duration(0))
 add an ellipse to the buffer More...
 
void addCylinder (const mrs_lib::geometry::Cylinder &cylinder, const double r=0.7, const double g=0.8, const double b=0.3, const double a=1.0, const bool filled=true, const bool capped=true, const int sides=DEFAULT_ELLIPSE_POINTS, const ros::Duration &timeout=ros::Duration(0))
 add a cylinder to the buffer More...
 
void addCone (const mrs_lib::geometry::Cone &cone, const double r=0.7, const double g=0.8, const double b=0.3, const double a=1.0, const bool filled=true, const bool capped=true, const int sides=DEFAULT_ELLIPSE_POINTS, const ros::Duration &timeout=ros::Duration(0))
 add a cone to the buffer More...
 
void addTrajectory (const mrs_msgs::TrajectoryReference &traj, const double r=0.3, const double g=1.0, const double b=0.3, const double a=1.0, const bool filled=true, const ros::Duration &timeout=ros::Duration(0))
 add a trajectory to the buffer More...
 
+void addNullPoint ()
 helper function for adding an invisible point to the object buffer
 
+void addNullLine ()
 helper function for adding an invisible line to the object buffer
 
+void addNullTriangle ()
 helper function for adding an invisible triangle to the buffer
 
void setPointsScale (const double scale)
 set the scale of all points More...
 
void setParentFrame (const std::string parent_frame)
 set the parent frame_id More...
 
void setLinesScale (const double scale)
 set the thickness of all lines More...
 
+void clearBuffers ()
 remove all objects from the buffer
 
+void clearVisuals ()
 publishes an empty message. Removes all objects drawn onto the scene, but keeps them in buffer
 
+void publish ()
 publish the visual markers ROS message and populates it with buffer content
 
+

Detailed Description

+

library for drawing large amounts of geometric objects in RVIZ at the same time

+

Constructor & Destructor Documentation

+ +

◆ BatchVisualizer()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::BatchVisualizer::BatchVisualizer (ros::NodeHandle & nh,
std::string marker_topic_name,
std::string parent_frame 
)
+
+ +

constructor to initialize the visualizer

+
Parameters
+ + + + +
nhROS node to connect our publisher to ROS
marker_topic_namename of the topic on which the markers will be published
parent_framename of the frame to which the markers will be linked
+
+
+ +
+
+

Member Function Documentation

+ +

◆ addCone()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void mrs_lib::BatchVisualizer::addCone (const mrs_lib::geometry::Conecone,
const double r = 0.7,
const double g = 0.8,
const double b = 0.3,
const double a = 1.0,
const bool filled = true,
const bool capped = true,
const int sides = DEFAULT_ELLIPSE_POINTS,
const ros::Duration & timeout = ros::Duration(0) 
)
+
+ +

add a cone to the buffer

+
Parameters
+ + + + + + + + + + +
conecone to be added
rred color in range <0,1>
ggreen color in range <0,1>
bblue color in range <0,1>
aalpha in range <0,1> (0 is fully transparent)
filledbool to set fill. True = face visible, False = outline visible
cappedbool to set caps on/off. True = cap drawn, False = base cap missing
sidesnumber of points to approximate the round shape
timeouttime in seconds after which the object should be removed from buffer
+
+
+ +
+
+ +

◆ addCuboid()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void mrs_lib::BatchVisualizer::addCuboid (const mrs_lib::geometry::Cuboidcuboid,
const double r = 0.5,
const double g = 0.5,
const double b = 0.0,
const double a = 1.0,
const bool filled = true,
const ros::Duration & timeout = ros::Duration(0) 
)
+
+ +

add a cuboid to the buffer

+
Parameters
+ + + + + + + + +
cuboidcuboid to be added
rred color in range <0,1>
ggreen color in range <0,1>
bblue color in range <0,1>
aalpha in range <0,1> (0 is fully transparent)
filledbool to set fill. True = face visible, False = outline visible
timeouttime in seconds after which the object should be removed from buffer
+
+
+ +
+
+ +

◆ addCylinder()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void mrs_lib::BatchVisualizer::addCylinder (const mrs_lib::geometry::Cylindercylinder,
const double r = 0.7,
const double g = 0.8,
const double b = 0.3,
const double a = 1.0,
const bool filled = true,
const bool capped = true,
const int sides = DEFAULT_ELLIPSE_POINTS,
const ros::Duration & timeout = ros::Duration(0) 
)
+
+ +

add a cylinder to the buffer

+
Parameters
+ + + + + + + + + + +
cylindercylinder to be added
rred color in range <0,1>
ggreen color in range <0,1>
bblue color in range <0,1>
aalpha in range <0,1> (0 is fully transparent)
filledbool to set fill. True = face visible, False = outline visible
cappedbool to set caps on/off. True = caps drawn, False = hollow cylinder
sidesnumber of points to approximate the round shape
timeouttime in seconds after which the object should be removed from buffer
+
+
+ +
+
+ +

◆ addEllipse()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void mrs_lib::BatchVisualizer::addEllipse (const mrs_lib::geometry::Ellipseellipse,
const double r = 0.0,
const double g = 1.0,
const double b = 1.0,
const double a = 1.0,
const bool filled = true,
const int num_points = DEFAULT_ELLIPSE_POINTS,
const ros::Duration & timeout = ros::Duration(0) 
)
+
+ +

add an ellipse to the buffer

+
Parameters
+ + + + + + + + + +
ellipseellipse to be added
rred color in range <0,1>
ggreen color in range <0,1>
bblue color in range <0,1>
aalpha in range <0,1> (0 is fully transparent)
filledbool to set fill. True = face visible, False = outline visible
num_pointsnumber of points to approximate the round shape
timeouttime in seconds after which the object should be removed from buffer
+
+
+ +
+
+ +

◆ addPoint()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void mrs_lib::BatchVisualizer::addPoint (const Eigen::Vector3d & point,
const double r = 0.0,
const double g = 1.0,
const double b = 0.3,
const double a = 1.0,
const ros::Duration & timeout = ros::Duration(0) 
)
+
+ +

add a point to the buffer

+
Parameters
+ + + + + + + +
pointcoordinates of the point
rred color in range <0,1>
ggreen color in range <0,1>
bblue color in range <0,1>
aalpha in range <0,1> (0 is fully transparent)
timeouttime in seconds after which the object should be removed from buffer
+
+
+ +
+
+ +

◆ addRay()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void mrs_lib::BatchVisualizer::addRay (const mrs_lib::geometry::Rayray,
const double r = 1.0,
const double g = 0.0,
const double b = 0.0,
const double a = 1.0,
const ros::Duration & timeout = ros::Duration(0) 
)
+
+ +

add a ray to the buffer

+
Parameters
+ + + + + + + +
rayray to be added
rred color in range <0,1>
ggreen color in range <0,1>
bblue color in range <0,1>
aalpha in range <0,1> (0 is fully transparent)
timeouttime in seconds after which the object should be removed from buffer
+
+
+ +
+
+ +

◆ addRectangle()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void mrs_lib::BatchVisualizer::addRectangle (const mrs_lib::geometry::Rectanglerect,
const double r = 0.5,
const double g = 0.5,
const double b = 0.0,
const double a = 1.0,
const bool filled = true,
const ros::Duration & timeout = ros::Duration(0) 
)
+
+ +

add a rectangle to the buffer

+
Parameters
+ + + + + + + + +
rectrectangle to be added
rred color in range <0,1>
ggreen color in range <0,1>
bblue color in range <0,1>
aalpha in range <0,1> (0 is fully transparent)
filledbool to set fill. True = face visible, False = outline visible
timeouttime in seconds after which the object should be removed from buffer
+
+
+ +
+
+ +

◆ addTrajectory()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void mrs_lib::BatchVisualizer::addTrajectory (const mrs_msgs::TrajectoryReference & traj,
const double r = 0.3,
const double g = 1.0,
const double b = 0.3,
const double a = 1.0,
const bool filled = true,
const ros::Duration & timeout = ros::Duration(0) 
)
+
+ +

add a trajectory to the buffer

+
Parameters
+ + + + + + + + +
trajtrajectory reference to be added
rred color in range <0,1>
ggreen color in range <0,1>
bblue color in range <0,1>
aalpha in range <0,1> (0 is fully transparent)
filledbool to set fill. True = continuous line, False = only visualize points
timeouttime in seconds after which the object should be removed from buffer
+
+
+ +
+
+ +

◆ addTriangle()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void mrs_lib::BatchVisualizer::addTriangle (const mrs_lib::geometry::Triangletri,
const double r = 0.5,
const double g = 0.5,
const double b = 0.0,
const double a = 1.0,
const bool filled = true,
const ros::Duration & timeout = ros::Duration(0) 
)
+
+ +

add a triangle to the buffer

+
Parameters
+ + + + + + + + +
tritriangle to be added
rred color in range <0,1>
ggreen color in range <0,1>
bblue color in range <0,1>
aalpha in range <0,1> (0 is fully transparent)
filledbool to set fill. True = face visible, False = outline visible
timeouttime in seconds after which the object should be removed from buffer
+
+
+ +
+
+ +

◆ setLinesScale()

+ +
+
+ + + + + + + + +
void mrs_lib::BatchVisualizer::setLinesScale (const double scale)
+
+ +

set the thickness of all lines

+
Parameters
+ + +
scale
+
+
+ +
+
+ +

◆ setParentFrame()

+ +
+
+ + + + + + + + +
void mrs_lib::BatchVisualizer::setParentFrame (const std::string parent_frame)
+
+ +

set the parent frame_id

+
Parameters
+ + +
parent_frame
+
+
+ +
+
+ +

◆ setPointsScale()

+ +
+
+ + + + + + + + +
void mrs_lib::BatchVisualizer::setPointsScale (const double scale)
+
+ +

set the scale of all points

+
Parameters
+ + +
scale
+
+
+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/classmrs__lib_1_1BatchVisualizer.js b/classmrs__lib_1_1BatchVisualizer.js new file mode 100644 index 00000000..3b2a136b --- /dev/null +++ b/classmrs__lib_1_1BatchVisualizer.js @@ -0,0 +1,24 @@ +var classmrs__lib_1_1BatchVisualizer = +[ + [ "BatchVisualizer", "classmrs__lib_1_1BatchVisualizer.html#a2a426c62b02dec6430362920db0d6c80", null ], + [ "~BatchVisualizer", "classmrs__lib_1_1BatchVisualizer.html#a83a3baa46f7a3c22079a1d80aaed4459", null ], + [ "BatchVisualizer", "classmrs__lib_1_1BatchVisualizer.html#a3a857713e5516bec553b5380eaa423f8", null ], + [ "addCone", "classmrs__lib_1_1BatchVisualizer.html#a937c831f9caac50bc84f671c3260f1a7", null ], + [ "addCuboid", "classmrs__lib_1_1BatchVisualizer.html#ab5aba26d50dbe7fe22cd4c0549a99051", null ], + [ "addCylinder", "classmrs__lib_1_1BatchVisualizer.html#abd2f9394a4cb63da0478ad1621ed7e79", null ], + [ "addEllipse", "classmrs__lib_1_1BatchVisualizer.html#ac03c515ed44761d88f43a2af446c26b7", null ], + [ "addNullLine", "classmrs__lib_1_1BatchVisualizer.html#a7f4d6d1ae967d6a5c15351969d9e4592", null ], + [ "addNullPoint", "classmrs__lib_1_1BatchVisualizer.html#a7556fd856cd4be7d0bdea9a4c0c6e1fc", null ], + [ "addNullTriangle", "classmrs__lib_1_1BatchVisualizer.html#a6a844cdffd1474570988e8d1a87126cb", null ], + [ "addPoint", "classmrs__lib_1_1BatchVisualizer.html#ac9c76c18ef837dc7b87cf20f5e2511b9", null ], + [ "addRay", "classmrs__lib_1_1BatchVisualizer.html#ae3c2f932f592a0e61da8e51643cc686a", null ], + [ "addRectangle", "classmrs__lib_1_1BatchVisualizer.html#a5a68c474ce18a4fccbc8f14066267d73", null ], + [ "addTrajectory", "classmrs__lib_1_1BatchVisualizer.html#a5dad7ddef02d959da350385544b98063", null ], + [ "addTriangle", "classmrs__lib_1_1BatchVisualizer.html#ae2cf4d2a0578711a060f7f398179a677", null ], + [ "clearBuffers", "classmrs__lib_1_1BatchVisualizer.html#a317a263d7a57b88805a3d264976b4c9f", null ], + [ "clearVisuals", "classmrs__lib_1_1BatchVisualizer.html#aacda752bbfd192279da0fe15f001b0bb", null ], + [ "publish", "classmrs__lib_1_1BatchVisualizer.html#a3b7e6b602bdaf7d42e1c48ea511aa93b", null ], + [ "setLinesScale", "classmrs__lib_1_1BatchVisualizer.html#af36566a7f7267a2cdb167a533e4cb856", null ], + [ "setParentFrame", "classmrs__lib_1_1BatchVisualizer.html#a284c94fdfec8f359704d92f9ef79cd74", null ], + [ "setPointsScale", "classmrs__lib_1_1BatchVisualizer.html#ac613c22b8ed79cd169636e6aafacf2dc", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1DKF-members.html b/classmrs__lib_1_1DKF-members.html new file mode 100644 index 00000000..7071ab54 --- /dev/null +++ b/classmrs__lib_1_1DKF-members.html @@ -0,0 +1,141 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::DKF Member List
+
+
+ +

This is the complete list of members for mrs_lib::DKF, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Amrs_lib::LKF< 3, -1, 2 >
A_t typedefmrs_lib::DKF
Bmrs_lib::LKF< 3, -1, 2 >
B_t typedefmrs_lib::DKF
Base_class typedefmrs_lib::DKF
computeKalmanGain(const statecov_t &sc,[[maybe_unused]] const z_t &z, const R_t &R, const H_t &H) const (defined in mrs_lib::LKF< 3, -1, 2 >)mrs_lib::LKF< 3, -1, 2 >inlineprotectedvirtual
correct(const statecov_t &sc, const z_t &z, const R_t &R) const overridemrs_lib::LKF< 3, -1, 2 >inlinevirtual
mrs_lib::KalmanFilter::correct(const statecov_t &sc, const z_t &z, const R_t &R) const =0mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >pure virtual
correction_impl(const statecov_t &sc, const z_t &z, const R_t &R, const H_t &H) const (defined in mrs_lib::LKF< 3, -1, 2 >)mrs_lib::LKF< 3, -1, 2 >inlineprotected
correctLine(const statecov_t &sc, const pt3_t &line_origin, const vec3_t &line_direction, const double line_variance) constmrs_lib::DKFinlinevirtual
covariance_predict(const A_t &A, const P_t &P, const Q_t &Q, const double dt) (defined in mrs_lib::LKF< 3, -1, 2 >)mrs_lib::LKF< 3, -1, 2 >inlineprotectedstatic
DKF()mrs_lib::DKFinline
DKF(const A_t &A, const B_t &B)mrs_lib::DKFinline
Hmrs_lib::LKF< 3, -1, 2 >
H_t typedefmrs_lib::DKF
invert_W(R_t W) (defined in mrs_lib::LKF< 3, -1, 2 >)mrs_lib::LKF< 3, -1, 2 >inlineprotectedstatic
K_t typedefmrs_lib::DKF
LKF()mrs_lib::LKF< 3, -1, 2 >inline
LKF(const A_t &A, const B_t &B, const H_t &H)mrs_lib::LKF< 3, -1, 2 >inline
mmrs_lib::DKFstatic
mat2_t typedef (defined in mrs_lib::DKF)mrs_lib::DKF
mat3_t typedef (defined in mrs_lib::DKF)mrs_lib::DKF
nmrs_lib::DKFstatic
pmrs_lib::DKFstatic
P_t typedefmrs_lib::DKF
predict(const statecov_t &sc, const u_t &u, const Q_t &Q,[[maybe_unused]] double dt) const overridemrs_lib::LKF< 3, -1, 2 >inlinevirtual
mrs_lib::KalmanFilter::predict(const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const =0mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >pure virtual
pt3_t typedef (defined in mrs_lib::DKF)mrs_lib::DKF
Q_t typedefmrs_lib::DKF
R_t typedefmrs_lib::DKF
state_predict(const A_t &A, const x_t &x,[[maybe_unused]] const B_t &B,[[maybe_unused]] const u_t &u) (defined in mrs_lib::LKF< 3, -1, 2 >)mrs_lib::LKF< 3, -1, 2 >inlineprotectedstatic
state_predict(const A_t &A, const x_t &x, const B_t &B, const u_t &u) (defined in mrs_lib::LKF< 3, -1, 2 >)mrs_lib::LKF< 3, -1, 2 >inlineprotectedstatic
statecov_t typedefmrs_lib::DKF
u_t typedefmrs_lib::DKF
vec3_t typedef (defined in mrs_lib::DKF)mrs_lib::DKF
x_t typedefmrs_lib::DKF
z_t typedefmrs_lib::DKF
+
+ + + + diff --git a/classmrs__lib_1_1DKF.html b/classmrs__lib_1_1DKF.html new file mode 100644 index 00000000..60253697 --- /dev/null +++ b/classmrs__lib_1_1DKF.html @@ -0,0 +1,532 @@ + + + + + + + +mrs_lib: mrs_lib::DKF Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ + +
+ +

Implementation of the Degenerate measurement Linear Kalman filter. + More...

+ +

#include <dkf.h>

+
+ + Inheritance diagram for mrs_lib::DKF:
+
+
+ +
+ + Collaboration diagram for mrs_lib::DKF:
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Types

+using Base_class = LKF< n, m, p >
 Base class of this class.
 
+using x_t = typename Base_class::x_t
 State vector type $n \times 1$.
 
+using u_t = typename Base_class::u_t
 Input vector type $m \times 1$.
 
+using z_t = typename Base_class::z_t
 Measurement vector type $p \times 1$.
 
+using P_t = typename Base_class::P_t
 State uncertainty covariance matrix type $n \times n$.
 
+using R_t = typename Base_class::R_t
 Measurement noise covariance matrix type $p \times p$.
 
+using Q_t = typename Base_class::Q_t
 Process noise covariance matrix type $n \times n$.
 
+using statecov_t = typename Base_class::statecov_t
 Helper struct for passing around the state and its covariance in one variable.
 
+typedef Eigen::Matrix< double, n, nA_t
 System transition matrix type $n \times n$.
 
+typedef Eigen::Matrix< double, n, mB_t
 Input to state mapping matrix type $n \times m$.
 
+typedef Eigen::Matrix< double, p, nH_t
 State to measurement mapping matrix type $p \times n$.
 
+typedef Eigen::Matrix< double, n, pK_t
 Kalman gain matrix type $n \times p$.
 
+using mat2_t = Eigen::Matrix< double, 2, 2 >
 
+using mat3_t = Eigen::Matrix< double, 3, 3 >
 
+using pt3_t = mrs_lib::geometry::vec3_t
 
+using vec3_t = mrs_lib::geometry::vec3_t
 
- Public Types inherited from mrs_lib::LKF< 3, -1, 2 >
+using Base_class = KalmanFilter< n, m, p >
 Base class of this class.
 
+using x_t = typename Base_class::x_t
 State vector type $n \times 1$.
 
+using u_t = typename Base_class::u_t
 Input vector type $m \times 1$.
 
+using z_t = typename Base_class::z_t
 Measurement vector type $p \times 1$.
 
+using P_t = typename Base_class::P_t
 State uncertainty covariance matrix type $n \times n$.
 
+using R_t = typename Base_class::R_t
 Measurement noise covariance matrix type $p \times p$.
 
+using Q_t = typename Base_class::Q_t
 Process noise covariance matrix type $n \times n$.
 
+using statecov_t = typename Base_class::statecov_t
 Helper struct for passing around the state and its covariance in one variable.
 
+typedef Eigen::Matrix< double, n, nA_t
 System transition matrix type $n \times n$.
 
+typedef Eigen::Matrix< double, n, mB_t
 Input to state mapping matrix type $n \times m$.
 
+typedef Eigen::Matrix< double, p, nH_t
 State to measurement mapping matrix type $p \times n$.
 
+typedef Eigen::Matrix< double, n, pK_t
 Kalman gain matrix type $n \times p$.
 
- Public Types inherited from mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >
+typedef Eigen::Matrix< double, n, 1 > x_t
 State vector type $n \times 1$.
 
+typedef Eigen::Matrix< double, m, 1 > u_t
 Input vector type $m \times 1$.
 
+typedef Eigen::Matrix< double, p, 1 > z_t
 Measurement vector type $p \times 1$.
 
+typedef Eigen::Matrix< double, n, nP_t
 State uncertainty covariance matrix type $n \times n$.
 
+typedef Eigen::Matrix< double, p, pR_t
 Measurement noise covariance matrix type $p \times p$.
 
+typedef Eigen::Matrix< double, n, nQ_t
 Process noise covariance matrix type $n \times n$.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 DKF ()
 Convenience default constructor. More...
 
 DKF (const A_t &A, const B_t &B)
 The main constructor. More...
 
virtual statecov_t correctLine (const statecov_t &sc, const pt3_t &line_origin, const vec3_t &line_direction, const double line_variance) const
 Applies the correction (update, measurement, data) step of the Kalman filter. More...
 
- Public Member Functions inherited from mrs_lib::LKF< 3, -1, 2 >
 LKF ()
 Convenience default constructor. More...
 
 LKF (const A_t &A, const B_t &B, const H_t &H)
 The main constructor. More...
 
virtual statecov_t correct (const statecov_t &sc, const z_t &z, const R_t &R) const override
 Applies the correction (update, measurement, data) step of the Kalman filter. More...
 
virtual statecov_t predict (const statecov_t &sc, const u_t &u, const Q_t &Q,[[maybe_unused]] double dt) const override
 Applies the prediction (time) step of the Kalman filter. More...
 
- Public Member Functions inherited from mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >
virtual statecov_t correct (const statecov_t &sc, const z_t &z, const R_t &R) const =0
 Applies the correction (update, measurement, data) step of the Kalman filter. More...
 
virtual statecov_t predict (const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const =0
 Applies the prediction (time) step of the Kalman filter. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Static Public Attributes

+static constexpr int n = Base_class::n
 Length of the state vector of the system.
 
+static constexpr int m = Base_class::m
 Length of the input vector of the system.
 
+static constexpr int p = Base_class::p
 Length of the measurement vector of the system.
 
- Static Public Attributes inherited from mrs_lib::LKF< 3, -1, 2 >
+static constexpr int n
 Length of the state vector of the system.
 
+static constexpr int m
 Length of the input vector of the system.
 
+static constexpr int p
 Length of the measurement vector of the system.
 
- Static Public Attributes inherited from mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >
+static const int n = n_states
 Length of the state vector of the system.
 
+static const int m = n_inputs
 Length of the input vector of the system.
 
+static const int p = n_measurements
 Length of the measurement vector of the system.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Attributes inherited from mrs_lib::LKF< 3, -1, 2 >
+A_t A
 The system transition matrix $n \times n$.
 
+B_t B
 The input to state mapping matrix $n \times m$.
 
+H_t H
 The state to measurement mapping matrix $p \times n$.
 
- Protected Member Functions inherited from mrs_lib::LKF< 3, -1, 2 >
+virtual K_t computeKalmanGain (const statecov_t &sc,[[maybe_unused]] const z_t &z, const R_t &R, const H_t &H) const
 
+statecov_t ::type correction_impl (const statecov_t &sc, const z_t &z, const R_t &R, const H_t &H) const
 
- Static Protected Member Functions inherited from mrs_lib::LKF< 3, -1, 2 >
+static P_t covariance_predict (const A_t &A, const P_t &P, const Q_t &Q, const double dt)
 
+static std::enable_if< check==0, x_t >::type state_predict (const A_t &A, const x_t &x,[[maybe_unused]] const B_t &B,[[maybe_unused]] const u_t &u)
 
+static 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)
 
+static R_t invert_W (R_t W)
 
+

Detailed Description

+

Implementation of the Degenerate measurement Linear Kalman filter.

+
Template Parameters
+ + + + +
n_statesnumber of states of the system (length of the $ \mathbf{x} $ vector).
n_inputsnumber of inputs of the system (length of the $ \mathbf{u} $ vector).
n_measurementsnumber of measurements of the system (length of the $ \mathbf{z} $ vector).
+
+
+

Constructor & Destructor Documentation

+ +

◆ DKF() [1/2]

+ +
+
+ + + + + +
+ + + + + + + +
mrs_lib::DKF::DKF ()
+
+inline
+
+ +

Convenience default constructor.

+

This constructor should not be used if applicable. If used, the main constructor has to be called afterwards, before using this class, otherwise the LKF object is invalid (not initialized).

+ +
+
+ +

◆ DKF() [2/2]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
mrs_lib::DKF::DKF (const A_tA,
const B_tB 
)
+
+inline
+
+ +

The main constructor.

+
Parameters
+ + + + +
AThe state transition matrix.
BThe input to state mapping transition matrix.
HThe state to measurement mapping transition matrix.
+
+
+ +
+
+

Member Function Documentation

+ +

◆ correctLine()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
virtual statecov_t mrs_lib::DKF::correctLine (const statecov_tsc,
const pt3_t & line_origin,
const vec3_t & line_direction,
const double line_variance 
) const
+
+inlinevirtual
+
+ +

Applies the correction (update, measurement, data) step of the Kalman filter.

+

This method applies the linear Kalman filter correction step to the state and covariance passed in sc using the measurement z and measurement noise R. The parameter param is ignored in this implementation. The updated state and covariance after the correction step is returned.

+
Parameters
+ + + + +
scThe state and covariance to which the correction step is to be applied.
zThe measurement vector to be used for correction.
RThe measurement noise covariance matrix to be used for correction.
+
+
+
Returns
The state and covariance after the correction update.
+ +
+
+
The documentation for this class was generated from the following file:
    +
  • include/mrs_lib/dkf.h
  • +
+
+
+ + + + diff --git a/classmrs__lib_1_1DKF.js b/classmrs__lib_1_1DKF.js new file mode 100644 index 00000000..e4a9417f --- /dev/null +++ b/classmrs__lib_1_1DKF.js @@ -0,0 +1,22 @@ +var classmrs__lib_1_1DKF = +[ + [ "A_t", "classmrs__lib_1_1DKF.html#a1d615e5b5aef4c5a00de9b42eef43c1b", null ], + [ "B_t", "classmrs__lib_1_1DKF.html#a5de2bdb0aa87e268361e19206849bb22", null ], + [ "Base_class", "classmrs__lib_1_1DKF.html#ad7e6756be6a89592151d092f20d19811", null ], + [ "H_t", "classmrs__lib_1_1DKF.html#aaee9d5c96d921fa7854f24460edf58ab", null ], + [ "K_t", "classmrs__lib_1_1DKF.html#a87d3b7863fbd0b392f9c831fcaf8e345", null ], + [ "mat2_t", "classmrs__lib_1_1DKF.html#a3f7ce3b4407d784fcaf95f43b7685202", null ], + [ "mat3_t", "classmrs__lib_1_1DKF.html#ac3b0581c4ada64f5bfaf8b59514ad06c", null ], + [ "P_t", "classmrs__lib_1_1DKF.html#aa351bed9f3bdac26c6ed2526a5b2ac01", null ], + [ "pt3_t", "classmrs__lib_1_1DKF.html#a3104e749a86237eb1193b25d975ac68d", null ], + [ "Q_t", "classmrs__lib_1_1DKF.html#a59afcc2127ecd2a9dba8a53ca505f97a", null ], + [ "R_t", "classmrs__lib_1_1DKF.html#a6c1a5e6a6cdcb52271774b566957f948", null ], + [ "statecov_t", "classmrs__lib_1_1DKF.html#a1408b975fe2e4bd3fc5009c80d43f06b", null ], + [ "u_t", "classmrs__lib_1_1DKF.html#a5998af081256d469dbd4ac5a1d4d7fd7", null ], + [ "vec3_t", "classmrs__lib_1_1DKF.html#ade9f06e25f9c50c5c7c19628afefd454", null ], + [ "x_t", "classmrs__lib_1_1DKF.html#a094cf9bcb768de6db47e4c2703bede20", null ], + [ "z_t", "classmrs__lib_1_1DKF.html#ad919f1d7a6f5d8be7361a8336aa6fd85", null ], + [ "DKF", "classmrs__lib_1_1DKF.html#a75bd345a8f4e3856d35d23d3b85b12cd", null ], + [ "DKF", "classmrs__lib_1_1DKF.html#a68c0d27c7ae1897c6b54cea9e75b95ec", null ], + [ "correctLine", "classmrs__lib_1_1DKF.html#a7e5d887496dea33a60b8cf2a0acc5fec", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1DKF__coll__graph.map b/classmrs__lib_1_1DKF__coll__graph.map new file mode 100644 index 00000000..9aed0a8c --- /dev/null +++ b/classmrs__lib_1_1DKF__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/classmrs__lib_1_1DKF__coll__graph.md5 b/classmrs__lib_1_1DKF__coll__graph.md5 new file mode 100644 index 00000000..7707cd62 --- /dev/null +++ b/classmrs__lib_1_1DKF__coll__graph.md5 @@ -0,0 +1 @@ +492c4fc945b482dde86c495ac5b2677b \ No newline at end of file diff --git a/classmrs__lib_1_1DKF__coll__graph.png b/classmrs__lib_1_1DKF__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..c4aacf26f5f823491d6cd1cc26f98018407ee788 GIT binary patch literal 6620 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 SIsuPsuv8Vb6iOk_gZ~Th7XVEF literal 0 HcmV?d00001 diff --git a/classmrs__lib_1_1DKF__inherit__graph.map b/classmrs__lib_1_1DKF__inherit__graph.map new file mode 100644 index 00000000..9aed0a8c --- /dev/null +++ b/classmrs__lib_1_1DKF__inherit__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/classmrs__lib_1_1DKF__inherit__graph.md5 b/classmrs__lib_1_1DKF__inherit__graph.md5 new file mode 100644 index 00000000..7707cd62 --- /dev/null +++ b/classmrs__lib_1_1DKF__inherit__graph.md5 @@ -0,0 +1 @@ +492c4fc945b482dde86c495ac5b2677b \ No newline at end of file diff --git a/classmrs__lib_1_1DKF__inherit__graph.png b/classmrs__lib_1_1DKF__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..c4aacf26f5f823491d6cd1cc26f98018407ee788 GIT binary patch literal 6620 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 SIsuPsuv8Vb6iOk_gZ~Th7XVEF literal 0 HcmV?d00001 diff --git a/classmrs__lib_1_1DynamicPublisher-members.html b/classmrs__lib_1_1DynamicPublisher-members.html new file mode 100644 index 00000000..dc56352a --- /dev/null +++ b/classmrs__lib_1_1DynamicPublisher-members.html @@ -0,0 +1,107 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::DynamicPublisher Member List
+
+
+ +

This is the complete list of members for mrs_lib::DynamicPublisher, including all inherited members.

+ + + + +
DynamicPublisher()mrs_lib::DynamicPublisher
DynamicPublisher(const ros::NodeHandle &nh)mrs_lib::DynamicPublisher
publish(const std::string name, const T &msg)mrs_lib::DynamicPublisher
+
+ + + + diff --git a/classmrs__lib_1_1DynamicPublisher.html b/classmrs__lib_1_1DynamicPublisher.html new file mode 100644 index 00000000..8875488d --- /dev/null +++ b/classmrs__lib_1_1DynamicPublisher.html @@ -0,0 +1,213 @@ + + + + + + + +mrs_lib: mrs_lib::DynamicPublisher Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::DynamicPublisher Class Reference
+
+
+ +

A helper class for easy publishing of ROS messages for debugging purposes. + More...

+ +

#include <dynamic_publisher.h>

+ + + + + + + + + + + + +

+Public Member Functions

 DynamicPublisher ()
 A no-parameter constructor. More...
 
 DynamicPublisher (const ros::NodeHandle &nh)
 The main constructor. More...
 
template<class T >
void publish (const std::string name, const T &msg)
 Publishes a message to a topic, advertising the topic if necessary. More...
 
+

Detailed Description

+

A helper class for easy publishing of ROS messages for debugging purposes.

+

This class enables you to just call the publish() method with a topic name and a message without the need to advertise the topic.

+
Note
This class should only be used for debugging and not for regular publishing as it introduces some overhead.
+
Examples
dynamic_publisher/example.cpp.
+
+

Constructor & Destructor Documentation

+ +

◆ DynamicPublisher() [1/2]

+ +
+
+ + + + + + + +
mrs_lib::DynamicPublisher::DynamicPublisher ()
+
+ +

A no-parameter constructor.

+

This overload will use a ros::NodeHandle with default arguments for advertising new topics, so remappings, namespaces etc. will be ignored.

+ +
+
+ +

◆ DynamicPublisher() [2/2]

+ +
+
+ + + + + + + + +
mrs_lib::DynamicPublisher::DynamicPublisher (const ros::NodeHandle & nh)
+
+ +

The main constructor.

+

This overload uses the ros::NodeHandle that you provided for advertising new topics. The recommended way of constructing a DynamicPublisher.

+ +
+
+

Member Function Documentation

+ +

◆ publish()

+ +
+
+
+template<class T >
+ + + + + + + + + + + + + + + + + + +
void mrs_lib::DynamicPublisher::publish (const std::string name,
const T & msg 
)
+
+ +

Publishes a message to a topic, advertising the topic if necessary.

+

The topic is advertised with the type of the first message published to it. If you try to publish a different type of message on the topic, it will be ignored.

+
Warning
Take care to always publish the same message type to the topic to avoid being spammed with errors.
+
Examples
dynamic_publisher/example.cpp.
+
+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/classmrs__lib_1_1DynamicPublisher.js b/classmrs__lib_1_1DynamicPublisher.js new file mode 100644 index 00000000..3ecb5f6e --- /dev/null +++ b/classmrs__lib_1_1DynamicPublisher.js @@ -0,0 +1,6 @@ +var classmrs__lib_1_1DynamicPublisher = +[ + [ "DynamicPublisher", "classmrs__lib_1_1DynamicPublisher.html#a2c671b4d99d4bb6bde12e7a1d8717687", null ], + [ "DynamicPublisher", "classmrs__lib_1_1DynamicPublisher.html#a6a17d49f4d7203f8b8693c6ceb2fb1d9", null ], + [ "publish", "classmrs__lib_1_1DynamicPublisher.html#a57946b630bcf2892658f754ecb6b735d", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1DynamicReconfigureMgr-members.html b/classmrs__lib_1_1DynamicReconfigureMgr-members.html new file mode 100644 index 00000000..a9bffc85 --- /dev/null +++ b/classmrs__lib_1_1DynamicReconfigureMgr-members.html @@ -0,0 +1,113 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::DynamicReconfigureMgr< ConfigType > Member List
+
+
+ +

This is the complete list of members for mrs_lib::DynamicReconfigureMgr< ConfigType >, including all inherited members.

+ + + + + + + + + + +
config (defined in mrs_lib::DynamicReconfigureMgr< ConfigType >)mrs_lib::DynamicReconfigureMgr< ConfigType >
DynamicReconfigureMgr(const ros::NodeHandle &nh=ros::NodeHandle("~"), bool print_values=true, std::string node_name=std::string(), const callback_t &user_callback={}) (defined in mrs_lib::DynamicReconfigureMgr< ConfigType >)mrs_lib::DynamicReconfigureMgr< ConfigType >inline
DynamicReconfigureMgr(const ros::NodeHandle &nh, std::string node_name) (defined in mrs_lib::DynamicReconfigureMgr< ConfigType >)mrs_lib::DynamicReconfigureMgr< ConfigType >inline
DynamicReconfigureMgr(const ros::NodeHandle &nh, const char *node_name) (defined in mrs_lib::DynamicReconfigureMgr< ConfigType >)mrs_lib::DynamicReconfigureMgr< ConfigType >inline
DynamicReconfigureMgr(std::string node_name) (defined in mrs_lib::DynamicReconfigureMgr< ConfigType >)mrs_lib::DynamicReconfigureMgr< ConfigType >inline
loaded_successfully() (defined in mrs_lib::DynamicReconfigureMgr< ConfigType >)mrs_lib::DynamicReconfigureMgr< ConfigType >inline
publish_descriptions() (defined in mrs_lib::DynamicReconfigureMgr< ConfigType >)mrs_lib::DynamicReconfigureMgr< ConfigType >inline
update_config(const ConfigType &cfg) (defined in mrs_lib::DynamicReconfigureMgr< ConfigType >)mrs_lib::DynamicReconfigureMgr< ConfigType >inline
update_config() (defined in mrs_lib::DynamicReconfigureMgr< ConfigType >)mrs_lib::DynamicReconfigureMgr< ConfigType >inline
+
+ + + + diff --git a/classmrs__lib_1_1DynamicReconfigureMgr.html b/classmrs__lib_1_1DynamicReconfigureMgr.html new file mode 100644 index 00000000..b6da9b6b --- /dev/null +++ b/classmrs__lib_1_1DynamicReconfigureMgr.html @@ -0,0 +1,150 @@ + + + + + + + +mrs_lib: mrs_lib::DynamicReconfigureMgr< ConfigType > Class Template Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::DynamicReconfigureMgr< ConfigType > Class Template Reference
+
+
+ +

#include <dynamic_reconfigure_mgr.h>

+ + + + + + + + + + + + + + + + + + +

+Public Member Functions

DynamicReconfigureMgr (const ros::NodeHandle &nh=ros::NodeHandle("~"), bool print_values=true, std::string node_name=std::string(), const callback_t &user_callback={})
 
DynamicReconfigureMgr (const ros::NodeHandle &nh, std::string node_name)
 
DynamicReconfigureMgr (const ros::NodeHandle &nh, const char *node_name)
 
DynamicReconfigureMgr (std::string node_name)
 
+void update_config (const ConfigType &cfg)
 
+void update_config ()
 
+void publish_descriptions ()
 
+bool loaded_successfully ()
 
+ + + +

+Public Attributes

+ConfigType config
 
+

Detailed Description

+

template<typename ConfigType>
+class mrs_lib::DynamicReconfigureMgr< ConfigType >

+ +

DynamicReconfigureMgr CLASS //{

+

The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/classmrs__lib_1_1DynamicReconfigureMgr.js b/classmrs__lib_1_1DynamicReconfigureMgr.js new file mode 100644 index 00000000..8d223731 --- /dev/null +++ b/classmrs__lib_1_1DynamicReconfigureMgr.js @@ -0,0 +1,12 @@ +var classmrs__lib_1_1DynamicReconfigureMgr = +[ + [ "DynamicReconfigureMgr", "classmrs__lib_1_1DynamicReconfigureMgr.html#a2f7e6a43035ce3066bf01e42cab37030", null ], + [ "DynamicReconfigureMgr", "classmrs__lib_1_1DynamicReconfigureMgr.html#ad97f2a0f3083911c830514dedb9ac15e", null ], + [ "DynamicReconfigureMgr", "classmrs__lib_1_1DynamicReconfigureMgr.html#a490a18abe58b19610203a48f7682b377", null ], + [ "DynamicReconfigureMgr", "classmrs__lib_1_1DynamicReconfigureMgr.html#a43dfdd75290a853fd1c53944d787c391", null ], + [ "loaded_successfully", "classmrs__lib_1_1DynamicReconfigureMgr.html#aa0368ef6c49fcf909296290612b09d4f", null ], + [ "publish_descriptions", "classmrs__lib_1_1DynamicReconfigureMgr.html#a1020e218921f8cbdca345a6c71c684d6", null ], + [ "update_config", "classmrs__lib_1_1DynamicReconfigureMgr.html#ad0c89b6bab776a28647ccb9c11b08f60", null ], + [ "update_config", "classmrs__lib_1_1DynamicReconfigureMgr.html#a47d76d8eb2dc7969f80f5840d72b0b2e", null ], + [ "config", "classmrs__lib_1_1DynamicReconfigureMgr.html#a67b3f78c6b5f53a23c735c758fac302a", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1EulerAttitude-members.html b/classmrs__lib_1_1EulerAttitude-members.html new file mode 100644 index 00000000..883c64c1 --- /dev/null +++ b/classmrs__lib_1_1EulerAttitude-members.html @@ -0,0 +1,108 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::EulerAttitude Member List
+
+
+ +

This is the complete list of members for mrs_lib::EulerAttitude, including all inherited members.

+ + + + + +
EulerAttitude(const double &roll, const double &pitch, const double &yaw)mrs_lib::EulerAttitude
pitch(void) constmrs_lib::EulerAttitude
roll(void) constmrs_lib::EulerAttitude
yaw(void) constmrs_lib::EulerAttitude
+
+ + + + diff --git a/classmrs__lib_1_1EulerAttitude.html b/classmrs__lib_1_1EulerAttitude.html new file mode 100644 index 00000000..c0af83c4 --- /dev/null +++ b/classmrs__lib_1_1EulerAttitude.html @@ -0,0 +1,241 @@ + + + + + + + +mrs_lib: mrs_lib::EulerAttitude Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::EulerAttitude Class Reference
+
+
+ +

A small class for storing the Euler angles. + More...

+ +

#include <attitude_converter.h>

+ + + + + + + + + + + + + + +

+Public Member Functions

 EulerAttitude (const double &roll, const double &pitch, const double &yaw)
 A simple class for storing the Euler angles. More...
 
double roll (void) const
 get the roll angle More...
 
double pitch (void) const
 get the pitch angle More...
 
double yaw (void) const
 get the yaw angle More...
 
+

Detailed Description

+

A small class for storing the Euler angles.

+

Constructor & Destructor Documentation

+ +

◆ EulerAttitude()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::EulerAttitude::EulerAttitude (const double & roll,
const double & pitch,
const double & yaw 
)
+
+ +

A simple class for storing the Euler angles.

+
Parameters
+ + + + +
roll
pitch
yaw
+
+
+ +
+
+

Member Function Documentation

+ +

◆ pitch()

+ +
+
+ + + + + + + + +
double mrs_lib::EulerAttitude::pitch (void ) const
+
+ +

get the pitch angle

+
Returns
pitch
+ +
+
+ +

◆ roll()

+ +
+
+ + + + + + + + +
double mrs_lib::EulerAttitude::roll (void ) const
+
+ +

get the roll angle

+
Returns
roll
+ +
+
+ +

◆ yaw()

+ +
+
+ + + + + + + + +
double mrs_lib::EulerAttitude::yaw (void ) const
+
+ +

get the yaw angle

+
Returns
yaw
+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/classmrs__lib_1_1EulerAttitude.js b/classmrs__lib_1_1EulerAttitude.js new file mode 100644 index 00000000..f9e7ce16 --- /dev/null +++ b/classmrs__lib_1_1EulerAttitude.js @@ -0,0 +1,7 @@ +var classmrs__lib_1_1EulerAttitude = +[ + [ "EulerAttitude", "classmrs__lib_1_1EulerAttitude.html#ac4da09217c4956043801841737da8521", null ], + [ "pitch", "classmrs__lib_1_1EulerAttitude.html#abbed482a509d21505dfd1e608cd362fe", null ], + [ "roll", "classmrs__lib_1_1EulerAttitude.html#a7d62c8be0341555c3e03e124a617d765", null ], + [ "yaw", "classmrs__lib_1_1EulerAttitude.html#ab29c3b0fb567107c23eff485e8f2578d", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1IirFilter-members.html b/classmrs__lib_1_1IirFilter-members.html new file mode 100644 index 00000000..6e00a9f0 --- /dev/null +++ b/classmrs__lib_1_1IirFilter-members.html @@ -0,0 +1,106 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::IirFilter Member List
+
+
+ +

This is the complete list of members for mrs_lib::IirFilter, including all inherited members.

+ + + +
IirFilter(const std::vector< double > &a, const std::vector< double > &b) (defined in mrs_lib::IirFilter)mrs_lib::IirFilter
iterate(const double &input) (defined in mrs_lib::IirFilter)mrs_lib::IirFilter
+
+ + + + diff --git a/classmrs__lib_1_1IirFilter.html b/classmrs__lib_1_1IirFilter.html new file mode 100644 index 00000000..24043d54 --- /dev/null +++ b/classmrs__lib_1_1IirFilter.html @@ -0,0 +1,119 @@ + + + + + + + +mrs_lib: mrs_lib::IirFilter Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::IirFilter Class Reference
+
+
+ + + + + + +

+Public Member Functions

IirFilter (const std::vector< double > &a, const std::vector< double > &b)
 
+double iterate (const double &input)
 
+
The documentation for this class was generated from the following files:
    +
  • include/mrs_lib/iir_filter.h
  • +
  • src/iir_filter/iir_filter.cpp
  • +
+
+
+ + + + diff --git a/classmrs__lib_1_1IirFilter.js b/classmrs__lib_1_1IirFilter.js new file mode 100644 index 00000000..524005b8 --- /dev/null +++ b/classmrs__lib_1_1IirFilter.js @@ -0,0 +1,5 @@ +var classmrs__lib_1_1IirFilter = +[ + [ "IirFilter", "classmrs__lib_1_1IirFilter.html#a675dd4ebe1bf007f019a703cd049412e", null ], + [ "iterate", "classmrs__lib_1_1IirFilter.html#aa304784bf3e3150e89fa1266e35863f9", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1ImagePublisher-members.html b/classmrs__lib_1_1ImagePublisher-members.html new file mode 100644 index 00000000..70a069a8 --- /dev/null +++ b/classmrs__lib_1_1ImagePublisher-members.html @@ -0,0 +1,106 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::ImagePublisher Member List
+
+
+ +

This is the complete list of members for mrs_lib::ImagePublisher, including all inherited members.

+ + + +
ImagePublisher(ros::NodeHandlePtr nh_) (defined in mrs_lib::ImagePublisher)mrs_lib::ImagePublisher
publish(std::string topic_name, double throttle_period, cv::Mat &image, bool bgr_order=false) (defined in mrs_lib::ImagePublisher)mrs_lib::ImagePublisher
+
+ + + + diff --git a/classmrs__lib_1_1ImagePublisher.html b/classmrs__lib_1_1ImagePublisher.html new file mode 100644 index 00000000..3f9b2dc6 --- /dev/null +++ b/classmrs__lib_1_1ImagePublisher.html @@ -0,0 +1,119 @@ + + + + + + + +mrs_lib: mrs_lib::ImagePublisher Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::ImagePublisher Class Reference
+
+
+ + + + + + +

+Public Member Functions

ImagePublisher (ros::NodeHandlePtr nh_)
 
+bool publish (std::string topic_name, double throttle_period, cv::Mat &image, bool bgr_order=false)
 
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/classmrs__lib_1_1ImagePublisher.js b/classmrs__lib_1_1ImagePublisher.js new file mode 100644 index 00000000..4cd8d500 --- /dev/null +++ b/classmrs__lib_1_1ImagePublisher.js @@ -0,0 +1,5 @@ +var classmrs__lib_1_1ImagePublisher = +[ + [ "ImagePublisher", "classmrs__lib_1_1ImagePublisher.html#a00ec635f8012086fc7df35d06bb1d4b5", null ], + [ "publish", "classmrs__lib_1_1ImagePublisher.html#ad95770e8691002b0443b73806a9fe76a", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1JLKF-members.html b/classmrs__lib_1_1JLKF-members.html new file mode 100644 index 00000000..252a7160 --- /dev/null +++ b/classmrs__lib_1_1JLKF-members.html @@ -0,0 +1,131 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases > Member List
+
+
+ +

This is the complete list of members for mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
A_t typedefmrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >
B_t typedefmrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >
Base_class typedef (defined in mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >)mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >
C_t typedefmrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >
computeKalmanGain(const statecov_t &sc, [[maybe_unused]] const z_t &z, const R_t &R, const H_t &H, double &nis, H_t &H_out, const double &nis_thr, const double &nis_avg_thr) const (defined in mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >)mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >inlineprotectedvirtual
correct(const statecov_t &sc, const z_t &z, const R_t &R) const overridemrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >inlinevirtual
mrs_lib::KalmanFilterAloamGarm::correct(const statecov_t &sc, const z_t &z, const R_t &R) const =0mrs_lib::KalmanFilterAloamGarm< n_states, n_inputs, n_measurements >pure virtual
correction_impl(const statecov_t &sc, const z_t &z, const R_t &R, const H_t &H) const (defined in mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >)mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >inlineprotected
D_t typedefmrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >
generateA_t typedef (defined in mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >)mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >
generateB_t typedef (defined in mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >)mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >
H_t typedefmrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >
invert_W(R_t W) (defined in mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >)mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >inlineprotectedstatic
JLKF(const generateA_t &generateA, const generateB_t &generateB, const H_t &H, const ros::NodeHandle &nh, const double &nis_thr, const double &nis_avg_thr)mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >inline
K_t typedefmrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >
m (defined in mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >)mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >static
n (defined in mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >)mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >static
p (defined in mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >)mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >static
P_t typedef (defined in mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >)mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >
predict(const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const overridemrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >inlinevirtual
mrs_lib::KalmanFilterAloamGarm::predict(const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const =0mrs_lib::KalmanFilterAloamGarm< n_states, n_inputs, n_measurements >pure virtual
Q_t typedef (defined in mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >)mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >
R_t typedef (defined in mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >)mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >
statecov_t typedef (defined in mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >)mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >
u_t typedef (defined in mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >)mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >
x_t typedef (defined in mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >)mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >
z_t typedef (defined in mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >)mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >
+
+ + + + diff --git a/classmrs__lib_1_1JLKF.html b/classmrs__lib_1_1JLKF.html new file mode 100644 index 00000000..6c83d0d9 --- /dev/null +++ b/classmrs__lib_1_1JLKF.html @@ -0,0 +1,477 @@ + + + + + + + +mrs_lib: mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases > Class Template Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases > Class Template Reference
+
+
+
+ + Inheritance diagram for mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >:
+
+
+ +
+ + Collaboration diagram for mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >:
+
+
+ + + + + + +

+Classes

struct  inverse_exception
 This exception is thrown when taking the inverse of a matrix fails. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Types

+using Base_class = KalmanFilterAloamGarm< n, m, p >
 
+using x_t = typename Base_class::x_t
 
+using u_t = typename Base_class::u_t
 
+using z_t = typename Base_class::z_t
 
+using P_t = typename Base_class::P_t
 
+using R_t = typename Base_class::R_t
 
+using statecov_t = typename Base_class::statecov_t
 
+using Q_t = typename Base_class::Q_t
 
+typedef Eigen::Matrix< double, n, n > A_t
 System transition matrix type $n \times n$.
 
+typedef Eigen::Matrix< double, n, m > B_t
 Input to state mapping matrix type $n \times m$.
 
+typedef Eigen::Matrix< double, p, n > H_t
 State to measurement mapping matrix type $p \times n$.
 
+typedef Eigen::Matrix< double, n, p > K_t
 Kalman gain matrix type $n \times p$.
 
+typedef Eigen::Matrix< double, p, p > C_t
 correntropy gain $p \times p$
 
+typedef Eigen::Matrix< double, n, n > D_t
 D $n \times n$.
 
+using generateA_t = std::function< A_t(double)>
 
+using generateB_t = std::function< B_t(double)>
 
- Public Types inherited from mrs_lib::KalmanFilterAloamGarm< n_states, n_inputs, n_measurements >
+typedef Eigen::Matrix< double, n, 1 > x_t
 State vector type $n \times 1$.
 
+typedef Eigen::Matrix< double, m, 1 > u_t
 Input vector type $m \times 1$.
 
+typedef Eigen::Matrix< double, p, 1 > z_t
 Measurement vector type $p \times 1$.
 
+typedef Eigen::Matrix< double, n, nP_t
 State uncertainty covariance matrix type $n \times n$.
 
+typedef Eigen::Matrix< double, p, pR_t
 Measurement noise covariance matrix type $p \times p$.
 
+typedef Eigen::Matrix< double, n, nQ_t
 Process noise covariance matrix type $n \times n$.
 
+ + + + + + + + + + + + + + + + + +

+Public Member Functions

 JLKF (const generateA_t &generateA, const generateB_t &generateB, const H_t &H, const ros::NodeHandle &nh, const double &nis_thr, const double &nis_avg_thr)
 The main constructor. More...
 
virtual statecov_t predict (const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const override
 Applies the prediction (time) step of the Kalman filter. More...
 
virtual statecov_t correct (const statecov_t &sc, const z_t &z, const R_t &R) const override
 Applies the correction (update, measurement, data) step of the Kalman filter. More...
 
- Public Member Functions inherited from mrs_lib::KalmanFilterAloamGarm< n_states, n_inputs, n_measurements >
virtual statecov_t correct (const statecov_t &sc, const z_t &z, const R_t &R) const =0
 Applies the correction (update, measurement, data) step of the Kalman filter. More...
 
virtual statecov_t predict (const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const =0
 Applies the prediction (time) step of the Kalman filter. More...
 
+ + + + + + + + + + + + + + + + + +

+Static Public Attributes

+static const int n = n_states
 
+static const int m = n_inputs
 
+static const int p = n_measurements
 
- Static Public Attributes inherited from mrs_lib::KalmanFilterAloamGarm< n_states, n_inputs, n_measurements >
+static const int n = n_states
 Length of the state vector of the system.
 
+static const int m = n_inputs
 Length of the input vector of the system.
 
+static const int p = n_measurements
 Length of the measurement vector of the system.
 
+ + + + + +

+Protected Member Functions

+virtual K_t computeKalmanGain (const statecov_t &sc, [[maybe_unused]] const z_t &z, const R_t &R, const H_t &H, double &nis, H_t &H_out, const double &nis_thr, const double &nis_avg_thr) const
 
+statecov_t ::type correction_impl (const statecov_t &sc, const z_t &z, const R_t &R, const H_t &H) const
 
+ + + +

+Static Protected Member Functions

+static R_t invert_W (R_t W)
 
+

Constructor & Destructor Documentation

+ +

◆ JLKF()

+ +
+
+
+template<int n_states, int n_inputs, int n_measurements, int n_biases>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >::JLKF (const generateA_t & generateA,
const generateB_t & generateB,
const H_tH,
const ros::NodeHandle & nh,
const double & nis_thr,
const double & nis_avg_thr 
)
+
+inline
+
+ +

The main constructor.

+
Parameters
+ + + + +
generateAa function, which returns the state transition matrix A based on the time difference dt.
generateBa function, which returns the input to state mapping matrix B based on the time difference dt.
Hthe state to measurement mapping matrix.
+
+
+ +
+
+

Member Function Documentation

+ +

◆ correct()

+ +
+
+
+template<int n_states, int n_inputs, int n_measurements, int n_biases>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
virtual statecov_t mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >::correct (const statecov_t & sc,
const z_t & z,
const R_t & R 
) const
+
+inlineoverridevirtual
+
+ +

Applies the correction (update, measurement, data) step of the Kalman filter.

+

This method applies the linear Kalman filter correction step to the state and covariance passed in sc using the measurement z and measurement noise R. The updated state and covariance after the correction step is returned.

+
Parameters
+ + + + +
scThe state and covariance to which the correction step is to be applied.
zThe measurement vector to be used for correction.
RThe measurement noise covariance matrix to be used for correction.
+
+
+
Returns
The state and covariance after the correction update.
+ +
+
+ +

◆ predict()

+ +
+
+
+template<int n_states, int n_inputs, int n_measurements, int n_biases>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
virtual statecov_t mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >::predict (const statecov_t & sc,
const u_t & u,
const Q_t & Q,
double dt 
) const
+
+inlineoverridevirtual
+
+ +

Applies the prediction (time) step of the Kalman filter.

+

This method applies the linear Kalman filter prediction step to the state and covariance passed in sc using the input u and process noise Q. The process noise covariance Q is scaled by the dt parameter. The updated state and covariance after the prediction step is returned.

+
Parameters
+ + + + + +
scThe state and covariance to which the prediction step is to be applied.
uThe input vector to be used for prediction.
QThe process noise covariance matrix to be used for prediction.
dtUsed to scale the process noise covariance Q and to generate the state transition and input to state mapping matrices A and \B using the functions, passed in the object's constructor.
+
+
+
Returns
The state and covariance after the prediction step.
+
Note
Note that the dt parameter is used to scale the process noise covariance Q and to generate the system matrices #A or #B using the functions, passed in the constructor!
+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/classmrs__lib_1_1JLKF.js b/classmrs__lib_1_1JLKF.js new file mode 100644 index 00000000..dd31242c --- /dev/null +++ b/classmrs__lib_1_1JLKF.js @@ -0,0 +1,25 @@ +var classmrs__lib_1_1JLKF = +[ + [ "inverse_exception", "structmrs__lib_1_1JLKF_1_1inverse__exception.html", "structmrs__lib_1_1JLKF_1_1inverse__exception" ], + [ "A_t", "classmrs__lib_1_1JLKF.html#a72ceb375903022d0dfc396b6f1ead479", null ], + [ "B_t", "classmrs__lib_1_1JLKF.html#ac8971eebc826cd62aadd45d4b64d216c", null ], + [ "Base_class", "classmrs__lib_1_1JLKF.html#a7a362bd5a3713025f631d2694d63e52d", null ], + [ "C_t", "classmrs__lib_1_1JLKF.html#af34d34f55cb8804bd4e873a16c9e9a08", null ], + [ "D_t", "classmrs__lib_1_1JLKF.html#ac047c1625da963988acfc47edc200a57", null ], + [ "generateA_t", "classmrs__lib_1_1JLKF.html#ac35cdcce67580306048f3faf848c52ce", null ], + [ "generateB_t", "classmrs__lib_1_1JLKF.html#aa346736b0780db11650afa85c8837fdc", null ], + [ "H_t", "classmrs__lib_1_1JLKF.html#a7599ec962b434fe92534a58d48cdfacb", null ], + [ "K_t", "classmrs__lib_1_1JLKF.html#a20be98f26b355640d078f196f9495fd5", null ], + [ "P_t", "classmrs__lib_1_1JLKF.html#a554f05f2ecc9d93ce5c24a351fd92ffb", null ], + [ "Q_t", "classmrs__lib_1_1JLKF.html#afdb5e239ba807f51c141a66e0c1531a2", null ], + [ "R_t", "classmrs__lib_1_1JLKF.html#a34b9b5334801adc3f6a658bfa7767528", null ], + [ "statecov_t", "classmrs__lib_1_1JLKF.html#a62e33a1002c24ac5624faf8bede53606", null ], + [ "u_t", "classmrs__lib_1_1JLKF.html#a583b079513c03b057857d6a81c023de1", null ], + [ "x_t", "classmrs__lib_1_1JLKF.html#a13187c4d74326b888098a956811b9dc3", null ], + [ "z_t", "classmrs__lib_1_1JLKF.html#a2ff6765f3b9e0960932433e861222a10", null ], + [ "JLKF", "classmrs__lib_1_1JLKF.html#a0c21f3599fe8ccfb1164ee204a0ae606", null ], + [ "computeKalmanGain", "classmrs__lib_1_1JLKF.html#a06fc93782bb0f77f5f5d3400e785d729", null ], + [ "correct", "classmrs__lib_1_1JLKF.html#a6aa1475ecb42a4ee97e8d7e93cb5c523", null ], + [ "correction_impl", "classmrs__lib_1_1JLKF.html#a0a877719d7fb1bcf4fd03e063eaea3d2", null ], + [ "predict", "classmrs__lib_1_1JLKF.html#acb856c6a2d7378bc6abd46af99efe580", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1JLKF__coll__graph.map b/classmrs__lib_1_1JLKF__coll__graph.map new file mode 100644 index 00000000..01e911d5 --- /dev/null +++ b/classmrs__lib_1_1JLKF__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/classmrs__lib_1_1JLKF__coll__graph.md5 b/classmrs__lib_1_1JLKF__coll__graph.md5 new file mode 100644 index 00000000..bab53702 --- /dev/null +++ b/classmrs__lib_1_1JLKF__coll__graph.md5 @@ -0,0 +1 @@ +921d466054faada3c50ed70a6984c77a \ No newline at end of file diff --git a/classmrs__lib_1_1JLKF__coll__graph.png b/classmrs__lib_1_1JLKF__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..a440d02f0ab9280d9acb359383d51fc0d48eb9e4 GIT binary patch literal 7408 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 eXa + + + diff --git a/classmrs__lib_1_1JLKF__inherit__graph.md5 b/classmrs__lib_1_1JLKF__inherit__graph.md5 new file mode 100644 index 00000000..bab53702 --- /dev/null +++ b/classmrs__lib_1_1JLKF__inherit__graph.md5 @@ -0,0 +1 @@ +921d466054faada3c50ed70a6984c77a \ No newline at end of file diff --git a/classmrs__lib_1_1JLKF__inherit__graph.png b/classmrs__lib_1_1JLKF__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..a440d02f0ab9280d9acb359383d51fc0d48eb9e4 GIT binary patch literal 7408 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 eXa + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ + + + + + diff --git a/classmrs__lib_1_1KalmanFilter.html b/classmrs__lib_1_1KalmanFilter.html new file mode 100644 index 00000000..5591cf9a --- /dev/null +++ b/classmrs__lib_1_1KalmanFilter.html @@ -0,0 +1,327 @@ + + + + + + + +mrs_lib: mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements > Class Template Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements > Class Template Referenceabstract
+
+
+ +

This abstract class defines common interfaces and types for a generic Kalman filter. + More...

+ +

#include <kalman_filter.h>

+
+ + Inheritance diagram for mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >:
+
+
+ + + + + + +

+Classes

struct  statecov_t
 Helper struct for passing around the state and its covariance in one variable. More...
 
+ + + + + + + + + + + + + + + + + + + +

+Public Types

+typedef Eigen::Matrix< double, n, 1 > x_t
 State vector type $n \times 1$.
 
+typedef Eigen::Matrix< double, m, 1 > u_t
 Input vector type $m \times 1$.
 
+typedef Eigen::Matrix< double, p, 1 > z_t
 Measurement vector type $p \times 1$.
 
+typedef Eigen::Matrix< double, n, nP_t
 State uncertainty covariance matrix type $n \times n$.
 
+typedef Eigen::Matrix< double, p, pR_t
 Measurement noise covariance matrix type $p \times p$.
 
+typedef Eigen::Matrix< double, n, nQ_t
 Process noise covariance matrix type $n \times n$.
 
+ + + + + + + +

+Public Member Functions

virtual statecov_t correct (const statecov_t &sc, const z_t &z, const R_t &R) const =0
 Applies the correction (update, measurement, data) step of the Kalman filter. More...
 
virtual statecov_t predict (const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const =0
 Applies the prediction (time) step of the Kalman filter. More...
 
+ + + + + + + + + + +

+Static Public Attributes

+static const int n = n_states
 Length of the state vector of the system.
 
+static const int m = n_inputs
 Length of the input vector of the system.
 
+static const int p = n_measurements
 Length of the measurement vector of the system.
 
+

Detailed Description

+

template<int n_states, int n_inputs, int n_measurements>
+class mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >

+ +

This abstract class defines common interfaces and types for a generic Kalman filter.

+
Template Parameters
+ + + + +
n_statesnumber of states of the system (length of the $ \mathbf{x} $ vector).
n_inputsnumber of inputs of the system (length of the $ \mathbf{u} $ vector).
n_measurementsnumber of measurements of the system (length of the $ \mathbf{z} $ vector).
+
+
+

Member Function Documentation

+ +

◆ correct()

+ +
+
+
+template<int n_states, int n_inputs, int n_measurements>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
virtual statecov_t mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >::correct (const statecov_tsc,
const z_tz,
const R_tR 
) const
+
+pure virtual
+
+ +

Applies the correction (update, measurement, data) step of the Kalman filter.

+

This method applies the correction step to the state and covariance passed in sc using the measurement z and measurement noise R. An optional parameter param may be used by some implementations, but it is usually ignored. The updated state and covariance after the correction step is returned.

+
Parameters
+ + + + +
scThe state and covariance to which the correction step is to be applied.
zThe measurement vector to be used for correction.
RThe measurement noise covariance matrix to be used for correction.
+
+
+
Returns
The state and covariance after the correction update.
+ +
+
+ +

◆ predict()

+ +
+
+
+template<int n_states, int n_inputs, int n_measurements>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
virtual statecov_t mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >::predict (const statecov_tsc,
const u_tu,
const Q_tQ,
double dt 
) const
+
+pure virtual
+
+ +

Applies the prediction (time) step of the Kalman filter.

+

This method applies the prediction step to the state and covariance passed in sc using the input u and process noise Q. The state and covariance are updated by dt into the future, if applicable to the implementation. An optional parameter param may be used by some implementations, but it is usually ignored. The updated state and covariance after the prediction step is returned.

+
Parameters
+ + + + + +
scThe state and covariance to which the prediction step is to be applied.
uThe input vector to be used for prediction.
QThe process noise covariance matrix to be used for prediction.
dtThe time step for the prediction update (the state and covariance will be predicted by dt into the future).
+
+
+
Returns
The state and covariance after the prediction step.
+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/classmrs__lib_1_1KalmanFilter.js b/classmrs__lib_1_1KalmanFilter.js new file mode 100644 index 00000000..475a9915 --- /dev/null +++ b/classmrs__lib_1_1KalmanFilter.js @@ -0,0 +1,12 @@ +var classmrs__lib_1_1KalmanFilter = +[ + [ "statecov_t", "structmrs__lib_1_1KalmanFilter_1_1statecov__t.html", "structmrs__lib_1_1KalmanFilter_1_1statecov__t" ], + [ "P_t", "classmrs__lib_1_1KalmanFilter.html#a8f5e50ea6668129218bd4113f4ffdf6f", null ], + [ "Q_t", "classmrs__lib_1_1KalmanFilter.html#ab2c5ddabe3fc919334595ec1e535c848", null ], + [ "R_t", "classmrs__lib_1_1KalmanFilter.html#a1e4c8aa79cfcea707876d85950132450", null ], + [ "u_t", "classmrs__lib_1_1KalmanFilter.html#ad92ac4f280e849986554bc593e5ab96e", null ], + [ "x_t", "classmrs__lib_1_1KalmanFilter.html#a5b8f47081daf208496a19a4364e6509c", null ], + [ "z_t", "classmrs__lib_1_1KalmanFilter.html#a0825f38a6a4ddc522239bb7bf6279737", null ], + [ "correct", "classmrs__lib_1_1KalmanFilter.html#a66c1e0d2e496f304a4f6166e7b894aac", null ], + [ "predict", "classmrs__lib_1_1KalmanFilter.html#a7c8e64828a78d1a680d1ef467633d9d5", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1KalmanFilterAloamGarm-members.html b/classmrs__lib_1_1KalmanFilterAloamGarm-members.html new file mode 100644 index 00000000..f40164be --- /dev/null +++ b/classmrs__lib_1_1KalmanFilterAloamGarm-members.html @@ -0,0 +1,115 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ + + + + + diff --git a/classmrs__lib_1_1KalmanFilterAloamGarm.html b/classmrs__lib_1_1KalmanFilterAloamGarm.html new file mode 100644 index 00000000..ce807dd7 --- /dev/null +++ b/classmrs__lib_1_1KalmanFilterAloamGarm.html @@ -0,0 +1,318 @@ + + + + + + + +mrs_lib: mrs_lib::KalmanFilterAloamGarm< n_states, n_inputs, n_measurements > Class Template Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::KalmanFilterAloamGarm< n_states, n_inputs, n_measurements > Class Template Referenceabstract
+
+
+ +

This abstract class defines common interfaces and types for a generic Kalman filter. + More...

+ +

#include <kalman_filter_aloamgarm.h>

+
+ + Inheritance diagram for mrs_lib::KalmanFilterAloamGarm< n_states, n_inputs, n_measurements >:
+
+
+ + + + + + +

+Classes

struct  statecov_t
 Helper struct for passing around the state and its covariance in one variable. More...
 
+ + + + + + + + + + + + + + + + + + + +

+Public Types

+typedef Eigen::Matrix< double, n, 1 > x_t
 State vector type $n \times 1$.
 
+typedef Eigen::Matrix< double, m, 1 > u_t
 Input vector type $m \times 1$.
 
+typedef Eigen::Matrix< double, p, 1 > z_t
 Measurement vector type $p \times 1$.
 
+typedef Eigen::Matrix< double, n, nP_t
 State uncertainty covariance matrix type $n \times n$.
 
+typedef Eigen::Matrix< double, p, pR_t
 Measurement noise covariance matrix type $p \times p$.
 
+typedef Eigen::Matrix< double, n, nQ_t
 Process noise covariance matrix type $n \times n$.
 
+ + + + + + + +

+Public Member Functions

virtual statecov_t correct (const statecov_t &sc, const z_t &z, const R_t &R) const =0
 Applies the correction (update, measurement, data) step of the Kalman filter. More...
 
virtual statecov_t predict (const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const =0
 Applies the prediction (time) step of the Kalman filter. More...
 
+ + + + + + + + + + +

+Static Public Attributes

+static const int n = n_states
 Length of the state vector of the system.
 
+static const int m = n_inputs
 Length of the input vector of the system.
 
+static const int p = n_measurements
 Length of the measurement vector of the system.
 
+

Detailed Description

+

template<int n_states, int n_inputs, int n_measurements>
+class mrs_lib::KalmanFilterAloamGarm< n_states, n_inputs, n_measurements >

+ +

This abstract class defines common interfaces and types for a generic Kalman filter.

+
Template Parameters
+ + + + +
n_statesnumber of states of the system (length of the $ \mathbf{x} $ vector).
n_inputsnumber of inputs of the system (length of the $ \mathbf{u} $ vector).
n_measurementsnumber of measurements of the system (length of the $ \mathbf{z} $ vector).
+
+
+

Member Function Documentation

+ +

◆ correct()

+ +
+
+
+template<int n_states, int n_inputs, int n_measurements>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
virtual statecov_t mrs_lib::KalmanFilterAloamGarm< n_states, n_inputs, n_measurements >::correct (const statecov_tsc,
const z_tz,
const R_tR 
) const
+
+pure virtual
+
+ +

Applies the correction (update, measurement, data) step of the Kalman filter.

+

This method applies the correction step to the state and covariance passed in sc using the measurement z and measurement noise R. An optional parameter param may be used by some implementations, but it is usually ignored. The updated state and covariance after the correction step is returned.

+
Parameters
+ + + + +
scThe state and covariance to which the correction step is to be applied.
zThe measurement vector to be used for correction.
RThe measurement noise covariance matrix to be used for correction.
+
+
+
Returns
The state and covariance after the correction update.
+ +
+
+ +

◆ predict()

+ +
+
+
+template<int n_states, int n_inputs, int n_measurements>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
virtual statecov_t mrs_lib::KalmanFilterAloamGarm< n_states, n_inputs, n_measurements >::predict (const statecov_tsc,
const u_tu,
const Q_tQ,
double dt 
) const
+
+pure virtual
+
+ +

Applies the prediction (time) step of the Kalman filter.

+

This method applies the prediction step to the state and covariance passed in sc using the input u and process noise Q. The state and covariance are updated by dt into the future, if applicable to the implementation. An optional parameter param may be used by some implementations, but it is usually ignored. The updated state and covariance after the prediction step is returned.

+
Parameters
+ + + + + +
scThe state and covariance to which the prediction step is to be applied.
uThe input vector to be used for prediction.
QThe process noise covariance matrix to be used for prediction.
dtThe time step for the prediction update (the state and covariance will be predicted by dt into the future).
+
+
+
Returns
The state and covariance after the prediction step.
+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/classmrs__lib_1_1KalmanFilterAloamGarm.js b/classmrs__lib_1_1KalmanFilterAloamGarm.js new file mode 100644 index 00000000..ae589e5a --- /dev/null +++ b/classmrs__lib_1_1KalmanFilterAloamGarm.js @@ -0,0 +1,12 @@ +var classmrs__lib_1_1KalmanFilterAloamGarm = +[ + [ "statecov_t", "structmrs__lib_1_1KalmanFilterAloamGarm_1_1statecov__t.html", "structmrs__lib_1_1KalmanFilterAloamGarm_1_1statecov__t" ], + [ "P_t", "classmrs__lib_1_1KalmanFilterAloamGarm.html#a9b8488ef81812059a366fcc2e92e04f6", null ], + [ "Q_t", "classmrs__lib_1_1KalmanFilterAloamGarm.html#ab9efcd795fc6c47ef94c20f9ff9547dc", null ], + [ "R_t", "classmrs__lib_1_1KalmanFilterAloamGarm.html#ab6bf1e91bfeb633b08038f54b2b5d0fa", null ], + [ "u_t", "classmrs__lib_1_1KalmanFilterAloamGarm.html#ae680d65b40883e1678e0365ed3924c16", null ], + [ "x_t", "classmrs__lib_1_1KalmanFilterAloamGarm.html#a0e19e15226a8e251452cd486153fba12", null ], + [ "z_t", "classmrs__lib_1_1KalmanFilterAloamGarm.html#ae7fc4baaa223bf1ccebebc20c4b02bcc", null ], + [ "correct", "classmrs__lib_1_1KalmanFilterAloamGarm.html#a3e541e3ec53df99c77f8cc7031728d6f", null ], + [ "predict", "classmrs__lib_1_1KalmanFilterAloamGarm.html#a139f8d4f64e9e45ca68b9141ecae8c99", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1KalmanFilterAloamGarm__inherit__graph.map b/classmrs__lib_1_1KalmanFilterAloamGarm__inherit__graph.map new file mode 100644 index 00000000..1f6ec346 --- /dev/null +++ b/classmrs__lib_1_1KalmanFilterAloamGarm__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/classmrs__lib_1_1KalmanFilterAloamGarm__inherit__graph.md5 b/classmrs__lib_1_1KalmanFilterAloamGarm__inherit__graph.md5 new file mode 100644 index 00000000..590ab51f --- /dev/null +++ b/classmrs__lib_1_1KalmanFilterAloamGarm__inherit__graph.md5 @@ -0,0 +1 @@ +ab54fd2f3ac94a1d3866399bc8e1fa9e \ No newline at end of file diff --git a/classmrs__lib_1_1KalmanFilterAloamGarm__inherit__graph.png b/classmrs__lib_1_1KalmanFilterAloamGarm__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..89eab45ce42f164720c7de47ce92386e0541bdec GIT binary patch literal 6393 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 cUtAHT`}5i4 + + + + + + + + + + + + diff --git a/classmrs__lib_1_1KalmanFilter__inherit__graph.md5 b/classmrs__lib_1_1KalmanFilter__inherit__graph.md5 new file mode 100644 index 00000000..e55449a8 --- /dev/null +++ b/classmrs__lib_1_1KalmanFilter__inherit__graph.md5 @@ -0,0 +1 @@ +dfff49ecc4577c9dc4e93323728b37f3 \ No newline at end of file diff --git a/classmrs__lib_1_1KalmanFilter__inherit__graph.png b/classmrs__lib_1_1KalmanFilter__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..f34f81f006f75f304e51a42e27a3801b71564341 GIT binary patch literal 37414 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

84(RE*6|mu%Yr} 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 + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +

+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::LKF< n_states, n_inputs, n_measurements > Member List
+
+
+ +

This is the complete list of members for mrs_lib::LKF< n_states, n_inputs, n_measurements >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Amrs_lib::LKF< n_states, n_inputs, n_measurements >
A_t typedefmrs_lib::LKF< n_states, n_inputs, n_measurements >
Bmrs_lib::LKF< n_states, n_inputs, n_measurements >
B_t typedefmrs_lib::LKF< n_states, n_inputs, n_measurements >
Base_class typedefmrs_lib::LKF< n_states, n_inputs, n_measurements >
computeKalmanGain(const statecov_t &sc, [[maybe_unused]] const z_t &z, const R_t &R, const H_t &H) const (defined in mrs_lib::LKF< n_states, n_inputs, n_measurements >)mrs_lib::LKF< n_states, n_inputs, n_measurements >inlineprotectedvirtual
correct(const statecov_t &sc, const z_t &z, const R_t &R) const overridemrs_lib::LKF< n_states, n_inputs, n_measurements >inlinevirtual
mrs_lib::KalmanFilter::correct(const statecov_t &sc, const z_t &z, const R_t &R) const =0mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >pure virtual
correction_impl(const statecov_t &sc, const z_t &z, const R_t &R, const H_t &H) const (defined in mrs_lib::LKF< n_states, n_inputs, n_measurements >)mrs_lib::LKF< n_states, n_inputs, n_measurements >inlineprotected
covariance_predict(const A_t &A, const P_t &P, const Q_t &Q, const double dt) (defined in mrs_lib::LKF< n_states, n_inputs, n_measurements >)mrs_lib::LKF< n_states, n_inputs, n_measurements >inlineprotectedstatic
Hmrs_lib::LKF< n_states, n_inputs, n_measurements >
H_t typedefmrs_lib::LKF< n_states, n_inputs, n_measurements >
invert_W(R_t W) (defined in mrs_lib::LKF< n_states, n_inputs, n_measurements >)mrs_lib::LKF< n_states, n_inputs, n_measurements >inlineprotectedstatic
K_t typedefmrs_lib::LKF< n_states, n_inputs, n_measurements >
LKF()mrs_lib::LKF< n_states, n_inputs, n_measurements >inline
LKF(const A_t &A, const B_t &B, const H_t &H)mrs_lib::LKF< n_states, n_inputs, n_measurements >inline
mmrs_lib::LKF< n_states, n_inputs, n_measurements >static
nmrs_lib::LKF< n_states, n_inputs, n_measurements >static
pmrs_lib::LKF< n_states, n_inputs, n_measurements >static
P_t typedefmrs_lib::LKF< n_states, n_inputs, n_measurements >
predict(const statecov_t &sc, const u_t &u, const Q_t &Q, [[maybe_unused]] double dt) const overridemrs_lib::LKF< n_states, n_inputs, n_measurements >inlinevirtual
mrs_lib::KalmanFilter::predict(const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const =0mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >pure virtual
Q_t typedefmrs_lib::LKF< n_states, n_inputs, n_measurements >
R_t typedefmrs_lib::LKF< n_states, n_inputs, n_measurements >
state_predict(const A_t &A, const x_t &x, [[maybe_unused]] const B_t &B, [[maybe_unused]] const u_t &u) (defined in mrs_lib::LKF< n_states, n_inputs, n_measurements >)mrs_lib::LKF< n_states, n_inputs, n_measurements >inlineprotectedstatic
state_predict(const A_t &A, const x_t &x, const B_t &B, const u_t &u) (defined in mrs_lib::LKF< n_states, n_inputs, n_measurements >)mrs_lib::LKF< n_states, n_inputs, n_measurements >inlineprotectedstatic
statecov_t typedefmrs_lib::LKF< n_states, n_inputs, n_measurements >
u_t typedefmrs_lib::LKF< n_states, n_inputs, n_measurements >
x_t typedefmrs_lib::LKF< n_states, n_inputs, n_measurements >
z_t typedefmrs_lib::LKF< n_states, n_inputs, n_measurements >
+
+ + + + diff --git a/classmrs__lib_1_1LKF.html b/classmrs__lib_1_1LKF.html new file mode 100644 index 00000000..2ea38802 --- /dev/null +++ b/classmrs__lib_1_1LKF.html @@ -0,0 +1,541 @@ + + + + + + + +mrs_lib: mrs_lib::LKF< n_states, n_inputs, n_measurements > Class Template Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::LKF< n_states, n_inputs, n_measurements > Class Template Reference
+
+
+ +

Implementation of the Linear Kalman filter [3]. + More...

+ +

#include <lkf.h>

+
+ + Inheritance diagram for mrs_lib::LKF< n_states, n_inputs, n_measurements >:
+
+
+ +
+ + Collaboration diagram for mrs_lib::LKF< n_states, n_inputs, n_measurements >:
+
+
+ + + + + + +

+Classes

struct  inverse_exception
 This exception is thrown when taking the inverse of a matrix fails. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Types

+using Base_class = KalmanFilter< n, m, p >
 Base class of this class.
 
+using x_t = typename Base_class::x_t
 State vector type $n \times 1$.
 
+using u_t = typename Base_class::u_t
 Input vector type $m \times 1$.
 
+using z_t = typename Base_class::z_t
 Measurement vector type $p \times 1$.
 
+using P_t = typename Base_class::P_t
 State uncertainty covariance matrix type $n \times n$.
 
+using R_t = typename Base_class::R_t
 Measurement noise covariance matrix type $p \times p$.
 
+using Q_t = typename Base_class::Q_t
 Process noise covariance matrix type $n \times n$.
 
+using statecov_t = typename Base_class::statecov_t
 Helper struct for passing around the state and its covariance in one variable.
 
+typedef Eigen::Matrix< double, n, nA_t
 System transition matrix type $n \times n$.
 
+typedef Eigen::Matrix< double, n, mB_t
 Input to state mapping matrix type $n \times m$.
 
+typedef Eigen::Matrix< double, p, nH_t
 State to measurement mapping matrix type $p \times n$.
 
+typedef Eigen::Matrix< double, n, pK_t
 Kalman gain matrix type $n \times p$.
 
- Public Types inherited from mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >
+typedef Eigen::Matrix< double, n, 1 > x_t
 State vector type $n \times 1$.
 
+typedef Eigen::Matrix< double, m, 1 > u_t
 Input vector type $m \times 1$.
 
+typedef Eigen::Matrix< double, p, 1 > z_t
 Measurement vector type $p \times 1$.
 
+typedef Eigen::Matrix< double, n, nP_t
 State uncertainty covariance matrix type $n \times n$.
 
+typedef Eigen::Matrix< double, p, pR_t
 Measurement noise covariance matrix type $p \times p$.
 
+typedef Eigen::Matrix< double, n, nQ_t
 Process noise covariance matrix type $n \times n$.
 
+ + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 LKF ()
 Convenience default constructor. More...
 
 LKF (const A_t &A, const B_t &B, const H_t &H)
 The main constructor. More...
 
virtual statecov_t correct (const statecov_t &sc, const z_t &z, const R_t &R) const override
 Applies the correction (update, measurement, data) step of the Kalman filter. More...
 
virtual statecov_t predict (const statecov_t &sc, const u_t &u, const Q_t &Q, [[maybe_unused]] double dt) const override
 Applies the prediction (time) step of the Kalman filter. More...
 
- Public Member Functions inherited from mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >
virtual statecov_t correct (const statecov_t &sc, const z_t &z, const R_t &R) const =0
 Applies the correction (update, measurement, data) step of the Kalman filter. More...
 
virtual statecov_t predict (const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const =0
 Applies the prediction (time) step of the Kalman filter. More...
 
+ + + + + + + + + + +

+Public Attributes

+A_t A
 The system transition matrix $n \times n$.
 
+B_t B
 The input to state mapping matrix $n \times m$.
 
+H_t H
 The state to measurement mapping matrix $p \times n$.
 
+ + + + + + + + + + + + + + + + + + + + +

+Static Public Attributes

+static constexpr int n = n_states
 Length of the state vector of the system.
 
+static constexpr int m = n_inputs
 Length of the input vector of the system.
 
+static constexpr int p = n_measurements
 Length of the measurement vector of the system.
 
- Static Public Attributes inherited from mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >
+static const int n = n_states
 Length of the state vector of the system.
 
+static const int m = n_inputs
 Length of the input vector of the system.
 
+static const int p = n_measurements
 Length of the measurement vector of the system.
 
+ + + + + +

+Protected Member Functions

+virtual K_t computeKalmanGain (const statecov_t &sc, [[maybe_unused]] const z_t &z, const R_t &R, const H_t &H) const
 
+statecov_t ::type correction_impl (const statecov_t &sc, const z_t &z, const R_t &R, const H_t &H) const
 
+ + + + + + + + + + + +

+Static Protected Member Functions

+static P_t covariance_predict (const A_t &A, const P_t &P, const Q_t &Q, const double dt)
 
+template<int check = n_inputs>
static std::enable_if< check==0, x_t >::type state_predict (const A_t &A, const x_t &x, [[maybe_unused]] const B_t &B, [[maybe_unused]] const u_t &u)
 
+template<int check = n_inputs>
static 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)
 
+static R_t invert_W (R_t W)
 
+

Detailed Description

+

template<int n_states, int n_inputs, int n_measurements>
+class mrs_lib::LKF< n_states, n_inputs, n_measurements >

+ +

Implementation of the Linear Kalman filter [3].

+

The Linear Kalman filter (abbreviated LKF, [3]) may be used for state filtration or estimation of linear stochastic discrete systems. It assumes that noise variables are sampled from multivariate gaussian distributions and takes into account apriori known parameters of these distributions (namely zero means and covariance matrices, which have to be specified by the user and are tunable parameters).

+

The LKF C++ class itself is templated. This has its advantages and disadvantages. Main disadvantage is that it may be harder to use if you're not familiar with C++ templates, which, admittedly, can get somewhat messy, espetially during compilation. Another disadvantage is that if used unwisely, the compilation times can get much higher when using templates. The main advantage is compile-time checking (if it compiles, then it has a lower chance of crashing at runtime) and enabling more effective optimalizations during compilation. Also in case of Eigen, the code is arguably more readable when you use aliases to the specific Matrix instances instead of having Eigen::MatrixXd and Eigen::VectorXd everywhere.

+
Template Parameters
+ + + + +
n_statesnumber of states of the system (length of the $ \mathbf{x} $ vector).
n_inputsnumber of inputs of the system (length of the $ \mathbf{u} $ vector).
n_measurementsnumber of measurements of the system (length of the $ \mathbf{z} $ vector).
+
+
+
Examples
lkf/example.cpp.
+
+

Constructor & Destructor Documentation

+ +

◆ LKF() [1/2]

+ +
+
+
+template<int n_states, int n_inputs, int n_measurements>
+ + + + + +
+ + + + + + + +
mrs_lib::LKF< n_states, n_inputs, n_measurements >::LKF ()
+
+inline
+
+ +

Convenience default constructor.

+

This constructor should not be used if applicable. If used, the main constructor has to be called afterwards, before using this class, otherwise the LKF object is invalid (not initialized).

+ +
+
+ +

◆ LKF() [2/2]

+ +
+
+
+template<int n_states, int n_inputs, int n_measurements>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::LKF< n_states, n_inputs, n_measurements >::LKF (const A_tA,
const B_tB,
const H_tH 
)
+
+inline
+
+ +

The main constructor.

+
Parameters
+ + + + +
AThe state transition matrix.
BThe input to state mapping matrix.
HThe state to measurement mapping matrix.
+
+
+ +
+
+

Member Function Documentation

+ +

◆ correct()

+ +
+
+
+template<int n_states, int n_inputs, int n_measurements>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
virtual statecov_t mrs_lib::LKF< n_states, n_inputs, n_measurements >::correct (const statecov_tsc,
const z_tz,
const R_tR 
) const
+
+inlineoverridevirtual
+
+ +

Applies the correction (update, measurement, data) step of the Kalman filter.

+

This method applies the linear Kalman filter correction step to the state and covariance passed in sc using the measurement z and measurement noise R. The updated state and covariance after the correction step is returned.

+
Parameters
+ + + + +
scThe state and covariance to which the correction step is to be applied.
zThe measurement vector to be used for correction.
RThe measurement noise covariance matrix to be used for correction.
+
+
+
Returns
The state and covariance after the correction update.
+ +
+
+ +

◆ predict()

+ +
+
+
+template<int n_states, int n_inputs, int n_measurements>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
virtual statecov_t mrs_lib::LKF< n_states, n_inputs, n_measurements >::predict (const statecov_tsc,
const u_tu,
const Q_tQ,
[[maybe_unused] ] double dt 
) const
+
+inlineoverridevirtual
+
+ +

Applies the prediction (time) step of the Kalman filter.

+

This method applies the linear Kalman filter prediction step to the state and covariance passed in sc using the input u and process noise Q. The process noise covariance Q is scaled by the dt parameter. The updated state and covariance after the prediction step is returned.

+
Parameters
+ + + + + +
scThe state and covariance to which the prediction step is to be applied.
uThe input vector to be used for prediction.
QThe process noise covariance matrix to be used for prediction.
dtUsed to scale the process noise covariance Q.
+
+
+
Returns
The state and covariance after the prediction step.
+
Note
Note that the dt parameter is only used to scale the process noise covariance Q it does not change the system matrices A or B (because there is no unambiguous way to do this)! If you have a changing time step duration and a dynamic system, you have to change the A and B matrices manually.
+ +
+
+
The documentation for this class was generated from the following file:
    +
  • include/mrs_lib/lkf.h
  • +
+
+
+ + + + diff --git a/classmrs__lib_1_1LKF.js b/classmrs__lib_1_1LKF.js new file mode 100644 index 00000000..f410cfce --- /dev/null +++ b/classmrs__lib_1_1LKF.js @@ -0,0 +1,25 @@ +var classmrs__lib_1_1LKF = +[ + [ "inverse_exception", "structmrs__lib_1_1LKF_1_1inverse__exception.html", "structmrs__lib_1_1LKF_1_1inverse__exception" ], + [ "A_t", "classmrs__lib_1_1LKF.html#aa5c83985c5c7685ebe2af0e445fbc0ad", null ], + [ "B_t", "classmrs__lib_1_1LKF.html#a5ca7805e401bd7b718b510269a6ce7bf", null ], + [ "Base_class", "classmrs__lib_1_1LKF.html#ae54a2cc807bafeee1777ffdbd37e3c02", null ], + [ "H_t", "classmrs__lib_1_1LKF.html#a78733a13f277480c5c8c42228d440df7", null ], + [ "K_t", "classmrs__lib_1_1LKF.html#a33b80f4e1b9b7eb7243b71a4ae6d99c6", null ], + [ "P_t", "classmrs__lib_1_1LKF.html#a5d5cee075e30da36ffb946cffcfca688", null ], + [ "Q_t", "classmrs__lib_1_1LKF.html#a5df2fd299b9da75a872e8d9194da1ca9", null ], + [ "R_t", "classmrs__lib_1_1LKF.html#a5d2cb5ed042b660f1a44bdb9f4d2612f", null ], + [ "statecov_t", "classmrs__lib_1_1LKF.html#a54b2b4a3932510daad92da5a2b1274c1", null ], + [ "u_t", "classmrs__lib_1_1LKF.html#a98e130a3d14cd93b01b0b942de8af10c", null ], + [ "x_t", "classmrs__lib_1_1LKF.html#abfad09fe2386fb87eaea7b4dd8b24409", null ], + [ "z_t", "classmrs__lib_1_1LKF.html#af4318056f5e0c024651bb882b60ec640", null ], + [ "LKF", "classmrs__lib_1_1LKF.html#aecd505e79c0102609c9e5ffbd91a7cc3", null ], + [ "LKF", "classmrs__lib_1_1LKF.html#a8bb9eee4045a176b56c28bc7e0113fa0", null ], + [ "computeKalmanGain", "classmrs__lib_1_1LKF.html#adcdde06220c8b30b2b74cb50d988c71b", null ], + [ "correct", "classmrs__lib_1_1LKF.html#a8ba4552b6fa909e5d899d2fe8c8fdaa5", null ], + [ "correction_impl", "classmrs__lib_1_1LKF.html#a3fdb4e57a1b930fd7e98f7a2c49aa052", null ], + [ "predict", "classmrs__lib_1_1LKF.html#af4027c4bef5dda2a12af1f728e92c45a", null ], + [ "A", "classmrs__lib_1_1LKF.html#a0926533d35a53410b4302fda99a45321", null ], + [ "B", "classmrs__lib_1_1LKF.html#a2d88249f1992d772631026387a45445a", null ], + [ "H", "classmrs__lib_1_1LKF.html#a552fedb99ce43148c212c809dcd8191f", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1LKF__MRS__odom-members.html b/classmrs__lib_1_1LKF__MRS__odom-members.html new file mode 100644 index 00000000..97019e84 --- /dev/null +++ b/classmrs__lib_1_1LKF__MRS__odom-members.html @@ -0,0 +1,143 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::LKF_MRS_odom Member List
+
+
+ +

This is the complete list of members for mrs_lib::LKF_MRS_odom, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Amrs_lib::LKF< 3, 1, 1 >
A_t typedef (defined in mrs_lib::LKF_MRS_odom)mrs_lib::LKF_MRS_odom
Bmrs_lib::LKF< 3, 1, 1 >
B_t typedef (defined in mrs_lib::LKF_MRS_odom)mrs_lib::LKF_MRS_odom
Base_class typedef (defined in mrs_lib::LKF_MRS_odom)mrs_lib::LKF_MRS_odom
coeff_A_t typedef (defined in mrs_lib::LKF_MRS_odom)mrs_lib::LKF_MRS_odom
coeff_B_t typedef (defined in mrs_lib::LKF_MRS_odom)mrs_lib::LKF_MRS_odom
computeKalmanGain(const statecov_t &sc,[[maybe_unused]] const z_t &z, const R_t &R, const H_t &H) const (defined in mrs_lib::LKF< 3, 1, 1 >)mrs_lib::LKF< 3, 1, 1 >inlineprotectedvirtual
correct(const statecov_t &sc, const z_t &z, const R_t &R, int param=0) const (defined in mrs_lib::LKF_MRS_odom)mrs_lib::LKF_MRS_odomvirtual
LKF< 3, 1, 1 >::correct(const statecov_t &sc, const z_t &z, const R_t &R) const overridemrs_lib::LKF< 3, 1, 1 >inlinevirtual
mrs_lib::KalmanFilter::correct(const statecov_t &sc, const z_t &z, const R_t &R) const =0mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >pure virtual
correction_impl(const statecov_t &sc, const z_t &z, const R_t &R, const H_t &H) const (defined in mrs_lib::LKF< 3, 1, 1 >)mrs_lib::LKF< 3, 1, 1 >inlineprotected
covariance_predict(const A_t &A, const P_t &P, const Q_t &Q, const double dt) (defined in mrs_lib::LKF< 3, 1, 1 >)mrs_lib::LKF< 3, 1, 1 >inlineprotectedstatic
covariance_predict_optimized(const P_t &P, const Q_t &Q, double dt) const (defined in mrs_lib::LKF_MRS_odom)mrs_lib::LKF_MRS_odom
dtexp_A_t typedef (defined in mrs_lib::LKF_MRS_odom)mrs_lib::LKF_MRS_odom
dtexp_B_t typedef (defined in mrs_lib::LKF_MRS_odom)mrs_lib::LKF_MRS_odom
Hmrs_lib::LKF< 3, 1, 1 >
H_t typedef (defined in mrs_lib::LKF_MRS_odom)mrs_lib::LKF_MRS_odom
invert_W(R_t W) (defined in mrs_lib::LKF< 3, 1, 1 >)mrs_lib::LKF< 3, 1, 1 >inlineprotectedstatic
K_t typedefmrs_lib::LKF< 3, 1, 1 >
LKF()mrs_lib::LKF< 3, 1, 1 >inline
LKF(const A_t &A, const B_t &B, const H_t &H)mrs_lib::LKF< 3, 1, 1 >inline
LKF_MRS_odom(const std::vector< H_t > &Hs, const double default_dt=1) (defined in mrs_lib::LKF_MRS_odom)mrs_lib::LKF_MRS_odom
m (defined in mrs_lib::LKF_MRS_odom)mrs_lib::LKF_MRS_odomstatic
n (defined in mrs_lib::LKF_MRS_odom)mrs_lib::LKF_MRS_odomstatic
p (defined in mrs_lib::LKF_MRS_odom)mrs_lib::LKF_MRS_odomstatic
P_t typedef (defined in mrs_lib::LKF_MRS_odom)mrs_lib::LKF_MRS_odom
predict(const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const override (defined in mrs_lib::LKF_MRS_odom)mrs_lib::LKF_MRS_odomvirtual
LKF< 3, 1, 1 >::predict(const statecov_t &sc, const u_t &u, const Q_t &Q,[[maybe_unused]] double dt) const overridemrs_lib::LKF< 3, 1, 1 >inlinevirtual
mrs_lib::KalmanFilter::predict(const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const =0mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >pure virtual
Q_t typedef (defined in mrs_lib::LKF_MRS_odom)mrs_lib::LKF_MRS_odom
R_t typedef (defined in mrs_lib::LKF_MRS_odom)mrs_lib::LKF_MRS_odom
state_predict(const A_t &A, const x_t &x,[[maybe_unused]] const B_t &B,[[maybe_unused]] const u_t &u) (defined in mrs_lib::LKF< 3, 1, 1 >)mrs_lib::LKF< 3, 1, 1 >inlineprotectedstatic
state_predict(const A_t &A, const x_t &x, const B_t &B, const u_t &u) (defined in mrs_lib::LKF< 3, 1, 1 >)mrs_lib::LKF< 3, 1, 1 >inlineprotectedstatic
state_predict_optimized(const x_t &x_prev, const u_t &u, double dt) const (defined in mrs_lib::LKF_MRS_odom)mrs_lib::LKF_MRS_odom
statecov_t typedef (defined in mrs_lib::LKF_MRS_odom)mrs_lib::LKF_MRS_odom
u_t typedef (defined in mrs_lib::LKF_MRS_odom)mrs_lib::LKF_MRS_odom
x_t typedef (defined in mrs_lib::LKF_MRS_odom)mrs_lib::LKF_MRS_odom
z_t typedef (defined in mrs_lib::LKF_MRS_odom)mrs_lib::LKF_MRS_odom
+
+ + + + diff --git a/classmrs__lib_1_1LKF__MRS__odom.html b/classmrs__lib_1_1LKF__MRS__odom.html new file mode 100644 index 00000000..d30999d1 --- /dev/null +++ b/classmrs__lib_1_1LKF__MRS__odom.html @@ -0,0 +1,370 @@ + + + + + + + +mrs_lib: mrs_lib::LKF_MRS_odom Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::LKF_MRS_odom Class Reference
+
+
+
+ + Inheritance diagram for mrs_lib::LKF_MRS_odom:
+
+
+ +
+ + Collaboration diagram for mrs_lib::LKF_MRS_odom:
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Types

+using Base_class = LKF< n, m, p >
 
+using x_t = typename Base_class::x_t
 
+using u_t = typename Base_class::u_t
 
+using z_t = typename Base_class::z_t
 
+using P_t = typename Base_class::P_t
 
+using R_t = typename Base_class::R_t
 
+using statecov_t = typename Base_class::statecov_t
 
+using A_t = typename Base_class::A_t
 
+using B_t = typename Base_class::B_t
 
+using H_t = typename Base_class::H_t
 
+using Q_t = typename Base_class::Q_t
 
+using coeff_A_t = A_t
 
+typedef Eigen::Matrix< unsigned, n, n > dtexp_A_t
 
+using coeff_B_t = B_t
 
+typedef Eigen::Matrix< unsigned, n, m > dtexp_B_t
 
- Public Types inherited from mrs_lib::LKF< 3, 1, 1 >
+using Base_class = KalmanFilter< n, m, p >
 Base class of this class.
 
+using x_t = typename Base_class::x_t
 State vector type $n \times 1$.
 
+using u_t = typename Base_class::u_t
 Input vector type $m \times 1$.
 
+using z_t = typename Base_class::z_t
 Measurement vector type $p \times 1$.
 
+using P_t = typename Base_class::P_t
 State uncertainty covariance matrix type $n \times n$.
 
+using R_t = typename Base_class::R_t
 Measurement noise covariance matrix type $p \times p$.
 
+using Q_t = typename Base_class::Q_t
 Process noise covariance matrix type $n \times n$.
 
+using statecov_t = typename Base_class::statecov_t
 Helper struct for passing around the state and its covariance in one variable.
 
+typedef Eigen::Matrix< double, n, nA_t
 System transition matrix type $n \times n$.
 
+typedef Eigen::Matrix< double, n, mB_t
 Input to state mapping matrix type $n \times m$.
 
+typedef Eigen::Matrix< double, p, nH_t
 State to measurement mapping matrix type $p \times n$.
 
+typedef Eigen::Matrix< double, n, pK_t
 Kalman gain matrix type $n \times p$.
 
- Public Types inherited from mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >
+typedef Eigen::Matrix< double, n, 1 > x_t
 State vector type $n \times 1$.
 
+typedef Eigen::Matrix< double, m, 1 > u_t
 Input vector type $m \times 1$.
 
+typedef Eigen::Matrix< double, p, 1 > z_t
 Measurement vector type $p \times 1$.
 
+typedef Eigen::Matrix< double, n, nP_t
 State uncertainty covariance matrix type $n \times n$.
 
+typedef Eigen::Matrix< double, p, pR_t
 Measurement noise covariance matrix type $p \times p$.
 
+typedef Eigen::Matrix< double, n, nQ_t
 Process noise covariance matrix type $n \times n$.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

LKF_MRS_odom (const std::vector< H_t > &Hs, const double default_dt=1)
 
+virtual statecov_t predict (const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const override
 
+virtual statecov_t correct (const statecov_t &sc, const z_t &z, const R_t &R, int param=0) const
 
+x_t state_predict_optimized (const x_t &x_prev, const u_t &u, double dt) const
 
+P_t covariance_predict_optimized (const P_t &P, const Q_t &Q, double dt) const
 
- Public Member Functions inherited from mrs_lib::LKF< 3, 1, 1 >
 LKF ()
 Convenience default constructor. More...
 
 LKF (const A_t &A, const B_t &B, const H_t &H)
 The main constructor. More...
 
virtual statecov_t correct (const statecov_t &sc, const z_t &z, const R_t &R) const override
 Applies the correction (update, measurement, data) step of the Kalman filter. More...
 
virtual statecov_t predict (const statecov_t &sc, const u_t &u, const Q_t &Q,[[maybe_unused]] double dt) const override
 Applies the prediction (time) step of the Kalman filter. More...
 
- Public Member Functions inherited from mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >
virtual statecov_t correct (const statecov_t &sc, const z_t &z, const R_t &R) const =0
 Applies the correction (update, measurement, data) step of the Kalman filter. More...
 
virtual statecov_t predict (const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const =0
 Applies the prediction (time) step of the Kalman filter. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Static Public Attributes

+static const int n = 3
 
+static const int m = 1
 
+static const int p = 1
 
- Static Public Attributes inherited from mrs_lib::LKF< 3, 1, 1 >
+static constexpr int n
 Length of the state vector of the system.
 
+static constexpr int m
 Length of the input vector of the system.
 
+static constexpr int p
 Length of the measurement vector of the system.
 
- Static Public Attributes inherited from mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >
+static const int n = n_states
 Length of the state vector of the system.
 
+static const int m = n_inputs
 Length of the input vector of the system.
 
+static const int p = n_measurements
 Length of the measurement vector of the system.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Attributes inherited from mrs_lib::LKF< 3, 1, 1 >
+A_t A
 The system transition matrix $n \times n$.
 
+B_t B
 The input to state mapping matrix $n \times m$.
 
+H_t H
 The state to measurement mapping matrix $p \times n$.
 
- Protected Member Functions inherited from mrs_lib::LKF< 3, 1, 1 >
+virtual K_t computeKalmanGain (const statecov_t &sc,[[maybe_unused]] const z_t &z, const R_t &R, const H_t &H) const
 
+statecov_t ::type correction_impl (const statecov_t &sc, const z_t &z, const R_t &R, const H_t &H) const
 
- Static Protected Member Functions inherited from mrs_lib::LKF< 3, 1, 1 >
+static P_t covariance_predict (const A_t &A, const P_t &P, const Q_t &Q, const double dt)
 
+static std::enable_if< check==0, x_t >::type state_predict (const A_t &A, const x_t &x,[[maybe_unused]] const B_t &B,[[maybe_unused]] const u_t &u)
 
+static 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)
 
+static R_t invert_W (R_t W)
 
+
The documentation for this class was generated from the following files:
    +
  • include/mrs_lib/lkf.h
  • +
  • src/lkf/LKF_MRS_odom.cpp
  • +
+
+
+ + + + diff --git a/classmrs__lib_1_1LKF__MRS__odom.js b/classmrs__lib_1_1LKF__MRS__odom.js new file mode 100644 index 00000000..28aae3df --- /dev/null +++ b/classmrs__lib_1_1LKF__MRS__odom.js @@ -0,0 +1,23 @@ +var classmrs__lib_1_1LKF__MRS__odom = +[ + [ "A_t", "classmrs__lib_1_1LKF__MRS__odom.html#a09aecefb7fb87d7e9e9dc9e3663a25ba", null ], + [ "B_t", "classmrs__lib_1_1LKF__MRS__odom.html#a96aa8d8e7cabbf158ef5a3b2f801474c", null ], + [ "Base_class", "classmrs__lib_1_1LKF__MRS__odom.html#aeb66a3e27ef38bc25498f98e66ba8169", null ], + [ "coeff_A_t", "classmrs__lib_1_1LKF__MRS__odom.html#a97ea9790fa2fd495ceddf0af9f6c5280", null ], + [ "coeff_B_t", "classmrs__lib_1_1LKF__MRS__odom.html#a6409e849ae9fab7aeef866c9acaa7730", null ], + [ "dtexp_A_t", "classmrs__lib_1_1LKF__MRS__odom.html#a0a22b36fff8f0160a14c586da4b8387e", null ], + [ "dtexp_B_t", "classmrs__lib_1_1LKF__MRS__odom.html#a7e5f00e6dbc4f50accac220a597ade44", null ], + [ "H_t", "classmrs__lib_1_1LKF__MRS__odom.html#a6790100be5843d9702159f185a516e4f", null ], + [ "P_t", "classmrs__lib_1_1LKF__MRS__odom.html#a78259b00ba8e37ccfd4fb520ff4945b2", null ], + [ "Q_t", "classmrs__lib_1_1LKF__MRS__odom.html#a38089d1d8f42e93afadd3ca54b738e26", null ], + [ "R_t", "classmrs__lib_1_1LKF__MRS__odom.html#aab73a89d85dabeaf370b34597829c449", null ], + [ "statecov_t", "classmrs__lib_1_1LKF__MRS__odom.html#a64fb6aad88554272313f57133e54d77c", null ], + [ "u_t", "classmrs__lib_1_1LKF__MRS__odom.html#aff31793f0ceacb7755ff658a1a0a91d7", null ], + [ "x_t", "classmrs__lib_1_1LKF__MRS__odom.html#af2a13b4d363aee6830af4f913cefaa77", null ], + [ "z_t", "classmrs__lib_1_1LKF__MRS__odom.html#a6f33958aa554e958c622cbd04d3347d5", null ], + [ "LKF_MRS_odom", "classmrs__lib_1_1LKF__MRS__odom.html#a8046db3503fe0c724164714bd309cad4", null ], + [ "correct", "classmrs__lib_1_1LKF__MRS__odom.html#a668f845e05a934e46185e768b4669ca5", null ], + [ "covariance_predict_optimized", "classmrs__lib_1_1LKF__MRS__odom.html#a19a12aa3c13ce269ad52f3206c9ee329", null ], + [ "predict", "classmrs__lib_1_1LKF__MRS__odom.html#a6761cb7486eb9c99510805e17d5c2d1c", null ], + [ "state_predict_optimized", "classmrs__lib_1_1LKF__MRS__odom.html#a072921264c196f192b8dba85c78b43bc", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1LKF__MRS__odom__coll__graph.map b/classmrs__lib_1_1LKF__MRS__odom__coll__graph.map new file mode 100644 index 00000000..2d7a6b10 --- /dev/null +++ b/classmrs__lib_1_1LKF__MRS__odom__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/classmrs__lib_1_1LKF__MRS__odom__coll__graph.md5 b/classmrs__lib_1_1LKF__MRS__odom__coll__graph.md5 new file mode 100644 index 00000000..8f02d5f8 --- /dev/null +++ b/classmrs__lib_1_1LKF__MRS__odom__coll__graph.md5 @@ -0,0 +1 @@ +0e33aa7954d5ff9d60495f236e9ecb76 \ No newline at end of file diff --git a/classmrs__lib_1_1LKF__MRS__odom__coll__graph.png b/classmrs__lib_1_1LKF__MRS__odom__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..e8db05b946fd084c1eba96f8a309b05c09a97518 GIT binary patch literal 7144 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 qOb=Yn(Z3o({VDLjs^#9xE6dDVgCV + + + + diff --git a/classmrs__lib_1_1LKF__MRS__odom__inherit__graph.md5 b/classmrs__lib_1_1LKF__MRS__odom__inherit__graph.md5 new file mode 100644 index 00000000..8f02d5f8 --- /dev/null +++ b/classmrs__lib_1_1LKF__MRS__odom__inherit__graph.md5 @@ -0,0 +1 @@ +0e33aa7954d5ff9d60495f236e9ecb76 \ No newline at end of file diff --git a/classmrs__lib_1_1LKF__MRS__odom__inherit__graph.png b/classmrs__lib_1_1LKF__MRS__odom__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..e8db05b946fd084c1eba96f8a309b05c09a97518 GIT binary patch literal 7144 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 qOb=Yn(Z3o({VDLjs^#9xE6dDVgCV + + + diff --git a/classmrs__lib_1_1LKF__coll__graph.md5 b/classmrs__lib_1_1LKF__coll__graph.md5 new file mode 100644 index 00000000..d8849876 --- /dev/null +++ b/classmrs__lib_1_1LKF__coll__graph.md5 @@ -0,0 +1 @@ +7f8d1d83e87a8e1ea9fdc8523881a04a \ No newline at end of file diff --git a/classmrs__lib_1_1LKF__coll__graph.png b/classmrs__lib_1_1LKF__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..86f92f1df584625768f663bfeb2dbdea1a0d02b8 GIT binary patch literal 5902 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 + + + + + + diff --git a/classmrs__lib_1_1LKF__inherit__graph.md5 b/classmrs__lib_1_1LKF__inherit__graph.md5 new file mode 100644 index 00000000..4cda1a06 --- /dev/null +++ b/classmrs__lib_1_1LKF__inherit__graph.md5 @@ -0,0 +1 @@ +708b85a4fb102a73d75148021f8cb01b \ No newline at end of file diff --git a/classmrs__lib_1_1LKF__inherit__graph.png b/classmrs__lib_1_1LKF__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..2fa7e49e8028b6772540b98f6d176620dc2c0d6b GIT binary patch literal 17709 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 F{~wyeln4L- literal 0 HcmV?d00001 diff --git a/classmrs__lib_1_1MRSTimer-members.html b/classmrs__lib_1_1MRSTimer-members.html new file mode 100644 index 00000000..22918d9b --- /dev/null +++ b/classmrs__lib_1_1MRSTimer-members.html @@ -0,0 +1,115 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::MRSTimer Member List
+
+
+ +

This is the complete list of members for mrs_lib::MRSTimer, including all inherited members.

+ + + + + + + + + + + + +
callback_t typedef (defined in mrs_lib::MRSTimer)mrs_lib::MRSTimer
MRSTimer(const MRSTimer &)=default (defined in mrs_lib::MRSTimer)mrs_lib::MRSTimer
MRSTimer(MRSTimer &&)=default (defined in mrs_lib::MRSTimer)mrs_lib::MRSTimer
MRSTimer()=default (defined in mrs_lib::MRSTimer)mrs_lib::MRSTimerprotected
operator=(const MRSTimer &)=default (defined in mrs_lib::MRSTimer)mrs_lib::MRSTimer
operator=(MRSTimer &&)=default (defined in mrs_lib::MRSTimer)mrs_lib::MRSTimer
running()=0mrs_lib::MRSTimerpure virtual
setPeriod(const ros::Duration &duration, const bool reset=true)=0mrs_lib::MRSTimerpure virtual
start()=0mrs_lib::MRSTimerpure virtual
stop()=0mrs_lib::MRSTimerpure virtual
~MRSTimer()=default (defined in mrs_lib::MRSTimer)mrs_lib::MRSTimervirtual
+
+ + + + diff --git a/classmrs__lib_1_1MRSTimer.html b/classmrs__lib_1_1MRSTimer.html new file mode 100644 index 00000000..04b4597f --- /dev/null +++ b/classmrs__lib_1_1MRSTimer.html @@ -0,0 +1,244 @@ + + + + + + + +mrs_lib: mrs_lib::MRSTimer Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::MRSTimer Class Referenceabstract
+
+
+ +

Common wrapper representing the functionality of the ros::Timer. + More...

+ +

#include <timer.h>

+
+ + Inheritance diagram for mrs_lib::MRSTimer:
+
+
+ + + + + +

+Public Types

+using callback_t = std::function< void(const ros::TimerEvent &)>
 
+ + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+virtual void stop ()=0
 stop the timer
 
+virtual void start ()=0
 start the timer
 
virtual void setPeriod (const ros::Duration &duration, const bool reset=true)=0
 set the timer period/duration More...
 
virtual bool running ()=0
 returns true if callbacks should be called More...
 
MRSTimer (const MRSTimer &)=default
 
MRSTimer (MRSTimer &&)=default
 
+MRSTimeroperator= (const MRSTimer &)=default
 
+MRSTimeroperator= (MRSTimer &&)=default
 
+

Detailed Description

+

Common wrapper representing the functionality of the ros::Timer.

+

The implementation can then use either ros::Timer (the ROSTimer class) or threads and synchronization primitives from the C++ standard library (the ThreadTimer class). Both these variants implement the same interface.

+
Note
Functionality of the two implementations differs in some details.
+

Member Function Documentation

+ +

◆ running()

+ +
+
+ + + + + +
+ + + + + + + +
virtual bool mrs_lib::MRSTimer::running ()
+
+pure virtual
+
+ +

returns true if callbacks should be called

+
Returns
true if timer is running
+ +

Implemented in mrs_lib::ThreadTimer, and mrs_lib::ROSTimer.

+ +
+
+ +

◆ setPeriod()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
virtual void mrs_lib::MRSTimer::setPeriod (const ros::Duration & duration,
const bool reset = true 
)
+
+pure virtual
+
+ +

set the timer period/duration

+
Parameters
+ + + +
duration
reset
+
+
+ +

Implemented in mrs_lib::ThreadTimer, and mrs_lib::ROSTimer.

+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/classmrs__lib_1_1MRSTimer.js b/classmrs__lib_1_1MRSTimer.js new file mode 100644 index 00000000..5b89c350 --- /dev/null +++ b/classmrs__lib_1_1MRSTimer.js @@ -0,0 +1,14 @@ +var classmrs__lib_1_1MRSTimer = +[ + [ "callback_t", "classmrs__lib_1_1MRSTimer.html#ae519667943aa8289e9c75b8182c75322", null ], + [ "~MRSTimer", "classmrs__lib_1_1MRSTimer.html#a45659d46a9d71bb68a20b3152c42b9aa", null ], + [ "MRSTimer", "classmrs__lib_1_1MRSTimer.html#ab8c67e675c0f51ff31bad5e898d90d33", null ], + [ "MRSTimer", "classmrs__lib_1_1MRSTimer.html#ae06c621b106897104698b62c28b67b84", null ], + [ "MRSTimer", "classmrs__lib_1_1MRSTimer.html#a11e9f9e577d68ab084762d549c5d9a52", null ], + [ "operator=", "classmrs__lib_1_1MRSTimer.html#acf622f64026f1e7dbdeeec3b5512e8fb", null ], + [ "operator=", "classmrs__lib_1_1MRSTimer.html#ae455e462fc33b2021fb2ce0bc768a75e", null ], + [ "running", "classmrs__lib_1_1MRSTimer.html#a54461ff4541da2848c3263e646ff928a", null ], + [ "setPeriod", "classmrs__lib_1_1MRSTimer.html#acf818ea5cffe17b89ed00866ca7cbeff", null ], + [ "start", "classmrs__lib_1_1MRSTimer.html#afda0c038cd360ccaa71b95227e413b44", null ], + [ "stop", "classmrs__lib_1_1MRSTimer.html#aeda0660a5031f17bb57f55f4166e737e", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1MRSTimer__inherit__graph.map b/classmrs__lib_1_1MRSTimer__inherit__graph.map new file mode 100644 index 00000000..161319f3 --- /dev/null +++ b/classmrs__lib_1_1MRSTimer__inherit__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/classmrs__lib_1_1MRSTimer__inherit__graph.md5 b/classmrs__lib_1_1MRSTimer__inherit__graph.md5 new file mode 100644 index 00000000..d179a26a --- /dev/null +++ b/classmrs__lib_1_1MRSTimer__inherit__graph.md5 @@ -0,0 +1 @@ +91b834a2a406e2abf555446a03879b25 \ No newline at end of file diff --git a/classmrs__lib_1_1MRSTimer__inherit__graph.png b/classmrs__lib_1_1MRSTimer__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..7eceeafa62bd4fa7192666a2fdfa10e2663eb941 GIT binary patch literal 5845 zcmZWtbySo=_g)&7Mq-hYMnPhckd7q<1pxs8VM&!PS*3-gLmEVC2??d7L0XU!LFrEE z7MAoIzQ2Cw`yI|%=DhDaGxy$^``qWb;W`i1$e}l(5D0`^LmlxL0>RM(V;5pV@SBUD zUl6-WqhW1FqvartOOo)6zP4uMMeCZ z1v>QDvI3T$pT9v7uW<8QAg?ZlS|{tOkT`Ig&wnrA5Y@4_AJwP(r%8x?oZsd~bt-MBG=k*5Mp+#8Wkn${HFZ z@6*%Ssfej)XmIW9>`-ss^hTpQ7Uny{Z$OPgu%a#B)KE-o&*8UHFL0!oq@!yL-n-iJ|V3Cn14&L>yoZ!&1{g z9X^DzGM;UJYG7TRq%aw$S@+Bg3pY1+o!_Mta8}pQkSIqdY;y8x)J-wy(9jU$+Ctgs-sLtGC_0f-_^5@*pPbm|saTCxjRo8wU>lu^P;j<-2?L+pmw0&S%TT z-*}UWJ57fb7vIUt&u8c5C3^Mhl~MIex=BA@mnkbmxc)gfINYnNE11|zS}kqu{nd15 zOhpBCTwGjvRTX~LU}$xvuF!U7^HDhgv{RJ=uXi-SW6 zxj&F5N(Af`78O-?aS?WKaBx}eXN0s~oF3ZzP?~yFd$7OXmL_Vqx3{3Yyt0DanXY#` z@!FeL)XI`$`C>cp--vi_jsh3(P?@QEdU{Al$7pgU@z$v+CS6@!N#C<0(&`F{ZUq7Q zB@l6Sb@kTywjiXfZAe%cvA%)9LW;RxoYR+W5st}N!Ncl+q@<)HXHHH|7!y-RXD4Fy zI$UXwRpo*cm>YXALY(O@%=ez$K4ikq!X~ zzzL8AM8o$vayO=JrqK%r5*QfBQln>PMy{r&23b4qPk+v!Ss+#Hxm7xncw0}{rkA!{ zAabcY)~Y9-`}@EEx}svAbhkw8byY^Dl;_K`T2ZeZ)6ULL5NwR{MMgzsrIL~o?&@Gx ztaI}zp`4r?OR|WlXordOSM-Mu%!!GKNB7f?yRsF7T7}7)ug>iEP%`y>fAgXd-ar4M zS?gRDaN%&cj)4Jsb=6j#i$=!xjFu)G!9FzzE@A$Il%GF;25fCPgnhHTSbyY?yLS-96F>(CMF`7w&g7;A-0^nNgi6asjn4NuVYpRxVU|^uIsHiQ1j^AZ}QANfFOBKr| z-xbHHrekIn4e+bQNZI@Q=qSD3$A>CzZg2z#_51hlUH)zue0o|91-DjDgADO^tzVzA zuAyPEE1F4NOADc`O^)@EyM`KYAX#*ZHyPS=D|7Y?og~B#$=p0ICyvq?L6Smy}R5Gf%I}JbLs< zz@$d&8#OiND_`11g<=q4kIXX-;&thUeqK;mvaL0V*`W$OiBw9o0r9ulgZUsc0gpv0 zjG{0Y4$sgWkH3Fu^bN#1CMI;&W3`_=5fADkAfyxzD3#AS{q;z`NE)Amh;F;&Cosol zz7+?|xW^nLqNSzU_S=IjDvB_tbcgRIQ(2Kki*0$uDXCEn0J{9=4i}6A11Cw%=AIb; znwx6sJ&8^4>;|9i&3MUkN}sDS%RhsLBXGlm(T(TC%d4uz0x@5`Te>T4l!VFfl5IrZ z99i^d?Z(u*&saD*=2S|C&0?%I&sGmsG>Op+E_?H@Wl%qf1yh1nSO1uQXkT#y>pl>1 zTUJQ=#u-<>cl_|%Bl#IccXv|Q>Z!9-g#f9S7cV}6c5rPiX@7r|KK+d${zNT}!I^r! zQ0368Xy5bZ?(L})UzJ71_jS8&yGA z6-|hTuXwH9BS{&Vu0o!=hrh?<+Y)cv>zYiB=ceDY>LOE7Yzq~JW7_Etl-5jg)yL${ zp3~d@plxjp2r8v13dA8|WwrYKUL7Z(TePj4?Hq4SD$cE*OyI6|T--h@_hSqd*e^wr znJ~+r73zJC)55F&y3e)TDWe6-nJ_r#FEc%p(GbO8QEoq`G(JVCV{D43)rE7rE*L$rp3V_jrMux_TZ62C$Xco3kp$ ziV9<+mMdaQE7`cjqvU?hbQ+S#NAkW*At9!J32v)7Y^9f1uV@SwkdxPAJJ`0$-R)qd zW+fphhS1*Loud1i7=A#t>UU;J)D&9jfgSBJEW7OR1M*<>*NE(F4PoJV5HLJ>c?qqI z;krL!0Kx5SGyFUC7Z&_f4Z~%{Y6pUA2H?cGQD_(VgPZ{*U+Hz z@fqHma*oy2p^B84W9H9D`M?}jVRZ_4Qv1e;`v}bDB-0Q^Y+-F3(BJAR> ze3#Bd;OxvGU|M&>q&8E>Jr6OZn{j)6esAI5Ex{drt@q1eM@Kq)C>DR3rviRqi;L-d ze?1M9gTHdpj9{v&G*{(=Yv7`T$ZrvNd;6{`n!VD(A~{)BJYQ8+&X@g-lEIVO@upLg zi_^h`3Z$}y#EMEoZsFRUS$}`Ft*vM6rDjMNyi;?AoqAiTCsF2PP4@;SR}_#b1D}H) z8IUgeUg~!Yb#;RXNMC`Tpv2e8@g5 zdZ4}7AoS<(@F_zh)iAx;>So0#lhEv}pt?4B0h7=+v)lz+XP0f;%#6lPw4{=snpMHs z+WIeBE*_}sd@F%~i8xbSoO7WxSG2+7$LN#UDI88tyscT5f?=U1o~P(8t-soKXe^?+ z!YcG}p!_`;P|&#>&BJzlq;sYRu~{wVp_0Kca9d=XprsxQreps2G{(RZk^L~8>9rkA1Y+V0K)gJvm zT`&gQUV;fvqoDg@Ows0>bYOxim>?SwQOdz#DYUgsq!ZZUlxtn=2-ZIb<7e4SI+MZB z{puTFeIm_*r*FZS35?|$`p0lRIF)O`M-MR~dfKXJY(pgU!jmF8?PYNd8Y}H3n1?8~ zDr_}B(SeUBY?JQG0*sO7!r%kzOxED$9l$z2jH~Ns5b*b4SrR&|y_jaf`vB;^2LGMC zv8Nt*nlpt|z(suq6b9iz6xNWML)gZ9{`9v+PYZ@ZOM+Vk*l4>YN8bX>UO}MOn}Cq8X7@4l1`JkseEg!lZ+bdu z#qIUWSmiA9jPD`=%o7t62e#D1MZbUR=kIm^wqH?Ep*cs%o^ju6hk1B-SSo{8BCYxI zcuJErY>g*Jr|`&k@6=}_9r1aYTkodmwL<&9g;aqzzNoQL8c>$yA6}lGDz>%-P)?5J z`<^G-+H2<{BO?|tLNPJ1m(j`-9vo>kV`fC7whhzbz6#xC-jipH>(=nQf`Y0jR9$+@niAx^8*z{ z1$?%!vVsP@dZ{OYci7kC7%nWVqd67!^7aPyZ&k~48nfLcsWh!5b{-x=fj&$@0bwNl zU8U#G`7|{(^A1~1SDBjjyO>gCUc>*~(uZ+JaynZH`e!G6;nrIO2@$R(g|AKtUj1ya+FAK7;!IJD*#apNF`+ zyI;>`5PG(yCzD~ulbD=rIa&2$ejjx$wh_>rKPdM;WR*R^d|8` zAjvk=jEv!XdoDl@69QQQ6SjaTDJxgl^wEDZYoxDrnrZ*)ed2Pss_k<$q&9ze3Is)P zXebdB3O$>yY4$meWtCOZ(jwd1-bUKk5U{baO*eQxuub2NjjkE~*nE4i+I~zJlw81E zn=TIeBwuYAr8sVv`eU)!03^&sl37wx(qg8;(_+fUd>Bydg{37t)>xuIg@7O;%HuoF z9JiOC(xS2+YgFLA0S-#;<>iG!q2?#6?dyC_;ew`h0i0?v9#|c(o#}8OG_p%eDV&^~ z!eV39Y;Ae`&bK8TCaXw{jg2FqlJ7|zn-I~vgv%AF7XOJ z53ZhsL`IUP$H#MI$h|(`>JuhAUmN0F_hx5j->S6fvmQ0Bb;|H)XlnW(CLv)bWZpbo z;`>FQ@8SD<;WN#?jngj}7#Loi9<0DOqgZ9%&(t`Y#MbPtuirj2Escw#PS45`$}rd0 z@5Hs>=jWF;oBQ!2#;nCpwy#ovpC)|#`*-zMonh3Ua&p+EUmsW>g9^toNyK*_Az&0UQj>04N24`&VRZXbJob*_mYGdDFg9Un-S zc<^y|u4NF{LWLvF!*8nQIM2W8q_*WUnj8wXG)}g0o~~=dwb-3$a&&OW^G{DrZSC(TTU}j+?}~|w_kOanv*W#-YHPy*=YB0QgGp|b zyDTV~Hh5_0F0>5|RdiITb8YOOeYPrSxjN(b@%4>MObkv=ric8q_ckyv2>tu?>C@}W zW@2IjY5ke=-*iY!O3DFn0OFh~;mjHl5pgzNIqQ4ea&ZuOFJ?5*Uoa)|?Cg!czP|d{ z3vY+2jM9^VovLG5h_ION)ylBr)Ktx9*>yIh94c@<%gf6l9l~MZ;c;CctQMf@@Z}LN z??(owAn_yD>e&EGn5yk0kV*f}##;84V&yHnq8L$sM+}F4{>*;oTkY5Sxwo&c?a!h2 zR~9BFCTnZ!>!!+hg%uIR;%IHCyta1Nt4O}3Mrnd=t76|i7&XQuI;I+wb( zcG9fO;^8Uk0xRNo`PVS*xG=uqtgdT%KuAEK^I9@4b&<<>ACuj^dl$4`5*e3J)F9_1 zJvV4s<$S^h<<7}Ks|z48=ljsAj03`4rQz$@Y1BXRM4ZDk=(OvcRDu^5MgWsZySI zFc=Jwj=ImD#jNzD@ZX(nu2M9<$CK84JZWEES@||4h2iXEHx|^w<>lqp_I4%qDf1?j z$dgjjaCYU8>+TgFAK$xrkG0RB9^AWk&tk0943e2uPfJg~xHa(wz&Z?WP5f9-FD^Mb z1T-8WgF@0A92|Q+yjh@cK>~~)Z}ydbwLOUj4VF838L|~#yU!%0r91liNCEhS#l&>I zB_OqMaQIXSs|v6AJHRkv@DC>EBPn-zq=yf1s(XoDP>=$2f#90}hL(U>zwQFY#!>=2 z7b_<39bS;gc5`#1qNNRf<$PoK^XtP^9GzLi{oCH>!5$wYFVtIbREXIlviEzcFc_ts zB|B1j0Ua+CB35^f%kjl5Ueh)io7{&G<}g)Ev&Q5wR#Xo(WeNYMSqe)2J8!(=>VnvJ znRf&QLmC?!hffrJ6AB*~&ZYfiPorQGCj(6sO>#gO0F-NG${4?xGF+`8StpUp5|WUA qg~E-XQc^D)x}kF|+W-IRSbtRAIGTXQ+yL~cAsQ+V5v58NZ~p^r-z|~= literal 0 HcmV?d00001 diff --git a/classmrs__lib_1_1MedianFilter-members.html b/classmrs__lib_1_1MedianFilter-members.html new file mode 100644 index 00000000..8c35f11f --- /dev/null +++ b/classmrs__lib_1_1MedianFilter-members.html @@ -0,0 +1,121 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::MedianFilter Member List
+
+
+ +

This is the complete list of members for mrs_lib::MedianFilter, including all inherited members.

+ + + + + + + + + + + + + + + + + + +
add(const double value)mrs_lib::MedianFilter
addCheck(const double value)mrs_lib::MedianFilter
check(const double value)mrs_lib::MedianFilter
clear()mrs_lib::MedianFilter
full() constmrs_lib::MedianFilter
initialized() constmrs_lib::MedianFilter
median() constmrs_lib::MedianFilter
MedianFilter(const size_t buffer_length, const double min_value=-std::numeric_limits< double >::infinity(), const double max_value=std::numeric_limits< double >::infinity(), const double max_diff=std::numeric_limits< double >::infinity())mrs_lib::MedianFilter
MedianFilter()mrs_lib::MedianFilter
MedianFilter(const MedianFilter &other)mrs_lib::MedianFilter
MedianFilter(MedianFilter &&other)mrs_lib::MedianFilter
operator=(const MedianFilter &other)mrs_lib::MedianFilter
operator=(MedianFilter &&other)mrs_lib::MedianFilter
setBufferLength(const size_t buffer_length)mrs_lib::MedianFilter
setMaxDifference(const double max_diff)mrs_lib::MedianFilter
setMaxValue(const double max_value)mrs_lib::MedianFilter
setMinValue(const double min_value)mrs_lib::MedianFilter
+
+ + + + diff --git a/classmrs__lib_1_1MedianFilter.html b/classmrs__lib_1_1MedianFilter.html new file mode 100644 index 00000000..3ba795ee --- /dev/null +++ b/classmrs__lib_1_1MedianFilter.html @@ -0,0 +1,628 @@ + + + + + + + +mrs_lib: mrs_lib::MedianFilter Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::MedianFilter Class Reference
+
+
+ +

Implementation of a median filter with a fixed-length buffer. + More...

+ +

#include <median_filter.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 MedianFilter (const size_t buffer_length, const double min_value=-std::numeric_limits< double >::infinity(), const double max_value=std::numeric_limits< double >::infinity(), const double max_diff=std::numeric_limits< double >::infinity())
 The main constructor. More...
 
 MedianFilter ()
 A convenience empty constructor that will construct an invalid filter. More...
 
 MedianFilter (const MedianFilter &other)
 A convenience copy constructor. More...
 
 MedianFilter (MedianFilter &&other)
 A convenience move constructor. More...
 
MedianFilteroperator= (const MedianFilter &other)
 A convenience copy assignment operator. More...
 
MedianFilteroperator= (MedianFilter &&other)
 A convenience move assignment operator. More...
 
void add (const double value)
 Add a new value to the buffer. More...
 
bool check (const double value)
 Check whether a value complies with the constraints. More...
 
bool addCheck (const double value)
 Add a new value to the buffer and check if it complies with the constraints. More...
 
void clear ()
 Clear the buffer of all values. More...
 
bool full () const
 Check whether the buffer is filled with values. More...
 
double median () const
 Obtain the median. More...
 
bool initialized () const
 Check whether the filter was initialized with a valid buffer length. More...
 
void setBufferLength (const size_t buffer_length)
 Set a new size of the buffer. More...
 
void setMinValue (const double min_value)
 Set a new minimal threshold for new values. More...
 
void setMaxValue (const double max_value)
 Set a new maximal threshold for new values. More...
 
void setMaxDifference (const double max_diff)
 Set a new maximal difference from median for new values. More...
 
+

Detailed Description

+

Implementation of a median filter with a fixed-length buffer.

+

Constructor & Destructor Documentation

+ +

◆ MedianFilter() [1/4]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::MedianFilter::MedianFilter (const size_t buffer_length,
const double min_value = -std::numeric_limits<double>::infinity(),
const double max_value = std::numeric_limits<double>::infinity(),
const double max_diff = std::numeric_limits<double>::infinity() 
)
+
+ +

The main constructor.

+
Parameters
+ + + + + +
buffer_lengththe number of last values to be kept in the buffer.
min_valuevalues below this threshold will be discarded (won't be added to the buffer).
max_valuevalues above this threshold will be discarded.
max_diffvalues that differ from the current mean by more than this threshold will be discarded.
+
+
+ +
+
+ +

◆ MedianFilter() [2/4]

+ +
+
+ + + + + + + +
mrs_lib::MedianFilter::MedianFilter ()
+
+ +

A convenience empty constructor that will construct an invalid filter.

+
Warning
This constructor will construct an unusable filter with a zero-length buffer. To actually initialize this object, use the main constructor. You can use the initialized() method to check whether the object is valid.
+ +
+
+ +

◆ MedianFilter() [3/4]

+ +
+
+ + + + + + + + +
mrs_lib::MedianFilter::MedianFilter (const MedianFilterother)
+
+ +

A convenience copy constructor.

+

This constructor copies all data from the object that is being assigned from in a thread-safe manner.

+
Parameters
+ + +
otherthe object to assign from.
+
+
+ +
+
+ +

◆ MedianFilter() [4/4]

+ +
+
+ + + + + + + + +
mrs_lib::MedianFilter::MedianFilter (MedianFilter && other)
+
+ +

A convenience move constructor.

+

This constructor moves all data from the object that is being assigned from in a thread-safe manner, invalidating it.

+
Parameters
+ + +
otherthe object to assign from. It will be invalid after this method returns.
+
+
+ +
+
+

Member Function Documentation

+ +

◆ add()

+ +
+
+ + + + + + + + +
void mrs_lib::MedianFilter::add (const double value)
+
+ +

Add a new value to the buffer.

+
Note
The median value will not be updated until the median() method is called (lazy evaluation).
+
Parameters
+ + +
valuethe new value to be added to the buffer.
+
+
+ +
+
+ +

◆ addCheck()

+ +
+
+ + + + + + + + +
bool mrs_lib::MedianFilter::addCheck (const double value)
+
+ +

Add a new value to the buffer and check if it complies with the constraints.

+

The value is compliant if it's above the min_value, below the max_value and its (absolute) difference from the current mean is below max_diff.

+
Note
The median value will not be updated until the median() method is called (lazy evaluation).
+
Parameters
+ + +
valuethe new value to be added to the buffer and checked.
+
+
+
Returns
true if the value is compliant, false otherwise.
+ +
+
+ +

◆ check()

+ +
+
+ + + + + + + + +
bool mrs_lib::MedianFilter::check (const double value)
+
+ +

Check whether a value complies with the constraints.

+

The value is compliant if it's above the min_value, below the max_value and its (absolute) difference from the current mean is below max_diff.

+
Parameters
+ + +
valuethe value to be checked.
+
+
+
Returns
true if the value is compliant, false otherwise.
+ +
+
+ +

◆ clear()

+ +
+
+ + + + + + + +
void mrs_lib::MedianFilter::clear ()
+
+ +

Clear the buffer of all values.

+

Doesn't change the buffer's length set in the constructor or any other parameters, only clears all stored values.

+ +
+
+ +

◆ full()

+ +
+
+ + + + + + + +
bool mrs_lib::MedianFilter::full () const
+
+ +

Check whether the buffer is filled with values.

+

If true, adding a new value will remove the oldest value in the buffer.

+
Returns
true if the buffer contains buffer_length values.
+ +
+
+ +

◆ initialized()

+ +
+
+ + + + + + + +
bool mrs_lib::MedianFilter::initialized () const
+
+ +

Check whether the filter was initialized with a valid buffer length.

+
Returns
true if the buffer length is larger than zero.
+ +
+
+ +

◆ median()

+ +
+
+ + + + + + + +
double mrs_lib::MedianFilter::median () const
+
+ +

Obtain the median.

+

If an up-to-date median value is available, it's not recalculated. Otherwise, the new median value is calculated and then returned (lazy evaluation).

+
Returns
the current median value (returns nan if the input buffer is empty).
+ +
+
+ +

◆ operator=() [1/2]

+ +
+
+ + + + + + + + +
MedianFilter & mrs_lib::MedianFilter::operator= (const MedianFilterother)
+
+ +

A convenience copy assignment operator.

+

This operator copies all data from the object that is being assigned from in a thread-safe manner.

+
Parameters
+ + +
otherthe object to assign from.
+
+
+
Returns
a reference to the object being assigned to.
+ +
+
+ +

◆ operator=() [2/2]

+ +
+
+ + + + + + + + +
MedianFilter & mrs_lib::MedianFilter::operator= (MedianFilter && other)
+
+ +

A convenience move assignment operator.

+

This operator moves all data from the object that is being assigned from in a thread-safe manner, invalidating it.

+
Parameters
+ + +
otherthe object to assign from. It will be invalid after this method returns.
+
+
+
Returns
a reference to the object being assigned to.
+ +
+
+ +

◆ setBufferLength()

+ +
+
+ + + + + + + + +
void mrs_lib::MedianFilter::setBufferLength (const size_t buffer_length)
+
+ +

Set a new size of the buffer.

+
Note
The median value may change.
+
Parameters
+ + +
buffer_lengththe new size of the buffer.
+
+
+ +
+
+ +

◆ setMaxDifference()

+ +
+
+ + + + + + + + +
void mrs_lib::MedianFilter::setMaxDifference (const double max_diff)
+
+ +

Set a new maximal difference from median for new values.

+
Note
The current buffer is not changed - the change only applies to new values.
+
Parameters
+ + +
max_diffthe new maximal difference of new buffer elements from the current median.
+
+
+ +
+
+ +

◆ setMaxValue()

+ +
+
+ + + + + + + + +
void mrs_lib::MedianFilter::setMaxValue (const double max_value)
+
+ +

Set a new maximal threshold for new values.

+
Note
The current buffer is not changed - the change only applies to new values.
+
Parameters
+ + +
max_valuethe new maximal value of new buffer elements.
+
+
+ +
+
+ +

◆ setMinValue()

+ +
+
+ + + + + + + + +
void mrs_lib::MedianFilter::setMinValue (const double min_value)
+
+ +

Set a new minimal threshold for new values.

+
Note
The current buffer is not changed - the change only applies to new values.
+
Parameters
+ + +
min_valuethe new minimal value of new buffer elements.
+
+
+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/classmrs__lib_1_1MedianFilter.js b/classmrs__lib_1_1MedianFilter.js new file mode 100644 index 00000000..4bf0f88b --- /dev/null +++ b/classmrs__lib_1_1MedianFilter.js @@ -0,0 +1,20 @@ +var classmrs__lib_1_1MedianFilter = +[ + [ "MedianFilter", "classmrs__lib_1_1MedianFilter.html#a6c6bd20d15d66535b900634396e99f51", null ], + [ "MedianFilter", "classmrs__lib_1_1MedianFilter.html#ae810bd254e4fccfeb883b4585062f166", null ], + [ "MedianFilter", "classmrs__lib_1_1MedianFilter.html#aa17291d605ef5364db2835745a2c669c", null ], + [ "MedianFilter", "classmrs__lib_1_1MedianFilter.html#a46da8f440b739a1d01710104fc38611c", null ], + [ "add", "classmrs__lib_1_1MedianFilter.html#aaf3d8e3bab539001962f2b29dabd314d", null ], + [ "addCheck", "classmrs__lib_1_1MedianFilter.html#a234342f8780bce6019f5183f798fe348", null ], + [ "check", "classmrs__lib_1_1MedianFilter.html#a518d744f114ad6d0b2591d3804f6f095", null ], + [ "clear", "classmrs__lib_1_1MedianFilter.html#a533c6e194f991a9c11b9e2aadf7087a5", null ], + [ "full", "classmrs__lib_1_1MedianFilter.html#acdd73f7ffc9868eb6a05e7b6aea35d85", null ], + [ "initialized", "classmrs__lib_1_1MedianFilter.html#a843ddc70b6daf92fa91f225fab5b36f7", null ], + [ "median", "classmrs__lib_1_1MedianFilter.html#a53562ea9addbf12ba3cd257cdede4af6", null ], + [ "operator=", "classmrs__lib_1_1MedianFilter.html#ab30170b4f0d029c66e0a616936c7b693", null ], + [ "operator=", "classmrs__lib_1_1MedianFilter.html#acc63d667e153c07ea9481eb0b3d74c54", null ], + [ "setBufferLength", "classmrs__lib_1_1MedianFilter.html#af2888fa7449ce3ebc82f3255a519fe6a", null ], + [ "setMaxDifference", "classmrs__lib_1_1MedianFilter.html#a82d854470b0920fac623472721b01601", null ], + [ "setMaxValue", "classmrs__lib_1_1MedianFilter.html#a8162e19bd901f6dcd542d4c8615732f9", null ], + [ "setMinValue", "classmrs__lib_1_1MedianFilter.html#a569e93d2d4be9632db2943fedb8133ba", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1NCLKF-members.html b/classmrs__lib_1_1NCLKF-members.html new file mode 100644 index 00000000..c243d73b --- /dev/null +++ b/classmrs__lib_1_1NCLKF-members.html @@ -0,0 +1,138 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::NCLKF< n_states, n_inputs, n_measurements > Member List
+
+
+ +

This is the complete list of members for mrs_lib::NCLKF< n_states, n_inputs, n_measurements >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Amrs_lib::LKF< n_states, n_inputs, n_measurements >
A_t typedefmrs_lib::NCLKF< n_states, n_inputs, n_measurements >
Bmrs_lib::LKF< n_states, n_inputs, n_measurements >
B_t typedefmrs_lib::NCLKF< n_states, n_inputs, n_measurements >
Base_class typedefmrs_lib::NCLKF< n_states, n_inputs, n_measurements >
computeKalmanGain(const statecov_t &sc, const z_t &z, const R_t &R, const H_t &H) const override (defined in mrs_lib::NCLKF< n_states, n_inputs, n_measurements >)mrs_lib::NCLKF< n_states, n_inputs, n_measurements >inlineprotectedvirtual
computeKalmanGain(const statecov_t &sc, [[maybe_unused]] const z_t &z, const R_t &R, const H_t &H) const (defined in mrs_lib::LKF< n_states, n_inputs, n_measurements >)mrs_lib::LKF< n_states, n_inputs, n_measurements >inlineprotectedvirtual
correct(const statecov_t &sc, const z_t &z, const R_t &R) const overridemrs_lib::LKF< n_states, n_inputs, n_measurements >inlinevirtual
mrs_lib::KalmanFilter::correct(const statecov_t &sc, const z_t &z, const R_t &R) const =0mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >pure virtual
correction_impl(const statecov_t &sc, const z_t &z, const R_t &R, const H_t &H) const (defined in mrs_lib::LKF< n_states, n_inputs, n_measurements >)mrs_lib::LKF< n_states, n_inputs, n_measurements >inlineprotected
covariance_predict(const A_t &A, const P_t &P, const Q_t &Q, const double dt) (defined in mrs_lib::LKF< n_states, n_inputs, n_measurements >)mrs_lib::LKF< n_states, n_inputs, n_measurements >inlineprotectedstatic
Hmrs_lib::LKF< n_states, n_inputs, n_measurements >
H_t typedefmrs_lib::NCLKF< n_states, n_inputs, n_measurements >
invert_W(R_t W) (defined in mrs_lib::LKF< n_states, n_inputs, n_measurements >)mrs_lib::LKF< n_states, n_inputs, n_measurements >inlineprotectedstatic
K_t typedefmrs_lib::NCLKF< n_states, n_inputs, n_measurements >
l (defined in mrs_lib::NCLKF< n_states, n_inputs, n_measurements >)mrs_lib::NCLKF< n_states, n_inputs, n_measurements >protected
LKF()mrs_lib::LKF< n_states, n_inputs, n_measurements >inline
LKF(const A_t &A, const B_t &B, const H_t &H)mrs_lib::LKF< n_states, n_inputs, n_measurements >inline
mmrs_lib::NCLKF< n_states, n_inputs, n_measurements >static
nmrs_lib::NCLKF< n_states, n_inputs, n_measurements >static
NCLKF()mrs_lib::NCLKF< n_states, n_inputs, n_measurements >inline
NCLKF(const A_t &A, const B_t &B, const H_t &H, const double l)mrs_lib::NCLKF< n_states, n_inputs, n_measurements >inline
pmrs_lib::NCLKF< n_states, n_inputs, n_measurements >static
P_t typedefmrs_lib::NCLKF< n_states, n_inputs, n_measurements >
predict(const statecov_t &sc, const u_t &u, const Q_t &Q, [[maybe_unused]] double dt) const overridemrs_lib::LKF< n_states, n_inputs, n_measurements >inlinevirtual
mrs_lib::KalmanFilter::predict(const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const =0mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >pure virtual
Q_t typedefmrs_lib::NCLKF< n_states, n_inputs, n_measurements >
R_t typedefmrs_lib::NCLKF< n_states, n_inputs, n_measurements >
state_predict(const A_t &A, const x_t &x, [[maybe_unused]] const B_t &B, [[maybe_unused]] const u_t &u) (defined in mrs_lib::LKF< n_states, n_inputs, n_measurements >)mrs_lib::LKF< n_states, n_inputs, n_measurements >inlineprotectedstatic
state_predict(const A_t &A, const x_t &x, const B_t &B, const u_t &u) (defined in mrs_lib::LKF< n_states, n_inputs, n_measurements >)mrs_lib::LKF< n_states, n_inputs, n_measurements >inlineprotectedstatic
statecov_t typedefmrs_lib::NCLKF< n_states, n_inputs, n_measurements >
u_t typedefmrs_lib::NCLKF< n_states, n_inputs, n_measurements >
x_t typedefmrs_lib::NCLKF< n_states, n_inputs, n_measurements >
z_t typedefmrs_lib::NCLKF< n_states, n_inputs, n_measurements >
+
+ + + + diff --git a/classmrs__lib_1_1NCLKF.html b/classmrs__lib_1_1NCLKF.html new file mode 100644 index 00000000..428fa65f --- /dev/null +++ b/classmrs__lib_1_1NCLKF.html @@ -0,0 +1,487 @@ + + + + + + + +mrs_lib: mrs_lib::NCLKF< n_states, n_inputs, n_measurements > Class Template Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::NCLKF< n_states, n_inputs, n_measurements > Class Template Reference
+
+
+ +

This class implements the norm-constrained linear Kalman filter [5]. + More...

+ +

#include <nckf.h>

+
+ + Inheritance diagram for mrs_lib::NCLKF< n_states, n_inputs, n_measurements >:
+
+
+ +
+ + Collaboration diagram for mrs_lib::NCLKF< n_states, n_inputs, n_measurements >:
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Types

+using Base_class = LKF< n, m, p >
 Base class of this class.
 
+using x_t = typename Base_class::x_t
 State vector type $n \times 1$.
 
+using u_t = typename Base_class::u_t
 Input vector type $m \times 1$.
 
+using z_t = typename Base_class::z_t
 Measurement vector type $p \times 1$.
 
+using P_t = typename Base_class::P_t
 State uncertainty covariance matrix type $n \times n$.
 
+using R_t = typename Base_class::R_t
 Measurement noise covariance matrix type $p \times p$.
 
+using Q_t = typename Base_class::Q_t
 Process noise covariance matrix type $n \times n$.
 
+using statecov_t = typename Base_class::statecov_t
 Helper struct for passing around the state and its covariance in one variable.
 
+using A_t = typename Base_class::A_t
 System transition matrix type $n \times n$.
 
+using B_t = typename Base_class::B_t
 Input to state mapping matrix type $n \times m$.
 
+using H_t = typename Base_class::H_t
 State to measurement mapping matrix type $p \times n$.
 
+using K_t = typename Base_class::K_t
 Kalman gain matrix type $n \times p$.
 
- Public Types inherited from mrs_lib::LKF< n_states, n_inputs, n_measurements >
+using Base_class = KalmanFilter< n, m, p >
 Base class of this class.
 
+using x_t = typename Base_class::x_t
 State vector type $n \times 1$.
 
+using u_t = typename Base_class::u_t
 Input vector type $m \times 1$.
 
+using z_t = typename Base_class::z_t
 Measurement vector type $p \times 1$.
 
+using P_t = typename Base_class::P_t
 State uncertainty covariance matrix type $n \times n$.
 
+using R_t = typename Base_class::R_t
 Measurement noise covariance matrix type $p \times p$.
 
+using Q_t = typename Base_class::Q_t
 Process noise covariance matrix type $n \times n$.
 
+using statecov_t = typename Base_class::statecov_t
 Helper struct for passing around the state and its covariance in one variable.
 
+typedef Eigen::Matrix< double, n, nA_t
 System transition matrix type $n \times n$.
 
+typedef Eigen::Matrix< double, n, mB_t
 Input to state mapping matrix type $n \times m$.
 
+typedef Eigen::Matrix< double, p, nH_t
 State to measurement mapping matrix type $p \times n$.
 
+typedef Eigen::Matrix< double, n, pK_t
 Kalman gain matrix type $n \times p$.
 
- Public Types inherited from mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >
+typedef Eigen::Matrix< double, n, 1 > x_t
 State vector type $n \times 1$.
 
+typedef Eigen::Matrix< double, m, 1 > u_t
 Input vector type $m \times 1$.
 
+typedef Eigen::Matrix< double, p, 1 > z_t
 Measurement vector type $p \times 1$.
 
+typedef Eigen::Matrix< double, n, nP_t
 State uncertainty covariance matrix type $n \times n$.
 
+typedef Eigen::Matrix< double, p, pR_t
 Measurement noise covariance matrix type $p \times p$.
 
+typedef Eigen::Matrix< double, n, nQ_t
 Process noise covariance matrix type $n \times n$.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 NCLKF ()
 Convenience default constructor. More...
 
 NCLKF (const A_t &A, const B_t &B, const H_t &H, const double l)
 The main constructor. More...
 
- Public Member Functions inherited from mrs_lib::LKF< n_states, n_inputs, n_measurements >
 LKF ()
 Convenience default constructor. More...
 
 LKF (const A_t &A, const B_t &B, const H_t &H)
 The main constructor. More...
 
virtual statecov_t correct (const statecov_t &sc, const z_t &z, const R_t &R) const override
 Applies the correction (update, measurement, data) step of the Kalman filter. More...
 
virtual statecov_t predict (const statecov_t &sc, const u_t &u, const Q_t &Q, [[maybe_unused]] double dt) const override
 Applies the prediction (time) step of the Kalman filter. More...
 
- Public Member Functions inherited from mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >
virtual statecov_t correct (const statecov_t &sc, const z_t &z, const R_t &R) const =0
 Applies the correction (update, measurement, data) step of the Kalman filter. More...
 
virtual statecov_t predict (const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const =0
 Applies the prediction (time) step of the Kalman filter. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Static Public Attributes

+static const int n = n_states
 Length of the state vector of the system.
 
+static const int m = n_inputs
 Length of the input vector of the system.
 
+static const int p = n_measurements
 Length of the measurement vector of the system.
 
- Static Public Attributes inherited from mrs_lib::LKF< n_states, n_inputs, n_measurements >
+static constexpr int n = n_states
 Length of the state vector of the system.
 
+static constexpr int m = n_inputs
 Length of the input vector of the system.
 
+static constexpr int p = n_measurements
 Length of the measurement vector of the system.
 
- Static Public Attributes inherited from mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >
+static const int n = n_states
 Length of the state vector of the system.
 
+static const int m = n_inputs
 Length of the input vector of the system.
 
+static const int p = n_measurements
 Length of the measurement vector of the system.
 
+ + + + + + + + +

+Protected Member Functions

+virtual K_t computeKalmanGain (const statecov_t &sc, const z_t &z, const R_t &R, const H_t &H) const override
 
- Protected Member Functions inherited from mrs_lib::LKF< n_states, n_inputs, n_measurements >
+virtual K_t computeKalmanGain (const statecov_t &sc, [[maybe_unused]] const z_t &z, const R_t &R, const H_t &H) const
 
+statecov_t ::type correction_impl (const statecov_t &sc, const z_t &z, const R_t &R, const H_t &H) const
 
+ + + +

+Protected Attributes

+double l
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Attributes inherited from mrs_lib::LKF< n_states, n_inputs, n_measurements >
+A_t A
 The system transition matrix $n \times n$.
 
+B_t B
 The input to state mapping matrix $n \times m$.
 
+H_t H
 The state to measurement mapping matrix $p \times n$.
 
- Static Protected Member Functions inherited from mrs_lib::LKF< n_states, n_inputs, n_measurements >
+static P_t covariance_predict (const A_t &A, const P_t &P, const Q_t &Q, const double dt)
 
+template<int check = n_inputs>
static std::enable_if< check==0, x_t >::type state_predict (const A_t &A, const x_t &x, [[maybe_unused]] const B_t &B, [[maybe_unused]] const u_t &u)
 
+template<int check = n_inputs>
static 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)
 
+static R_t invert_W (R_t W)
 
+

Detailed Description

+

template<int n_states, int n_inputs, int n_measurements>
+class mrs_lib::NCLKF< n_states, n_inputs, n_measurements >

+ +

This class implements the norm-constrained linear Kalman filter [5].

+

Note that the class is templated. The template parameters specify the number of states, number of inputs and number of measurements of the system. The last template parameter specifies the number of states which are norm-constrained.

+

The norm constraint is specified in the constructor and applied to the whole state vector of the system.

+

Constructor & Destructor Documentation

+ +

◆ NCLKF() [1/2]

+ +
+
+
+template<int n_states, int n_inputs, int n_measurements>
+ + + + + +
+ + + + + + + +
mrs_lib::NCLKF< n_states, n_inputs, n_measurements >::NCLKF ()
+
+inline
+
+ +

Convenience default constructor.

+

This constructor should not be used if applicable. If used, the main constructor has to be called afterwards, before using this class, otherwise the object is invalid (not initialized).

+ +
+
+ +

◆ NCLKF() [2/2]

+ +
+
+
+template<int n_states, int n_inputs, int n_measurements>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::NCLKF< n_states, n_inputs, n_measurements >::NCLKF (const A_tA,
const B_tB,
const H_tH,
const double l 
)
+
+inline
+
+ +

The main constructor.

+
Parameters
+ + + + + +
AState transition matrix of the system (n x n).
BInput to state mapping matrix of the system (n x m).
HState to measurement mapping matrix of the system (p x n).
lThe norm constraint, applied to the specified states.
+
+
+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/classmrs__lib_1_1NCLKF.js b/classmrs__lib_1_1NCLKF.js new file mode 100644 index 00000000..76c11501 --- /dev/null +++ b/classmrs__lib_1_1NCLKF.js @@ -0,0 +1,19 @@ +var classmrs__lib_1_1NCLKF = +[ + [ "A_t", "classmrs__lib_1_1NCLKF.html#aa7b38a32abe6a319930d6392178d5e3e", null ], + [ "B_t", "classmrs__lib_1_1NCLKF.html#af283625e8caefbccb8ca64072dab91a8", null ], + [ "Base_class", "classmrs__lib_1_1NCLKF.html#aa670be9fba29c7d8d8c7c849d9d844d1", null ], + [ "H_t", "classmrs__lib_1_1NCLKF.html#a92eb1e6f9fe04297bb54fdfbdc74d460", null ], + [ "K_t", "classmrs__lib_1_1NCLKF.html#ae2d30fe948b17723e0a89450044f8f93", null ], + [ "P_t", "classmrs__lib_1_1NCLKF.html#a1448842265f0b39d5da536488d146db3", null ], + [ "Q_t", "classmrs__lib_1_1NCLKF.html#aab7df7efe1e8e70d0e79ad374c6674a0", null ], + [ "R_t", "classmrs__lib_1_1NCLKF.html#a4b6b964e9491ca80fdfc1afacc9b23fc", null ], + [ "statecov_t", "classmrs__lib_1_1NCLKF.html#abac1b51597611226f2c0642230207e71", null ], + [ "u_t", "classmrs__lib_1_1NCLKF.html#a8992c34838e430a64b070929e92c263a", null ], + [ "x_t", "classmrs__lib_1_1NCLKF.html#a8fa90de14ea4fa4125882bd49d101888", null ], + [ "z_t", "classmrs__lib_1_1NCLKF.html#a80db36613d09068f8daa0dc7e735dc64", null ], + [ "NCLKF", "classmrs__lib_1_1NCLKF.html#a5f970519deaccdbb021df412645f26d5", null ], + [ "NCLKF", "classmrs__lib_1_1NCLKF.html#aa4dcb47ceca9f506407e14858567ea09", null ], + [ "computeKalmanGain", "classmrs__lib_1_1NCLKF.html#a16d5bb9adb1708072bd039ab8355c356", null ], + [ "l", "classmrs__lib_1_1NCLKF.html#a9844bbffd20b73e814d54aebad840fb0", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1NCLKF__coll__graph.map b/classmrs__lib_1_1NCLKF__coll__graph.map new file mode 100644 index 00000000..79425643 --- /dev/null +++ b/classmrs__lib_1_1NCLKF__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/classmrs__lib_1_1NCLKF__coll__graph.md5 b/classmrs__lib_1_1NCLKF__coll__graph.md5 new file mode 100644 index 00000000..6207a81e --- /dev/null +++ b/classmrs__lib_1_1NCLKF__coll__graph.md5 @@ -0,0 +1 @@ +9b5f7a421a6d634d8650c925d569af45 \ No newline at end of file diff --git a/classmrs__lib_1_1NCLKF__coll__graph.png b/classmrs__lib_1_1NCLKF__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..c1514078d3a00f81ae0fe89854cc7e0a37e8ceee GIT binary patch literal 9084 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 + + + + + diff --git a/classmrs__lib_1_1NCLKF__inherit__graph.md5 b/classmrs__lib_1_1NCLKF__inherit__graph.md5 new file mode 100644 index 00000000..e64927bd --- /dev/null +++ b/classmrs__lib_1_1NCLKF__inherit__graph.md5 @@ -0,0 +1 @@ +17888d7784436d4e5ab7188880b89f72 \ No newline at end of file diff --git a/classmrs__lib_1_1NCLKF__inherit__graph.png b/classmrs__lib_1_1NCLKF__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..49bda7b9a0289d695d845808040315905a06eec5 GIT binary patch literal 12568 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 literal 0 HcmV?d00001 diff --git a/classmrs__lib_1_1NCLKF__partial-members.html b/classmrs__lib_1_1NCLKF__partial-members.html new file mode 100644 index 00000000..0af18870 --- /dev/null +++ b/classmrs__lib_1_1NCLKF__partial-members.html @@ -0,0 +1,145 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states > Member List
+
+
+ +

This is the complete list of members for mrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Amrs_lib::LKF< n_states, n_inputs, n_measurements >
A_t typedefmrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states >
Bmrs_lib::LKF< n_states, n_inputs, n_measurements >
B_t typedefmrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states >
Base_class typedefmrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states >
computeKalmanGain(const statecov_t &sc, const z_t &z, const R_t &R, const H_t &H) const override (defined in mrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states >)mrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states >inlineprotectedvirtual
computeKalmanGain(const statecov_t &sc, [[maybe_unused]] const z_t &z, const R_t &R, const H_t &H) const (defined in mrs_lib::LKF< n_states, n_inputs, n_measurements >)mrs_lib::LKF< n_states, n_inputs, n_measurements >inlineprotectedvirtual
correct(const statecov_t &sc, const z_t &z, const R_t &R) const overridemrs_lib::LKF< n_states, n_inputs, n_measurements >inlinevirtual
mrs_lib::KalmanFilter::correct(const statecov_t &sc, const z_t &z, const R_t &R) const =0mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >pure virtual
correction_impl(const statecov_t &sc, const z_t &z, const R_t &R, const H_t &H) const (defined in mrs_lib::LKF< n_states, n_inputs, n_measurements >)mrs_lib::LKF< n_states, n_inputs, n_measurements >inlineprotected
covariance_predict(const A_t &A, const P_t &P, const Q_t &Q, const double dt) (defined in mrs_lib::LKF< n_states, n_inputs, n_measurements >)mrs_lib::LKF< n_states, n_inputs, n_measurements >inlineprotectedstatic
Hmrs_lib::LKF< n_states, n_inputs, n_measurements >
H_t typedefmrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states >
Hq_t typedefmrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states >
indices_t typedefmrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states >
invert_W(R_t W) (defined in mrs_lib::LKF< n_states, n_inputs, n_measurements >)mrs_lib::LKF< n_states, n_inputs, n_measurements >inlineprotectedstatic
K_t typedefmrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states >
Kq_t typedefmrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states >
l (defined in mrs_lib::NCLKF< n_states, n_inputs, n_measurements >)mrs_lib::NCLKF< n_states, n_inputs, n_measurements >protected
LKF()mrs_lib::LKF< n_states, n_inputs, n_measurements >inline
LKF(const A_t &A, const B_t &B, const H_t &H)mrs_lib::LKF< n_states, n_inputs, n_measurements >inline
mmrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states >static
nmrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states >static
NCLKF()mrs_lib::NCLKF< n_states, n_inputs, n_measurements >inline
NCLKF(const A_t &A, const B_t &B, const H_t &H, const double l)mrs_lib::NCLKF< n_states, n_inputs, n_measurements >inline
NCLKF_partial()mrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states >inline
NCLKF_partial(const A_t &A, const B_t &B, const H_t &H, const double l, const indices_t &norm_constrained_indices)mrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states >inline
nqmrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states >static
pmrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states >static
P_t typedefmrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states >
predict(const statecov_t &sc, const u_t &u, const Q_t &Q, [[maybe_unused]] double dt) const overridemrs_lib::LKF< n_states, n_inputs, n_measurements >inlinevirtual
mrs_lib::KalmanFilter::predict(const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const =0mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >pure virtual
Q_t typedefmrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states >
R_t typedefmrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states >
state_predict(const A_t &A, const x_t &x, [[maybe_unused]] const B_t &B, [[maybe_unused]] const u_t &u) (defined in mrs_lib::LKF< n_states, n_inputs, n_measurements >)mrs_lib::LKF< n_states, n_inputs, n_measurements >inlineprotectedstatic
state_predict(const A_t &A, const x_t &x, const B_t &B, const u_t &u) (defined in mrs_lib::LKF< n_states, n_inputs, n_measurements >)mrs_lib::LKF< n_states, n_inputs, n_measurements >inlineprotectedstatic
statecov_t typedefmrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states >
u_t typedefmrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states >
x_t typedefmrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states >
xq_t typedefmrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states >
z_t typedefmrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states >
+
+ + + + diff --git a/classmrs__lib_1_1NCLKF__partial.html b/classmrs__lib_1_1NCLKF__partial.html new file mode 100644 index 00000000..718d9c40 --- /dev/null +++ b/classmrs__lib_1_1NCLKF__partial.html @@ -0,0 +1,789 @@ + + + + + + + +mrs_lib: mrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states > Class Template Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states > Class Template Reference
+
+
+ +

This class implements the partially norm-constrained linear Kalman filter [5]. + More...

+ +

#include <nckf.h>

+
+ + Inheritance diagram for mrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states >:
+
+
+ +
+ + Collaboration diagram for mrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states >:
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Types

+using Base_class = NCLKF< n, m, p >
 Base class of this class.
 
+using x_t = typename Base_class::x_t
 State vector type $n \times 1$.
 
+using u_t = typename Base_class::u_t
 Input vector type $m \times 1$.
 
+using z_t = typename Base_class::z_t
 Measurement vector type $p \times 1$.
 
+using P_t = typename Base_class::P_t
 State uncertainty covariance matrix type $n \times n$.
 
+using R_t = typename Base_class::R_t
 Measurement noise covariance matrix type $p \times p$.
 
+using Q_t = typename Base_class::Q_t
 Process noise covariance matrix type $n \times n$.
 
+using statecov_t = typename Base_class::statecov_t
 Helper struct for passing around the state and its covariance in one variable.
 
+using A_t = typename Base_class::A_t
 System transition matrix type $n \times n$.
 
+using B_t = typename Base_class::B_t
 Input to state mapping matrix type $n \times m$.
 
+using H_t = typename Base_class::H_t
 State to measurement mapping matrix type $p \times n$.
 
+using K_t = typename Base_class::K_t
 Kalman gain matrix type $n \times p$.
 
+using indices_t = std::array< int, nq >
 Indices of the norm-constrained states type.
 
+using xq_t = Eigen::Matrix< double, nq, 1 >
 Norm-constrained states vector type $ n_q \times 1 $.
 
+using Hq_t = Eigen::Matrix< double, p, nq >
 Norm-constrained measurement mapping type $ p \times n_q $.
 
+using Kq_t = Eigen::Matrix< double, nq, p >
 Norm-constrained kalman gain type $ n_q \times p $.
 
- Public Types inherited from mrs_lib::NCLKF< n_states, n_inputs, n_measurements >
+using Base_class = LKF< n, m, p >
 Base class of this class.
 
+using x_t = typename Base_class::x_t
 State vector type $n \times 1$.
 
+using u_t = typename Base_class::u_t
 Input vector type $m \times 1$.
 
+using z_t = typename Base_class::z_t
 Measurement vector type $p \times 1$.
 
+using P_t = typename Base_class::P_t
 State uncertainty covariance matrix type $n \times n$.
 
+using R_t = typename Base_class::R_t
 Measurement noise covariance matrix type $p \times p$.
 
+using Q_t = typename Base_class::Q_t
 Process noise covariance matrix type $n \times n$.
 
+using statecov_t = typename Base_class::statecov_t
 Helper struct for passing around the state and its covariance in one variable.
 
+using A_t = typename Base_class::A_t
 System transition matrix type $n \times n$.
 
+using B_t = typename Base_class::B_t
 Input to state mapping matrix type $n \times m$.
 
+using H_t = typename Base_class::H_t
 State to measurement mapping matrix type $p \times n$.
 
+using K_t = typename Base_class::K_t
 Kalman gain matrix type $n \times p$.
 
- Public Types inherited from mrs_lib::LKF< n_states, n_inputs, n_measurements >
+using Base_class = KalmanFilter< n, m, p >
 Base class of this class.
 
+using x_t = typename Base_class::x_t
 State vector type $n \times 1$.
 
+using u_t = typename Base_class::u_t
 Input vector type $m \times 1$.
 
+using z_t = typename Base_class::z_t
 Measurement vector type $p \times 1$.
 
+using P_t = typename Base_class::P_t
 State uncertainty covariance matrix type $n \times n$.
 
+using R_t = typename Base_class::R_t
 Measurement noise covariance matrix type $p \times p$.
 
+using Q_t = typename Base_class::Q_t
 Process noise covariance matrix type $n \times n$.
 
+using statecov_t = typename Base_class::statecov_t
 Helper struct for passing around the state and its covariance in one variable.
 
+typedef Eigen::Matrix< double, n, nA_t
 System transition matrix type $n \times n$.
 
+typedef Eigen::Matrix< double, n, mB_t
 Input to state mapping matrix type $n \times m$.
 
+typedef Eigen::Matrix< double, p, nH_t
 State to measurement mapping matrix type $p \times n$.
 
+typedef Eigen::Matrix< double, n, pK_t
 Kalman gain matrix type $n \times p$.
 
- Public Types inherited from mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >
+typedef Eigen::Matrix< double, n, 1 > x_t
 State vector type $n \times 1$.
 
+typedef Eigen::Matrix< double, m, 1 > u_t
 Input vector type $m \times 1$.
 
+typedef Eigen::Matrix< double, p, 1 > z_t
 Measurement vector type $p \times 1$.
 
+typedef Eigen::Matrix< double, n, nP_t
 State uncertainty covariance matrix type $n \times n$.
 
+typedef Eigen::Matrix< double, p, pR_t
 Measurement noise covariance matrix type $p \times p$.
 
+typedef Eigen::Matrix< double, n, nQ_t
 Process noise covariance matrix type $n \times n$.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 NCLKF_partial ()
 Convenience default constructor. More...
 
 NCLKF_partial (const A_t &A, const B_t &B, const H_t &H, const double l, const indices_t &norm_constrained_indices)
 The main constructor. More...
 
- Public Member Functions inherited from mrs_lib::NCLKF< n_states, n_inputs, n_measurements >
 NCLKF ()
 Convenience default constructor. More...
 
 NCLKF (const A_t &A, const B_t &B, const H_t &H, const double l)
 The main constructor. More...
 
- Public Member Functions inherited from mrs_lib::LKF< n_states, n_inputs, n_measurements >
 LKF ()
 Convenience default constructor. More...
 
 LKF (const A_t &A, const B_t &B, const H_t &H)
 The main constructor. More...
 
virtual statecov_t correct (const statecov_t &sc, const z_t &z, const R_t &R) const override
 Applies the correction (update, measurement, data) step of the Kalman filter. More...
 
virtual statecov_t predict (const statecov_t &sc, const u_t &u, const Q_t &Q, [[maybe_unused]] double dt) const override
 Applies the prediction (time) step of the Kalman filter. More...
 
- Public Member Functions inherited from mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >
virtual statecov_t correct (const statecov_t &sc, const z_t &z, const R_t &R) const =0
 Applies the correction (update, measurement, data) step of the Kalman filter. More...
 
virtual statecov_t predict (const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const =0
 Applies the prediction (time) step of the Kalman filter. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Static Public Attributes

+static const int n = n_states
 Length of the state vector of the system.
 
+static const int m = n_inputs
 Length of the input vector of the system.
 
+static const int p = n_measurements
 Length of the measurement vector of the system.
 
+static const int nq = n_norm_constrained_states
 Number of states to which the norm constraint applies.
 
- Static Public Attributes inherited from mrs_lib::NCLKF< n_states, n_inputs, n_measurements >
+static const int n = n_states
 Length of the state vector of the system.
 
+static const int m = n_inputs
 Length of the input vector of the system.
 
+static const int p = n_measurements
 Length of the measurement vector of the system.
 
- Static Public Attributes inherited from mrs_lib::LKF< n_states, n_inputs, n_measurements >
+static constexpr int n = n_states
 Length of the state vector of the system.
 
+static constexpr int m = n_inputs
 Length of the input vector of the system.
 
+static constexpr int p = n_measurements
 Length of the measurement vector of the system.
 
- Static Public Attributes inherited from mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >
+static const int n = n_states
 Length of the state vector of the system.
 
+static const int m = n_inputs
 Length of the input vector of the system.
 
+static const int p = n_measurements
 Length of the measurement vector of the system.
 
+ + + + + + + + +

+Protected Member Functions

+virtual K_t computeKalmanGain (const statecov_t &sc, const z_t &z, const R_t &R, const H_t &H) const override
 
- Protected Member Functions inherited from mrs_lib::LKF< n_states, n_inputs, n_measurements >
+virtual K_t computeKalmanGain (const statecov_t &sc, [[maybe_unused]] const z_t &z, const R_t &R, const H_t &H) const
 
+statecov_t ::type correction_impl (const statecov_t &sc, const z_t &z, const R_t &R, const H_t &H) const
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Attributes inherited from mrs_lib::LKF< n_states, n_inputs, n_measurements >
+A_t A
 The system transition matrix $n \times n$.
 
+B_t B
 The input to state mapping matrix $n \times m$.
 
+H_t H
 The state to measurement mapping matrix $p \times n$.
 
- Static Protected Member Functions inherited from mrs_lib::LKF< n_states, n_inputs, n_measurements >
+static P_t covariance_predict (const A_t &A, const P_t &P, const Q_t &Q, const double dt)
 
+template<int check = n_inputs>
static std::enable_if< check==0, x_t >::type state_predict (const A_t &A, const x_t &x, [[maybe_unused]] const B_t &B, [[maybe_unused]] const u_t &u)
 
+template<int check = n_inputs>
static 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)
 
+static R_t invert_W (R_t W)
 
- Protected Attributes inherited from mrs_lib::NCLKF< n_states, n_inputs, n_measurements >
+double l
 
+

Detailed Description

+

template<int n_states, int n_inputs, int n_measurements, int n_norm_constrained_states>
+class mrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states >

+ +

This class implements the partially norm-constrained linear Kalman filter [5].

+

Note that the class is templated. The template parameters specify the number of states, number of inputs and number of measurements of the system. The last template parameter specifies the number of states which are norm-constrained.

+

The norm constraint is specified in the constructor together with the indices of the states to which the constraint applies.

+

Example usage:

// clang: MatousFormat
+
+
#include <mrs_lib/nckf.h>
+
#include <random>
+
+
namespace mrs_lib
+
{
+
const int n_states = -1;
+
const int n_states_norm_constrained = 2;
+
const int n_inputs = 1;
+
const int n_measurements = 4;
+
+
/* using ukf_t = NCUKF<n_states, n_inputs, n_measurements>; */
+
using lkf_t = NCLKF_partial<n_states, n_inputs, n_measurements, n_states_norm_constrained>;
+
}
+
+
constexpr int n = 4;
+
+
using namespace mrs_lib;
+
using Q_t = lkf_t::Q_t;
+
using x_t = lkf_t::x_t;
+
using P_t = lkf_t::P_t;
+
using u_t = lkf_t::u_t;
+
using z_t = lkf_t::z_t;
+
using R_t = lkf_t::R_t;
+
+
using A_t = lkf_t::A_t;
+
using B_t = lkf_t::B_t;
+
using H_t = lkf_t::H_t;
+
+
A_t A;
+
B_t B;
+
H_t H;
+
+
+
// This function implements the state transition
+
x_t tra_model_f(const x_t& x, const u_t& u, [[maybe_unused]] const double dt)
+
{
+
x_t ret;
+
ret = A*x + B*u;
+
auto xq = ret.block<2, 1>(0, 0);
+
xq = xq/xq.norm();
+
ret.block<2, 1>(2, 0) = xq;
+
return ret;
+
}
+
+
// This function implements the observation generation from a state
+
z_t obs_model_f(const x_t& x)
+
{
+
return H*x;
+
}
+
+
template <int rows>
+
Eigen::Matrix<double, rows, 1> normal_randmat(const Eigen::Matrix<double, rows, rows>& cov)
+
{
+
static std::random_device rd{};
+
static std::mt19937 gen{rd()};
+
static std::normal_distribution<> d{0,1};
+
Eigen::Matrix<double, rows, 1> ret(n, 1);
+
for (int row = 0; row < rows; row++)
+
ret(row, 0) = d(gen);
+
return cov*ret;
+
}
+
+
int main()
+
{
+
srand(std::time(0));
+
const double l = 3.0;
+
+
// dt will be constant in this example
+
const double dt = 1.0;
+
+
// Initialize the process noise matrix
+
Q_t Q(n,n); Q <<
+
1e-3, 0, 0, 0,
+
0, 1e-3, 0, 0,
+
0, 0, 1e-2, 0,
+
0, 0, 0, 1e-2;
+
+
// Initialize the measurement noise matrix
+
R_t R = 1e-2 * R_t::Ones();
+
+
// Initialize the state transition matrix
+
A = A_t(n,n);
+
A <<
+
1, dt, 0.5*dt*dt, 0.25*dt*dt*dt,
+
0, 1, dt, 0.5*dt*dt,
+
0, 0, 1, dt,
+
0, 0, 0, 0.9;
+
+
// Initialize the input matrix
+
B = B_t(n, n_inputs);
+
B <<
+
0,
+
0,
+
0,
+
1;
+
+
// Initialize the observation matrix
+
H = H_t(n_measurements, n);
+
H <<
+
1, 0, 0, 0,
+
0, 1, 0, 0,
+
0, 0, 1, 0,
+
0, 0, 0, 1;
+
+
// Generate initial state and covariance
+
x_t x0 = 100.0*x_t::Random(n);
+
x0(2) = 0.0;
+
x0(3) = 10.0;
+
x0 = x0/x0.norm();
+
P_t P_tmp = P_t::Random(n,n);
+
const P_t P0 = 10.0*P_tmp*P_tmp.transpose();
+
const lkf_t::statecov_t sc0({x0, P0});
+
+
const lkf_t::indices_t nconst_idxs = {0,1}; // these are the norm-constrained states
+
lkf_t lkf(A, B, H, l, nconst_idxs);
+
+
const int n_its = 1e1;
+
std::vector<lkf_t::statecov_t> lscs;
+
std::vector<lkf_t::statecov_t> scs;
+
+
lscs.reserve(n_its+1);
+
scs.reserve(n_its+1);
+
+
lscs.push_back(sc0);
+
scs.push_back(sc0);
+
+
for (int it = 0; it < n_its; it++)
+
{
+
std::cout << "step: " << it << std::endl;
+
+
// Generate a new input vector
+
/* const u_t u = u_t(0.5) + 0.1*u_t::Random(); */
+
const u_t u = u_t(0.0);
+
+
// Generate a new state according to the model and noise parameters
+
auto sc = scs.back();
+
sc.x = tra_model_f(sc.x, u, dt) + normal_randmat(Q);
+
sc.x = sc.x / sc.x.norm();
+
+
// Generate a new observation according to the model and noise parameters
+
const z_t z = obs_model_f(sc.x) + normal_randmat(R);
+
+
scs.push_back(sc);
+
scs.push_back(sc);
+
std::cout << "gt state:" << std::endl << sc.x.transpose() << std::endl;
+
+
{
+
auto lsc = lscs.back();
+
try
+
{
+
std::cout << "lkf_new state:" << std::endl << lsc.x.transpose() << std::endl;
+
lsc = lkf.predict(lsc, u, Q, dt);
+
std::cout << "lkf_new predi:" << std::endl << lsc.x.transpose() << std::endl;
+
lscs.push_back(lsc);
+
lsc = lkf.correct(lsc, z, R);
+
std::cout << "lkf_new corre:" << std::endl << lsc.x.transpose() << std::endl;
+
double sum2 = 0.0;
+
for (const auto it : nconst_idxs)
+
sum2 += lsc.x(it)*lsc.x(it);
+
std::cout << "lkf_new corre norm:" << std::sqrt(sum2) << std::endl;
+
lscs.push_back(lsc);
+
}
+
catch (const std::exception& e)
+
{
+
ROS_ERROR("NEW LKF failed: %s", e.what());
+
}
+
}
+
}
+
+
double x_diff = 0.0;
+
double P_diff = 0.0;
+
for (int it = 0; it < n_its; it++)
+
{
+
const auto lsc = lscs.at(it);
+
const auto cur_x_diff = (lsc.x-lsc.x).norm();
+
const auto cur_P_diff = (lsc.P-lsc.P).norm();
+
x_diff += cur_x_diff;
+
P_diff += cur_P_diff;
+
}
+
+
std::cout << "x diff average: " << x_diff/(n_its+1) << std::endl;
+
std::cout << "P diff average: " << P_diff/(n_its+1) << std::endl;
+
+
return 0;
+
}
+
+

Constructor & Destructor Documentation

+ +

◆ NCLKF_partial() [1/2]

+ +
+
+
+template<int n_states, int n_inputs, int n_measurements, int n_norm_constrained_states>
+ + + + + +
+ + + + + + + +
mrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states >::NCLKF_partial ()
+
+inline
+
+ +

Convenience default constructor.

+

This constructor should not be used if applicable. If used, the main constructor has to be called afterwards, before using this class, otherwise the object is invalid (not initialized).

+ +
+
+ +

◆ NCLKF_partial() [2/2]

+ +
+
+
+template<int n_states, int n_inputs, int n_measurements, int n_norm_constrained_states>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states >::NCLKF_partial (const A_tA,
const B_tB,
const H_tH,
const double l,
const indices_tnorm_constrained_indices 
)
+
+inline
+
+ +

The main constructor.

+
Parameters
+ + + + + + +
AState transition matrix of the system (n x n).
BInput to state mapping matrix of the system (n x m).
HState to measurement mapping matrix of the system (p x n).
lThe norm constraint, applied to the specified states.
norm_constrained_indicesIndices of the norm-constrained states in the state vector.
+
+
+ +
+
+
The documentation for this class was generated from the following file: +
+
+
typename Base_class::A_t A_t
System transition matrix type .
Definition: nckf.h:130
+
typename Base_class::Q_t Q_t
Process noise covariance matrix type .
Definition: lkf.h:52
+
Eigen::Matrix< double, p, n > H_t
State to measurement mapping matrix type .
Definition: lkf.h:57
+
typename Base_class::P_t P_t
State uncertainty covariance matrix type .
Definition: lkf.h:50
+
H_t H
The state to measurement mapping matrix .
Definition: lkf.h:150
+
typename Base_class::statecov_t statecov_t
Helper struct for passing around the state and its covariance in one variable.
Definition: lkf.h:53
+
typename Base_class::R_t R_t
Measurement noise covariance matrix type .
Definition: lkf.h:51
+
typename Base_class::u_t u_t
Input vector type .
Definition: nckf.h:123
+
static const int n
Length of the state vector of the system.
Definition: nckf.h:116
+
Eigen::Matrix< double, n, m > B_t
Input to state mapping matrix type .
Definition: lkf.h:56
+
typename Base_class::x_t x_t
State vector type .
Definition: lkf.h:47
+
All mrs_lib functions, classes, variables and definitions are contained in this namespace.
Definition: attitude_converter.h:29
+
Eigen::Matrix< double, n, n > A_t
System transition matrix type .
Definition: lkf.h:55
+
B_t B
The input to state mapping matrix .
Definition: lkf.h:149
+
typename Base_class::H_t H_t
State to measurement mapping matrix type .
Definition: nckf.h:132
+
Implementation of the Linear Kalman filter .
Definition: lkf.h:38
+
typename Base_class::B_t B_t
Input to state mapping matrix type .
Definition: nckf.h:131
+
typename Base_class::z_t z_t
Measurement vector type .
Definition: lkf.h:49
+
A_t A
The system transition matrix .
Definition: lkf.h:144
+
typename Base_class::u_t u_t
Input vector type .
Definition: lkf.h:48
+ + + + diff --git a/classmrs__lib_1_1NCLKF__partial.js b/classmrs__lib_1_1NCLKF__partial.js new file mode 100644 index 00000000..10531a6c --- /dev/null +++ b/classmrs__lib_1_1NCLKF__partial.js @@ -0,0 +1,22 @@ +var classmrs__lib_1_1NCLKF__partial = +[ + [ "A_t", "classmrs__lib_1_1NCLKF__partial.html#a6d62f542c4ee39019c9466e82ed0cd51", null ], + [ "B_t", "classmrs__lib_1_1NCLKF__partial.html#a749bb8222899e2b056e27875c0f951f6", null ], + [ "Base_class", "classmrs__lib_1_1NCLKF__partial.html#a13dac50b4906535f6ff5837b1057597f", null ], + [ "H_t", "classmrs__lib_1_1NCLKF__partial.html#a12079d59b1f0e949c535e478d8e1d88c", null ], + [ "Hq_t", "classmrs__lib_1_1NCLKF__partial.html#a6f311605a0470b290c6917d555bb4c9a", null ], + [ "indices_t", "classmrs__lib_1_1NCLKF__partial.html#a93afd8063033124c0698426cd03d4507", null ], + [ "K_t", "classmrs__lib_1_1NCLKF__partial.html#a47b90d150c6147ab30ae1866b66ea49c", null ], + [ "Kq_t", "classmrs__lib_1_1NCLKF__partial.html#a459ce71ac559eb881415485df4d622fa", null ], + [ "P_t", "classmrs__lib_1_1NCLKF__partial.html#aef875cb026a1a0d8df31a8fc3f02e63b", null ], + [ "Q_t", "classmrs__lib_1_1NCLKF__partial.html#a2ba0fce7ba12825a0c498f7676848fce", null ], + [ "R_t", "classmrs__lib_1_1NCLKF__partial.html#a7754b24176416b24869450c88a1328aa", null ], + [ "statecov_t", "classmrs__lib_1_1NCLKF__partial.html#a2bc4e99acb7f38dc41d6e63cdce5e805", null ], + [ "u_t", "classmrs__lib_1_1NCLKF__partial.html#a5718270798d8227ccaf76a5d3b97fda5", null ], + [ "x_t", "classmrs__lib_1_1NCLKF__partial.html#afaae66f623e768b19c0160fb21be9373", null ], + [ "xq_t", "classmrs__lib_1_1NCLKF__partial.html#a50092f2c99a521668dfd3211c999441c", null ], + [ "z_t", "classmrs__lib_1_1NCLKF__partial.html#ad5308432a3010edabc4598a92786fad5", null ], + [ "NCLKF_partial", "classmrs__lib_1_1NCLKF__partial.html#aabe13461dda8a89463ce87888fd6e428", null ], + [ "NCLKF_partial", "classmrs__lib_1_1NCLKF__partial.html#a1c6b3f2a9bd2d7cafe652d1bb24872e7", null ], + [ "computeKalmanGain", "classmrs__lib_1_1NCLKF__partial.html#a293e0195e2a651bda0b09e40e6f8d7f4", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1NCLKF__partial__coll__graph.map b/classmrs__lib_1_1NCLKF__partial__coll__graph.map new file mode 100644 index 00000000..291304e3 --- /dev/null +++ b/classmrs__lib_1_1NCLKF__partial__coll__graph.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/classmrs__lib_1_1NCLKF__partial__coll__graph.md5 b/classmrs__lib_1_1NCLKF__partial__coll__graph.md5 new file mode 100644 index 00000000..afd9120b --- /dev/null +++ b/classmrs__lib_1_1NCLKF__partial__coll__graph.md5 @@ -0,0 +1 @@ +77f1f25b3808c1f081f3f787e90da284 \ No newline at end of file diff --git a/classmrs__lib_1_1NCLKF__partial__coll__graph.png b/classmrs__lib_1_1NCLKF__partial__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..0e7d24c553914f1ea26b86bbb82ad03bdf081694 GIT binary patch literal 13292 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 lK`#ILeVD(##d3Mg=qFRu + + + + + diff --git a/classmrs__lib_1_1NCLKF__partial__inherit__graph.md5 b/classmrs__lib_1_1NCLKF__partial__inherit__graph.md5 new file mode 100644 index 00000000..afd9120b --- /dev/null +++ b/classmrs__lib_1_1NCLKF__partial__inherit__graph.md5 @@ -0,0 +1 @@ +77f1f25b3808c1f081f3f787e90da284 \ No newline at end of file diff --git a/classmrs__lib_1_1NCLKF__partial__inherit__graph.png b/classmrs__lib_1_1NCLKF__partial__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..0e7d24c553914f1ea26b86bbb82ad03bdf081694 GIT binary patch literal 13292 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 lK`#ILeVD(##d3Mg=qFRu + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::NCUKF< n_states, n_inputs, n_measurements > Member List
+
+
+ +

This is the complete list of members for mrs_lib::NCUKF< n_states, n_inputs, n_measurements >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Base_class typedef (defined in mrs_lib::NCUKF< n_states, n_inputs, n_measurements >)mrs_lib::NCUKF< n_states, n_inputs, n_measurements >
computeInverse(const Pzz_t &Pzz) const (defined in mrs_lib::UKF< n_states, n_inputs, n_measurements >)mrs_lib::UKF< n_states, n_inputs, n_measurements >protected
computeKalmanGain(const x_t &x, const z_t &inn, const K_t &Pxz, const Pzz_t &Pzz) const override (defined in mrs_lib::NCUKF< n_states, n_inputs, n_measurements >)mrs_lib::NCUKF< n_states, n_inputs, n_measurements >inlineprotectedvirtual
computeKalmanGain([[maybe_unused]] const x_t &x, [[maybe_unused]] const z_t &inn, const K_t &Pxz, const Pzz_t &Pzz) const (defined in mrs_lib::UKF< n_states, n_inputs, n_measurements >)mrs_lib::UKF< n_states, n_inputs, n_measurements >protectedvirtual
computePaSqrt(const P_t &P) const (defined in mrs_lib::UKF< n_states, n_inputs, n_measurements >)mrs_lib::UKF< n_states, n_inputs, n_measurements >protected
computeSigmas(const x_t &x, const P_t &P) const (defined in mrs_lib::UKF< n_states, n_inputs, n_measurements >)mrs_lib::UKF< n_states, n_inputs, n_measurements >protected
computeWeights() (defined in mrs_lib::UKF< n_states, n_inputs, n_measurements >)mrs_lib::UKF< n_states, n_inputs, n_measurements >protected
correct(const statecov_t &sc, const z_t &z, const R_t &R) const overridemrs_lib::NCUKF< n_states, n_inputs, n_measurements >inlinevirtual
mrs_lib::KalmanFilter::correct(const statecov_t &sc, const z_t &z, const R_t &R) const =0mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >pure virtual
K_t typedef (defined in mrs_lib::NCUKF< n_states, n_inputs, n_measurements >)mrs_lib::NCUKF< n_states, n_inputs, n_measurements >
l (defined in mrs_lib::NCUKF< n_states, n_inputs, n_measurements >)mrs_lib::NCUKF< n_states, n_inputs, n_measurements >protected
m (defined in mrs_lib::NCUKF< n_states, n_inputs, n_measurements >)mrs_lib::NCUKF< n_states, n_inputs, n_measurements >static
m_alpha (defined in mrs_lib::UKF< n_states, n_inputs, n_measurements >)mrs_lib::UKF< n_states, n_inputs, n_measurements >protected
m_beta (defined in mrs_lib::UKF< n_states, n_inputs, n_measurements >)mrs_lib::UKF< n_states, n_inputs, n_measurements >protected
m_kappa (defined in mrs_lib::UKF< n_states, n_inputs, n_measurements >)mrs_lib::UKF< n_states, n_inputs, n_measurements >protected
m_lambda (defined in mrs_lib::UKF< n_states, n_inputs, n_measurements >)mrs_lib::UKF< n_states, n_inputs, n_measurements >protected
m_observation_model (defined in mrs_lib::UKF< n_states, n_inputs, n_measurements >)mrs_lib::UKF< n_states, n_inputs, n_measurements >protected
m_transition_model (defined in mrs_lib::UKF< n_states, n_inputs, n_measurements >)mrs_lib::UKF< n_states, n_inputs, n_measurements >protected
m_Wc (defined in mrs_lib::UKF< n_states, n_inputs, n_measurements >)mrs_lib::UKF< n_states, n_inputs, n_measurements >protected
m_Wm (defined in mrs_lib::UKF< n_states, n_inputs, n_measurements >)mrs_lib::UKF< n_states, n_inputs, n_measurements >protected
n (defined in mrs_lib::NCUKF< n_states, n_inputs, n_measurements >)mrs_lib::NCUKF< n_states, n_inputs, n_measurements >static
NCUKF() (defined in mrs_lib::NCUKF< n_states, n_inputs, n_measurements >)mrs_lib::NCUKF< n_states, n_inputs, n_measurements >inline
NCUKF(const transition_model_t &transition_model, const observation_model_t &observation_model, const double l, const double alpha=1e-3, const double kappa=1, const double beta=2) (defined in mrs_lib::NCUKF< n_states, n_inputs, n_measurements >)mrs_lib::NCUKF< n_states, n_inputs, n_measurements >inline
observation_model_t typedef (defined in mrs_lib::NCUKF< n_states, n_inputs, n_measurements >)mrs_lib::NCUKF< n_states, n_inputs, n_measurements >
p (defined in mrs_lib::NCUKF< n_states, n_inputs, n_measurements >)mrs_lib::NCUKF< n_states, n_inputs, n_measurements >static
P_t typedef (defined in mrs_lib::NCUKF< n_states, n_inputs, n_measurements >)mrs_lib::NCUKF< n_states, n_inputs, n_measurements >
predict(const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const overridemrs_lib::UKF< n_states, n_inputs, n_measurements >virtual
Pzz_t typedef (defined in mrs_lib::NCUKF< n_states, n_inputs, n_measurements >)mrs_lib::NCUKF< n_states, n_inputs, n_measurements >
Q_t typedef (defined in mrs_lib::NCUKF< n_states, n_inputs, n_measurements >)mrs_lib::NCUKF< n_states, n_inputs, n_measurements >
R_t typedef (defined in mrs_lib::NCUKF< n_states, n_inputs, n_measurements >)mrs_lib::NCUKF< n_states, n_inputs, n_measurements >
setConstants(const double alpha, const double kappa, const double beta)mrs_lib::UKF< n_states, n_inputs, n_measurements >
setObservationModel(const observation_model_t &observation_model)mrs_lib::UKF< n_states, n_inputs, n_measurements >
setTransitionModel(const transition_model_t &transition_model)mrs_lib::UKF< n_states, n_inputs, n_measurements >
statecov_t typedef (defined in mrs_lib::NCUKF< n_states, n_inputs, n_measurements >)mrs_lib::NCUKF< n_states, n_inputs, n_measurements >
transition_model_t typedef (defined in mrs_lib::NCUKF< n_states, n_inputs, n_measurements >)mrs_lib::NCUKF< n_states, n_inputs, n_measurements >
u_t typedef (defined in mrs_lib::NCUKF< n_states, n_inputs, n_measurements >)mrs_lib::NCUKF< n_states, n_inputs, n_measurements >
UKF()mrs_lib::UKF< n_states, n_inputs, n_measurements >
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)mrs_lib::UKF< n_states, n_inputs, n_measurements >
wmrs_lib::UKF< n_states, n_inputs, n_measurements >protectedstatic
W_t typedefmrs_lib::UKF< n_states, n_inputs, n_measurements >
x_t typedef (defined in mrs_lib::NCUKF< n_states, n_inputs, n_measurements >)mrs_lib::NCUKF< n_states, n_inputs, n_measurements >
X_t typedef (defined in mrs_lib::NCUKF< n_states, n_inputs, n_measurements >)mrs_lib::NCUKF< n_states, n_inputs, n_measurements >
Z_t typedef (defined in mrs_lib::NCUKF< n_states, n_inputs, n_measurements >)mrs_lib::NCUKF< n_states, n_inputs, n_measurements >
z_t typedef (defined in mrs_lib::NCUKF< n_states, n_inputs, n_measurements >)mrs_lib::NCUKF< n_states, n_inputs, n_measurements >
+
+ + + + diff --git a/classmrs__lib_1_1NCUKF.html b/classmrs__lib_1_1NCUKF.html new file mode 100644 index 00000000..a128bbaf --- /dev/null +++ b/classmrs__lib_1_1NCUKF.html @@ -0,0 +1,415 @@ + + + + + + + +mrs_lib: mrs_lib::NCUKF< n_states, n_inputs, n_measurements > Class Template Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::NCUKF< n_states, n_inputs, n_measurements > Class Template Reference
+
+
+
+ + Inheritance diagram for mrs_lib::NCUKF< n_states, n_inputs, n_measurements >:
+
+
+ +
+ + Collaboration diagram for mrs_lib::NCUKF< n_states, n_inputs, n_measurements >:
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Types

+using Base_class = UKF< n, m, p >
 
+using x_t = typename Base_class::x_t
 
+using u_t = typename Base_class::u_t
 
+using z_t = typename Base_class::z_t
 
+using P_t = typename Base_class::P_t
 
+using R_t = typename Base_class::R_t
 
+using Q_t = typename Base_class::Q_t
 
+using statecov_t = typename Base_class::statecov_t
 
+using transition_model_t = typename Base_class::transition_model_t
 
+using observation_model_t = typename Base_class::observation_model_t
 
+using X_t = typename Base_class::X_t
 
+using Z_t = typename Base_class::Z_t
 
+using Pzz_t = typename Base_class::Pzz_t
 
+using K_t = typename Base_class::K_t
 
- Public Types inherited from mrs_lib::UKF< n_states, n_inputs, n_measurements >
+using x_t = typename Base_class::x_t
 state vector n*1 typedef
 
+using u_t = typename Base_class::u_t
 input vector m*1 typedef
 
+using z_t = typename Base_class::z_t
 measurement vector p*1 typedef
 
+using P_t = typename Base_class::P_t
 state covariance n*n typedef
 
+using R_t = typename Base_class::R_t
 measurement covariance p*p typedef
 
+using Q_t = typename Base_class::Q_t
 process covariance n*n typedef
 
+using W_t = typename Eigen::Matrix< double, w, 1 >
 weights vector (2n+1)*1 typedef
 
+using statecov_t = typename Base_class::statecov_t
 typedef of a helper struct for state and covariance
 
+using transition_model_t = typename std::function< x_t(const x_t &, const u_t &, double)>
 function of the state transition model typedef
 
+using observation_model_t = typename std::function< z_t(const x_t &)>
 function of the observation model typedef
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

NCUKF (const transition_model_t &transition_model, const observation_model_t &observation_model, const double l, const double alpha=1e-3, const double kappa=1, const double beta=2)
 
virtual statecov_t correct (const statecov_t &sc, const z_t &z, const R_t &R) const override
 Implements the state correction step (measurement update). More...
 
- Public Member Functions inherited from mrs_lib::UKF< n_states, n_inputs, n_measurements >
 UKF ()
 Convenience default constructor. More...
 
 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)
 The main constructor. More...
 
virtual statecov_t predict (const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const override
 Implements the state prediction step (time update). More...
 
void setConstants (const double alpha, const double kappa, const double beta)
 Changes the Unscented Transform parameters. More...
 
void setTransitionModel (const transition_model_t &transition_model)
 Changes the transition model function. More...
 
void setObservationModel (const observation_model_t &observation_model)
 Changes the observation model function. More...
 
+ + + + + + + +

+Static Public Attributes

+static const int n = n_states
 
+static const int m = n_inputs
 
+static const int p = n_measurements
 
+ + + + + + + + + + + + + + +

+Protected Member Functions

+virtual K_t computeKalmanGain (const x_t &x, const z_t &inn, const K_t &Pxz, const Pzz_t &Pzz) const override
 
- Protected Member Functions inherited from mrs_lib::UKF< n_states, n_inputs, n_measurements >
+void computeWeights ()
 
+X_t computeSigmas (const x_t &x, const P_t &P) const
 
+P_t computePaSqrt (const P_t &P) const
 
+Pzz_t computeInverse (const Pzz_t &Pzz) const
 
+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
 
+ + + + + + + + + + + + + + + + + + + + +

+Protected Attributes

+double l
 
- Protected Attributes inherited from mrs_lib::UKF< n_states, n_inputs, n_measurements >
+double m_alpha
 
+double m_kappa
 
+double m_beta
 
+double m_lambda
 
+W_t m_Wm
 
+W_t m_Wc
 
+transition_model_t m_transition_model
 
+observation_model_t m_observation_model
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Protected Types inherited from mrs_lib::UKF< n_states, n_inputs, n_measurements >
+using Base_class = KalmanFilter< n, m, p >
 Base class of this class.
 
+using X_t = typename Eigen::Matrix< double, n, w >
 State sigma points matrix.
 
+using Z_t = typename Eigen::Matrix< double, p, w >
 Measurement sigma points matrix.
 
+using Pzz_t = typename Eigen::Matrix< double, p, p >
 Pzz helper matrix.
 
+using K_t = typename Eigen::Matrix< double, n, p >
 Kalman gain matrix.
 
- Static Protected Attributes inherited from mrs_lib::UKF< n_states, n_inputs, n_measurements >
+static constexpr int n = n_states
 Length of the state vector of the system.
 
+static constexpr int m = n_inputs
 Length of the input vector of the system.
 
+static constexpr int p = n_measurements
 Length of the measurement vector of the system.
 
+static constexpr int w = 2 * n + 1
 Number of sigma points/weights.
 
+

Member Function Documentation

+ +

◆ correct()

+ +
+
+
+template<int n_states, int n_inputs, int n_measurements>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
virtual statecov_t mrs_lib::NCUKF< n_states, n_inputs, n_measurements >::correct (const statecov_t & sc,
const z_tz,
const R_tR 
) const
+
+inlineoverridevirtual
+
+ +

Implements the state correction step (measurement update).

+
Parameters
+ + + + +
scPrevious estimate of the state and covariance.
zMeasurement vector.
RMeasurement covariance matrix.
+
+
+
Returns
The state and covariance after applying the correction step.
+ +

Reimplemented from mrs_lib::UKF< n_states, n_inputs, n_measurements >.

+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/classmrs__lib_1_1NCUKF.js b/classmrs__lib_1_1NCUKF.js new file mode 100644 index 00000000..8e49af41 --- /dev/null +++ b/classmrs__lib_1_1NCUKF.js @@ -0,0 +1,22 @@ +var classmrs__lib_1_1NCUKF = +[ + [ "Base_class", "classmrs__lib_1_1NCUKF.html#adb3fa88b036f1fc6b80f204cb601ebc7", null ], + [ "K_t", "classmrs__lib_1_1NCUKF.html#a5fb979f0c5139359956a3fdd40f3f535", null ], + [ "observation_model_t", "classmrs__lib_1_1NCUKF.html#a45f922267ff95bcad0d4760d5dbf3e49", null ], + [ "P_t", "classmrs__lib_1_1NCUKF.html#a652482865a512df867d37e654b0b2d4d", null ], + [ "Pzz_t", "classmrs__lib_1_1NCUKF.html#a1f0e64b6d2682ae4afdc8f8e59d96674", null ], + [ "Q_t", "classmrs__lib_1_1NCUKF.html#acbbd4daa96d9ce0d4fca18dc114a9fb1", null ], + [ "R_t", "classmrs__lib_1_1NCUKF.html#a826781b0c822b0f72d8bd9ced7452f81", null ], + [ "statecov_t", "classmrs__lib_1_1NCUKF.html#a7d1795ff05b989b2a69b726d7958dae5", null ], + [ "transition_model_t", "classmrs__lib_1_1NCUKF.html#a6ad5bf2fb59a2265651708ffe2e6526c", null ], + [ "u_t", "classmrs__lib_1_1NCUKF.html#aa65fcd20c676be8399d3016e0203affa", null ], + [ "x_t", "classmrs__lib_1_1NCUKF.html#adf38e41db3b8a80c6742b2a2dd6cb7b2", null ], + [ "X_t", "classmrs__lib_1_1NCUKF.html#aad37acbc7a2fe813c770ff4a705abf22", null ], + [ "z_t", "classmrs__lib_1_1NCUKF.html#ad2b734aae3fea37fc9cfee8c752e5747", null ], + [ "Z_t", "classmrs__lib_1_1NCUKF.html#abf3be33e44e56e023d8475eed0062e71", null ], + [ "NCUKF", "classmrs__lib_1_1NCUKF.html#ab05d1bc34d4fe3715959b5797bc72bf1", null ], + [ "NCUKF", "classmrs__lib_1_1NCUKF.html#ae8bee52a0123cbcb1e898e4785336bf2", null ], + [ "computeKalmanGain", "classmrs__lib_1_1NCUKF.html#af48c26afd4a3cfabcddac78b63714946", null ], + [ "correct", "classmrs__lib_1_1NCUKF.html#ab12dfb8b6ad4c831c761327a3be2d814", null ], + [ "l", "classmrs__lib_1_1NCUKF.html#a8511740030abca1b1b1e9aa5c6451639", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1NCUKF__coll__graph.map b/classmrs__lib_1_1NCUKF__coll__graph.map new file mode 100644 index 00000000..813f875a --- /dev/null +++ b/classmrs__lib_1_1NCUKF__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/classmrs__lib_1_1NCUKF__coll__graph.md5 b/classmrs__lib_1_1NCUKF__coll__graph.md5 new file mode 100644 index 00000000..73a1e972 --- /dev/null +++ b/classmrs__lib_1_1NCUKF__coll__graph.md5 @@ -0,0 +1 @@ +459b13b13e8c8f9ebf5a85062b4d99e7 \ No newline at end of file diff --git a/classmrs__lib_1_1NCUKF__coll__graph.png b/classmrs__lib_1_1NCUKF__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..61d787531041be7d953deb34ffdd5850ad4e04b8 GIT binary patch literal 9276 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 j4Ak`stbbq3pJ5T*sNN)s + + + + diff --git a/classmrs__lib_1_1NCUKF__inherit__graph.md5 b/classmrs__lib_1_1NCUKF__inherit__graph.md5 new file mode 100644 index 00000000..73a1e972 --- /dev/null +++ b/classmrs__lib_1_1NCUKF__inherit__graph.md5 @@ -0,0 +1 @@ +459b13b13e8c8f9ebf5a85062b4d99e7 \ No newline at end of file diff --git a/classmrs__lib_1_1NCUKF__inherit__graph.png b/classmrs__lib_1_1NCUKF__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..61d787531041be7d953deb34ffdd5850ad4e04b8 GIT binary patch literal 9276 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 j4Ak`stbbq3pJ5T*sNN)s + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::NotchFilter Member List
+
+
+ +

This is the complete list of members for mrs_lib::NotchFilter, including all inherited members.

+ + + +
iterate(double &sample_in) (defined in mrs_lib::NotchFilter)mrs_lib::NotchFilter
NotchFilter(const double &sample_rate, const double &frequency_in, const double &bandwidth_in) (defined in mrs_lib::NotchFilter)mrs_lib::NotchFilter
+
+ + + + diff --git a/classmrs__lib_1_1NotchFilter.html b/classmrs__lib_1_1NotchFilter.html new file mode 100644 index 00000000..66bde6d8 --- /dev/null +++ b/classmrs__lib_1_1NotchFilter.html @@ -0,0 +1,119 @@ + + + + + + + +mrs_lib: mrs_lib::NotchFilter Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::NotchFilter Class Reference
+
+
+ + + + + + +

+Public Member Functions

NotchFilter (const double &sample_rate, const double &frequency_in, const double &bandwidth_in)
 
+double iterate (double &sample_in)
 
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/classmrs__lib_1_1NotchFilter.js b/classmrs__lib_1_1NotchFilter.js new file mode 100644 index 00000000..5560c791 --- /dev/null +++ b/classmrs__lib_1_1NotchFilter.js @@ -0,0 +1,5 @@ +var classmrs__lib_1_1NotchFilter = +[ + [ "NotchFilter", "classmrs__lib_1_1NotchFilter.html#aba69b0f84c898a16d853a2cdee710840", null ], + [ "iterate", "classmrs__lib_1_1NotchFilter.html#ada5555bb90a375ccba73f8cd2b691b3e", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1ParamLoader-members.html b/classmrs__lib_1_1ParamLoader-members.html new file mode 100644 index 00000000..15de16e6 --- /dev/null +++ b/classmrs__lib_1_1ParamLoader-members.html @@ -0,0 +1,145 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::ParamLoader Member List
+
+
+ +

This is the complete list of members for mrs_lib::ParamLoader, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
addYamlFile(const std::string &filepath)mrs_lib::ParamLoaderinline
addYamlFileFromParam(const std::string &param_name)mrs_lib::ParamLoaderinline
getPrefix()mrs_lib::ParamLoaderinline
loadedSuccessfully()mrs_lib::ParamLoaderinline
loadMatrixArray(const std::string &name, std::vector< MatrixX< T >> &mat)mrs_lib::ParamLoaderinline
loadMatrixArray(const std::string &name, std::vector< MatrixX< T >> &mat, const std::vector< MatrixX< T >> &default_value)mrs_lib::ParamLoaderinline
loadMatrixArray2(const std::string &name)mrs_lib::ParamLoaderinline
loadMatrixArray2(const std::string &name, const std::vector< MatrixX< T >> &default_value)mrs_lib::ParamLoaderinline
loadMatrixDynamic(const std::string &name, MatrixX< T > &mat, int rows, int cols)mrs_lib::ParamLoaderinline
loadMatrixDynamic(const std::string &name, MatrixX< T > &mat, const Eigen::MatrixBase< Derived > &default_value, int rows, int cols)mrs_lib::ParamLoaderinline
loadMatrixDynamic2(const std::string &name, int rows, int cols)mrs_lib::ParamLoaderinline
loadMatrixDynamic2(const std::string &name, const Eigen::MatrixBase< Derived > &default_value, int rows, int cols)mrs_lib::ParamLoaderinline
loadMatrixStatic(const std::string &name, Eigen::Matrix< T, rows, cols > &mat)mrs_lib::ParamLoaderinline
loadMatrixStatic(const std::string &name, Eigen::Matrix< T, rows, cols > &mat, const Eigen::MatrixBase< Derived > &default_value)mrs_lib::ParamLoaderinline
loadMatrixStatic(const std::string &name, MatrixX< T > &mat, int rows, int cols)mrs_lib::ParamLoaderinline
loadMatrixStatic(const std::string &name, MatrixX< T > &mat, const Eigen::MatrixBase< Derived > &default_value, int rows, int cols)mrs_lib::ParamLoaderinline
loadMatrixStatic2(const std::string &name)mrs_lib::ParamLoaderinline
loadMatrixStatic2(const std::string &name, const Eigen::MatrixBase< Derived > &default_value)mrs_lib::ParamLoaderinline
loadMatrixStatic2(const std::string &name, int rows, int cols)mrs_lib::ParamLoaderinline
loadMatrixStatic2(const std::string &name, const Eigen::MatrixBase< Derived > &default_value, int rows, int cols)mrs_lib::ParamLoaderinline
loadParam(const std::string &name, T &out_value, const T &default_value)mrs_lib::ParamLoaderinline
loadParam(const std::string &name, T &out_value)mrs_lib::ParamLoaderinline
loadParam(const std::string &name, ros::Duration &out, const ros::Duration &default_value)mrs_lib::ParamLoaderinline
loadParam(const std::string &name, ros::Duration &out)mrs_lib::ParamLoaderinline
loadParam(const std::string &name, std_msgs::ColorRGBA &out, const std_msgs::ColorRGBA &default_value={})mrs_lib::ParamLoaderinline
loadParam(const std::string &name, XmlRpc::XmlRpcValue &out, const XmlRpc::XmlRpcValue &default_value)mrs_lib::ParamLoaderinline
loadParam(const std::string &name, XmlRpc::XmlRpcValue &out)mrs_lib::ParamLoaderinline
loadParam(const std::string &name, MatrixX< T > &mat, const MatrixX< T > &default_value)mrs_lib::ParamLoaderinline
loadParam2(const std::string &name, const T &default_value)mrs_lib::ParamLoaderinline
loadParam2(const std::string &name)mrs_lib::ParamLoaderinline
loadParam2(const std::string &name, const std_msgs::ColorRGBA &default_value={})mrs_lib::ParamLoaderinline
loadParam2(const std::string &name, const XmlRpc::XmlRpcValue &default_value)mrs_lib::ParamLoaderinline
loadParam2(const std::string &name, const MatrixX< T > &default_value)mrs_lib::ParamLoaderinline
loadParamReusable(const std::string &name, T &out_value, const T &default_value)mrs_lib::ParamLoaderinline
loadParamReusable(const std::string &name, T &out_value)mrs_lib::ParamLoaderinline
loadParamReusable2(const std::string &name, const T &default_value)mrs_lib::ParamLoaderinline
loadParamReusable2(const std::string &name)mrs_lib::ParamLoaderinline
ParamLoader(const ros::NodeHandle &nh, bool printValues=true, std::string_view node_name=std::string())mrs_lib::ParamLoaderinline
ParamLoader(const ros::NodeHandle &nh, std::string_view node_name)mrs_lib::ParamLoaderinline
ParamLoader(const std::string &filepath, const ros::NodeHandle &nh)mrs_lib::ParamLoaderinline
setPrefix(const std::string &prefix)mrs_lib::ParamLoaderinline
+
+ + + + diff --git a/classmrs__lib_1_1ParamLoader.html b/classmrs__lib_1_1ParamLoader.html new file mode 100644 index 00000000..e3e947bb --- /dev/null +++ b/classmrs__lib_1_1ParamLoader.html @@ -0,0 +1,2339 @@ + + + + + + + +mrs_lib: mrs_lib::ParamLoader Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::ParamLoader Class Reference
+
+
+ +

Convenience class for loading parameters from rosparam server. + More...

+ +

#include <param_loader.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 ParamLoader (const ros::NodeHandle &nh, bool printValues=true, std::string_view node_name=std::string())
 Main constructor. More...
 
 ParamLoader (const ros::NodeHandle &nh, std::string_view node_name)
 Convenience overload to enable writing ParamLoader pl(nh, node_name);. More...
 
 ParamLoader (const std::string &filepath, const ros::NodeHandle &nh)
 Convenience overload to enable writing ParamLoader pl(nh, "node_name");. More...
 
void setPrefix (const std::string &prefix)
 All loaded parameters will be prefixed with this string. More...
 
std::string getPrefix ()
 Returns the current parameter name prefix. More...
 
bool addYamlFile (const std::string &filepath)
 Adds the specified file as a source of static parameters. More...
 
bool addYamlFileFromParam (const std::string &param_name)
 Loads a filepath from a parameter loads that file as a YAML. More...
 
bool loadedSuccessfully ()
 Indicates whether all compulsory parameters were successfully loaded. More...
 
template<typename T >
bool loadParam (const std::string &name, T &out_value, const T &default_value)
 Loads a parameter from the rosparam server with a default value. More...
 
template<typename T >
loadParam2 (const std::string &name, const T &default_value)
 Loads a parameter from the rosparam server with a default value. More...
 
template<typename T >
bool loadParamReusable (const std::string &name, T &out_value, const T &default_value)
 Loads a parameter from the rosparam server with a default value. More...
 
template<typename T >
loadParamReusable2 (const std::string &name, const T &default_value)
 Loads an optional reusable parameter from the rosparam server. More...
 
template<typename T >
bool loadParam (const std::string &name, T &out_value)
 Loads a compulsory parameter from the rosparam server. More...
 
template<typename T >
loadParam2 (const std::string &name)
 Loads a compulsory parameter from the rosparam server. More...
 
template<typename T >
bool loadParamReusable (const std::string &name, T &out_value)
 Loads a compulsory parameter from the rosparam server. More...
 
template<typename T >
loadParamReusable2 (const std::string &name)
 Loads a compulsory parameter from the rosparam server. More...
 
bool loadParam (const std::string &name, ros::Duration &out, const ros::Duration &default_value)
 An overload for loading ros::Duration. More...
 
bool loadParam (const std::string &name, ros::Duration &out)
 An overload for loading ros::Duration. More...
 
bool loadParam (const std::string &name, std_msgs::ColorRGBA &out, const std_msgs::ColorRGBA &default_value={})
 An overload for loading std_msgs::ColorRGBA. More...
 
std_msgs::ColorRGBA loadParam2 (const std::string &name, const std_msgs::ColorRGBA &default_value={})
 An overload for loading std_msgs::ColorRGBA. More...
 
bool loadParam (const std::string &name, XmlRpc::XmlRpcValue &out, const XmlRpc::XmlRpcValue &default_value)
 An overload for loading an optional XmlRpc::XmlRpcValue. More...
 
bool loadParam (const std::string &name, XmlRpc::XmlRpcValue &out)
 An overload for loading a compulsory XmlRpc::XmlRpcValue. More...
 
XmlRpc::XmlRpcValue loadParam2 (const std::string &name, const XmlRpc::XmlRpcValue &default_value)
 An overload for loading an optional XmlRpc::XmlRpcValue. More...
 
template<typename T >
void loadParam (const std::string &name, MatrixX< T > &mat, const MatrixX< T > &default_value)
 An overload for loading Eigen matrices. More...
 
template<typename T >
MatrixX< T > loadParam2 (const std::string &name, const MatrixX< T > &default_value)
 An overload for loading Eigen matrices. More...
 
template<int rows, int cols, typename T >
void loadMatrixStatic (const std::string &name, Eigen::Matrix< T, rows, cols > &mat)
 Specialized method for loading compulsory Eigen matrix parameters. More...
 
template<int rows, int cols, typename T , typename Derived >
void loadMatrixStatic (const std::string &name, Eigen::Matrix< T, rows, cols > &mat, const Eigen::MatrixBase< Derived > &default_value)
 Specialized method for loading Eigen matrix parameters with default value. More...
 
template<int rows, int cols, typename T = double>
Eigen::Matrix< T, rows, cols > loadMatrixStatic2 (const std::string &name)
 Specialized method for loading compulsory Eigen matrix parameters. More...
 
template<int rows, int cols, typename T , typename Derived >
Eigen::Matrix< T, rows, cols > loadMatrixStatic2 (const std::string &name, const Eigen::MatrixBase< Derived > &default_value)
 Specialized method for loading Eigen matrix parameters with default value. More...
 
template<typename T >
void loadMatrixStatic (const std::string &name, MatrixX< T > &mat, int rows, int cols)
 Specialized method for loading compulsory Eigen matrix parameters. More...
 
template<typename T , typename Derived >
void loadMatrixStatic (const std::string &name, MatrixX< T > &mat, const Eigen::MatrixBase< Derived > &default_value, int rows, int cols)
 Specialized method for loading Eigen matrix parameters with default value. More...
 
template<typename T = double>
MatrixX< T > loadMatrixStatic2 (const std::string &name, int rows, int cols)
 Specialized method for loading compulsory Eigen matrix parameters. More...
 
template<typename T , typename Derived >
MatrixX< T > loadMatrixStatic2 (const std::string &name, const Eigen::MatrixBase< Derived > &default_value, int rows, int cols)
 Specialized method for loading Eigen matrix parameters with default value. More...
 
template<typename T >
void loadMatrixDynamic (const std::string &name, MatrixX< T > &mat, int rows, int cols)
 Specialized method for loading compulsory dynamic Eigen matrix parameters. More...
 
template<typename T , typename Derived >
void loadMatrixDynamic (const std::string &name, MatrixX< T > &mat, const Eigen::MatrixBase< Derived > &default_value, int rows, int cols)
 Specialized method for loading compulsory dynamic Eigen matrix parameters. More...
 
template<typename T = double>
MatrixX< T > loadMatrixDynamic2 (const std::string &name, int rows, int cols)
 Specialized method for loading compulsory dynamic Eigen matrix parameters. More...
 
template<typename T , typename Derived >
MatrixX< T > loadMatrixDynamic2 (const std::string &name, const Eigen::MatrixBase< Derived > &default_value, int rows, int cols)
 Specialized method for loading compulsory dynamic Eigen matrix parameters. More...
 
template<typename T >
void loadMatrixArray (const std::string &name, std::vector< MatrixX< T >> &mat)
 Specialized method for loading compulsory parameters, interpreted as an array of dynamic Eigen matrices. More...
 
template<typename T >
void loadMatrixArray (const std::string &name, std::vector< MatrixX< T >> &mat, const std::vector< MatrixX< T >> &default_value)
 Specialized method for loading compulsory parameters, interpreted as an array of dynamic Eigen matrices. More...
 
template<typename T = double>
std::vector< MatrixX< T > > loadMatrixArray2 (const std::string &name)
 Specialized method for loading compulsory parameters, interpreted as an array of dynamic Eigen matrices. More...
 
template<typename T >
std::vector< MatrixX< T > > loadMatrixArray2 (const std::string &name, const std::vector< MatrixX< T >> &default_value)
 Specialized method for loading compulsory parameters, interpreted as an array of dynamic Eigen matrices. More...
 
+

Detailed Description

+

Convenience class for loading parameters from rosparam server.

+

The parameters can be loaded as compulsory. If a compulsory parameter is not found on the rosparam server (e.g. because it is missing in the launchfile or the yaml config file), an internal flag is set to false, indicating that the parameter loading procedure failed. This flag can be checked using the loaded_successfully() method after all parameters were attempted to be loaded (see usage example usage below).

+

The loaded parameter names and corresponding values are printed to stdout by default for user convenience. Special cases such as loading of Eigen matrices or loading of std::vectors of various values are also provided.

+

To load parameters into the rosparam server, use a launchfile prefferably. See documentation of ROS launchfiles here: http://wiki.ros.org/roslaunch/XML. Specifically, the param XML tag is used for loading parameters directly from the launchfile: http://wiki.ros.org/roslaunch/XML/param, and the rosparam XML tag tag is used for loading parameters from a yaml file: http://wiki.ros.org/roslaunch/XML/rosparam.

+
Examples
param_loader/example.cpp.
+
+

Constructor & Destructor Documentation

+ +

◆ ParamLoader() [1/3]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::ParamLoader::ParamLoader (const ros::NodeHandle & nh,
bool printValues = true,
std::string_view node_name = std::string() 
)
+
+inline
+
+ +

Main constructor.

+
Parameters
+ + + + +
nhThe parameters will be loaded from rosparam using this node handle.
printValuesIf true, the loaded values will be printed to stdout using std::cout or ROS_INFO if node_name is not empty.
node_nameOptional node name used when printing the loaded values or loading errors.
+
+
+ +
+
+ +

◆ ParamLoader() [2/3]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
mrs_lib::ParamLoader::ParamLoader (const ros::NodeHandle & nh,
std::string_view node_name 
)
+
+inline
+
+ +

Convenience overload to enable writing ParamLoader pl(nh, node_name);.

+
Parameters
+ + + +
nhThe parameters will be loaded from rosparam using this node handle.
node_nameOptional node name used when printing the loaded values or loading errors.
+
+
+ +
+
+ +

◆ ParamLoader() [3/3]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
mrs_lib::ParamLoader::ParamLoader (const std::string & filepath,
const ros::NodeHandle & nh 
)
+
+inline
+
+ +

Convenience overload to enable writing ParamLoader pl(nh, "node_name");.

+
Parameters
+ + + +
nhThe parameters will be loaded from rosparam using this node handle.
node_nameOptional node name used when printing the loaded values or loading errors.
+
+
+ +
+
+

Member Function Documentation

+ +

◆ addYamlFile()

+ +
+
+ + + + + +
+ + + + + + + + +
bool mrs_lib::ParamLoader::addYamlFile (const std::string & filepath)
+
+inline
+
+ +

Adds the specified file as a source of static parameters.

+
Parameters
+ + +
filepathThe full path to the yaml file to be loaded.
+
+
+
Returns
true if loading and parsing the file was successful, false otherwise.
+
Examples
param_loader/example.cpp.
+
+ +
+
+ +

◆ addYamlFileFromParam()

+ +
+
+ + + + + +
+ + + + + + + + +
bool mrs_lib::ParamLoader::addYamlFileFromParam (const std::string & param_name)
+
+inline
+
+ +

Loads a filepath from a parameter loads that file as a YAML.

+
Parameters
+ + +
param_nameName of the parameter from which to load the YAML filename to be loaded.
+
+
+
Returns
true if loading and parsing the file was successful, false otherwise.
+ +
+
+ +

◆ getPrefix()

+ +
+
+ + + + + +
+ + + + + + + +
std::string mrs_lib::ParamLoader::getPrefix ()
+
+inline
+
+ +

Returns the current parameter name prefix.

+
Returns
the current prefix to be applied to the loaded parameters.
+ +
+
+ +

◆ loadedSuccessfully()

+ +
+
+ + + + + +
+ + + + + + + +
bool mrs_lib::ParamLoader::loadedSuccessfully ()
+
+inline
+
+ +

Indicates whether all compulsory parameters were successfully loaded.

+
Returns
false if any compulsory parameter was not loaded (is not present at rosparam server). Otherwise returns true.
+
Examples
param_loader/example.cpp.
+
+ +
+
+ +

◆ loadMatrixArray() [1/2]

+ +
+
+
+template<typename T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void mrs_lib::ParamLoader::loadMatrixArray (const std::string & name,
std::vector< MatrixX< T >> & mat 
)
+
+inline
+
+ +

Specialized method for loading compulsory parameters, interpreted as an array of dynamic Eigen matrices.

+

The number of rows and columns of the matrices to be loaded is specified in the rosparam parameter. Specifically, the name/rows value specifies the number of rows, which must be common to all the loaded matrices (i.e. it is one integer >= 0), and the name/cols value specifies the number of columns of each matrix (i.e. it is an array of integers > 0). The name/data array contains the values of the elements of the matrices and it must have length $ r\sum_i c_i $, where $ r $ is the common number of rows and $ c_i $ is the number of columns of the $ i $-th matrix. A typical structure of a yaml file, specifying the matrix array to be loaded using this method, is

+
matrix_array:
+
rows: 3
+
cols: [1, 2]
+
data: [-5.0, 0.0, 23.0,
+
-5.0, 0.0, 12.0,
+
2.0, 4.0, 7.0]
+

which will be loaded as a std::vector, containing one $ 3\times 1 $ matrix and one $ 3\times 2 $ matrix.

+

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). 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), the loading process is unsuccessful. Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.

+
Parameters
+ + + +
nameName of the parameter in the rosparam server.
matReference to the variable to which the parameter value will be stored (such as a class member variable).
+
+
+ +
+
+ +

◆ loadMatrixArray() [2/2]

+ +
+
+
+template<typename T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
void mrs_lib::ParamLoader::loadMatrixArray (const std::string & name,
std::vector< MatrixX< T >> & mat,
const std::vector< MatrixX< T >> & default_value 
)
+
+inline
+
+ +

Specialized method for loading compulsory parameters, interpreted as an array of dynamic Eigen matrices.

+

This overload of the loadMatrixArray() method takes a default value for the parameter, which is used in case a rosparam with the specified name is not found in the rosparam server, instead of causing an unsuccessful load. This makes specifying the parameter value in the rosparam server optional.

+
Parameters
+ + + + +
nameName of the parameter in the rosparam server.
matReference to the variable to which the parameter value will be stored (such as a class member variable).
default_valueThe default value to be used in case the parameter is not found on the rosparam server.
+
+
+ +
+
+ +

◆ loadMatrixArray2() [1/2]

+ +
+
+
+template<typename T = double>
+ + + + + +
+ + + + + + + + +
std::vector<MatrixX<T> > mrs_lib::ParamLoader::loadMatrixArray2 (const std::string & name)
+
+inline
+
+ +

Specialized method for loading compulsory parameters, interpreted as an array of dynamic Eigen matrices.

+

This method works in the same way as the loadMatrixArray() method for compulsory parameters, except that the loaded parameter is returned and not stored in the reference parameter.

+
Parameters
+ + +
nameName of the parameter in the rosparam server.
+
+
+
Returns
The loaded parameter or a default constructed object of the respective type.
+ +
+
+ +

◆ loadMatrixArray2() [2/2]

+ +
+
+
+template<typename T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
std::vector<MatrixX<T> > mrs_lib::ParamLoader::loadMatrixArray2 (const std::string & name,
const std::vector< MatrixX< T >> & default_value 
)
+
+inline
+
+ +

Specialized method for loading compulsory parameters, interpreted as an array of dynamic Eigen matrices.

+

This method works in the same way as the loadMatrixArray() method for optional parameters, except that the loaded parameter is returned and not stored in the reference parameter.

+
Parameters
+ + + +
nameName of the parameter in the rosparam server.
default_valueThe default value to be used in case the parameter is not found on the rosparam server.
+
+
+
Returns
The loaded parameter or the default value.
+ +
+
+ +

◆ loadMatrixDynamic() [1/2]

+ +
+
+
+template<typename T , typename Derived >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void mrs_lib::ParamLoader::loadMatrixDynamic (const std::string & name,
MatrixX< T > & mat,
const Eigen::MatrixBase< Derived > & default_value,
int rows,
int cols 
)
+
+inline
+
+ +

Specialized method for loading compulsory dynamic Eigen matrix parameters.

+

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). 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), the default value is used. Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.

+
Parameters
+ + + + + + +
nameName of the parameter in the rosparam server.
default_valueThis value will be used if the parameter name is not found in the rosparam server.
matReference to the variable to which the parameter value will be stored (such as a class member variable).
rowsExpected 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).
colsExpected 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).
+
+
+ +
+
+ +

◆ loadMatrixDynamic() [2/2]

+ +
+
+
+template<typename T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void mrs_lib::ParamLoader::loadMatrixDynamic (const std::string & name,
MatrixX< T > & mat,
int rows,
int cols 
)
+
+inline
+
+ +

Specialized method for loading compulsory dynamic Eigen matrix parameters.

+

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). 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), the loading process is unsuccessful. Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.

+
Parameters
+ + + + + +
nameName of the parameter in the rosparam server.
matReference to the variable to which the parameter value will be stored (such as a class member variable).
rowsExpected 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).
colsExpected 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).
+
+
+ +
+
+ +

◆ loadMatrixDynamic2() [1/2]

+ +
+
+
+template<typename T , typename Derived >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MatrixX<T> mrs_lib::ParamLoader::loadMatrixDynamic2 (const std::string & name,
const Eigen::MatrixBase< Derived > & default_value,
int rows,
int cols 
)
+
+inline
+
+ +

Specialized method for loading compulsory dynamic Eigen matrix parameters.

+

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). 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), the default value is used. Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.

+
Parameters
+ + + + + +
nameName of the parameter in the rosparam server.
default_valueThis value will be used if the parameter name is not found in the rosparam server.
rowsExpected 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).
colsExpected 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).
+
+
+
Returns
The loaded parameter value.
+ +
+
+ +

◆ loadMatrixDynamic2() [2/2]

+ +
+
+
+template<typename T = double>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
MatrixX<T> mrs_lib::ParamLoader::loadMatrixDynamic2 (const std::string & name,
int rows,
int cols 
)
+
+inline
+
+ +

Specialized method for loading compulsory dynamic Eigen matrix parameters.

+

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). 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), the loading process is unsuccessful. Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.

+
Parameters
+ + + + +
nameName of the parameter in the rosparam server.
rowsExpected 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).
colsExpected 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).
+
+
+
Returns
The loaded parameter value.
+ +
+
+ +

◆ loadMatrixStatic() [1/4]

+ +
+
+
+template<int rows, int cols, typename T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void mrs_lib::ParamLoader::loadMatrixStatic (const std::string & name,
Eigen::Matrix< T, rows, cols > & mat 
)
+
+inline
+
+ +

Specialized method for loading compulsory Eigen matrix parameters.

+

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). 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), the loading process is unsuccessful. Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.

+
Template Parameters
+ + + +
rowsExpected number of rows of the matrix.
colsExpected number of columns of the matrix.
+
+
+
Parameters
+ + + +
nameName of the parameter in the rosparam server.
matReference to the variable to which the parameter value will be stored (such as a class member variable).
+
+
+ +
+
+ +

◆ loadMatrixStatic() [2/4]

+ +
+
+
+template<int rows, int cols, typename T , typename Derived >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
void mrs_lib::ParamLoader::loadMatrixStatic (const std::string & name,
Eigen::Matrix< T, rows, cols > & mat,
const Eigen::MatrixBase< Derived > & default_value 
)
+
+inline
+
+ +

Specialized method for loading Eigen matrix parameters with default value.

+

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). 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), the default value is used. Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.

+
Template Parameters
+ + + +
rowsExpected number of rows of the matrix.
colsExpected number of columns of the matrix.
+
+
+
Parameters
+ + + + +
nameName of the parameter in the rosparam server.
matReference to the variable to which the parameter value will be stored (such as a class member variable).
default_valueThis value will be used if the parameter name is not found in the rosparam server.
+
+
+ +
+
+ +

◆ loadMatrixStatic() [3/4]

+ +
+
+
+template<typename T , typename Derived >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void mrs_lib::ParamLoader::loadMatrixStatic (const std::string & name,
MatrixX< T > & mat,
const Eigen::MatrixBase< Derived > & default_value,
int rows,
int cols 
)
+
+inline
+
+ +

Specialized method for loading Eigen matrix parameters with default value.

+

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). 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), the default value is used. Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.

+
Parameters
+ + + + + + +
nameName of the parameter in the rosparam server.
matReference to the variable to which the parameter value will be stored (such as a class member variable).
default_valueThis value will be used if the parameter name is not found in the rosparam server.
rowsExpected number of rows of the matrix.
colsExpected number of columns of the matrix.
+
+
+ +
+
+ +

◆ loadMatrixStatic() [4/4]

+ +
+
+
+template<typename T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void mrs_lib::ParamLoader::loadMatrixStatic (const std::string & name,
MatrixX< T > & mat,
int rows,
int cols 
)
+
+inline
+
+ +

Specialized method for loading compulsory Eigen matrix parameters.

+

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). 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), the loading process is unsuccessful. Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.

+
Parameters
+ + + + + +
nameName of the parameter in the rosparam server.
matReference to the variable to which the parameter value will be stored (such as a class member variable).
rowsExpected number of rows of the matrix.
colsExpected number of columns of the matrix.
+
+
+ +
+
+ +

◆ loadMatrixStatic2() [1/4]

+ +
+
+
+template<int rows, int cols, typename T = double>
+ + + + + +
+ + + + + + + + +
Eigen::Matrix<T, rows, cols> mrs_lib::ParamLoader::loadMatrixStatic2 (const std::string & name)
+
+inline
+
+ +

Specialized method for loading compulsory Eigen matrix parameters.

+

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). 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), the loading process is unsuccessful. Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.

+
Template Parameters
+ + + +
rowsExpected number of rows of the matrix.
colsExpected number of columns of the matrix.
+
+
+
Parameters
+ + +
nameName of the parameter in the rosparam server.
+
+
+
Returns
The loaded parameter value.
+ +
+
+ +

◆ loadMatrixStatic2() [2/4]

+ +
+
+
+template<int rows, int cols, typename T , typename Derived >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Eigen::Matrix<T, rows, cols> mrs_lib::ParamLoader::loadMatrixStatic2 (const std::string & name,
const Eigen::MatrixBase< Derived > & default_value 
)
+
+inline
+
+ +

Specialized method for loading Eigen matrix parameters with default value.

+

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). 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), the default value is used. Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.

+
Template Parameters
+ + + +
rowsExpected number of rows of the matrix.
colsExpected number of columns of the matrix.
+
+
+
Parameters
+ + + +
nameName of the parameter in the rosparam server.
default_valueThis value will be used if the parameter name is not found in the rosparam server.
+
+
+
Returns
The loaded parameter value.
+ +
+
+ +

◆ loadMatrixStatic2() [3/4]

+ +
+
+
+template<typename T , typename Derived >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MatrixX<T> mrs_lib::ParamLoader::loadMatrixStatic2 (const std::string & name,
const Eigen::MatrixBase< Derived > & default_value,
int rows,
int cols 
)
+
+inline
+
+ +

Specialized method for loading Eigen matrix parameters with default value.

+

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). 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), the default value is used. Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.

+
Parameters
+ + + + + +
nameName of the parameter in the rosparam server.
default_valueThis value will be used if the parameter name is not found in the rosparam server.
rowsExpected number of rows of the matrix.
colsExpected number of columns of the matrix.
+
+
+
Returns
The loaded parameter value.
+ +
+
+ +

◆ loadMatrixStatic2() [4/4]

+ +
+
+
+template<typename T = double>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
MatrixX<T> mrs_lib::ParamLoader::loadMatrixStatic2 (const std::string & name,
int rows,
int cols 
)
+
+inline
+
+ +

Specialized method for loading compulsory Eigen matrix parameters.

+

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). 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), the loading process is unsuccessful. Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.

+
Parameters
+ + + + +
nameName of the parameter in the rosparam server.
rowsExpected number of rows of the matrix.
colsExpected number of columns of the matrix.
+
+
+
Returns
The loaded parameter value.
+ +
+
+ +

◆ loadParam() [1/8]

+ +
+
+
+template<typename T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
void mrs_lib::ParamLoader::loadParam (const std::string & name,
MatrixX< T > & mat,
const MatrixX< T > & default_value 
)
+
+inline
+
+ +

An overload for loading Eigen matrices.

+

For compulsory Eigen matrices, use loadMatrixStatic() or loadMatrixDynamic(). Matrix dimensions are deduced from the provided default value. 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), the default value is used. Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.

+
Parameters
+ + + + +
nameName of the parameter in the rosparam server.
out_valueReference to the variable to which the parameter value will be stored (such as a class member variable).
default_valueThis value will be used if the parameter name is not found in the rosparam server.
+
+
+ +
+
+ +

◆ loadParam() [2/8]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
bool mrs_lib::ParamLoader::loadParam (const std::string & name,
ros::Duration & out 
)
+
+inline
+
+ +

An overload for loading ros::Duration.

+

The duration will be loaded as a double, representing a number of seconds, and then converted to ros::Duration.

+
Parameters
+ + + +
nameName of the parameter in the rosparam server.
out_valueReference to the variable to which the parameter value will be stored (such as a class member variable).
+
+
+
Returns
true if the parameter was loaded from rosparam, false if the default value was used.
+ +
+
+ +

◆ loadParam() [3/8]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
bool mrs_lib::ParamLoader::loadParam (const std::string & name,
ros::Duration & out,
const ros::Duration & default_value 
)
+
+inline
+
+ +

An overload for loading ros::Duration.

+

The duration will be loaded as a double, representing a number of seconds, and then converted to ros::Duration.

+
Parameters
+ + + + +
nameName of the parameter in the rosparam server.
out_valueReference to the variable to which the parameter value will be stored (such as a class member variable).
default_valueThis value will be used if the parameter name is not found in the rosparam server.
+
+
+
Returns
true if the parameter was loaded from rosparam, false if the default value was used.
+ +
+
+ +

◆ loadParam() [4/8]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
bool mrs_lib::ParamLoader::loadParam (const std::string & name,
std_msgs::ColorRGBA & out,
const std_msgs::ColorRGBA & default_value = {} 
)
+
+inline
+
+ +

An overload for loading std_msgs::ColorRGBA.

+

The color will be loaded as several double -typed variables, representing the R, G, B and A color elements.

+
Parameters
+ + + + +
nameName of the parameter in the rosparam server.
out_valueReference to the variable to which the parameter value will be stored (such as a class member variable).
default_valueThis value will be used if the parameter name is not found in the rosparam server.
+
+
+
Returns
true if the parameter was loaded from rosparam, false if the default value was used.
+ +
+
+ +

◆ loadParam() [5/8]

+ +
+
+
+template<typename T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
bool mrs_lib::ParamLoader::loadParam (const std::string & name,
T & out_value 
)
+
+inline
+
+ +

Loads a compulsory parameter from the rosparam server.

+

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), the loading process is unsuccessful (loaded_successfully() will return false). Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.

+
Parameters
+ + + +
nameName of the parameter in the rosparam server.
out_valueReference to the variable to which the parameter value will be stored (such as a class member variable).
+
+
+
Returns
true if the parameter was loaded from rosparam, false if the default value was used.
+ +
+
+ +

◆ loadParam() [6/8]

+ +
+
+
+template<typename T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
bool mrs_lib::ParamLoader::loadParam (const std::string & name,
T & out_value,
const T & default_value 
)
+
+inline
+
+ +

Loads a parameter from the rosparam server with a default value.

+

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), the default value is used. Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.

+
Parameters
+ + + + +
nameName of the parameter in the rosparam server.
out_valueReference to the variable to which the parameter value will be stored (such as a class member variable).
default_valueThis value will be used if the parameter name is not found in the rosparam server.
+
+
+
Returns
true if the parameter was loaded from rosparam, false if the default value was used.
+
Examples
param_loader/example.cpp.
+
+ +
+
+ +

◆ loadParam() [7/8]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
bool mrs_lib::ParamLoader::loadParam (const std::string & name,
XmlRpc::XmlRpcValue & out 
)
+
+inline
+
+ +

An overload for loading a compulsory XmlRpc::XmlRpcValue.

+

This can be used if you want to manually parse some more complex parameter but still take advantage of ParamLoader.

Warning
XmlRpc::XmlRpcValue must be loaded from a rosparam server and not directly from a YAML file (i.e. you cannot use it to load parameters from a file added using the addYamlFile() or addYamlFileFromParam() methods).
+
Parameters
+ + + +
nameName of the parameter in the rosparam server.
out_valueReference to the variable to which the parameter value will be stored (such as a class member variable).
+
+
+
Returns
true if the parameter was loaded from rosparam, false if the default value was used.
+ +
+
+ +

◆ loadParam() [8/8]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
bool mrs_lib::ParamLoader::loadParam (const std::string & name,
XmlRpc::XmlRpcValue & out,
const XmlRpc::XmlRpcValue & default_value 
)
+
+inline
+
+ +

An overload for loading an optional XmlRpc::XmlRpcValue.

+

This can be used if you want to manually parse some more complex parameter but still take advantage of ParamLoader.

Warning
XmlRpc::XmlRpcValue must be loaded from a rosparam server and not directly from a YAML file (i.e. you cannot use it to load parameters from a file added using the addYamlFile() or addYamlFileFromParam() methods).
+
Parameters
+ + + + +
nameName of the parameter in the rosparam server.
out_valueReference to the variable to which the parameter value will be stored (such as a class member variable).
default_valueThis value will be used if the parameter name is not found in the rosparam server.
+
+
+
Returns
true if the parameter was loaded from rosparam, false if the default value was used.
+ +
+
+ +

◆ loadParam2() [1/5]

+ +
+
+
+template<typename T >
+ + + + + +
+ + + + + + + + +
T mrs_lib::ParamLoader::loadParam2 (const std::string & name)
+
+inline
+
+ +

Loads a compulsory parameter from the rosparam server.

+

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), the loading process is unsuccessful (loaded_successfully() will return false). Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.

+
Parameters
+ + +
nameName of the parameter in the rosparam server.
+
+
+
Returns
The loaded parameter value.
+ +
+
+ +

◆ loadParam2() [2/5]

+ +
+
+
+template<typename T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
MatrixX<T> mrs_lib::ParamLoader::loadParam2 (const std::string & name,
const MatrixX< T > & default_value 
)
+
+inline
+
+ +

An overload for loading Eigen matrices.

+

For compulsory Eigen matrices, use loadMatrixStatic() or loadMatrixDynamic(). Matrix dimensions are deduced from the provided default value. 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), the default value is used. Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.

+
Parameters
+ + + +
nameName of the parameter in the rosparam server.
default_valueThis value will be used if the parameter name is not found in the rosparam server.
+
+
+
Returns
The loaded parameter value.
+ +
+
+ +

◆ loadParam2() [3/5]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
std_msgs::ColorRGBA mrs_lib::ParamLoader::loadParam2 (const std::string & name,
const std_msgs::ColorRGBA & default_value = {} 
)
+
+inline
+
+ +

An overload for loading std_msgs::ColorRGBA.

+

The color will be loaded as several double -typed variables, representing the R, G, B and A color elements.

+
Parameters
+ + + +
nameName of the parameter in the rosparam server.
default_valueThis value will be used if the parameter name is not found in the rosparam server.
+
+
+
Returns
The loaded parameter value.
+ +
+
+ +

◆ loadParam2() [4/5]

+ +
+
+
+template<typename T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
T mrs_lib::ParamLoader::loadParam2 (const std::string & name,
const T & default_value 
)
+
+inline
+
+ +

Loads a parameter from the rosparam server with a default value.

+

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), the default value is used. Using this method, the parameter can only be loaded once using the same ParamLoader instance without error.

+
Parameters
+ + + +
nameName of the parameter in the rosparam server.
default_valueThis value will be used if the parameter name is not found in the rosparam server.
+
+
+
Returns
The loaded parameter value.
+
Examples
param_loader/example.cpp.
+
+ +
+
+ +

◆ loadParam2() [5/5]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
XmlRpc::XmlRpcValue mrs_lib::ParamLoader::loadParam2 (const std::string & name,
const XmlRpc::XmlRpcValue & default_value 
)
+
+inline
+
+ +

An overload for loading an optional XmlRpc::XmlRpcValue.

+

This can be used if you want to manually parse some more complex parameter but still take advantage of ParamLoader.

Warning
XmlRpc::XmlRpcValue must be loaded from a rosparam server and not directly from a YAML file (i.e. you cannot use it to load parameters from a file added using the addYamlFile() or addYamlFileFromParam() methods).
+
Parameters
+ + + +
nameName of the parameter in the rosparam server.
default_valueThis value will be used if the parameter name is not found in the rosparam server.
+
+
+
Returns
the loaded parameter.
+ +
+
+ +

◆ loadParamReusable() [1/2]

+ +
+
+
+template<typename T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
bool mrs_lib::ParamLoader::loadParamReusable (const std::string & name,
T & out_value 
)
+
+inline
+
+ +

Loads a compulsory parameter from the rosparam server.

+

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), the loading process is unsuccessful (loaded_successfully() will return false). Using this method, the parameter can be loaded multiple times using the same ParamLoader instance without error.

+
Parameters
+ + + +
nameName of the parameter in the rosparam server.
out_valueReference to the variable to which the parameter value will be stored (such as a class member variable).
+
+
+
Returns
true if the parameter was loaded from rosparam, false if the default value was used.
+ +
+
+ +

◆ loadParamReusable() [2/2]

+ +
+
+
+template<typename T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
bool mrs_lib::ParamLoader::loadParamReusable (const std::string & name,
T & out_value,
const T & default_value 
)
+
+inline
+
+ +

Loads a parameter from the rosparam server with a default value.

+

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), the default value is used. Using this method, the parameter can be loaded multiple times using the same ParamLoader instance without error.

+
Parameters
+ + + + +
nameName of the parameter in the rosparam server.
out_valueReference to the variable to which the parameter value will be stored (such as a class member variable).
default_valueThis value will be used if the parameter name is not found in the rosparam server.
+
+
+
Returns
true if the parameter was loaded from rosparam, false if the default value was used.
+ +
+
+ +

◆ loadParamReusable2() [1/2]

+ +
+
+
+template<typename T >
+ + + + + +
+ + + + + + + + +
T mrs_lib::ParamLoader::loadParamReusable2 (const std::string & name)
+
+inline
+
+ +

Loads a compulsory parameter from the rosparam server.

+

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), the loading process is unsuccessful (loaded_successfully() will return false). Using this method, the parameter can be loaded multiple times using the same ParamLoader instance without error.

+
Parameters
+ + +
nameName of the parameter in the rosparam server.
+
+
+
Returns
The loaded parameter value.
+ +
+
+ +

◆ loadParamReusable2() [2/2]

+ +
+
+
+template<typename T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
T mrs_lib::ParamLoader::loadParamReusable2 (const std::string & name,
const T & default_value 
)
+
+inline
+
+ +

Loads an optional reusable parameter from the rosparam server.

+

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), the default value is used. Using this method, the parameter can be loaded multiple times using the same ParamLoader instance without error.

+
Parameters
+ + + +
nameName of the parameter in the rosparam server.
default_valueThis value will be used if the parameter name is not found in the rosparam server.
+
+
+
Returns
The loaded parameter value.
+ +
+
+ +

◆ setPrefix()

+ +
+
+ + + + + +
+ + + + + + + + +
void mrs_lib::ParamLoader::setPrefix (const std::string & prefix)
+
+inline
+
+ +

All loaded parameters will be prefixed with this string.

+
Parameters
+ + +
prefixthe prefix to be applied to all loaded parameters from now on.
+
+
+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/classmrs__lib_1_1ParamLoader.js b/classmrs__lib_1_1ParamLoader.js new file mode 100644 index 00000000..932d5c33 --- /dev/null +++ b/classmrs__lib_1_1ParamLoader.js @@ -0,0 +1,44 @@ +var classmrs__lib_1_1ParamLoader = +[ + [ "ParamLoader", "classmrs__lib_1_1ParamLoader.html#a26079fe045fe261add0548c40c5d3baa", null ], + [ "ParamLoader", "classmrs__lib_1_1ParamLoader.html#a09d03d4f79736e8269f66ba2f11356c5", null ], + [ "ParamLoader", "classmrs__lib_1_1ParamLoader.html#ac3de917c61f02060c4e28afb2765f71c", null ], + [ "addYamlFile", "classmrs__lib_1_1ParamLoader.html#a7e0a9d3c3ca4e85692999f99b51e53e7", null ], + [ "addYamlFileFromParam", "classmrs__lib_1_1ParamLoader.html#a3ae6c294bc7bcf0fa17557ee36e04b31", null ], + [ "getPrefix", "classmrs__lib_1_1ParamLoader.html#a68eb35df103229cd2de7416252723bf8", null ], + [ "loadedSuccessfully", "classmrs__lib_1_1ParamLoader.html#ad49130b893f09bc2247e2bc37a41f6d5", null ], + [ "loadMatrixArray", "classmrs__lib_1_1ParamLoader.html#af5397147ce0a3ecaf0e1f178a9435183", null ], + [ "loadMatrixArray", "classmrs__lib_1_1ParamLoader.html#aaeaec89a76f044b2e5fe2883ae768942", null ], + [ "loadMatrixArray2", "classmrs__lib_1_1ParamLoader.html#af7ffe39a26bd4a457ab01b83e5d5795d", null ], + [ "loadMatrixArray2", "classmrs__lib_1_1ParamLoader.html#a46bb91300eaa5c0d06d462b950f92897", null ], + [ "loadMatrixDynamic", "classmrs__lib_1_1ParamLoader.html#a6b1fbdb2c1ed41ac533a67abad8638d9", null ], + [ "loadMatrixDynamic", "classmrs__lib_1_1ParamLoader.html#aabecb03ea3643752ddc3154e6c58d390", null ], + [ "loadMatrixDynamic2", "classmrs__lib_1_1ParamLoader.html#a99673cb2d8f39c18da5e6db967238ec9", null ], + [ "loadMatrixDynamic2", "classmrs__lib_1_1ParamLoader.html#a89bdbb61a1de508cc0f247f234d824d6", null ], + [ "loadMatrixStatic", "classmrs__lib_1_1ParamLoader.html#a03dc26f5fad92b0fb8b7437c074b23aa", null ], + [ "loadMatrixStatic", "classmrs__lib_1_1ParamLoader.html#a19bc5cbd5c3ee7d4614555dfe3d96001", null ], + [ "loadMatrixStatic", "classmrs__lib_1_1ParamLoader.html#af96b60fd7bce95d3e1d3aa351bccba9b", null ], + [ "loadMatrixStatic", "classmrs__lib_1_1ParamLoader.html#aafc3bb716f3728d5a1b1cfc45b0d3ddf", null ], + [ "loadMatrixStatic2", "classmrs__lib_1_1ParamLoader.html#a2a78e5b64d8681a46976a6e9d0486b1a", null ], + [ "loadMatrixStatic2", "classmrs__lib_1_1ParamLoader.html#ab6b1b2b00e8548b092893afcfbeee79f", null ], + [ "loadMatrixStatic2", "classmrs__lib_1_1ParamLoader.html#af8ab00da18479e583adf86983e77c577", null ], + [ "loadMatrixStatic2", "classmrs__lib_1_1ParamLoader.html#af06e1f2bdf94f8a18a19ae3e77a0f99a", null ], + [ "loadParam", "classmrs__lib_1_1ParamLoader.html#a6ee4d78d716c92045a38c40d6ae41c4d", null ], + [ "loadParam", "classmrs__lib_1_1ParamLoader.html#ae4893dc129c5f6fd07fc26f6c03279cd", null ], + [ "loadParam", "classmrs__lib_1_1ParamLoader.html#a5368f22f9c1eee287b39bcc91b8d8f42", null ], + [ "loadParam", "classmrs__lib_1_1ParamLoader.html#a472acaab459f4318dc20df8416b6023d", null ], + [ "loadParam", "classmrs__lib_1_1ParamLoader.html#af5d9f2ac1549f9a7f03a04b9cebf9fed", null ], + [ "loadParam", "classmrs__lib_1_1ParamLoader.html#a9e55225fa7d9de0e948b2e64494eb229", null ], + [ "loadParam", "classmrs__lib_1_1ParamLoader.html#a759df0d67059a44f87d1205782d4e4f7", null ], + [ "loadParam", "classmrs__lib_1_1ParamLoader.html#a297d547c380c4ca1eab5903fcbbc5f42", null ], + [ "loadParam2", "classmrs__lib_1_1ParamLoader.html#ab8a37a3b88261e120d6ff36a6aebf960", null ], + [ "loadParam2", "classmrs__lib_1_1ParamLoader.html#a080f2c2605b42219c63d62d0fd8e0948", null ], + [ "loadParam2", "classmrs__lib_1_1ParamLoader.html#a708d62a49386efe8334d8c13af2d8f85", null ], + [ "loadParam2", "classmrs__lib_1_1ParamLoader.html#a7b31603059669efa75b00d8e73bc163a", null ], + [ "loadParam2", "classmrs__lib_1_1ParamLoader.html#a880ad3b0f30ecd7b7742766253422c6a", null ], + [ "loadParamReusable", "classmrs__lib_1_1ParamLoader.html#a31b36d7e1109d2c1d663122c689359c0", null ], + [ "loadParamReusable", "classmrs__lib_1_1ParamLoader.html#add294058e4857eda6a8ece7e0b451390", null ], + [ "loadParamReusable2", "classmrs__lib_1_1ParamLoader.html#abe9a7f5aea80c8cdb2d624c12f098a90", null ], + [ "loadParamReusable2", "classmrs__lib_1_1ParamLoader.html#ae3e15767c2e94a1f22a9205ae3f507f1", null ], + [ "setPrefix", "classmrs__lib_1_1ParamLoader.html#a8ad978834d5d6d1745a96f1ecc65a759", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1ParamProvider-members.html b/classmrs__lib_1_1ParamProvider-members.html new file mode 100644 index 00000000..017f137c --- /dev/null +++ b/classmrs__lib_1_1ParamProvider-members.html @@ -0,0 +1,108 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::ParamProvider Member List
+
+
+ +

This is the complete list of members for mrs_lib::ParamProvider, including all inherited members.

+ + + + + +
addYamlFile(const std::string &filepath)mrs_lib::ParamProvider
getParam(const std::string &param_name, T &value_out) constmrs_lib::ParamProvider
getParam(const std::string &param_name, XmlRpc::XmlRpcValue &value_out) constmrs_lib::ParamProvider
ParamProvider(const ros::NodeHandle &nh, std::string node_name, const bool use_rosparam=true)mrs_lib::ParamProvider
+
+ + + + diff --git a/classmrs__lib_1_1ParamProvider.html b/classmrs__lib_1_1ParamProvider.html new file mode 100644 index 00000000..bc4e63d7 --- /dev/null +++ b/classmrs__lib_1_1ParamProvider.html @@ -0,0 +1,289 @@ + + + + + + + +mrs_lib: mrs_lib::ParamProvider Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::ParamProvider Class Reference
+
+
+ +

Helper class for ParamLoader. + More...

+ +

#include <param_provider.h>

+ + + + + + + + + + + + + + + +

+Public Member Functions

 ParamProvider (const ros::NodeHandle &nh, std::string node_name, const bool use_rosparam=true)
 Main constructor. More...
 
bool addYamlFile (const std::string &filepath)
 Add a YAML file to be parsed and used for loading parameters. More...
 
template<typename T >
bool getParam (const std::string &param_name, T &value_out) const
 Gets the value of a parameter. More...
 
bool getParam (const std::string &param_name, XmlRpc::XmlRpcValue &value_out) const
 Specialization of getParam() for the XmlRpcValue type. More...
 
+

Detailed Description

+

Helper class for ParamLoader.

+

This class abstracts away loading of parameters from ROS parameter server and directly from YAML files ("static" parameters). The user can specify a number of YAML files that will be parsed and when a parameter value is requested, these are checked first before attempting to load the parameter from the ROS server (which can be slow). The YAML files are searched in FIFO order and when a matching name is found in a file, its value is returned.

+

Constructor & Destructor Documentation

+ +

◆ ParamProvider()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::ParamProvider::ParamProvider (const ros::NodeHandle & nh,
std::string node_name,
const bool use_rosparam = true 
)
+
+ +

Main constructor.

+
Parameters
+ + + + +
nhThe parameters will be loaded from rosparam using this node handle.
node_nameOptional node name used when printing the loaded values or loading errors.
use_rosparamIf true, parameters that weren't found in the YAML files will be attempted to be loaded from ROS.
+
+
+ +
+
+

Member Function Documentation

+ +

◆ addYamlFile()

+ +
+
+ + + + + + + + +
bool mrs_lib::ParamProvider::addYamlFile (const std::string & filepath)
+
+ +

Add a YAML file to be parsed and used for loading parameters.

+

The first file added will be the first file searched for a parameter when using getParam().

+
Parameters
+ + +
filepathPath to the YAML file.
+
+
+ +
+
+ +

◆ getParam() [1/2]

+ +
+
+
+template<typename T >
+ + + + + + + + + + + + + + + + + + +
bool mrs_lib::ParamProvider::getParam (const std::string & param_name,
T & value_out 
) const
+
+ +

Gets the value of a parameter.

+

Firstly, the parameter is attempted to be loaded from the YAML files added by the addYamlFile() method in the same order that they were added. If the parameter is not found in any YAML file, and the use_rosparam flag of the constructor is true, the ParamProvider will attempt to load it from the ROS parameter server.

+
Parameters
+ + + +
param_nameName of the parameter to be loaded. Namespaces should be separated with a forward slash '/'.
value_outOutput argument that will hold the value of the loaded parameter, if successfull. Not modified otherwise.
+
+
+
Returns
Returns true iff the parameter was successfully loaded.
+ +
+
+ +

◆ getParam() [2/2]

+ +
+
+ + + + + + + + + + + + + + + + + + +
bool mrs_lib::ParamProvider::getParam (const std::string & param_name,
XmlRpc::XmlRpcValue & value_out 
) const
+
+ +

Specialization of getParam() for the XmlRpcValue type.

+

The XmlRpc::XmlRpcValue can be useful for manual parsing of more complex types.

+
Warning
XmlRpc::XmlRpcValue parameters cannot be loaded from a YAML file - only from ROS!
+
Parameters
+ + + +
param_nameName of the parameter to be loaded. Namespaces should be separated with a forward slash '/'.
value_outOutput argument that will hold the value of the loaded parameter, if successfull. Not modified otherwise.
+
+
+
Returns
Returns true iff the parameter was successfully loaded.
+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/classmrs__lib_1_1ParamProvider.js b/classmrs__lib_1_1ParamProvider.js new file mode 100644 index 00000000..5e605604 --- /dev/null +++ b/classmrs__lib_1_1ParamProvider.js @@ -0,0 +1,7 @@ +var classmrs__lib_1_1ParamProvider = +[ + [ "ParamProvider", "classmrs__lib_1_1ParamProvider.html#aa6f38dd58d2fd1093d6646134a5d6e59", null ], + [ "addYamlFile", "classmrs__lib_1_1ParamProvider.html#a137506901a03daeaaebcb5544de777f0", null ], + [ "getParam", "classmrs__lib_1_1ParamProvider.html#a6b3be6133e7eecc3f15b3c898c0911e0", null ], + [ "getParam", "classmrs__lib_1_1ParamProvider.html#aa3106f4d258195b890e8583d485c7547", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1Polygon-members.html b/classmrs__lib_1_1Polygon-members.html new file mode 100644 index 00000000..c9e8b1c8 --- /dev/null +++ b/classmrs__lib_1_1Polygon-members.html @@ -0,0 +1,110 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::Polygon Member List
+
+
+ +

This is the complete list of members for mrs_lib::Polygon, including all inherited members.

+ + + + + + + +
doesSectionIntersect(const double startX, const double startY, const double endX, const double endY) (defined in mrs_lib::Polygon)mrs_lib::Polygon
getPointMessageVector(const double z) (defined in mrs_lib::Polygon)mrs_lib::Polygon
inflateSelf(double amount) (defined in mrs_lib::Polygon)mrs_lib::Polygon
isClockwise() (defined in mrs_lib::Polygon)mrs_lib::Polygon
isPointInside(const double px, const double py) (defined in mrs_lib::Polygon)mrs_lib::Polygon
Polygon(const Eigen::MatrixXd vertices) (defined in mrs_lib::Polygon)mrs_lib::Polygon
+
+ + + + diff --git a/classmrs__lib_1_1Polygon.html b/classmrs__lib_1_1Polygon.html new file mode 100644 index 00000000..348149b0 --- /dev/null +++ b/classmrs__lib_1_1Polygon.html @@ -0,0 +1,141 @@ + + + + + + + +mrs_lib: mrs_lib::Polygon Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::Polygon Class Reference
+
+
+ + + + + + + + +

+Classes

struct  ExtraVertices
 
struct  WrongNumberOfColumns
 
struct  WrongNumberOfVertices
 
+ + + + + + + + + + + + + +

+Public Member Functions

Polygon (const Eigen::MatrixXd vertices)
 
+bool isPointInside (const double px, const double py)
 
+bool doesSectionIntersect (const double startX, const double startY, const double endX, const double endY)
 
+bool isClockwise ()
 
+void inflateSelf (double amount)
 
+std::vector< geometry_msgs::Point > getPointMessageVector (const double z)
 
+
The documentation for this class was generated from the following files:
    +
  • include/mrs_lib/safety_zone/polygon.h
  • +
  • src/safety_zone/polygon/polygon.cpp
  • +
+
+
+ + + + diff --git a/classmrs__lib_1_1Polygon.js b/classmrs__lib_1_1Polygon.js new file mode 100644 index 00000000..a77eacd6 --- /dev/null +++ b/classmrs__lib_1_1Polygon.js @@ -0,0 +1,12 @@ +var classmrs__lib_1_1Polygon = +[ + [ "ExtraVertices", "structmrs__lib_1_1Polygon_1_1ExtraVertices.html", "structmrs__lib_1_1Polygon_1_1ExtraVertices" ], + [ "WrongNumberOfColumns", "structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns.html", "structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns" ], + [ "WrongNumberOfVertices", "structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices.html", "structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices" ], + [ "Polygon", "classmrs__lib_1_1Polygon.html#a000afa1f46e867c63100b08fcd8656ee", null ], + [ "doesSectionIntersect", "classmrs__lib_1_1Polygon.html#a3a8003ab7f027475cb416e02b5772d7b", null ], + [ "getPointMessageVector", "classmrs__lib_1_1Polygon.html#a86a38fbc31a7218a8713c4db8aa8d990", null ], + [ "inflateSelf", "classmrs__lib_1_1Polygon.html#a76512a8ac70d056b7bb7661e6b7e5abc", null ], + [ "isClockwise", "classmrs__lib_1_1Polygon.html#a1b1b5c8674b256ca13266a92b3e09d79", null ], + [ "isPointInside", "classmrs__lib_1_1Polygon.html#a65e1c25641c33882c2ad6e913dbcdc84", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1Profiler-members.html b/classmrs__lib_1_1Profiler-members.html new file mode 100644 index 00000000..d9165f5b --- /dev/null +++ b/classmrs__lib_1_1Profiler-members.html @@ -0,0 +1,110 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::Profiler Member List
+
+
+ +

This is the complete list of members for mrs_lib::Profiler, including all inherited members.

+ + + + + + + +
createRoutine(std::string name, double expected_rate, double threshold, ros::TimerEvent event)mrs_lib::Profiler
createRoutine(std::string name)mrs_lib::Profiler
operator=(const Profiler &other)mrs_lib::Profiler
Profiler()mrs_lib::Profiler
Profiler(ros::NodeHandle &nh, std::string node_name, bool profiler_enabled)mrs_lib::Profiler
Profiler(const Profiler &other)mrs_lib::Profiler
+
+ + + + diff --git a/classmrs__lib_1_1Profiler.html b/classmrs__lib_1_1Profiler.html new file mode 100644 index 00000000..e88a1172 --- /dev/null +++ b/classmrs__lib_1_1Profiler.html @@ -0,0 +1,310 @@ + + + + + + + +mrs_lib: mrs_lib::Profiler Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::Profiler Class Reference
+
+
+ + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

Profiler ()
 the basic constructor
 
 Profiler (ros::NodeHandle &nh, std::string node_name, bool profiler_enabled)
 the full constructor More...
 
 Profiler (const Profiler &other)
 the copy constructor More...
 
Profileroperator= (const Profiler &other)
 the assignment operator More...
 
Routine createRoutine (std::string name, double expected_rate, double threshold, ros::TimerEvent event)
 create a routine for a periodic function More...
 
Routine createRoutine (std::string name)
 create a routine for an aperiodic function More...
 
+

Constructor & Destructor Documentation

+ +

◆ Profiler() [1/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::Profiler::Profiler (ros::NodeHandle & nh,
std::string node_name,
bool profiler_enabled 
)
+
+ +

the full constructor

+
Parameters
+ + + + +
nhnode handle
node_namethe node name
profiler_enabledif profiling is enabled
+
+
+ +
+
+ +

◆ Profiler() [2/2]

+ +
+
+ + + + + + + + +
mrs_lib::Profiler::Profiler (const Profilerother)
+
+ +

the copy constructor

+
Parameters
+ + +
otherthe other object
+
+
+ +
+
+

Member Function Documentation

+ +

◆ createRoutine() [1/2]

+ +
+
+ + + + + + + + +
Routine mrs_lib::Profiler::createRoutine (std::string name)
+
+ +

create a routine for an aperiodic function

+
Parameters
+ + +
namethe function name
+
+
+
Returns
the Routine
+ +
+
+ +

◆ createRoutine() [2/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Routine mrs_lib::Profiler::createRoutine (std::string name,
double expected_rate,
double threshold,
ros::TimerEvent event 
)
+
+ +

create a routine for a periodic function

+
Parameters
+ + + + + +
namethe function name
expected_ratethe expected rate in Hz
thresholdthe delay threshold to mark it as "late" in s
eventthe ros Timer event
+
+
+
Returns
the Routine
+ +
+
+ +

◆ operator=()

+ +
+
+ + + + + + + + +
Profiler & mrs_lib::Profiler::operator= (const Profilerother)
+
+ +

the assignment operator

+
Parameters
+ + +
otherthe other object
+
+
+
Returns
this object
+ +
+
+
The documentation for this class was generated from the following files:
    +
  • include/mrs_lib/profiler.h
  • +
  • src/profiler/profiler.cpp
  • +
+
+
+ + + + diff --git a/classmrs__lib_1_1Profiler.js b/classmrs__lib_1_1Profiler.js new file mode 100644 index 00000000..f2801403 --- /dev/null +++ b/classmrs__lib_1_1Profiler.js @@ -0,0 +1,9 @@ +var classmrs__lib_1_1Profiler = +[ + [ "Profiler", "classmrs__lib_1_1Profiler.html#aeb0acb43639e4e29572b1ecbedf6029e", null ], + [ "Profiler", "classmrs__lib_1_1Profiler.html#a1a61b447fb65e1d09a0bd6dab57c73eb", null ], + [ "Profiler", "classmrs__lib_1_1Profiler.html#ac384b6aa30ce0f43ee8d38eaad93ca28", null ], + [ "createRoutine", "classmrs__lib_1_1Profiler.html#a631e75be501cf4353dc8578bd9f66029", null ], + [ "createRoutine", "classmrs__lib_1_1Profiler.html#aaf170ec3c6f67e11931cde978a5d3750", null ], + [ "operator=", "classmrs__lib_1_1Profiler.html#ae054cd2655538ee7b4a0dec35aa0cf16", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1PublisherHandler-members.html b/classmrs__lib_1_1PublisherHandler-members.html new file mode 100644 index 00000000..586b14fd --- /dev/null +++ b/classmrs__lib_1_1PublisherHandler-members.html @@ -0,0 +1,113 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::PublisherHandler< TopicType > Member List
+
+
+ +

This is the complete list of members for mrs_lib::PublisherHandler< TopicType >, including all inherited members.

+ + + + + + + + + + +
getNumSubscribers(void)mrs_lib::PublisherHandler< TopicType >
operator=(const PublisherHandler &other)mrs_lib::PublisherHandler< TopicType >
publish(const TopicType &msg)mrs_lib::PublisherHandler< TopicType >
publish(const boost::shared_ptr< TopicType > &msg)mrs_lib::PublisherHandler< TopicType >
publish(const boost::shared_ptr< TopicType const > &msg)mrs_lib::PublisherHandler< TopicType >
PublisherHandler(void)mrs_lib::PublisherHandler< TopicType >inline
PublisherHandler(const PublisherHandler &other)mrs_lib::PublisherHandler< TopicType >
PublisherHandler(ros::NodeHandle &nh, const std::string &address, const unsigned int &buffer_size=1, const bool &latch=false, const double &rate=0)mrs_lib::PublisherHandler< TopicType >
~PublisherHandler(void)mrs_lib::PublisherHandler< TopicType >inline
+
+ + + + diff --git a/classmrs__lib_1_1PublisherHandler.html b/classmrs__lib_1_1PublisherHandler.html new file mode 100644 index 00000000..eab01af2 --- /dev/null +++ b/classmrs__lib_1_1PublisherHandler.html @@ -0,0 +1,377 @@ + + + + + + + +mrs_lib: mrs_lib::PublisherHandler< TopicType > Class Template Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::PublisherHandler< TopicType > Class Template Reference
+
+
+ +

user wrapper of the publisher handler implementation + More...

+ +

#include <publisher_handler.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

PublisherHandler (void)
 generic constructor
 
~PublisherHandler (void)
 generic destructor
 
PublisherHandleroperator= (const PublisherHandler &other)
 operator= More...
 
 PublisherHandler (const PublisherHandler &other)
 copy constructor More...
 
 PublisherHandler (ros::NodeHandle &nh, const std::string &address, const unsigned int &buffer_size=1, const bool &latch=false, const double &rate=0)
 constructor More...
 
void publish (const TopicType &msg)
 publish message More...
 
void publish (const boost::shared_ptr< TopicType > &msg)
 publish message, boost ptr overload More...
 
void publish (const boost::shared_ptr< TopicType const > &msg)
 publish message, boost const ptr overload More...
 
unsigned int getNumSubscribers (void)
 get number of subscribers More...
 
+

Detailed Description

+

template<class TopicType>
+class mrs_lib::PublisherHandler< TopicType >

+ +

user wrapper of the publisher handler implementation

+

Constructor & Destructor Documentation

+ +

◆ PublisherHandler() [1/2]

+ +
+
+
+template<class TopicType >
+ + + + + + + + +
mrs_lib::PublisherHandler< TopicType >::PublisherHandler (const PublisherHandler< TopicType > & other)
+
+ +

copy constructor

+
Parameters
+ + +
other
+
+
+ +
+
+ +

◆ PublisherHandler() [2/2]

+ +
+
+
+template<class TopicType >
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::PublisherHandler< TopicType >::PublisherHandler (ros::NodeHandle & nh,
const std::string & address,
const unsigned int & buffer_size = 1,
const bool & latch = false,
const double & rate = 0 
)
+
+ +

constructor

+
Parameters
+ + + + + +
nhROS node handler
addresstopic address
buffer_sizebuffer size
latchlatching
+
+
+ +
+
+

Member Function Documentation

+ +

◆ getNumSubscribers()

+ +
+
+
+template<class TopicType >
+ + + + + + + + +
unsigned int mrs_lib::PublisherHandler< TopicType >::getNumSubscribers (void )
+
+ +

get number of subscribers

+
Returns
the number of subscribers
+ +
+
+ +

◆ operator=()

+ +
+
+
+template<class TopicType >
+ + + + + + + + +
PublisherHandler< TopicType > & mrs_lib::PublisherHandler< TopicType >::operator= (const PublisherHandler< TopicType > & other)
+
+ +

operator=

+
Parameters
+ + +
other
+
+
+
Returns
+ +
+
+ +

◆ publish() [1/3]

+ +
+
+
+template<class TopicType >
+ + + + + + + + +
void mrs_lib::PublisherHandler< TopicType >::publish (const boost::shared_ptr< TopicType > & msg)
+
+ +

publish message, boost ptr overload

+
Parameters
+ + +
msg
+
+
+ +
+
+ +

◆ publish() [2/3]

+ +
+
+
+template<class TopicType >
+ + + + + + + + +
void mrs_lib::PublisherHandler< TopicType >::publish (const boost::shared_ptr< TopicType const > & msg)
+
+ +

publish message, boost const ptr overload

+
Parameters
+ + +
msg
+
+
+ +
+
+ +

◆ publish() [3/3]

+ +
+
+
+template<class TopicType >
+ + + + + + + + +
void mrs_lib::PublisherHandler< TopicType >::publish (const TopicType & msg)
+
+ +

publish message

+
Parameters
+ + +
msg
+
+
+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/classmrs__lib_1_1PublisherHandler.js b/classmrs__lib_1_1PublisherHandler.js new file mode 100644 index 00000000..a0eb9aaa --- /dev/null +++ b/classmrs__lib_1_1PublisherHandler.js @@ -0,0 +1,12 @@ +var classmrs__lib_1_1PublisherHandler = +[ + [ "PublisherHandler", "classmrs__lib_1_1PublisherHandler.html#aefafd64bd0d8a9b9717c94b76368fd0d", null ], + [ "~PublisherHandler", "classmrs__lib_1_1PublisherHandler.html#a9acaa1ef56768636f2163c75dd9e307e", null ], + [ "PublisherHandler", "classmrs__lib_1_1PublisherHandler.html#a08abb836db076c390101880ff34b8fe8", null ], + [ "PublisherHandler", "classmrs__lib_1_1PublisherHandler.html#a334376e25e8fb011ca27736cd2cf12b7", null ], + [ "getNumSubscribers", "classmrs__lib_1_1PublisherHandler.html#acae5a82536022514c6a2cefa2f7980b1", null ], + [ "operator=", "classmrs__lib_1_1PublisherHandler.html#a23a8578213fd78347ebaa259ee17c218", null ], + [ "publish", "classmrs__lib_1_1PublisherHandler.html#a3201fd4703f7e9cec24de7bc189356a5", null ], + [ "publish", "classmrs__lib_1_1PublisherHandler.html#ace9906a5cf9ae33115fc44af0e078f3f", null ], + [ "publish", "classmrs__lib_1_1PublisherHandler.html#a0c5bebc2848b0547048edb1297833290", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1PublisherHandler__impl-members.html b/classmrs__lib_1_1PublisherHandler__impl-members.html new file mode 100644 index 00000000..d02ef64f --- /dev/null +++ b/classmrs__lib_1_1PublisherHandler__impl-members.html @@ -0,0 +1,111 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::PublisherHandler_impl< TopicType > Member List
+
+
+ +

This is the complete list of members for mrs_lib::PublisherHandler_impl< TopicType >, including all inherited members.

+ + + + + + + + +
getNumSubscribers(void)mrs_lib::PublisherHandler_impl< TopicType >
publish(const TopicType &msg)mrs_lib::PublisherHandler_impl< TopicType >
publish(const boost::shared_ptr< TopicType > &msg)mrs_lib::PublisherHandler_impl< TopicType >
publish(const boost::shared_ptr< TopicType const > &msg)mrs_lib::PublisherHandler_impl< TopicType >
PublisherHandler_impl(void)mrs_lib::PublisherHandler_impl< TopicType >
PublisherHandler_impl(ros::NodeHandle &nh, const std::string &address, const unsigned int &buffer_size=1, const bool &latch=false, const double &rate=0.0)mrs_lib::PublisherHandler_impl< TopicType >
~PublisherHandler_impl(void)mrs_lib::PublisherHandler_impl< TopicType >inline
+
+ + + + diff --git a/classmrs__lib_1_1PublisherHandler__impl.html b/classmrs__lib_1_1PublisherHandler__impl.html new file mode 100644 index 00000000..81f851da --- /dev/null +++ b/classmrs__lib_1_1PublisherHandler__impl.html @@ -0,0 +1,314 @@ + + + + + + + +mrs_lib: mrs_lib::PublisherHandler_impl< TopicType > Class Template Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::PublisherHandler_impl< TopicType > Class Template Reference
+
+
+ +

implementation of the publisher handler + More...

+ +

#include <publisher_handler.h>

+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

PublisherHandler_impl (void)
 default constructor
 
~PublisherHandler_impl (void)
 default destructor
 
 PublisherHandler_impl (ros::NodeHandle &nh, const std::string &address, const unsigned int &buffer_size=1, const bool &latch=false, const double &rate=0.0)
 constructor More...
 
void publish (const TopicType &msg)
 publish message More...
 
void publish (const boost::shared_ptr< TopicType > &msg)
 publish message, boost ptr overload More...
 
void publish (const boost::shared_ptr< TopicType const > &msg)
 publish message, boost const ptr overload More...
 
unsigned int getNumSubscribers (void)
 get number of subscribers More...
 
+

Detailed Description

+

template<class TopicType>
+class mrs_lib::PublisherHandler_impl< TopicType >

+ +

implementation of the publisher handler

+

Constructor & Destructor Documentation

+ +

◆ PublisherHandler_impl()

+ +
+
+
+template<class TopicType >
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::PublisherHandler_impl< TopicType >::PublisherHandler_impl (ros::NodeHandle & nh,
const std::string & address,
const unsigned int & buffer_size = 1,
const bool & latch = false,
const double & rate = 0.0 
)
+
+ +

constructor

+
Parameters
+ + + + + +
nhROS node handler
addresstopic address
buffer_sizebuffer size
latchlatching
+
+
+ +
+
+

Member Function Documentation

+ +

◆ getNumSubscribers()

+ +
+
+
+template<class TopicType >
+ + + + + + + + +
unsigned int mrs_lib::PublisherHandler_impl< TopicType >::getNumSubscribers (void )
+
+ +

get number of subscribers

+
Returns
the number of subscribers
+ +
+
+ +

◆ publish() [1/3]

+ +
+
+
+template<class TopicType >
+ + + + + + + + +
void mrs_lib::PublisherHandler_impl< TopicType >::publish (const boost::shared_ptr< TopicType > & msg)
+
+ +

publish message, boost ptr overload

+
Parameters
+ + +
msg
+
+
+ +
+
+ +

◆ publish() [2/3]

+ +
+
+
+template<class TopicType >
+ + + + + + + + +
void mrs_lib::PublisherHandler_impl< TopicType >::publish (const boost::shared_ptr< TopicType const > & msg)
+
+ +

publish message, boost const ptr overload

+
Parameters
+ + +
msg
+
+
+ +
+
+ +

◆ publish() [3/3]

+ +
+
+
+template<class TopicType >
+ + + + + + + + +
void mrs_lib::PublisherHandler_impl< TopicType >::publish (const TopicType & msg)
+
+ +

publish message

+
Parameters
+ + +
msgdata
+
+
+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/classmrs__lib_1_1PublisherHandler__impl.js b/classmrs__lib_1_1PublisherHandler__impl.js new file mode 100644 index 00000000..579f4d57 --- /dev/null +++ b/classmrs__lib_1_1PublisherHandler__impl.js @@ -0,0 +1,10 @@ +var classmrs__lib_1_1PublisherHandler__impl = +[ + [ "PublisherHandler_impl", "classmrs__lib_1_1PublisherHandler__impl.html#ab6dfde5a454ce357957a2ea8618890fc", null ], + [ "~PublisherHandler_impl", "classmrs__lib_1_1PublisherHandler__impl.html#a685a159577dfe363423c58a91ba92ac6", null ], + [ "PublisherHandler_impl", "classmrs__lib_1_1PublisherHandler__impl.html#a9168a142f84bf96f73563fe5f3589ce7", null ], + [ "getNumSubscribers", "classmrs__lib_1_1PublisherHandler__impl.html#a2043d0a61e0ff0dbd0acd6a64f1e4bef", null ], + [ "publish", "classmrs__lib_1_1PublisherHandler__impl.html#ad41ed622292e537101a2dac779c08f34", null ], + [ "publish", "classmrs__lib_1_1PublisherHandler__impl.html#a80c0caa745661936409fdc93277e7453", null ], + [ "publish", "classmrs__lib_1_1PublisherHandler__impl.html#a4404a3234f548fe9184ec43ac18c9671", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1RHEIV-members.html b/classmrs__lib_1_1RHEIV-members.html new file mode 100644 index 00000000..7b2f1050 --- /dev/null +++ b/classmrs__lib_1_1RHEIV-members.html @@ -0,0 +1,130 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::RHEIV< n_states, n_params > Member List
+
+
+ +

This is the complete list of members for mrs_lib::RHEIV< n_states, n_params >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
dzdx_t typedefmrs_lib::RHEIV< n_states, n_params >
dzdxs_t typedefmrs_lib::RHEIV< n_states, n_params >
eta_t typedefmrs_lib::RHEIV< n_states, n_params >
f_dzdx_t typedefmrs_lib::RHEIV< n_states, n_params >
f_z_t typedefmrs_lib::RHEIV< n_states, n_params >
fit(const xs_t &xs, const Ps_t &Ps)mrs_lib::RHEIV< n_states, n_params >inline
fit(const T_it1 &xs_begin, const T_it1 &xs_end, const T_it2 &Ps_begin, const T_it2 &Ps_end)mrs_lib::RHEIV< n_states, n_params >inline
fit_ALS(const xs_t &xs)mrs_lib::RHEIV< n_states, n_params >inline
get_ALS_estimate() constmrs_lib::RHEIV< n_states, n_params >inline
get_last_estimate() constmrs_lib::RHEIV< n_states, n_params >inline
kmrs_lib::RHEIV< n_states, n_params >static
lmrs_lib::RHEIV< n_states, n_params >static
lrmrs_lib::RHEIV< n_states, n_params >static
P_t typedefmrs_lib::RHEIV< n_states, n_params >
Ps_t typedefmrs_lib::RHEIV< n_states, n_params >
RHEIV()mrs_lib::RHEIV< n_states, n_params >inline
RHEIV(const f_z_t &f_z, const f_dzdx_t &f_dzdx, const double min_dtheta=1e-15, const unsigned max_its=100)mrs_lib::RHEIV< n_states, n_params >inline
RHEIV(const f_z_t &f_z, const f_dzdx_t &f_dzdx, const double min_dtheta=1e-15, const unsigned max_its=100, const time_t &timeout=std::chrono::duration_cast< time_t >(ms_t::zero()), const int debug_nth_it=-1)mrs_lib::RHEIV< n_states, n_params >inline
RHEIV(const f_z_t &f_z, const dzdx_t &dzdx, const double min_dtheta=1e-15, const unsigned max_its=100)mrs_lib::RHEIV< n_states, n_params >inline
RHEIV(const f_z_t &f_z, const dzdx_t &dzdx, const double min_dtheta=1e-15, const unsigned max_its=100, const time_t &timeout=std::chrono::duration_cast< time_t >(ms_t::zero()), const int debug_nth_it=-1)mrs_lib::RHEIV< n_states, n_params >inline
theta_t typedefmrs_lib::RHEIV< n_states, n_params >
u_t typedefmrs_lib::RHEIV< n_states, n_params >
x_t typedefmrs_lib::RHEIV< n_states, n_params >
xs_t typedefmrs_lib::RHEIV< n_states, n_params >
z_t typedefmrs_lib::RHEIV< n_states, n_params >
zs_t typedefmrs_lib::RHEIV< n_states, n_params >
+
+ + + + diff --git a/classmrs__lib_1_1RHEIV.html b/classmrs__lib_1_1RHEIV.html new file mode 100644 index 00000000..4bc2a114 --- /dev/null +++ b/classmrs__lib_1_1RHEIV.html @@ -0,0 +1,773 @@ + + + + + + + +mrs_lib: mrs_lib::RHEIV< n_states, n_params > Class Template Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::RHEIV< n_states, n_params > Class Template Reference
+
+
+ +

Implementation of the Reduced Heteroscedastic Errors In Variables surface fitting algorithm [2]. + More...

+ +

#include <rheiv.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Types

+using x_t = Eigen::Matrix< double, k, 1 >
 Input vector type $k \times 1$.
 
+using xs_t = Eigen::Matrix< double, k, -1 >
 Container type for the input data array.
 
+using u_t = Eigen::Matrix< double, l, 1 >
 Transformed input vector type $l \times 1$.
 
+using P_t = Eigen::Matrix< double, k, k >
 Covariance type of the input vector $k \times k$.
 
+using Ps_t = std::vector< P_t >
 Container type for covariances P of the input data array.
 
+using z_t = Eigen::Matrix< double, lr, 1 >
 Type of a reduced transformed input vector $l_r \times 1$.
 
+using zs_t = Eigen::Matrix< double, lr, -1 >
 Container type for an array of the reduced transformed input vectors z.
 
+using f_z_t = typename std::function< zs_t(const xs_t &)>
 Function signature of the $ \mathbf{z}\left( \mathbf{x} \right) $ mapping function.
 
+using dzdx_t = Eigen::Matrix< double, lr, k >
 Type of the jacobian matrix $ \mathbf{J} \mathbf{z}\left( \mathbf{x} \right) $, evaluated at $ \mathbf{x} $.
 
+using dzdxs_t = std::vector< dzdx_t >
 Contained type for an array of the jacobian matrices.
 
+using f_dzdx_t = typename std::function< dzdx_t(const xs_t &)>
 Function signature of the jacobian $ \mathbf{J} \mathbf{z}\left( \mathbf{x} \right) $.
 
+using theta_t = Eigen::Matrix< double, l, 1 >
 Parameter vector type $l \times 1$.
 
+using eta_t = z_t
 Reduced parameter vector type $l_r \times 1$.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 RHEIV ()
 Convenience default constructor. More...
 
 RHEIV (const f_z_t &f_z, const f_dzdx_t &f_dzdx, const double min_dtheta=1e-15, const unsigned max_its=100)
 The main constructor. More...
 
template<typename time_t >
 RHEIV (const f_z_t &f_z, const f_dzdx_t &f_dzdx, const double min_dtheta=1e-15, const unsigned max_its=100, const time_t &timeout=std::chrono::duration_cast< time_t >(ms_t::zero()), const int debug_nth_it=-1)
 The main constructor. More...
 
 RHEIV (const f_z_t &f_z, const dzdx_t &dzdx, const double min_dtheta=1e-15, const unsigned max_its=100)
 A convenience constructor constructor. More...
 
template<typename time_t >
 RHEIV (const f_z_t &f_z, const dzdx_t &dzdx, const double min_dtheta=1e-15, const unsigned max_its=100, const time_t &timeout=std::chrono::duration_cast< time_t >(ms_t::zero()), const int debug_nth_it=-1)
 A convenience constructor constructor. More...
 
theta_t fit (const xs_t &xs, const Ps_t &Ps)
 Fit the defined model to the provided data. More...
 
template<class T_it1 , class T_it2 >
theta_t fit (const T_it1 &xs_begin, const T_it1 &xs_end, const T_it2 &Ps_begin, const T_it2 &Ps_end)
 Fit the defined model to the provided data. More...
 
theta_t fit_ALS (const xs_t &xs)
 Fit the defined model to the provided data using Algebraic Least Squares (not RHEIV). More...
 
theta_t get_last_estimate () const
 Returns the last valid estimate of $ \mathbf{\theta} $. More...
 
theta_t get_ALS_estimate () const
 Returns the Algebraic Least Squares estimate of $ \mathbf{\theta} $. More...
 
+ + + + + + + + + + +

+Static Public Attributes

+static const int k = n_states
 Length of the state vector x.
 
+static const int l = n_params
 Length of the parameter vector $ \mathbf{\theta} $.
 
+static const int lr = l - 1
 Length of the reduced parameter vector $ \mathbf{\eta} $.
 
+

Detailed Description

+

template<int n_states, int n_params>
+class mrs_lib::RHEIV< n_states, n_params >

+ +

Implementation of the Reduced Heteroscedastic Errors In Variables surface fitting algorithm [2].

+

This class estimates a vector of parameters $ \mathbf{\theta} $ of a model, which is defined by an equation $ \mathbf{\theta}^T \mathbf{u}\left( \mathbf{x} \right) = 0 $, where $ \mathbf{x} $ is a data sample vector and $ \mathbf{u}\left( \mathbf{x} \right) $ is a vector, obtained by transforming $ \mathbf{x} $ in a problem-dependent manner.

+

Note that $ \mathbf{u}\left( \mathbf{x} \right) $ must fulfill two conditions:

    +
  • each element of $ \mathbf{u}\left( \mathbf{x} \right) $ is a quadratic form of a vector $ \left[ \mathbf{x}, 1 \right] $, and
  • +
  • the last element of $ \mathbf{u}\left( \mathbf{x} \right) $ is equal to one.
  • +
+

Such model can be used to describe e.g. various surfaces, such as planes or conics, which makes this class a useful tool for computer vision. The model is described in the context of the RHEIV class by the length of the vector $ \mathbf{x} $, the length of the vector $ \mathbf{\theta} $, and the Jacobian matrix of $ \partial_{\mathbf{x}} \mathbf{z}\left( \mathbf{x} \right) $, where $ \mathbf{z}\left( \mathbf{x} \right) $ is defined by the formula $ \mathbf{u}\left( \mathbf{x} \right) = \left[ \mathbf{z}\left( \mathbf{x} \right), 1 \right] $.

+

For more information, see [2].

+
Examples
rheiv/example.cpp.
+
+

Constructor & Destructor Documentation

+ +

◆ RHEIV() [1/5]

+ +
+
+
+template<int n_states, int n_params>
+ + + + + +
+ + + + + + + +
mrs_lib::RHEIV< n_states, n_params >::RHEIV ()
+
+inline
+
+ +

Convenience default constructor.

+
Warning
This constructor should not be used if applicable. If used, the main constructor has to be called afterwards, before using this class, otherwise the RHEIV object is invalid (not initialized).
+ +
+
+ +

◆ RHEIV() [2/5]

+ +
+
+
+template<int n_states, int n_params>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::RHEIV< n_states, n_params >::RHEIV (const f_z_tf_z,
const f_dzdx_tf_dzdx,
const double min_dtheta = 1e-15,
const unsigned max_its = 100 
)
+
+inline
+
+ +

The main constructor.

+

The dzdx parameter gives the relation between $ \mathbf{z}\left( \mathbf{x} \right) $ and $ \mathbf{x} $. It is the full jacobian matrix $ \partial_{\mathbf{x}} \mathbf{z}\left( \mathbf{x} \right) $.

+

The optimization algorithm is iterative with two possible stopping conditions:

    +
  • if change of the estimate of $ \mathbf{\theta} $ between two iterations is smaller than a defined threshold, or
  • +
  • if a maximal number of iterations was reached.
  • +
+
Parameters
+ + + + + +
f_zthe mapping function $ \mathbf{z}\left( \mathbf{x} \right) $.
f_dzdxa function, returning the jacobian matrix of partial derivations of $ \mathbf{z}\left( \mathbf{x} \right) $ by $ \mathbf{x} $, evaluated at $ \mathbf{x} $.
min_dthetaif the difference of $ \mathbf{\theta}_{k} $ and $ \mathbf{\theta}_{k-1} $ is smaller than this number, the iteration is stopped.
max_itsif the iteration is stopped after this number of iterations.
+
+
+ +
+
+ +

◆ RHEIV() [3/5]

+ +
+
+
+template<int n_states, int n_params>
+
+template<typename time_t >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::RHEIV< n_states, n_params >::RHEIV (const f_z_tf_z,
const f_dzdx_tf_dzdx,
const double min_dtheta = 1e-15,
const unsigned max_its = 100,
const time_t & timeout = std::chrono::duration_cast<time_t>(ms_t::zero()),
const int debug_nth_it = -1 
)
+
+inline
+
+ +

The main constructor.

+

The dzdx parameter gives the relation between $ \mathbf{z}\left( \mathbf{x} \right) $ and $ \mathbf{x} $. It is the full jacobian matrix $ \partial_{\mathbf{x}} \mathbf{z}\left( \mathbf{x} \right) $.

+

The optimization algorithm is iterative with two possible stopping conditions:

    +
  • if change of the estimate of $ \mathbf{\theta} $ between two iterations is smaller than a defined threshold, or
  • +
  • if a maximal number of iterations was reached.
  • +
+
Parameters
+ + + + + + + +
f_zthe mapping function $ \mathbf{z}\left( \mathbf{x} \right) $.
f_dzdxa function, returning the jacobian matrix of partial derivations of $ \mathbf{z}\left( \mathbf{x} \right) $ by $ \mathbf{x} $, evaluated at $ \mathbf{x} $.
min_dthetaif the difference of $ \mathbf{\theta}_{k} $ and $ \mathbf{\theta}_{k-1} $ is smaller than this number, the iteration is stopped.
max_itsif the iteration is stopped after this number of iterations.
timeoutif the calculation takes longer than this time, the iteration is stopped.
debug_nth_ita debug message will be printed every debug_nth_it th iteration (negative number disables debug).
+
+
+ +
+
+ +

◆ RHEIV() [4/5]

+ +
+
+
+template<int n_states, int n_params>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::RHEIV< n_states, n_params >::RHEIV (const f_z_tf_z,
const dzdx_tdzdx,
const double min_dtheta = 1e-15,
const unsigned max_its = 100 
)
+
+inline
+
+ +

A convenience constructor constructor.

+

This constructor differs from the main one only in the parameters it takes. Instead of the function f_dzdx, it takes directly the dzdx matrix. This variant is meant to be used for systems where the jacobian matrix $ \mathbf{z}\left( \mathbf{x} \right) $ by $ \mathbf{x} $ does not depend on $ \mathbf{x} $.

+
Parameters
+ + + + +
f_zthe mapping function $ \mathbf{z}\left( \mathbf{x} \right) $.
dzdxthe jacobian matrix of partial derivations of $ \mathbf{z}\left( \mathbf{x} \right) $ by $ \mathbf{x} $.
min_dthetaif the difference of $ \mathbf{\theta}_{k} $ and $ \mathbf{\theta}_{k-1} $ is smaller than this number, the iteration is stopped.
+
+
+ +
+
+ +

◆ RHEIV() [5/5]

+ +
+
+
+template<int n_states, int n_params>
+
+template<typename time_t >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::RHEIV< n_states, n_params >::RHEIV (const f_z_tf_z,
const dzdx_tdzdx,
const double min_dtheta = 1e-15,
const unsigned max_its = 100,
const time_t & timeout = std::chrono::duration_cast<time_t>(ms_t::zero()),
const int debug_nth_it = -1 
)
+
+inline
+
+ +

A convenience constructor constructor.

+

This constructor differs from the main one only in the parameters it takes. Instead of the function f_dzdx, it takes directly the dzdx matrix. This variant is meant to be used for systems where the jacobian matrix $ \mathbf{z}\left( \mathbf{x} \right) $ by $ \mathbf{x} $ does not depend on $ \mathbf{x} $.

+
Parameters
+ + + + + + + +
f_zthe mapping function $ \mathbf{z}\left( \mathbf{x} \right) $.
dzdxthe jacobian matrix of partial derivations of $ \mathbf{z}\left( \mathbf{x} \right) $ by $ \mathbf{x} $.
min_dthetaif the difference of $ \mathbf{\theta}_{k} $ and $ \mathbf{\theta}_{k-1} $ is smaller than this number, the iteration is stopped.
timeoutif the calculation takes longer than this time, the iteration is stopped.
max_itsif the iteration is stopped after this number of iterations.
debug_nth_ita debug message will be printed every debug_nth_it th iteration (negative number disables debug).
+
+
+ +
+
+

Member Function Documentation

+ +

◆ fit() [1/2]

+ +
+
+
+template<int n_states, int n_params>
+
+template<class T_it1 , class T_it2 >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
theta_t mrs_lib::RHEIV< n_states, n_params >::fit (const T_it1 & xs_begin,
const T_it1 & xs_end,
const T_it2 & Ps_begin,
const T_it2 & Ps_end 
)
+
+inline
+
+ +

Fit the defined model to the provided data.

+

The RHEIV iterative optimization algorithm will be applied to estimate optimal parameters of the model based on the provided data. This is a conveinence overload, which takes the data points and covariances in a general container, supporting std::begin() and std::end().

+
Parameters
+ + + + + +
xs_beginbegin iterator of a container, containing the data points $ \mathbf{x}_i $.
xs_endend iterator of a container, containing the data points $ \mathbf{x}_i $.
Ps_beginbegin iterator of a container, containing the corresponding covariance matrices $ \mathbf{P}_i $ .
Ps_endend iterator of a container, containing the corresponding covariance matrices $ \mathbf{P}_i $ .
+
+
+
Returns
estimate of the parameter vector $ \mathbf{\theta} $.
+
Warning
Note that length of xs and Ps must be the same!
+ +
+
+ +

◆ fit() [2/2]

+ +
+
+
+template<int n_states, int n_params>
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
theta_t mrs_lib::RHEIV< n_states, n_params >::fit (const xs_txs,
const Ps_tPs 
)
+
+inline
+
+ +

Fit the defined model to the provided data.

+

The RHEIV iterative optimization algorithm will be applied to estimate optimal parameters of the model based on the provided data.

+
Parameters
+ + + +
xsthe data points $ \mathbf{x}_i $.
Psthe corresponding covariance matrices $ \mathbf{P}_i $ .
+
+
+
Returns
estimate of the parameter vector $ \mathbf{\theta} $.
+
Warning
Note that length of xs and Ps must be the same!
+ +
+
+ +

◆ fit_ALS()

+ +
+
+
+template<int n_states, int n_params>
+ + + + + +
+ + + + + + + + +
theta_t mrs_lib::RHEIV< n_states, n_params >::fit_ALS (const xs_txs)
+
+inline
+
+ +

Fit the defined model to the provided data using Algebraic Least Squares (not RHEIV).

+

Instead of using the iterative RHEIV algorithm to fit the data, just use the simple ALS (which basically does eigenvector decomposition). This can be useful in cases of degenerate data where the RHEIV algorithm fails or when covariances of the data are not available.

+
Parameters
+ + +
xsthe data points $ \mathbf{x}_i $.
+
+
+
Returns
estimate of the parameter vector $ \mathbf{\theta} $.
+ +
+
+ +

◆ get_ALS_estimate()

+ +
+
+
+template<int n_states, int n_params>
+ + + + + +
+ + + + + + + +
theta_t mrs_lib::RHEIV< n_states, n_params >::get_ALS_estimate () const
+
+inline
+
+ +

Returns the Algebraic Least Squares estimate of $ \mathbf{\theta} $.

+

You can use this method in case of an exception to retreive the Algebraic Least Squares estimate of the parameter vector, which is more stable than the RHEIV algorithm, and can be used as a more rough estimate of the parameters.

+
Returns
the ALS estimate of the parameter vector $ \mathbf{\theta} $.
+
Warning
The fit() method must be called prior to attempting to get the last ALS estimate!
+ +
+
+ +

◆ get_last_estimate()

+ +
+
+
+template<int n_states, int n_params>
+ + + + + +
+ + + + + + + +
theta_t mrs_lib::RHEIV< n_states, n_params >::get_last_estimate () const
+
+inline
+
+ +

Returns the last valid estimate of $ \mathbf{\theta} $.

+

You can use this method in case of an exception to retreive the last valid estimate of the parameter vector before the crash, which is sometimes useful.

+
Returns
the last valid estimate of the parameter vector $ \mathbf{\theta} $.
+
Warning
The fit() method must be called prior to attempting to get the last valid estimate!
+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/classmrs__lib_1_1RHEIV.js b/classmrs__lib_1_1RHEIV.js new file mode 100644 index 00000000..baf07f6b --- /dev/null +++ b/classmrs__lib_1_1RHEIV.js @@ -0,0 +1,26 @@ +var classmrs__lib_1_1RHEIV = +[ + [ "dzdx_t", "classmrs__lib_1_1RHEIV.html#abec4cb102b681ff3ec39786dc1d2bd4b", null ], + [ "dzdxs_t", "classmrs__lib_1_1RHEIV.html#ad85f14fb415e2fbe69ad05db0dc56e7b", null ], + [ "eta_t", "classmrs__lib_1_1RHEIV.html#a238b7a1a44cb7711756bd7b94a11797d", null ], + [ "f_dzdx_t", "classmrs__lib_1_1RHEIV.html#ac5b425f7782114173db5a275bea2c871", null ], + [ "f_z_t", "classmrs__lib_1_1RHEIV.html#abfea65ce9c912fcde3e805a66dc8ca42", null ], + [ "P_t", "classmrs__lib_1_1RHEIV.html#a9adfedc8dfbe38ccf06f556481a6c5c9", null ], + [ "Ps_t", "classmrs__lib_1_1RHEIV.html#aab24b461160051b3537f76e633d47d8d", null ], + [ "theta_t", "classmrs__lib_1_1RHEIV.html#af6d8212b941ad45ce6b53bc4e8449de1", null ], + [ "u_t", "classmrs__lib_1_1RHEIV.html#a3bc18fd815c8f09123b0a9083ca3b959", null ], + [ "x_t", "classmrs__lib_1_1RHEIV.html#a6482f5ff13cbfaef9f8dc86912c1258d", null ], + [ "xs_t", "classmrs__lib_1_1RHEIV.html#aee3df85ac46e5b29259f8898388324ec", null ], + [ "z_t", "classmrs__lib_1_1RHEIV.html#a8e01ed1580572ec20f0230d9bfe5273f", null ], + [ "zs_t", "classmrs__lib_1_1RHEIV.html#a3b4e40932aae907ae8185df7703d5677", null ], + [ "RHEIV", "classmrs__lib_1_1RHEIV.html#a057ffc158ceb64e933d3ae73e96bb033", null ], + [ "RHEIV", "classmrs__lib_1_1RHEIV.html#a4712a3306cdd759a73d2124b23bb388b", null ], + [ "RHEIV", "classmrs__lib_1_1RHEIV.html#a8c8f7b9c1b3ea4daafc08e1a29941558", null ], + [ "RHEIV", "classmrs__lib_1_1RHEIV.html#a66a840487d929607a3385e90b3c35ec5", null ], + [ "RHEIV", "classmrs__lib_1_1RHEIV.html#a9c0c437bea8612516cb37d9503b6a852", null ], + [ "fit", "classmrs__lib_1_1RHEIV.html#a9eaa3b7a946a9c590326d3b47295d728", null ], + [ "fit", "classmrs__lib_1_1RHEIV.html#aad00da516e55bb60661b5cf234487932", null ], + [ "fit_ALS", "classmrs__lib_1_1RHEIV.html#a2123ee2ffa07063a8a50275b998874ca", null ], + [ "get_ALS_estimate", "classmrs__lib_1_1RHEIV.html#a96de075c76bf79a411606d762e4b9728", null ], + [ "get_last_estimate", "classmrs__lib_1_1RHEIV.html#ac7f24b984bcfdee4f21de1206942f986", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1ROSTimer-members.html b/classmrs__lib_1_1ROSTimer-members.html new file mode 100644 index 00000000..f6913ed4 --- /dev/null +++ b/classmrs__lib_1_1ROSTimer-members.html @@ -0,0 +1,125 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::ROSTimer Member List
+
+
+ +

This is the complete list of members for mrs_lib::ROSTimer, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + +
callback_t typedef (defined in mrs_lib::MRSTimer)mrs_lib::MRSTimer
MRSTimer(const MRSTimer &)=default (defined in mrs_lib::MRSTimer)mrs_lib::MRSTimer
MRSTimer(MRSTimer &&)=default (defined in mrs_lib::MRSTimer)mrs_lib::MRSTimer
MRSTimer()=default (defined in mrs_lib::MRSTimer)mrs_lib::MRSTimerprotected
operator=(const ROSTimer &)=delete (defined in mrs_lib::ROSTimer)mrs_lib::ROSTimer
operator=(ROSTimer &&)=delete (defined in mrs_lib::ROSTimer)mrs_lib::ROSTimer
operator=(const MRSTimer &)=default (defined in mrs_lib::MRSTimer)mrs_lib::MRSTimer
operator=(MRSTimer &&)=default (defined in mrs_lib::MRSTimer)mrs_lib::MRSTimer
ROSTimer() (defined in mrs_lib::ROSTimer)mrs_lib::ROSTimer
ROSTimer(const ros::NodeHandle &nh, const ros::Rate &rate, void(ObjectType::*const callback)(const ros::TimerEvent &), ObjectType *const obj, const bool oneshot=false, const bool autostart=true)mrs_lib::ROSTimer
ROSTimer(const ros::NodeHandle &nh, const ros::Duration &duration, void(ObjectType::*const callback)(const ros::TimerEvent &), ObjectType *const obj, const bool oneshot=false, const bool autostart=true)mrs_lib::ROSTimer
ROSTimer(const ROSTimer &)=delete (defined in mrs_lib::ROSTimer)mrs_lib::ROSTimer
ROSTimer(ROSTimer &&)=delete (defined in mrs_lib::ROSTimer)mrs_lib::ROSTimer
ROSTimer(const ros::NodeHandle &nh, const ros::Duration &duration, void(ObjectType::*const callback)(const ros::TimerEvent &), ObjectType *const obj, const bool oneshot, const bool autostart) (defined in mrs_lib::ROSTimer)mrs_lib::ROSTimer
ROSTimer(const ros::NodeHandle &nh, const ros::Rate &rate, void(ObjectType::*const callback)(const ros::TimerEvent &), ObjectType *const obj, const bool oneshot, const bool autostart) (defined in mrs_lib::ROSTimer)mrs_lib::ROSTimer
running() overridemrs_lib::ROSTimervirtual
setPeriod(const ros::Duration &duration, const bool reset=true) overridemrs_lib::ROSTimervirtual
start() overridemrs_lib::ROSTimervirtual
stop() overridemrs_lib::ROSTimervirtual
~MRSTimer()=default (defined in mrs_lib::MRSTimer)mrs_lib::MRSTimervirtual
~ROSTimer() override (defined in mrs_lib::ROSTimer)mrs_lib::ROSTimerinlinevirtual
+
+ + + + diff --git a/classmrs__lib_1_1ROSTimer.html b/classmrs__lib_1_1ROSTimer.html new file mode 100644 index 00000000..c62dd161 --- /dev/null +++ b/classmrs__lib_1_1ROSTimer.html @@ -0,0 +1,430 @@ + + + + + + + +mrs_lib: mrs_lib::ROSTimer Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::ROSTimer Class Reference
+
+
+ +

ros::Timer wrapper. The interface is the same as with ros::Timer, except for the initialization method. + More...

+ +

#include <timer.h>

+
+ + Inheritance diagram for mrs_lib::ROSTimer:
+
+
+ +
+ + Collaboration diagram for mrs_lib::ROSTimer:
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

template<class ObjectType >
 ROSTimer (const ros::NodeHandle &nh, const ros::Rate &rate, void(ObjectType::*const callback)(const ros::TimerEvent &), ObjectType *const obj, const bool oneshot=false, const bool autostart=true)
 Constructs the object. More...
 
template<class ObjectType >
 ROSTimer (const ros::NodeHandle &nh, const ros::Duration &duration, void(ObjectType::*const callback)(const ros::TimerEvent &), ObjectType *const obj, const bool oneshot=false, const bool autostart=true)
 full constructor More...
 
+virtual void stop () override
 stop the timer
 
+virtual void start () override
 start the timer
 
virtual void setPeriod (const ros::Duration &duration, const bool reset=true) override
 set the timer period/duration More...
 
virtual bool running () override
 returns true if callbacks should be called More...
 
ROSTimer (const ROSTimer &)=delete
 
ROSTimer (ROSTimer &&)=delete
 
+ROSTimeroperator= (const ROSTimer &)=delete
 
+ROSTimeroperator= (ROSTimer &&)=delete
 
+template<class ObjectType >
 ROSTimer (const ros::NodeHandle &nh, const ros::Duration &duration, void(ObjectType::*const callback)(const ros::TimerEvent &), ObjectType *const obj, const bool oneshot, const bool autostart)
 
+template<class ObjectType >
 ROSTimer (const ros::NodeHandle &nh, const ros::Rate &rate, void(ObjectType::*const callback)(const ros::TimerEvent &), ObjectType *const obj, const bool oneshot, const bool autostart)
 
- Public Member Functions inherited from mrs_lib::MRSTimer
MRSTimer (const MRSTimer &)=default
 
MRSTimer (MRSTimer &&)=default
 
+MRSTimeroperator= (const MRSTimer &)=default
 
+MRSTimeroperator= (MRSTimer &&)=default
 
+ + + + +

+Additional Inherited Members

- Public Types inherited from mrs_lib::MRSTimer
+using callback_t = std::function< void(const ros::TimerEvent &)>
 
+

Detailed Description

+

ros::Timer wrapper. The interface is the same as with ros::Timer, except for the initialization method.

+

Constructor & Destructor Documentation

+ +

◆ ROSTimer() [1/2]

+ +
+
+
+template<class ObjectType >
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::ROSTimer::ROSTimer (const ros::NodeHandle & nh,
const ros::Rate & rate,
void(ObjectType::*)(const ros::TimerEvent &) callback,
ObjectType *const obj,
const bool oneshot = false,
const bool autostart = true 
)
+
+ +

Constructs the object.

+
Template Parameters
+ + +
ObjectType
+
+
+
Parameters
+ + + + + + + +
nhROS node handle to be used for creating the underlying ros::Timer object.
raterate at which the callback should be called.
ObjectType::*constcallback callback method to be called.
objobject for the method.
oneshotwhether the callback should only be called once after starting.
autostartwhether the timer should immediately start after construction.
+
+
+ +
+
+ +

◆ ROSTimer() [2/2]

+ +
+
+
+template<class ObjectType >
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::ROSTimer::ROSTimer (const ros::NodeHandle & nh,
const ros::Duration & duration,
void(ObjectType::*)(const ros::TimerEvent &) callback,
ObjectType *const obj,
const bool oneshot = false,
const bool autostart = true 
)
+
+ +

full constructor

+
Template Parameters
+ + +
ObjectType
+
+
+
Parameters
+ + + + + + + +
nhROS node handle to be used for creating the underlying ros::Timer object.
durationdesired callback period.
ObjectType::*constcallback callback method to be called.
objobject for the method.
oneshotwhether the callback should only be called once after starting.
autostartwhether the timer should immediately start after construction.
+
+
+ +
+
+

Member Function Documentation

+ +

◆ running()

+ +
+
+ + + + + +
+ + + + + + + +
bool mrs_lib::ROSTimer::running ()
+
+overridevirtual
+
+ +

returns true if callbacks should be called

+
Returns
true if timer is running
+ +

Implements mrs_lib::MRSTimer.

+ +
+
+ +

◆ setPeriod()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void mrs_lib::ROSTimer::setPeriod (const ros::Duration & duration,
const bool reset = true 
)
+
+overridevirtual
+
+ +

set the timer period/duration

+
Parameters
+ + + +
duration
reset
+
+
+ +

Implements mrs_lib::MRSTimer.

+ +
+
+
The documentation for this class was generated from the following files:
    +
  • include/mrs_lib/timer.h
  • +
  • include/mrs_lib/impl/timer.hpp
  • +
  • src/timer/timer.cpp
  • +
+
+
+ + + + diff --git a/classmrs__lib_1_1ROSTimer.js b/classmrs__lib_1_1ROSTimer.js new file mode 100644 index 00000000..dbb977d5 --- /dev/null +++ b/classmrs__lib_1_1ROSTimer.js @@ -0,0 +1,17 @@ +var classmrs__lib_1_1ROSTimer = +[ + [ "ROSTimer", "classmrs__lib_1_1ROSTimer.html#a279f348615fa132944657499c7430365", null ], + [ "ROSTimer", "classmrs__lib_1_1ROSTimer.html#aaf683893d28eca7f91e4b2333cf4eed5", null ], + [ "ROSTimer", "classmrs__lib_1_1ROSTimer.html#ad4913fe0402a8be9b131ad5afb9d7d05", null ], + [ "~ROSTimer", "classmrs__lib_1_1ROSTimer.html#af787df1a0c745a5f97b147479ed83aed", null ], + [ "ROSTimer", "classmrs__lib_1_1ROSTimer.html#a7c10fdefa4336a0ccaa5e3946eda6824", null ], + [ "ROSTimer", "classmrs__lib_1_1ROSTimer.html#a6ac090d048d684dce77c2cbf721e7a4b", null ], + [ "ROSTimer", "classmrs__lib_1_1ROSTimer.html#a0dfc38d13fe6c1311cad6d11ddea7443", null ], + [ "ROSTimer", "classmrs__lib_1_1ROSTimer.html#afe594c985a1338f4f6c6de4a37b5f0ba", null ], + [ "operator=", "classmrs__lib_1_1ROSTimer.html#a23c218adf410d480d424ccfc16ea6047", null ], + [ "operator=", "classmrs__lib_1_1ROSTimer.html#afe803ecb15e947501c86b64df4c4f5dc", null ], + [ "running", "classmrs__lib_1_1ROSTimer.html#af5074139258db68cf314b1bf4868243a", null ], + [ "setPeriod", "classmrs__lib_1_1ROSTimer.html#a7dd4d03428c7abe2de8ea260a9a4eeff", null ], + [ "start", "classmrs__lib_1_1ROSTimer.html#afd70b40e8e4b84b48215eeafc5e27520", null ], + [ "stop", "classmrs__lib_1_1ROSTimer.html#a6a774123e3400848884fa83fe01e1955", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1ROSTimer__coll__graph.map b/classmrs__lib_1_1ROSTimer__coll__graph.map new file mode 100644 index 00000000..22799d86 --- /dev/null +++ b/classmrs__lib_1_1ROSTimer__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/classmrs__lib_1_1ROSTimer__coll__graph.md5 b/classmrs__lib_1_1ROSTimer__coll__graph.md5 new file mode 100644 index 00000000..38fde2d5 --- /dev/null +++ b/classmrs__lib_1_1ROSTimer__coll__graph.md5 @@ -0,0 +1 @@ +5debd548a8a8d5eedbb039dc177aaa0e \ No newline at end of file diff --git a/classmrs__lib_1_1ROSTimer__coll__graph.png b/classmrs__lib_1_1ROSTimer__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..fc14a2f3266612fc6b7f0586e98a4f8ca6a2cfd5 GIT binary patch literal 3528 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 BupIyZ literal 0 HcmV?d00001 diff --git a/classmrs__lib_1_1ROSTimer__inherit__graph.map b/classmrs__lib_1_1ROSTimer__inherit__graph.map new file mode 100644 index 00000000..22799d86 --- /dev/null +++ b/classmrs__lib_1_1ROSTimer__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/classmrs__lib_1_1ROSTimer__inherit__graph.md5 b/classmrs__lib_1_1ROSTimer__inherit__graph.md5 new file mode 100644 index 00000000..38fde2d5 --- /dev/null +++ b/classmrs__lib_1_1ROSTimer__inherit__graph.md5 @@ -0,0 +1 @@ +5debd548a8a8d5eedbb039dc177aaa0e \ No newline at end of file diff --git a/classmrs__lib_1_1ROSTimer__inherit__graph.png b/classmrs__lib_1_1ROSTimer__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..fc14a2f3266612fc6b7f0586e98a4f8ca6a2cfd5 GIT binary patch literal 3528 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 BupIyZ literal 0 HcmV?d00001 diff --git a/classmrs__lib_1_1Repredictor-members.html b/classmrs__lib_1_1Repredictor-members.html new file mode 100644 index 00000000..c86c1448 --- /dev/null +++ b/classmrs__lib_1_1Repredictor-members.html @@ -0,0 +1,131 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::Repredictor< Model, disable_reprediction > Member List
+
+
+ +

This is the complete list of members for mrs_lib::Repredictor< Model, disable_reprediction >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
addInputChange(const u_t &u, const ros::Time &stamp, const ModelPtr &model=nullptr)mrs_lib::Repredictor< Model, disable_reprediction >inline
addInputChange(const u_t &u, [[maybe_unused]] const ros::Time &stamp, const ModelPtr &model=nullptr)mrs_lib::Repredictor< Model, disable_reprediction >inline
addInputChangeWithNoise(const u_t &u, const Q_t &Q, const ros::Time &stamp, const ModelPtr &model=nullptr)mrs_lib::Repredictor< Model, disable_reprediction >inline
addInputChangeWithNoise(const u_t &u, const Q_t &Q, [[maybe_unused]] const ros::Time &stamp, const ModelPtr &model=nullptr)mrs_lib::Repredictor< Model, disable_reprediction >inline
addMeasurement(const z_t &z, const R_t &R, const ros::Time &stamp, const ModelPtr &model=nullptr, const double &meas_id=-1)mrs_lib::Repredictor< Model, disable_reprediction >inline
addMeasurement(const z_t &z, const R_t &R, const ros::Time &stamp, const ModelPtr &model=nullptr, const double &meas_id=-1)mrs_lib::Repredictor< Model, disable_reprediction >inline
addProcessNoiseChange(const Q_t &Q, const ros::Time &stamp, const ModelPtr &model=nullptr)mrs_lib::Repredictor< Model, disable_reprediction >inline
addProcessNoiseChange(const Q_t &Q, [[maybe_unused]] const ros::Time &stamp, const ModelPtr &model=nullptr)mrs_lib::Repredictor< Model, disable_reprediction >inline
checkMonotonicity(const T &buf) (defined in mrs_lib::Repredictor< Model, disable_reprediction >)mrs_lib::Repredictor< Model, disable_reprediction >inlineprotected
history_t typedef (defined in mrs_lib::Repredictor< Model, disable_reprediction >)mrs_lib::Repredictor< Model, disable_reprediction >protected
m_default_model (defined in mrs_lib::Repredictor< Model, disable_reprediction >)mrs_lib::Repredictor< Model, disable_reprediction >protected
m_history (defined in mrs_lib::Repredictor< Model, disable_reprediction >)mrs_lib::Repredictor< Model, disable_reprediction >protected
m_sc (defined in mrs_lib::Repredictor< Model, disable_reprediction >)mrs_lib::Repredictor< Model, disable_reprediction >protected
ModelPtr typedefmrs_lib::Repredictor< Model, disable_reprediction >
P_t typedefmrs_lib::Repredictor< Model, disable_reprediction >
predictTo(const ros::Time &to_stamp)mrs_lib::Repredictor< Model, disable_reprediction >inline
predictTo(const ros::Time &to_stamp)mrs_lib::Repredictor< Model, disable_reprediction >inline
printBuffer(const T &buf) (defined in mrs_lib::Repredictor< Model, disable_reprediction >)mrs_lib::Repredictor< Model, disable_reprediction >inlineprotected
Q_t typedefmrs_lib::Repredictor< Model, disable_reprediction >
R_t typedefmrs_lib::Repredictor< Model, disable_reprediction >
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)mrs_lib::Repredictor< Model, disable_reprediction >inline
Repredictor()mrs_lib::Repredictor< Model, disable_reprediction >inline
Repredictor(const x_t &x0, const P_t &P0, const Q_t &Q0, const ros::Time &t0, const ModelPtr &model, const unsigned hist_len)mrs_lib::Repredictor< Model, disable_reprediction >inline
statecov_t typedefmrs_lib::Repredictor< Model, disable_reprediction >
u_t typedefmrs_lib::Repredictor< Model, disable_reprediction >
x_t typedefmrs_lib::Repredictor< Model, disable_reprediction >
z_t typedefmrs_lib::Repredictor< Model, disable_reprediction >
+
+ + + + diff --git a/classmrs__lib_1_1Repredictor.html b/classmrs__lib_1_1Repredictor.html new file mode 100644 index 00000000..01b56793 --- /dev/null +++ b/classmrs__lib_1_1Repredictor.html @@ -0,0 +1,1025 @@ + + + + + + + +mrs_lib: mrs_lib::Repredictor< Model, disable_reprediction > Class Template Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::Repredictor< Model, disable_reprediction > Class Template Reference
+
+
+ +

Implementation of the Repredictor for fusing measurements with variable delays. + More...

+ +

#include <repredictor.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Types

+using x_t = typename Model::x_t
 State vector type $n \times 1$.
 
+using u_t = typename Model::u_t
 Input vector type $m \times 1$.
 
+using z_t = typename Model::z_t
 Measurement vector type $p \times 1$.
 
+using P_t = typename Model::P_t
 State uncertainty covariance matrix type $n \times n$.
 
+using R_t = typename Model::R_t
 Measurement noise covariance matrix type $p \times p$.
 
+using Q_t = typename Model::Q_t
 Process noise covariance matrix type $n \times n$.
 
+using statecov_t = typename Model::statecov_t
 Helper struct for passing around the state and its covariance in one variable.
 
+using ModelPtr = typename std::shared_ptr< Model >
 Shorthand type for a shared pointer-to-Model.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

template<bool check = disable_reprediction>
std::enable_if_t<!check, statecov_tpredictTo (const ros::Time &to_stamp)
 Estimates the system state and covariance matrix at the specified time. More...
 
template<bool check = disable_reprediction>
std::enable_if_t< check, statecov_tpredictTo (const ros::Time &to_stamp)
 Estimates the system state and covariance matrix at the specified time. More...
 
template<bool check = disable_reprediction>
std::enable_if_t<!check > addInputChangeWithNoise (const u_t &u, const Q_t &Q, const ros::Time &stamp, const ModelPtr &model=nullptr)
 Adds one system input to the history buffer, removing the oldest element in the buffer if it is full. More...
 
template<bool check = disable_reprediction>
std::enable_if_t< check > addInputChangeWithNoise (const u_t &u, const Q_t &Q, [[maybe_unused]] const ros::Time &stamp, const ModelPtr &model=nullptr)
 Adds one system input to the history buffer, removing the oldest element in the buffer if it is full. More...
 
template<bool check = disable_reprediction>
std::enable_if_t<!check > addInputChange (const u_t &u, const ros::Time &stamp, const ModelPtr &model=nullptr)
 Adds one system input to the history buffer, removing the oldest element in the buffer if it is full. More...
 
template<bool check = disable_reprediction>
std::enable_if_t< check > addInputChange (const u_t &u, [[maybe_unused]] const ros::Time &stamp, const ModelPtr &model=nullptr)
 Adds one system input to the history buffer, removing the oldest element in the buffer if it is full. More...
 
template<bool check = disable_reprediction>
std::enable_if_t<!check > addProcessNoiseChange (const Q_t &Q, const ros::Time &stamp, const ModelPtr &model=nullptr)
 Adds one system input to the history buffer, removing the oldest element in the buffer if it is full. More...
 
template<bool check = disable_reprediction>
std::enable_if_t< check > addProcessNoiseChange (const Q_t &Q, [[maybe_unused]] const ros::Time &stamp, const ModelPtr &model=nullptr)
 Adds one system input to the history buffer, removing the oldest element in the buffer if it is full. More...
 
template<bool check = disable_reprediction>
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)
 Adds one measurement to the history buffer, removing the oldest element in the buffer if it is full. More...
 
template<bool check = disable_reprediction>
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)
 Adds one measurement to the history buffer, removing the oldest element in the buffer if it is full. More...
 
 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)
 The main constructor. More...
 
 Repredictor ()
 Empty constructor. More...
 
 Repredictor (const x_t &x0, const P_t &P0, const Q_t &Q0, const ros::Time &t0, const ModelPtr &model, const unsigned hist_len)
 Variation of the constructor for cases without a system input. More...
 
+ + + +

+Protected Types

+using history_t = boost::circular_buffer< info_t >
 
+ + + + + + + +

+Protected Member Functions

+template<typename T >
bool checkMonotonicity (const T &buf)
 
+template<typename T >
void printBuffer (const T &buf)
 
+ + + + + + + +

+Protected Attributes

+statecov_t m_sc
 
+ModelPtr m_default_model
 
+history_t m_history
 
+

Detailed Description

+

template<class Model, bool disable_reprediction = false>
+class mrs_lib::Repredictor< Model, disable_reprediction >

+ +

Implementation of the Repredictor for fusing measurements with variable delays.

+

A standard state-space system model is assumed for the repredictor with system inputs and measurements, generated from the system state vector. The inputs and measurements may be delayed with varying durations (an older measurement may become available after 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 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 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 significantly bias your latest estimate.

+

To accomodate this, the Repredictor keeps a buffer of N last inputs and measurements (N is specified in the constructor). This buffer is then used to re-predict the desired state to a specific time, as requested by the user. Note that the re-prediction is evaluated in a lazy manner only when the user requests it, so it goes through the whole history buffer every time a prediction is requested.

+

The Repredictor utilizes a fusion Model (specified as the template parameter), which should implement the predict() and correct() methods. This Model is used for fusing the system inputs and measurements as well as for predictions. Typically, this Model will be some kind of a Kalman Filter (LKF, UKF etc.).

Note
The Model should be able to accomodate predictions with varying time steps in order for the Repredictor to work correctly (see eg. the varstepLKF class).
+
Template Parameters
+ + + +
Modelthe prediction and correction model (eg. a Kalman Filter).
disable_repredictionif true, reprediction is disabled and the class will act like a dumb LKF (for evaluation purposes).
+
+
+
Examples
repredictor/example.cpp.
+
+

Constructor & Destructor Documentation

+ +

◆ Repredictor() [1/3]

+ +
+
+
+template<class Model , bool disable_reprediction = false>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::Repredictor< Model, disable_reprediction >::Repredictor (const x_tx0,
const P_tP0,
const u_tu0,
const Q_tQ0,
const ros::Time & t0,
const ModelPtrmodel,
const unsigned hist_len 
)
+
+inline
+
+ +

The main constructor.

+

Initializes the Repredictor with the necessary initial and default values.

+
Parameters
+ + + + + + + + +
x0Initial state.
P0Covariance matrix of the initial state uncertainty.
u0Initial system input.
Q0Default covariance matrix of the process noise.
t0Time stamp of the initial state.
modelDefault prediction and correction model.
hist_lenLength of the history buffer for system inputs and measurements.
+
+
+ +
+
+ +

◆ Repredictor() [2/3]

+ +
+
+
+template<class Model , bool disable_reprediction = false>
+ + + + + +
+ + + + + + + +
mrs_lib::Repredictor< Model, disable_reprediction >::Repredictor ()
+
+inline
+
+ +

Empty constructor.

+ +
+
+ +

◆ Repredictor() [3/3]

+ +
+
+
+template<class Model , bool disable_reprediction = false>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::Repredictor< Model, disable_reprediction >::Repredictor (const x_tx0,
const P_tP0,
const Q_tQ0,
const ros::Time & t0,
const ModelPtrmodel,
const unsigned hist_len 
)
+
+inline
+
+ +

Variation of the constructor for cases without a system input.

+

Initializes the Repredictor with the necessary initial and default values. Assumes the system input is zero at t0.

+
Parameters
+ + + + + + + +
x0Initial state.
P0Covariance matrix of the initial state uncertainty.
Q0Default covariance matrix of the process noise.
t0Time stamp of the initial state.
modelDefault prediction and correction model.
hist_lenLength of the history buffer for system inputs and measurements.
+
+
+ +
+
+

Member Function Documentation

+ +

◆ addInputChange() [1/2]

+ +
+
+
+template<class Model , bool disable_reprediction = false>
+
+template<bool check = disable_reprediction>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
std::enable_if_t<check> mrs_lib::Repredictor< Model, disable_reprediction >::addInputChange (const u_tu,
[[maybe_unused] ] const ros::Time & stamp,
const ModelPtrmodel = nullptr 
)
+
+inline
+
+ +

Adds one system input to the history buffer, removing the oldest element in the buffer if it is full.

+
Parameters
+ + + + +
uThe system input vector to be added.
stampTime stamp of the input vector and covariance matrix.
modelOptional pointer to a specific Model to be used with this input (eg. mapping it to different states). If it equals to nullptr, the default model specified in the constructor will be used.
+
+
+
Note
This is the variant of the method when reprediction is disabled and will function like a dumb LKF.
+ +
+
+ +

◆ addInputChange() [2/2]

+ +
+
+
+template<class Model , bool disable_reprediction = false>
+
+template<bool check = disable_reprediction>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
std::enable_if_t<!check> mrs_lib::Repredictor< Model, disable_reprediction >::addInputChange (const u_tu,
const ros::Time & stamp,
const ModelPtrmodel = nullptr 
)
+
+inline
+
+ +

Adds one system input to the history buffer, removing the oldest element in the buffer if it is full.

+
Parameters
+ + + + +
uThe system input vector to be added.
stampTime stamp of the input vector and covariance matrix.
modelOptional pointer to a specific Model to be used with this input (eg. mapping it to different states). If it equals to nullptr, the default model specified in the constructor will be used.
+
+
+
Note
The system input vector will not be added if it is older than the oldest element in the history buffer.
+ +
+
+ +

◆ addInputChangeWithNoise() [1/2]

+ +
+
+
+template<class Model , bool disable_reprediction = false>
+
+template<bool check = disable_reprediction>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
std::enable_if_t<check> mrs_lib::Repredictor< Model, disable_reprediction >::addInputChangeWithNoise (const u_tu,
const Q_tQ,
[[maybe_unused] ] const ros::Time & stamp,
const ModelPtrmodel = nullptr 
)
+
+inline
+
+ +

Adds one system input to the history buffer, removing the oldest element in the buffer if it is full.

+
Parameters
+ + + + + +
uThe system input vector to be added.
QThe process noise covariance matrix.
stampTime stamp of the input vector and covariance matrix.
modelOptional pointer to a specific Model to be used with this input (eg. mapping it to different states). If it equals to nullptr, the default model specified in the constructor will be used.
+
+
+
Note
This is the variant of the method when reprediction is disabled and will function like a dumb LKF.
+ +
+
+ +

◆ addInputChangeWithNoise() [2/2]

+ +
+
+
+template<class Model , bool disable_reprediction = false>
+
+template<bool check = disable_reprediction>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
std::enable_if_t<!check> mrs_lib::Repredictor< Model, disable_reprediction >::addInputChangeWithNoise (const u_tu,
const Q_tQ,
const ros::Time & stamp,
const ModelPtrmodel = nullptr 
)
+
+inline
+
+ +

Adds one system input to the history buffer, removing the oldest element in the buffer if it is full.

+
Parameters
+ + + + + +
uThe system input vector to be added.
QThe process noise covariance matrix.
stampTime stamp of the input vector and covariance matrix.
modelOptional pointer to a specific Model to be used with this input (eg. mapping it to different states). If it equals to nullptr, the default model specified in the constructor will be used.
+
+
+
Note
The system input vector will not be added if it is older than the oldest element in the history buffer.
+
Examples
repredictor/example.cpp.
+
+ +
+
+ +

◆ addMeasurement() [1/2]

+ +
+
+
+template<class Model , bool disable_reprediction = false>
+
+template<bool check = disable_reprediction>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
std::enable_if_t<!check> mrs_lib::Repredictor< Model, disable_reprediction >::addMeasurement (const z_tz,
const R_tR,
const ros::Time & stamp,
const ModelPtrmodel = nullptr,
const double & meas_id = -1 
)
+
+inline
+
+ +

Adds one measurement to the history buffer, removing the oldest element in the buffer if it is full.

+
Parameters
+ + + + + +
zThe measurement vector to be added.
RThe measurement noise covariance matrix, corresponding to the measurement vector.
stampTime stamp of the measurement vector and covariance matrix.
modelOptional pointer to a specific Model to be used with this measurement (eg. mapping it from different states). If it equals to nullptr, the default model specified in the constructor will be used.
+
+
+
Note
The measurement vector will not be added if it is older than the oldest element in the history buffer.
+
Examples
repredictor/example.cpp.
+
+ +
+
+ +

◆ addMeasurement() [2/2]

+ +
+
+
+template<class Model , bool disable_reprediction = false>
+
+template<bool check = disable_reprediction>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
std::enable_if_t<check> mrs_lib::Repredictor< Model, disable_reprediction >::addMeasurement (const z_tz,
const R_tR,
const ros::Time & stamp,
const ModelPtrmodel = nullptr,
const double & meas_id = -1 
)
+
+inline
+
+ +

Adds one measurement to the history buffer, removing the oldest element in the buffer if it is full.

+
Parameters
+ + + + + +
zThe measurement vector to be added.
RThe measurement noise covariance matrix, corresponding to the measurement vector.
stampTime stamp of the measurement vector and covariance matrix.
modelOptional pointer to a specific Model to be used with this measurement (eg. mapping it from different states). If it equals to nullptr, the default model specified in the constructor will be used.
+
+
+
Note
This is the variant of the method when reprediction is disabled and will function like a dumb LKF.
+ +
+
+ +

◆ addProcessNoiseChange() [1/2]

+ +
+
+
+template<class Model , bool disable_reprediction = false>
+
+template<bool check = disable_reprediction>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
std::enable_if_t<check> mrs_lib::Repredictor< Model, disable_reprediction >::addProcessNoiseChange (const Q_tQ,
[[maybe_unused] ] const ros::Time & stamp,
const ModelPtrmodel = nullptr 
)
+
+inline
+
+ +

Adds one system input to the history buffer, removing the oldest element in the buffer if it is full.

+
Parameters
+ + + + +
QThe process noise covariance matrix.
stampTime stamp of the input vector and covariance matrix.
modelOptional pointer to a specific Model to be used with this covariance matrix (eg. mapping it to different states). If it equals to nullptr, the default model specified in the constructor will be used.
+
+
+
Note
This is the variant of the method when reprediction is disabled and will function like a dumb LKF.
+ +
+
+ +

◆ addProcessNoiseChange() [2/2]

+ +
+
+
+template<class Model , bool disable_reprediction = false>
+
+template<bool check = disable_reprediction>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
std::enable_if_t<!check> mrs_lib::Repredictor< Model, disable_reprediction >::addProcessNoiseChange (const Q_tQ,
const ros::Time & stamp,
const ModelPtrmodel = nullptr 
)
+
+inline
+
+ +

Adds one system input to the history buffer, removing the oldest element in the buffer if it is full.

+
Parameters
+ + + + +
QThe process noise covariance matrix.
stampTime stamp of the input vector and covariance matrix.
modelOptional pointer to a specific Model to be used with this covariance matrix (eg. mapping it to different states). If it equals to nullptr, the default model specified in the constructor will be used.
+
+
+
Note
The new element will not be added if it is older than the oldest element in the history buffer.
+ +
+
+ +

◆ predictTo() [1/2]

+ +
+
+
+template<class Model , bool disable_reprediction = false>
+
+template<bool check = disable_reprediction>
+ + + + + +
+ + + + + + + + +
std::enable_if_t<!check, statecov_t> mrs_lib::Repredictor< Model, disable_reprediction >::predictTo (const ros::Time & to_stamp)
+
+inline
+
+ +

Estimates the system state and covariance matrix at the specified time.

+

The measurement and system input histories are used to estimate the state vector and covariance matrix values at the specified time, which are returned.

+
Parameters
+ + +
to_stampThe desired time at which the state vector and covariance matrix should be estimated.
+
+
+
Returns
Returns the estimated state vector and covariance matrix in a single struct.
+
Examples
repredictor/example.cpp.
+
+ +
+
+ +

◆ predictTo() [2/2]

+ +
+
+
+template<class Model , bool disable_reprediction = false>
+
+template<bool check = disable_reprediction>
+ + + + + +
+ + + + + + + + +
std::enable_if_t<check, statecov_t> mrs_lib::Repredictor< Model, disable_reprediction >::predictTo (const ros::Time & to_stamp)
+
+inline
+
+ +

Estimates the system state and covariance matrix at the specified time.

+

The measurement and system input histories are used to estimate the state vector and covariance matrix values at the specified time, which are returned.

+
Parameters
+ + +
to_stampThe desired time at which the state vector and covariance matrix should be estimated.
+
+
+
Returns
Returns the estimated state vector and covariance matrix in a single struct.
+
Note
This is the variant of the method when reprediction is disabled and will function like a dumb LKF.
+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/classmrs__lib_1_1Repredictor.js b/classmrs__lib_1_1Repredictor.js new file mode 100644 index 00000000..dd5372d8 --- /dev/null +++ b/classmrs__lib_1_1Repredictor.js @@ -0,0 +1,30 @@ +var classmrs__lib_1_1Repredictor = +[ + [ "history_t", "classmrs__lib_1_1Repredictor.html#a4f62944beacf99f22b71726d2cb5a0c1", null ], + [ "ModelPtr", "classmrs__lib_1_1Repredictor.html#acb4a34d97aab3896de9565012a890381", null ], + [ "P_t", "classmrs__lib_1_1Repredictor.html#aca5fb76c2e698ed1dd2c58e340adca58", null ], + [ "Q_t", "classmrs__lib_1_1Repredictor.html#af0b9dfd5f21b220e87c79298b061f63d", null ], + [ "R_t", "classmrs__lib_1_1Repredictor.html#aac7c07ba0237230fa7346932fb542ae9", null ], + [ "statecov_t", "classmrs__lib_1_1Repredictor.html#a794952d1627187223300848cd3e1bf66", null ], + [ "u_t", "classmrs__lib_1_1Repredictor.html#a19532d9b875ac33f80ffe313dfb26e6d", null ], + [ "x_t", "classmrs__lib_1_1Repredictor.html#ac9550981d03dc3c898dcbd39c4bc461f", null ], + [ "z_t", "classmrs__lib_1_1Repredictor.html#a4f12cadd7f0377eccb70b8d61e7ee8e3", null ], + [ "Repredictor", "classmrs__lib_1_1Repredictor.html#a035888099138efba982bda818c5fe390", null ], + [ "Repredictor", "classmrs__lib_1_1Repredictor.html#a0245871abc8208f13b4b33a7c2ece708", null ], + [ "Repredictor", "classmrs__lib_1_1Repredictor.html#a6ffbce95c9194f159c203378845851d0", null ], + [ "addInputChange", "classmrs__lib_1_1Repredictor.html#a2fa01fc3dbe7a557b80b6104466c8b7e", null ], + [ "addInputChange", "classmrs__lib_1_1Repredictor.html#a4db1b1896eb17c54bc906d0e9da1eee9", null ], + [ "addInputChangeWithNoise", "classmrs__lib_1_1Repredictor.html#a203a2fc80f2ab2d0caeb2b09e2c410a3", null ], + [ "addInputChangeWithNoise", "classmrs__lib_1_1Repredictor.html#ac85faca4dca9e6f785078eac6819f10f", null ], + [ "addMeasurement", "classmrs__lib_1_1Repredictor.html#a5e1db8bec67cabd386b8924c5312f648", null ], + [ "addMeasurement", "classmrs__lib_1_1Repredictor.html#a0aed856752f139230db775620b4b97da", null ], + [ "addProcessNoiseChange", "classmrs__lib_1_1Repredictor.html#ad07b1f478d926355157c46d93cde1b4b", null ], + [ "addProcessNoiseChange", "classmrs__lib_1_1Repredictor.html#a1a409036d5c94ee2115b2e31465fd2c7", null ], + [ "checkMonotonicity", "classmrs__lib_1_1Repredictor.html#abcd77c1a5c4a58a9e87ad47d5270f8ed", null ], + [ "predictTo", "classmrs__lib_1_1Repredictor.html#a018a96efcc5533e0e43b195cc23ee42e", null ], + [ "predictTo", "classmrs__lib_1_1Repredictor.html#ac4bd7a77f3a9c73309108c35cad4936c", null ], + [ "printBuffer", "classmrs__lib_1_1Repredictor.html#aece422abbff5ac9b83b79b0fd128b85d", null ], + [ "m_default_model", "classmrs__lib_1_1Repredictor.html#a53e46cd8b6ef87f1a716f879883807cf", null ], + [ "m_history", "classmrs__lib_1_1Repredictor.html#a1a3d0fc65e325813bbdbbcb62ba1d0eb", null ], + [ "m_sc", "classmrs__lib_1_1Repredictor.html#a0353caac9435795af6495ea3ea6a7352", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1RepredictorAloamgarm-members.html b/classmrs__lib_1_1RepredictorAloamgarm-members.html new file mode 100644 index 00000000..510f6aec --- /dev/null +++ b/classmrs__lib_1_1RepredictorAloamgarm-members.html @@ -0,0 +1,132 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::RepredictorAloamgarm< Model > Member List
+
+
+ +

This is the complete list of members for mrs_lib::RepredictorAloamgarm< Model >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
addInputChange(const u_t &u, const ros::Time &stamp, const ModelPtr &model=nullptr)mrs_lib::Repredictor< Model >inline
addInputChange(const u_t &u,[[maybe_unused]] const ros::Time &stamp, const ModelPtr &model=nullptr)mrs_lib::Repredictor< Model >inline
addInputChangeWithNoise(const u_t &u, const Q_t &Q, const ros::Time &stamp, const ModelPtr &model=nullptr)mrs_lib::Repredictor< Model >inline
addInputChangeWithNoise(const u_t &u, const Q_t &Q,[[maybe_unused]] const ros::Time &stamp, const ModelPtr &model=nullptr)mrs_lib::Repredictor< Model >inline
addMeasurement(const z_t &z, const R_t &R, const ros::Time &stamp, const ModelPtr &model=nullptr, const double &meas_id=-1)mrs_lib::Repredictor< Model >inline
addMeasurement(const z_t &z, const R_t &R, const ros::Time &stamp, const ModelPtr &model=nullptr, const double &meas_id=-1)mrs_lib::Repredictor< Model >inline
addProcessNoiseChange(const Q_t &Q, const ros::Time &stamp, const ModelPtr &model=nullptr)mrs_lib::Repredictor< Model >inline
addProcessNoiseChange(const Q_t &Q,[[maybe_unused]] const ros::Time &stamp, const ModelPtr &model=nullptr)mrs_lib::Repredictor< Model >inline
checkMonotonicity(const T &buf) (defined in mrs_lib::Repredictor< Model >)mrs_lib::Repredictor< Model >inlineprotected
history_t typedef (defined in mrs_lib::RepredictorAloamgarm< Model >)mrs_lib::RepredictorAloamgarm< Model >
m_default_model (defined in mrs_lib::Repredictor< Model >)mrs_lib::Repredictor< Model >protected
m_history (defined in mrs_lib::Repredictor< Model >)mrs_lib::Repredictor< Model >protected
m_sc (defined in mrs_lib::Repredictor< Model >)mrs_lib::Repredictor< Model >protected
ModelPtr typedefmrs_lib::RepredictorAloamgarm< Model >
P_t typedefmrs_lib::RepredictorAloamgarm< Model >
predictTo(const ros::Time &to_stamp)mrs_lib::Repredictor< Model >inline
predictTo(const ros::Time &to_stamp)mrs_lib::Repredictor< Model >inline
printBuffer(const T &buf) (defined in mrs_lib::Repredictor< Model >)mrs_lib::Repredictor< Model >inlineprotected
Q_t typedefmrs_lib::RepredictorAloamgarm< Model >
R_t typedefmrs_lib::RepredictorAloamgarm< Model >
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)mrs_lib::Repredictor< Model >inline
Repredictor()mrs_lib::Repredictor< Model >inline
Repredictor(const x_t &x0, const P_t &P0, const Q_t &Q0, const ros::Time &t0, const ModelPtr &model, const unsigned hist_len)mrs_lib::Repredictor< Model >inline
RepredictorAloamgarm(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, const std::shared_ptr< boost::circular_buffer< double >> &nis_buffer)mrs_lib::RepredictorAloamgarm< Model >inline
statecov_t typedefmrs_lib::RepredictorAloamgarm< Model >
u_t typedefmrs_lib::RepredictorAloamgarm< Model >
x_t typedefmrs_lib::RepredictorAloamgarm< Model >
z_t typedefmrs_lib::RepredictorAloamgarm< Model >
+
+ + + + diff --git a/classmrs__lib_1_1RepredictorAloamgarm.html b/classmrs__lib_1_1RepredictorAloamgarm.html new file mode 100644 index 00000000..4a15b78d --- /dev/null +++ b/classmrs__lib_1_1RepredictorAloamgarm.html @@ -0,0 +1,383 @@ + + + + + + + +mrs_lib: mrs_lib::RepredictorAloamgarm< Model > Class Template Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::RepredictorAloamgarm< Model > Class Template Reference
+
+
+ +

Implementation of the RepredictorAloamgarm for fusing measurements with variable delays. + More...

+ +

#include <repredictor_aloamgarm.h>

+
+ + Inheritance diagram for mrs_lib::RepredictorAloamgarm< Model >:
+
+
+ +
+ + Collaboration diagram for mrs_lib::RepredictorAloamgarm< Model >:
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Types

+using x_t = typename Model::x_t
 State vector type $n \times 1$.
 
+using u_t = typename Model::u_t
 Input vector type $m \times 1$.
 
+using z_t = typename Model::z_t
 Measurement vector type $p \times 1$.
 
+using P_t = typename Model::P_t
 State uncertainty covariance matrix type $n \times n$.
 
+using R_t = typename Model::R_t
 Measurement noise covariance matrix type $p \times p$.
 
+using Q_t = typename Model::Q_t
 Process noise covariance matrix type $n \times n$.
 
+using statecov_t = typename Model::statecov_t
 Helper struct for passing around the state and its covariance in one variable.
 
+using ModelPtr = typename std::shared_ptr< Model >
 Shorthand type for a shared pointer-to-Model.
 
+using history_t = typename Repredictor< Model >::history_t
 
- Public Types inherited from mrs_lib::Repredictor< Model >
+using x_t = typename Model::x_t
 State vector type $n \times 1$.
 
+using u_t = typename Model::u_t
 Input vector type $m \times 1$.
 
+using z_t = typename Model::z_t
 Measurement vector type $p \times 1$.
 
+using P_t = typename Model::P_t
 State uncertainty covariance matrix type $n \times n$.
 
+using R_t = typename Model::R_t
 Measurement noise covariance matrix type $p \times p$.
 
+using Q_t = typename Model::Q_t
 Process noise covariance matrix type $n \times n$.
 
+using statecov_t = typename Model::statecov_t
 Helper struct for passing around the state and its covariance in one variable.
 
+using ModelPtr = typename std::shared_ptr< Model >
 Shorthand type for a shared pointer-to-Model.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 RepredictorAloamgarm (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, const std::shared_ptr< boost::circular_buffer< double >> &nis_buffer)
 Variation of the constructor for kalman filter using nis_buffer (ALOAMGARM) More...
 
- Public Member Functions inherited from mrs_lib::Repredictor< Model >
std::enable_if_t<!check, statecov_tpredictTo (const ros::Time &to_stamp)
 Estimates the system state and covariance matrix at the specified time. More...
 
std::enable_if_t< check, statecov_tpredictTo (const ros::Time &to_stamp)
 Estimates the system state and covariance matrix at the specified time. More...
 
std::enable_if_t<!check > addInputChangeWithNoise (const u_t &u, const Q_t &Q, const ros::Time &stamp, const ModelPtr &model=nullptr)
 Adds one system input to the history buffer, removing the oldest element in the buffer if it is full. More...
 
std::enable_if_t< check > addInputChangeWithNoise (const u_t &u, const Q_t &Q,[[maybe_unused]] const ros::Time &stamp, const ModelPtr &model=nullptr)
 Adds one system input to the history buffer, removing the oldest element in the buffer if it is full. More...
 
std::enable_if_t<!check > addInputChange (const u_t &u, const ros::Time &stamp, const ModelPtr &model=nullptr)
 Adds one system input to the history buffer, removing the oldest element in the buffer if it is full. More...
 
std::enable_if_t< check > addInputChange (const u_t &u,[[maybe_unused]] const ros::Time &stamp, const ModelPtr &model=nullptr)
 Adds one system input to the history buffer, removing the oldest element in the buffer if it is full. More...
 
std::enable_if_t<!check > addProcessNoiseChange (const Q_t &Q, const ros::Time &stamp, const ModelPtr &model=nullptr)
 Adds one system input to the history buffer, removing the oldest element in the buffer if it is full. More...
 
std::enable_if_t< check > addProcessNoiseChange (const Q_t &Q,[[maybe_unused]] const ros::Time &stamp, const ModelPtr &model=nullptr)
 Adds one system input to the history buffer, removing the oldest element in the buffer if it is full. More...
 
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)
 Adds one measurement to the history buffer, removing the oldest element in the buffer if it is full. More...
 
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)
 Adds one measurement to the history buffer, removing the oldest element in the buffer if it is full. More...
 
 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)
 The main constructor. More...
 
 Repredictor ()
 Empty constructor. More...
 
 Repredictor (const x_t &x0, const P_t &P0, const Q_t &Q0, const ros::Time &t0, const ModelPtr &model, const unsigned hist_len)
 Variation of the constructor for cases without a system input. More...
 
+ + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Protected Types inherited from mrs_lib::Repredictor< Model >
+using history_t = boost::circular_buffer< info_t >
 
- Protected Member Functions inherited from mrs_lib::Repredictor< Model >
+bool checkMonotonicity (const T &buf)
 
+void printBuffer (const T &buf)
 
- Protected Attributes inherited from mrs_lib::Repredictor< Model >
+statecov_t m_sc
 
+ModelPtr m_default_model
 
+history_t m_history
 
+

Detailed Description

+

template<class Model>
+class mrs_lib::RepredictorAloamgarm< Model >

+ +

Implementation of the RepredictorAloamgarm for fusing measurements with variable delays.

+

A standard state-space system model is assumed for the repredictor with system inputs and measurements, generated from the system state vector. The inputs and measurements may be delayed with varying durations (an older measurement may become available after 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 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 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 significantly bias your latest estimate.

+

To accomodate this, the RepredictorAloamgarm keeps a buffer of N last inputs and measurements (N is specified in the constructor). This buffer is then used to re-predict the desired state to a specific time, as requested by the user. Note that the re-prediction is evaluated in a lazy manner only when the user requests it, so it goes through the whole history buffer every time a prediction is requested.

+

The RepredictorAloamgarm utilizes a fusion Model (specified as the template parameter), which should implement the predict() and correct() methods. This Model is used for fusing the system inputs and measurements as well as for predictions. Typically, this Model will be some kind of a Kalman Filter (LKF, UKF etc.).

Note
The Model should be able to accomodate predictions with varying time steps in order for the RepredictorAloamgarm to work correctly (see eg. the varstepLKF class).
+
Template Parameters
+ + +
Modelthe prediction and correction model (eg. a Kalman Filter).
+
+
+

Constructor & Destructor Documentation

+ +

◆ RepredictorAloamgarm()

+ +
+
+
+template<class Model >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::RepredictorAloamgarm< Model >::RepredictorAloamgarm (const x_tx0,
const P_tP0,
const u_tu0,
const Q_tQ0,
const ros::Time & t0,
const ModelPtrmodel,
const unsigned hist_len,
const std::shared_ptr< boost::circular_buffer< double >> & nis_buffer 
)
+
+inline
+
+ +

Variation of the constructor for kalman filter using nis_buffer (ALOAMGARM)

+

Initializes the RepredictorAloamgarm with the necessary initial and default values.

+
Parameters
+ + + + + + + + + +
x0Initial state.
P0Covariance matrix of the initial state uncertainty.
u0Initial system input.
Q0Default covariance matrix of the process noise.
t0Time stamp of the initial state.
modelDefault prediction and correction model.
hist_lenLength of the history buffer for system inputs and measurements.
nis_bufferCircular buffer for NIS values.
+
+
+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/classmrs__lib_1_1RepredictorAloamgarm.js b/classmrs__lib_1_1RepredictorAloamgarm.js new file mode 100644 index 00000000..d65cdcee --- /dev/null +++ b/classmrs__lib_1_1RepredictorAloamgarm.js @@ -0,0 +1,13 @@ +var classmrs__lib_1_1RepredictorAloamgarm = +[ + [ "history_t", "classmrs__lib_1_1RepredictorAloamgarm.html#adfbe585577a0feda074bad4e18d617dc", null ], + [ "ModelPtr", "classmrs__lib_1_1RepredictorAloamgarm.html#a7766d3dbccd04fcbe584cca6730153ca", null ], + [ "P_t", "classmrs__lib_1_1RepredictorAloamgarm.html#a1f2bffb8cbea233b14036e016e8bb654", null ], + [ "Q_t", "classmrs__lib_1_1RepredictorAloamgarm.html#aa031cc536ee7a46c3e79287c65fc1fa7", null ], + [ "R_t", "classmrs__lib_1_1RepredictorAloamgarm.html#afa36b8b183f868a84dc182e4ac562d44", null ], + [ "statecov_t", "classmrs__lib_1_1RepredictorAloamgarm.html#a4d5da8a5d296bf98bff6f99eaf550ae7", null ], + [ "u_t", "classmrs__lib_1_1RepredictorAloamgarm.html#acf7e98ab597eeeb4766b9794cf861f13", null ], + [ "x_t", "classmrs__lib_1_1RepredictorAloamgarm.html#a5c2992c6bde2dd8f3bdc7673fc3977da", null ], + [ "z_t", "classmrs__lib_1_1RepredictorAloamgarm.html#a3e265f15f9b8b031af819d1d2045909b", null ], + [ "RepredictorAloamgarm", "classmrs__lib_1_1RepredictorAloamgarm.html#a1e1d3245d8f2fd98c9f80d4795061395", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1RepredictorAloamgarm__coll__graph.map b/classmrs__lib_1_1RepredictorAloamgarm__coll__graph.map new file mode 100644 index 00000000..68c827b9 --- /dev/null +++ b/classmrs__lib_1_1RepredictorAloamgarm__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/classmrs__lib_1_1RepredictorAloamgarm__coll__graph.md5 b/classmrs__lib_1_1RepredictorAloamgarm__coll__graph.md5 new file mode 100644 index 00000000..4419632f --- /dev/null +++ b/classmrs__lib_1_1RepredictorAloamgarm__coll__graph.md5 @@ -0,0 +1 @@ +4018511dbda9a0f596989656ba14d0ad \ No newline at end of file diff --git a/classmrs__lib_1_1RepredictorAloamgarm__coll__graph.png b/classmrs__lib_1_1RepredictorAloamgarm__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..b3442949dbdedcb09a28b38f965136bf6b936444 GIT binary patch literal 5946 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 + + + diff --git a/classmrs__lib_1_1RepredictorAloamgarm__inherit__graph.md5 b/classmrs__lib_1_1RepredictorAloamgarm__inherit__graph.md5 new file mode 100644 index 00000000..4419632f --- /dev/null +++ b/classmrs__lib_1_1RepredictorAloamgarm__inherit__graph.md5 @@ -0,0 +1 @@ +4018511dbda9a0f596989656ba14d0ad \ No newline at end of file diff --git a/classmrs__lib_1_1RepredictorAloamgarm__inherit__graph.png b/classmrs__lib_1_1RepredictorAloamgarm__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..b3442949dbdedcb09a28b38f965136bf6b936444 GIT binary patch literal 5946 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 + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::Routine Member List
+
+
+ +

This is the complete list of members for mrs_lib::Routine, including all inherited members.

+ + + + + +
end(void) (defined in mrs_lib::Routine)mrs_lib::Routine
Routine(std::string name, std::string node_name, std::shared_ptr< ros::Publisher > publisher, std::shared_ptr< std::mutex > mutex_publisher, bool profiler_enabled) (defined in mrs_lib::Routine)mrs_lib::Routine
Routine(std::string name, std::string node_name, double expected_rate, double threshold, std::shared_ptr< ros::Publisher > publisher, std::shared_ptr< std::mutex > mutex_publisher, bool profiler_enabled, ros::TimerEvent event) (defined in mrs_lib::Routine)mrs_lib::Routine
~Routine() (defined in mrs_lib::Routine)mrs_lib::Routine
+
+ + + + diff --git a/classmrs__lib_1_1Routine.html b/classmrs__lib_1_1Routine.html new file mode 100644 index 00000000..150eb3ca --- /dev/null +++ b/classmrs__lib_1_1Routine.html @@ -0,0 +1,122 @@ + + + + + + + +mrs_lib: mrs_lib::Routine Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::Routine Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

Routine (std::string name, std::string node_name, std::shared_ptr< ros::Publisher > publisher, std::shared_ptr< std::mutex > mutex_publisher, bool profiler_enabled)
 
Routine (std::string name, std::string node_name, double expected_rate, double threshold, std::shared_ptr< ros::Publisher > publisher, std::shared_ptr< std::mutex > mutex_publisher, bool profiler_enabled, ros::TimerEvent event)
 
+void end (void)
 
+
The documentation for this class was generated from the following files:
    +
  • include/mrs_lib/profiler.h
  • +
  • src/profiler/profiler.cpp
  • +
+
+
+ + + + diff --git a/classmrs__lib_1_1Routine.js b/classmrs__lib_1_1Routine.js new file mode 100644 index 00000000..00d07904 --- /dev/null +++ b/classmrs__lib_1_1Routine.js @@ -0,0 +1,7 @@ +var classmrs__lib_1_1Routine = +[ + [ "Routine", "classmrs__lib_1_1Routine.html#a0fdaedd9d006a1a3ab935783fd45ad4f", null ], + [ "Routine", "classmrs__lib_1_1Routine.html#a97f405ab968c85699c3b3c6d60ee8b79", null ], + [ "~Routine", "classmrs__lib_1_1Routine.html#a30d39155a75b06030d7539566d2068d2", null ], + [ "end", "classmrs__lib_1_1Routine.html#aec3b10482c1b3b3ba80bde4f60c919a7", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1SafetyZone-members.html b/classmrs__lib_1_1SafetyZone-members.html new file mode 100644 index 00000000..ade2a40e --- /dev/null +++ b/classmrs__lib_1_1SafetyZone-members.html @@ -0,0 +1,110 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::SafetyZone Member List
+
+
+ +

This is the complete list of members for mrs_lib::SafetyZone, including all inherited members.

+ + + + + + + +
getBorder() (defined in mrs_lib::SafetyZone)mrs_lib::SafetyZone
isPathValid(const double p1x, const double p1y, const double p2x, const double p2y) (defined in mrs_lib::SafetyZone)mrs_lib::SafetyZone
isPointValid(const double px, const double py) (defined in mrs_lib::SafetyZone)mrs_lib::SafetyZone
SafetyZone(Polygon outerBorder) (defined in mrs_lib::SafetyZone)mrs_lib::SafetyZone
SafetyZone(const Eigen::MatrixXd &outerBorderMatrix) (defined in mrs_lib::SafetyZone)mrs_lib::SafetyZone
~SafetyZone() (defined in mrs_lib::SafetyZone)mrs_lib::SafetyZone
+
+ + + + diff --git a/classmrs__lib_1_1SafetyZone.html b/classmrs__lib_1_1SafetyZone.html new file mode 100644 index 00000000..22ea5305 --- /dev/null +++ b/classmrs__lib_1_1SafetyZone.html @@ -0,0 +1,134 @@ + + + + + + + +mrs_lib: mrs_lib::SafetyZone Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::SafetyZone Class Reference
+
+
+ + + + +

+Classes

struct  BorderError
 
+ + + + + + + + + + + +

+Public Member Functions

SafetyZone (Polygon outerBorder)
 
SafetyZone (const Eigen::MatrixXd &outerBorderMatrix)
 
+bool isPointValid (const double px, const double py)
 
+bool isPathValid (const double p1x, const double p1y, const double p2x, const double p2y)
 
+Polygon getBorder ()
 
+
The documentation for this class was generated from the following files:
    +
  • include/mrs_lib/safety_zone/safety_zone.h
  • +
  • src/safety_zone/safety_zone.cpp
  • +
+
+
+ + + + diff --git a/classmrs__lib_1_1SafetyZone.js b/classmrs__lib_1_1SafetyZone.js new file mode 100644 index 00000000..d5bbfe35 --- /dev/null +++ b/classmrs__lib_1_1SafetyZone.js @@ -0,0 +1,10 @@ +var classmrs__lib_1_1SafetyZone = +[ + [ "BorderError", "structmrs__lib_1_1SafetyZone_1_1BorderError.html", "structmrs__lib_1_1SafetyZone_1_1BorderError" ], + [ "SafetyZone", "classmrs__lib_1_1SafetyZone.html#ad130d2a0ee6b59bbae8ec1c74db5e709", null ], + [ "~SafetyZone", "classmrs__lib_1_1SafetyZone.html#a2bb02ed16ded0e81467cbf1d8d08bd9e", null ], + [ "SafetyZone", "classmrs__lib_1_1SafetyZone.html#aa0453f04bbb93787aa6aa6be8ae342ff", null ], + [ "getBorder", "classmrs__lib_1_1SafetyZone.html#aa42fec6e604ceb9605b47b92d6c210b0", null ], + [ "isPathValid", "classmrs__lib_1_1SafetyZone.html#a1ab4533d92db725138a4dc11b630e0f6", null ], + [ "isPointValid", "classmrs__lib_1_1SafetyZone.html#a0a19dd70b4e5c41b84ce32ccc0be6d0d", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1ScopeTimer-members.html b/classmrs__lib_1_1ScopeTimer-members.html new file mode 100644 index 00000000..4dec607a --- /dev/null +++ b/classmrs__lib_1_1ScopeTimer-members.html @@ -0,0 +1,110 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::ScopeTimer Member List
+
+
+ +

This is the complete list of members for mrs_lib::ScopeTimer, including all inherited members.

+ + + + + + + +
checkpoint(const std::string &label)mrs_lib::ScopeTimer
getLifetime()mrs_lib::ScopeTimer
ScopeTimer(const std::string &label, const ros::Duration &throttle_period=ros::Duration(0), const bool enable=true, const std::shared_ptr< ScopeTimerLogger > scope_timer_logger=nullptr)mrs_lib::ScopeTimer
ScopeTimer(const std::string &label, const time_point &tp0, const ros::Duration &throttle_period=ros::Duration(0), const bool enable=true, const std::shared_ptr< ScopeTimerLogger > scope_timer_logger=nullptr)mrs_lib::ScopeTimer
ScopeTimer(const std::string &label, const std::shared_ptr< ScopeTimerLogger > scope_timer_logger, const bool enable=true)mrs_lib::ScopeTimer
~ScopeTimer()mrs_lib::ScopeTimer
+
+ + + + diff --git a/classmrs__lib_1_1ScopeTimer.html b/classmrs__lib_1_1ScopeTimer.html new file mode 100644 index 00000000..a292441d --- /dev/null +++ b/classmrs__lib_1_1ScopeTimer.html @@ -0,0 +1,170 @@ + + + + + + + +mrs_lib: mrs_lib::ScopeTimer Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::ScopeTimer Class Reference
+
+
+ +

Simple timer which will time a duration of a scope and checkpoints inside the scope in ros time and std::chrono time. + More...

+ +

#include <scope_timer.h>

+ + + + +

+Classes

struct  time_point
 
+ + + + + + + + + + + + + + + + + + + +

+Public Member Functions

ScopeTimer (const std::string &label, const ros::Duration &throttle_period=ros::Duration(0), const bool enable=true, const std::shared_ptr< ScopeTimerLogger > scope_timer_logger=nullptr)
 The basic constructor with a user-defined label of the timer, throttled period and file logger.
 
ScopeTimer (const std::string &label, const time_point &tp0, const ros::Duration &throttle_period=ros::Duration(0), const bool enable=true, const std::shared_ptr< ScopeTimerLogger > scope_timer_logger=nullptr)
 The basic constructor with a user-defined label of the timer and a pre-start time, which will also be measured.
 
ScopeTimer (const std::string &label, const std::shared_ptr< ScopeTimerLogger > scope_timer_logger, const bool enable=true)
 The basic constructor with a user-defined label of the timer and file logger.
 
+void checkpoint (const std::string &label)
 Checkpoint, prints the time passed until the point this function is called.
 
float getLifetime ()
 Getter for scope timer lifetime. More...
 
~ScopeTimer ()
 The basic destructor which prints out or logs the scope times, if enabled.
 
+

Detailed Description

+

Simple timer which will time a duration of a scope and checkpoints inside the scope in ros time and std::chrono time.

+

Member Function Documentation

+ +

◆ getLifetime()

+ +
+
+ + + + + + + +
float mrs_lib::ScopeTimer::getLifetime ()
+
+ +

Getter for scope timer lifetime.

+
Returns
lifetime as floating point milliseconds
+ +
+
+
The documentation for this class was generated from the following files:
    +
  • include/mrs_lib/scope_timer.h
  • +
  • src/scope_timer/scope_timer.cpp
  • +
+
+
+ + + + diff --git a/classmrs__lib_1_1ScopeTimer.js b/classmrs__lib_1_1ScopeTimer.js new file mode 100644 index 00000000..b0cf4d12 --- /dev/null +++ b/classmrs__lib_1_1ScopeTimer.js @@ -0,0 +1,10 @@ +var classmrs__lib_1_1ScopeTimer = +[ + [ "time_point", "structmrs__lib_1_1ScopeTimer_1_1time__point.html", "structmrs__lib_1_1ScopeTimer_1_1time__point" ], + [ "ScopeTimer", "classmrs__lib_1_1ScopeTimer.html#aebac3a7bad2d63f49d5777e08b504661", null ], + [ "ScopeTimer", "classmrs__lib_1_1ScopeTimer.html#a8943aec6fbe491633b7f698eb3f0d131", null ], + [ "ScopeTimer", "classmrs__lib_1_1ScopeTimer.html#abdaf77484c74055916b8e491c8ffe318", null ], + [ "~ScopeTimer", "classmrs__lib_1_1ScopeTimer.html#a243e048e46a8ef623b60c465dc7ee102", null ], + [ "checkpoint", "classmrs__lib_1_1ScopeTimer.html#acbb378343cba8f94ef228024d7a4b938", null ], + [ "getLifetime", "classmrs__lib_1_1ScopeTimer.html#abe8dc75be918b3a2ca7bbb043a022106", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1ScopeTimerLogger-members.html b/classmrs__lib_1_1ScopeTimerLogger-members.html new file mode 100644 index 00000000..534066c0 --- /dev/null +++ b/classmrs__lib_1_1ScopeTimerLogger-members.html @@ -0,0 +1,112 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::ScopeTimerLogger Member List
+
+
+ +

This is the complete list of members for mrs_lib::ScopeTimerLogger, including all inherited members.

+ + + + + + + + + +
chrono_tp typedef (defined in mrs_lib::ScopeTimerLogger)mrs_lib::ScopeTimerLogger
getLogFilepath()mrs_lib::ScopeTimerLoggerinline
log(const std::string &scope, const chrono_tp &time_start, const chrono_tp &time_end)mrs_lib::ScopeTimerLogger
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)mrs_lib::ScopeTimerLogger
loggingEnabled()mrs_lib::ScopeTimerLoggerinline
ScopeTimerLogger(const std::string &logfile, const bool enable_logging=true, const int log_precision=10)mrs_lib::ScopeTimerLogger
shouldLog()mrs_lib::ScopeTimerLoggerinline
~ScopeTimerLogger()mrs_lib::ScopeTimerLogger
+
+ + + + diff --git a/classmrs__lib_1_1ScopeTimerLogger.html b/classmrs__lib_1_1ScopeTimerLogger.html new file mode 100644 index 00000000..3a1cde4f --- /dev/null +++ b/classmrs__lib_1_1ScopeTimerLogger.html @@ -0,0 +1,155 @@ + + + + + + + +mrs_lib: mrs_lib::ScopeTimerLogger Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::ScopeTimerLogger Class Reference
+
+
+ +

Simple file logger of scope timer and its checkpoints. + More...

+ +

#include <scope_timer.h>

+ + + + +

+Public Types

+using chrono_tp = std::chrono::time_point< std::chrono::steady_clock >
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

ScopeTimerLogger (const std::string &logfile, const bool enable_logging=true, const int log_precision=10)
 The basic constructor with a user-defined path to the logger file, enable flag and float-logging precision.
 
~ScopeTimerLogger ()
 The basic destructor which closes the logging file.
 
+bool shouldLog ()
 Returns true if a non-empty path to a logger file was given by the user.
 
+bool loggingEnabled ()
 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 opened.
 
+std::string getLogFilepath ()
 Returns the path to the log.
 
+void log (const std::string &scope, const chrono_tp &time_start, const chrono_tp &time_end)
 Writes the time data of the given scope and empty checkpoints into the logger stream.
 
+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)
 Writes the time data of the given scope and checkpoint labels into the logger stream.
 
+

Detailed Description

+

Simple file logger of scope timer and its checkpoints.

+

The documentation for this class was generated from the following files:
    +
  • include/mrs_lib/scope_timer.h
  • +
  • src/scope_timer/scope_timer.cpp
  • +
+
+
+ + + + diff --git a/classmrs__lib_1_1ScopeTimerLogger.js b/classmrs__lib_1_1ScopeTimerLogger.js new file mode 100644 index 00000000..fa593e89 --- /dev/null +++ b/classmrs__lib_1_1ScopeTimerLogger.js @@ -0,0 +1,11 @@ +var classmrs__lib_1_1ScopeTimerLogger = +[ + [ "chrono_tp", "classmrs__lib_1_1ScopeTimerLogger.html#ac495e41e5cac5285245d56d6e7cdd235", null ], + [ "ScopeTimerLogger", "classmrs__lib_1_1ScopeTimerLogger.html#a5369b8ec91eab0a06b87485bed5c130c", null ], + [ "~ScopeTimerLogger", "classmrs__lib_1_1ScopeTimerLogger.html#a0152ea8087d16a05027e66c44d99662e", null ], + [ "getLogFilepath", "classmrs__lib_1_1ScopeTimerLogger.html#addb114f39d72c3c3ee2ea8a4074cf455", null ], + [ "log", "classmrs__lib_1_1ScopeTimerLogger.html#a98f7fe29f151e4d0b88952530f40ef06", null ], + [ "log", "classmrs__lib_1_1ScopeTimerLogger.html#a8f3794f5477960606a86543ddb708b1f", null ], + [ "loggingEnabled", "classmrs__lib_1_1ScopeTimerLogger.html#aaf51a60a214ab18976a354c328fc9d09", null ], + [ "shouldLog", "classmrs__lib_1_1ScopeTimerLogger.html#a8bb5c6453336967529f118a717f20825", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1ServiceClientHandler-members.html b/classmrs__lib_1_1ServiceClientHandler-members.html new file mode 100644 index 00000000..cdf8d22c --- /dev/null +++ b/classmrs__lib_1_1ServiceClientHandler-members.html @@ -0,0 +1,116 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::ServiceClientHandler< ServiceType > Member List
+
+
+ +

This is the complete list of members for mrs_lib::ServiceClientHandler< ServiceType >, including all inherited members.

+ + + + + + + + + + + + + +
call(ServiceType &srv)mrs_lib::ServiceClientHandler< ServiceType >
call(ServiceType &srv, const int &attempts)mrs_lib::ServiceClientHandler< ServiceType >
call(ServiceType &srv, const int &attempts, const double &repeat_delay)mrs_lib::ServiceClientHandler< ServiceType >
callAsync(ServiceType &srv)mrs_lib::ServiceClientHandler< ServiceType >
callAsync(ServiceType &srv, const int &attempts)mrs_lib::ServiceClientHandler< ServiceType >
callAsync(ServiceType &srv, const int &attempts, const double &repeat_delay)mrs_lib::ServiceClientHandler< ServiceType >
initialize(ros::NodeHandle &nh, const std::string &address)mrs_lib::ServiceClientHandler< ServiceType >
operator=(const ServiceClientHandler &other)mrs_lib::ServiceClientHandler< ServiceType >
ServiceClientHandler(void)mrs_lib::ServiceClientHandler< ServiceType >inline
ServiceClientHandler(const ServiceClientHandler &other)mrs_lib::ServiceClientHandler< ServiceType >
ServiceClientHandler(ros::NodeHandle &nh, const std::string &address)mrs_lib::ServiceClientHandler< ServiceType >
~ServiceClientHandler(void)mrs_lib::ServiceClientHandler< ServiceType >inline
+
+ + + + diff --git a/classmrs__lib_1_1ServiceClientHandler.html b/classmrs__lib_1_1ServiceClientHandler.html new file mode 100644 index 00000000..63f871ed --- /dev/null +++ b/classmrs__lib_1_1ServiceClientHandler.html @@ -0,0 +1,530 @@ + + + + + + + +mrs_lib: mrs_lib::ServiceClientHandler< ServiceType > Class Template Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::ServiceClientHandler< ServiceType > Class Template Reference
+
+
+ +

user wrapper of the service client handler implementation + More...

+ +

#include <service_client_handler.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

ServiceClientHandler (void)
 generic constructor
 
~ServiceClientHandler (void)
 generic destructor
 
ServiceClientHandleroperator= (const ServiceClientHandler &other)
 operator= More...
 
 ServiceClientHandler (const ServiceClientHandler &other)
 copy constructor More...
 
 ServiceClientHandler (ros::NodeHandle &nh, const std::string &address)
 constructor More...
 
void initialize (ros::NodeHandle &nh, const std::string &address)
 initializer More...
 
bool call (ServiceType &srv)
 "standard" synchronous call More...
 
bool call (ServiceType &srv, const int &attempts)
 "standard" synchronous call with repeats after failure More...
 
bool call (ServiceType &srv, const int &attempts, const double &repeat_delay)
 "standard" synchronous call with repeats after failure More...
 
std::future< ServiceType > callAsync (ServiceType &srv)
 asynchronous call More...
 
std::future< ServiceType > callAsync (ServiceType &srv, const int &attempts)
 asynchronous call with repeats after failure More...
 
std::future< ServiceType > callAsync (ServiceType &srv, const int &attempts, const double &repeat_delay)
 asynchronous call with repeats after failure More...
 
+

Detailed Description

+

template<class ServiceType>
+class mrs_lib::ServiceClientHandler< ServiceType >

+ +

user wrapper of the service client handler implementation

+

Constructor & Destructor Documentation

+ +

◆ ServiceClientHandler() [1/2]

+ +
+
+
+template<class ServiceType >
+ + + + + + + + +
mrs_lib::ServiceClientHandler< ServiceType >::ServiceClientHandler (const ServiceClientHandler< ServiceType > & other)
+
+ +

copy constructor

+
Parameters
+ + +
other
+
+
+ +
+
+ +

◆ ServiceClientHandler() [2/2]

+ +
+
+
+template<class ServiceType >
+ + + + + + + + + + + + + + + + + + +
mrs_lib::ServiceClientHandler< ServiceType >::ServiceClientHandler (ros::NodeHandle & nh,
const std::string & address 
)
+
+ +

constructor

+
Parameters
+ + + +
nhROS node handler
addressservice address
+
+
+ +
+
+

Member Function Documentation

+ +

◆ call() [1/3]

+ +
+
+
+template<class ServiceType >
+ + + + + + + + +
bool mrs_lib::ServiceClientHandler< ServiceType >::call (ServiceType & srv)
+
+ +

"standard" synchronous call

+
Parameters
+ + +
srvdata
+
+
+
Returns
true when success
+ +
+
+ +

◆ call() [2/3]

+ +
+
+
+template<class ServiceType >
+ + + + + + + + + + + + + + + + + + +
bool mrs_lib::ServiceClientHandler< ServiceType >::call (ServiceType & srv,
const int & attempts 
)
+
+ +

"standard" synchronous call with repeats after failure

+
Parameters
+ + + +
srvdata
attemptshow many attempts for the call
+
+
+
Returns
true when success
+ +
+
+ +

◆ call() [3/3]

+ +
+
+
+template<class ServiceType >
+ + + + + + + + + + + + + + + + + + + + + + + + +
bool mrs_lib::ServiceClientHandler< ServiceType >::call (ServiceType & srv,
const int & attempts,
const double & repeat_delay 
)
+
+ +

"standard" synchronous call with repeats after failure

+
Parameters
+ + + + +
srvdata
attemptshow many attempts for the call
repeat_delayhow long to wait before repeating the call
+
+
+
Returns
true when success
+ +
+
+ +

◆ callAsync() [1/3]

+ +
+
+
+template<class ServiceType >
+ + + + + + + + +
std::future< ServiceType > mrs_lib::ServiceClientHandler< ServiceType >::callAsync (ServiceType & srv)
+
+ +

asynchronous call

+
Parameters
+ + +
srvdata
+
+
+
Returns
future result
+ +
+
+ +

◆ callAsync() [2/3]

+ +
+
+
+template<class ServiceType >
+ + + + + + + + + + + + + + + + + + +
std::future< ServiceType > mrs_lib::ServiceClientHandler< ServiceType >::callAsync (ServiceType & srv,
const int & attempts 
)
+
+ +

asynchronous call with repeats after failure

+
Parameters
+ + + +
srvdata
attemptshow many attemps for the call
+
+
+
Returns
future result
+ +
+
+ +

◆ callAsync() [3/3]

+ +
+
+
+template<class ServiceType >
+ + + + + + + + + + + + + + + + + + + + + + + + +
std::future< ServiceType > mrs_lib::ServiceClientHandler< ServiceType >::callAsync (ServiceType & srv,
const int & attempts,
const double & repeat_delay 
)
+
+ +

asynchronous call with repeats after failure

+
Parameters
+ + + + +
srvdata
attemptshow many attemps for the call
repeat_delayhow long to wait before repeating the call
+
+
+
Returns
future result
+ +
+
+ +

◆ initialize()

+ +
+
+
+template<class ServiceType >
+ + + + + + + + + + + + + + + + + + +
void mrs_lib::ServiceClientHandler< ServiceType >::initialize (ros::NodeHandle & nh,
const std::string & address 
)
+
+ +

initializer

+
Parameters
+ + + +
nhROS node handler
addressservice address
+
+
+ +
+
+ +

◆ operator=()

+ +
+
+
+template<class ServiceType >
+ + + + + + + + +
ServiceClientHandler< ServiceType > & mrs_lib::ServiceClientHandler< ServiceType >::operator= (const ServiceClientHandler< ServiceType > & other)
+
+ +

operator=

+
Parameters
+ + +
other
+
+
+
Returns
+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/classmrs__lib_1_1ServiceClientHandler.js b/classmrs__lib_1_1ServiceClientHandler.js new file mode 100644 index 00000000..0ad4b5cb --- /dev/null +++ b/classmrs__lib_1_1ServiceClientHandler.js @@ -0,0 +1,15 @@ +var classmrs__lib_1_1ServiceClientHandler = +[ + [ "ServiceClientHandler", "classmrs__lib_1_1ServiceClientHandler.html#a7d0e35cfbbe280ab0d739c23a26189de", null ], + [ "~ServiceClientHandler", "classmrs__lib_1_1ServiceClientHandler.html#ad796fc7f9044bdeeacdf549faa1d2f48", null ], + [ "ServiceClientHandler", "classmrs__lib_1_1ServiceClientHandler.html#acf286dd2720d41fa05e98c7327d94413", null ], + [ "ServiceClientHandler", "classmrs__lib_1_1ServiceClientHandler.html#a6da5592ce8388bd1aa08b63fd3d3d060", null ], + [ "call", "classmrs__lib_1_1ServiceClientHandler.html#acd827db26db5d8e1f310769509176fe2", null ], + [ "call", "classmrs__lib_1_1ServiceClientHandler.html#a7eee51ebff7a805d425673ddc166d489", null ], + [ "call", "classmrs__lib_1_1ServiceClientHandler.html#afdf41e0cf6b2fa0941ee0ae703facc71", null ], + [ "callAsync", "classmrs__lib_1_1ServiceClientHandler.html#aa7f3a5d1566aa2a361594797f162ca0d", null ], + [ "callAsync", "classmrs__lib_1_1ServiceClientHandler.html#a390d8d24962c3efd849f44627b29387e", null ], + [ "callAsync", "classmrs__lib_1_1ServiceClientHandler.html#ac6babcda855d48bc3b8fc72f45f7672b", null ], + [ "initialize", "classmrs__lib_1_1ServiceClientHandler.html#adff9526494a62051bf864ef6a7178450", null ], + [ "operator=", "classmrs__lib_1_1ServiceClientHandler.html#a03d184432cd8b51f683746e87b071bdb", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1ServiceClientHandler__impl-members.html b/classmrs__lib_1_1ServiceClientHandler__impl-members.html new file mode 100644 index 00000000..438da373 --- /dev/null +++ b/classmrs__lib_1_1ServiceClientHandler__impl-members.html @@ -0,0 +1,113 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::ServiceClientHandler_impl< ServiceType > Member List
+
+
+ +

This is the complete list of members for mrs_lib::ServiceClientHandler_impl< ServiceType >, including all inherited members.

+ + + + + + + + + + +
call(ServiceType &srv)mrs_lib::ServiceClientHandler_impl< ServiceType >
call(ServiceType &srv, const int &attempts)mrs_lib::ServiceClientHandler_impl< ServiceType >
call(ServiceType &srv, const int &attempts, const double &repeat_delay)mrs_lib::ServiceClientHandler_impl< ServiceType >
callAsync(ServiceType &srv)mrs_lib::ServiceClientHandler_impl< ServiceType >
callAsync(ServiceType &srv, const int &attempts)mrs_lib::ServiceClientHandler_impl< ServiceType >
callAsync(ServiceType &srv, const int &attempts, const double &repeat_delay)mrs_lib::ServiceClientHandler_impl< ServiceType >
ServiceClientHandler_impl(void)mrs_lib::ServiceClientHandler_impl< ServiceType >
ServiceClientHandler_impl(ros::NodeHandle &nh, const std::string &address)mrs_lib::ServiceClientHandler_impl< ServiceType >
~ServiceClientHandler_impl(void)mrs_lib::ServiceClientHandler_impl< ServiceType >inline
+
+ + + + diff --git a/classmrs__lib_1_1ServiceClientHandler__impl.html b/classmrs__lib_1_1ServiceClientHandler__impl.html new file mode 100644 index 00000000..307578a2 --- /dev/null +++ b/classmrs__lib_1_1ServiceClientHandler__impl.html @@ -0,0 +1,425 @@ + + + + + + + +mrs_lib: mrs_lib::ServiceClientHandler_impl< ServiceType > Class Template Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::ServiceClientHandler_impl< ServiceType > Class Template Reference
+
+
+ +

implementation of the service client handler + More...

+ +

#include <service_client_handler.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

ServiceClientHandler_impl (void)
 default constructor
 
~ServiceClientHandler_impl (void)
 default destructor
 
 ServiceClientHandler_impl (ros::NodeHandle &nh, const std::string &address)
 constructor More...
 
bool call (ServiceType &srv)
 "classic" synchronous service call More...
 
bool call (ServiceType &srv, const int &attempts)
 "classic" synchronous service call with repeats after an error More...
 
bool call (ServiceType &srv, const int &attempts, const double &repeat_delay)
 "classic" synchronous service call with repeats after an error More...
 
std::future< ServiceType > callAsync (ServiceType &srv)
 asynchronous service call More...
 
std::future< ServiceType > callAsync (ServiceType &srv, const int &attempts)
 asynchronous service call with repeates after an error More...
 
std::future< ServiceType > callAsync (ServiceType &srv, const int &attempts, const double &repeat_delay)
 asynchronous service call with repeates after an error More...
 
+

Detailed Description

+

template<class ServiceType>
+class mrs_lib::ServiceClientHandler_impl< ServiceType >

+ +

implementation of the service client handler

+

Constructor & Destructor Documentation

+ +

◆ ServiceClientHandler_impl()

+ +
+
+
+template<class ServiceType >
+ + + + + + + + + + + + + + + + + + +
mrs_lib::ServiceClientHandler_impl< ServiceType >::ServiceClientHandler_impl (ros::NodeHandle & nh,
const std::string & address 
)
+
+ +

constructor

+
Parameters
+ + + +
nhROS node handler
addressservice address
+
+
+ +
+
+

Member Function Documentation

+ +

◆ call() [1/3]

+ +
+
+
+template<class ServiceType >
+ + + + + + + + +
bool mrs_lib::ServiceClientHandler_impl< ServiceType >::call (ServiceType & srv)
+
+ +

"classic" synchronous service call

+
Parameters
+ + +
srvdata
+
+
+
Returns
true when success
+ +
+
+ +

◆ call() [2/3]

+ +
+
+
+template<class ServiceType >
+ + + + + + + + + + + + + + + + + + +
bool mrs_lib::ServiceClientHandler_impl< ServiceType >::call (ServiceType & srv,
const int & attempts 
)
+
+ +

"classic" synchronous service call with repeats after an error

+
Parameters
+ + + +
srvdata
attemptshow many attempts for the call
+
+
+
Returns
true when success
+ +
+
+ +

◆ call() [3/3]

+ +
+
+
+template<class ServiceType >
+ + + + + + + + + + + + + + + + + + + + + + + + +
bool mrs_lib::ServiceClientHandler_impl< ServiceType >::call (ServiceType & srv,
const int & attempts,
const double & repeat_delay 
)
+
+ +

"classic" synchronous service call with repeats after an error

+
Parameters
+ + + + +
srvdata
attemptshow many attempts for the call
repeat_delayhow long to wait before repeating the call
+
+
+
Returns
true when success
+ +
+
+ +

◆ callAsync() [1/3]

+ +
+
+
+template<class ServiceType >
+ + + + + + + + +
std::future< ServiceType > mrs_lib::ServiceClientHandler_impl< ServiceType >::callAsync (ServiceType & srv)
+
+ +

asynchronous service call

+
Parameters
+ + +
srvdata
+
+
+
Returns
future result
+ +
+
+ +

◆ callAsync() [2/3]

+ +
+
+
+template<class ServiceType >
+ + + + + + + + + + + + + + + + + + +
std::future< ServiceType > mrs_lib::ServiceClientHandler_impl< ServiceType >::callAsync (ServiceType & srv,
const int & attempts 
)
+
+ +

asynchronous service call with repeates after an error

+
Parameters
+ + + +
srvdata
attemptshow many attempts for the call
+
+
+
Returns
future result
+ +
+
+ +

◆ callAsync() [3/3]

+ +
+
+
+template<class ServiceType >
+ + + + + + + + + + + + + + + + + + + + + + + + +
std::future< ServiceType > mrs_lib::ServiceClientHandler_impl< ServiceType >::callAsync (ServiceType & srv,
const int & attempts,
const double & repeat_delay 
)
+
+ +

asynchronous service call with repeates after an error

+
Parameters
+ + + + +
srvdata
attemptshow many attempts for the call
repeat_delayhow long to wait before repeating the call
+
+
+
Returns
future result
+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/classmrs__lib_1_1ServiceClientHandler__impl.js b/classmrs__lib_1_1ServiceClientHandler__impl.js new file mode 100644 index 00000000..ee5325c7 --- /dev/null +++ b/classmrs__lib_1_1ServiceClientHandler__impl.js @@ -0,0 +1,12 @@ +var classmrs__lib_1_1ServiceClientHandler__impl = +[ + [ "ServiceClientHandler_impl", "classmrs__lib_1_1ServiceClientHandler__impl.html#ae1f6eb48630bf4d3eb9e92b95c6269c8", null ], + [ "~ServiceClientHandler_impl", "classmrs__lib_1_1ServiceClientHandler__impl.html#a2d906a4c237db032edfb7578d0eb2be1", null ], + [ "ServiceClientHandler_impl", "classmrs__lib_1_1ServiceClientHandler__impl.html#a4ae10aba33d5d46013bf25a61c005ac0", null ], + [ "call", "classmrs__lib_1_1ServiceClientHandler__impl.html#a50394dc3190eafbce4c58b20823942d6", null ], + [ "call", "classmrs__lib_1_1ServiceClientHandler__impl.html#a35cc1c54991d1eb2801e2dfd205e1ef0", null ], + [ "call", "classmrs__lib_1_1ServiceClientHandler__impl.html#aecd6585588ea75d444577651591fb847", null ], + [ "callAsync", "classmrs__lib_1_1ServiceClientHandler__impl.html#a39ed1a2c10f97d75447224bd9cb9e968", null ], + [ "callAsync", "classmrs__lib_1_1ServiceClientHandler__impl.html#acbc6113b775545e89e7fa4fd41cf15ed", null ], + [ "callAsync", "classmrs__lib_1_1ServiceClientHandler__impl.html#ae15fc00b04219ae241e03c0973a00c5a", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1SubscribeHandler-members.html b/classmrs__lib_1_1SubscribeHandler-members.html new file mode 100644 index 00000000..e6e9aee6 --- /dev/null +++ b/classmrs__lib_1_1SubscribeHandler-members.html @@ -0,0 +1,132 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::SubscribeHandler< MessageType > Member List
+
+
+ +

This is the complete list of members for mrs_lib::SubscribeHandler< MessageType >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
getMsg()mrs_lib::SubscribeHandler< MessageType >inlinevirtual
hasMsg() constmrs_lib::SubscribeHandler< MessageType >inlinevirtual
lastMsgTime() constmrs_lib::SubscribeHandler< MessageType >inlinevirtual
message_callback_t typedefmrs_lib::SubscribeHandler< MessageType >
message_type typedefmrs_lib::SubscribeHandler< MessageType >
newMsg() constmrs_lib::SubscribeHandler< MessageType >inlinevirtual
operator=(const SubscribeHandler &)=delete (defined in mrs_lib::SubscribeHandler< MessageType >)mrs_lib::SubscribeHandler< MessageType >
operator=(SubscribeHandler &&other) (defined in mrs_lib::SubscribeHandler< MessageType >)mrs_lib::SubscribeHandler< MessageType >inline
peekMsg() constmrs_lib::SubscribeHandler< MessageType >inlinevirtual
start()mrs_lib::SubscribeHandler< MessageType >inlinevirtual
stop()mrs_lib::SubscribeHandler< MessageType >inlinevirtual
subscribedTopicName() constmrs_lib::SubscribeHandler< MessageType >inlinevirtual
SubscribeHandler()mrs_lib::SubscribeHandler< MessageType >inline
SubscribeHandler(const SubscribeHandlerOptions &options, const std::string &topic_name, Types ... args)mrs_lib::SubscribeHandler< MessageType >inline
SubscribeHandler(const SubscribeHandlerOptions &options, const message_callback_t &message_callback={})mrs_lib::SubscribeHandler< MessageType >inline
SubscribeHandler(const SubscribeHandlerOptions &options, const timeout_callback_t &timeout_callback, Types ... args)mrs_lib::SubscribeHandler< MessageType >inline
SubscribeHandler(const SubscribeHandlerOptions &options, void(ObjectType1::*const timeout_callback)(const std::string &topic_name, const ros::Time &last_msg), ObjectType1 *const obj1, Types ... args)mrs_lib::SubscribeHandler< MessageType >inline
SubscribeHandler(const SubscribeHandlerOptions &options, void(ObjectType2::*const message_callback)(typename MessageType::ConstPtr), ObjectType2 *const obj2, Types ... args)mrs_lib::SubscribeHandler< MessageType >inline
SubscribeHandler(const SubscribeHandlerOptions &options, void(ObjectType2::*const message_callback)(typename MessageType::ConstPtr), ObjectType2 *const obj2, void(ObjectType1::*const timeout_callback)(const std::string &topic_name, const ros::Time &last_msg), ObjectType1 *const obj1, Types ... args)mrs_lib::SubscribeHandler< MessageType >inline
SubscribeHandler(const SubscribeHandlerOptions &options, const ros::Duration &no_message_timeout, Types ... args)mrs_lib::SubscribeHandler< MessageType >inline
SubscribeHandler(const SubscribeHandlerOptions &options, mrs_lib::TimeoutManager &timeout_manager, Types ... args)mrs_lib::SubscribeHandler< MessageType >inline
SubscribeHandler(const SubscribeHandler &)=delete (defined in mrs_lib::SubscribeHandler< MessageType >)mrs_lib::SubscribeHandler< MessageType >
SubscribeHandler(SubscribeHandler &&other) (defined in mrs_lib::SubscribeHandler< MessageType >)mrs_lib::SubscribeHandler< MessageType >inline
timeout_callback_t typedefmrs_lib::SubscribeHandler< MessageType >
topicName() constmrs_lib::SubscribeHandler< MessageType >inlinevirtual
usedMsg() constmrs_lib::SubscribeHandler< MessageType >inlinevirtual
waitForNew(const ros::WallDuration &timeout)mrs_lib::SubscribeHandler< MessageType >inlinevirtual
~SubscribeHandler()=default (defined in mrs_lib::SubscribeHandler< MessageType >)mrs_lib::SubscribeHandler< MessageType >
+
+ + + + diff --git a/classmrs__lib_1_1SubscribeHandler.html b/classmrs__lib_1_1SubscribeHandler.html new file mode 100644 index 00000000..454f7364 --- /dev/null +++ b/classmrs__lib_1_1SubscribeHandler.html @@ -0,0 +1,1069 @@ + + + + + + + +mrs_lib: mrs_lib::SubscribeHandler< MessageType > Class Template Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::SubscribeHandler< MessageType > Class Template Reference
+
+
+ +

The main class for ROS topic subscription, message timeout handling etc. + More...

+ +

#include <subscribe_handler.h>

+ + + + + + +

+Classes

class  Impl
 
class  ImplThreadsafe
 
+ + + + + + + + + + +

+Public Types

+using message_type = MessageType
 Convenience type for the template parameter to enable nice aliasing.
 
+using timeout_callback_t = std::function< void(const std::string &topic_name, const ros::Time &last_msg)>
 Type for the timeout callback function.
 
+using message_callback_t = std::function< void(typename MessageType::ConstPtr)>
 Convenience type for the message callback function.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

virtual MessageType::ConstPtr getMsg ()
 Returns the last received message on the topic, handled by this SubscribeHandler. Use hasMsg() first to check if at least one message is available or newMsg() to check if a new message since the last call to getMsg() is available. More...
 
virtual MessageType::ConstPtr peekMsg () const
 Returns the last received message on the topic without modifying the newMsg() or usedMsg() flags. More...
 
virtual bool hasMsg () const
 Used to check whether at least one message has been received on the handled topic. More...
 
virtual bool newMsg () const
 Used to check whether at least one message has been received on the handled topic since the last call to getMsg(). More...
 
virtual bool usedMsg () const
 Used to check whether getMsg() was called at least once on this SubscribeHandler. More...
 
virtual MessageType::ConstPtr waitForNew (const ros::WallDuration &timeout)
 Blocks until new data becomes available or until the timeout runs out or until a spurious wake-up. More...
 
virtual ros::Time lastMsgTime () const
 Returns time of the last received message on the topic, handled by this SubscribeHandler. More...
 
virtual std::string topicName () const
 Returns the resolved (full) name of the topic, handled by this SubscribeHandler. More...
 
virtual std::string subscribedTopicName () const
 Returns the subscribed (unresolved) name of the topic, handled by this SubscribeHandler. More...
 
virtual void start ()
 Enables the callbacks for the handled topic. More...
 
virtual void stop ()
 Disables the callbacks for the handled topic. More...
 
 SubscribeHandler ()
 Default constructor to avoid having to use pointers. More...
 
template<class ... Types>
 SubscribeHandler (const SubscribeHandlerOptions &options, const std::string &topic_name, Types ... args)
 Main constructor. More...
 
 SubscribeHandler (const SubscribeHandlerOptions &options, const message_callback_t &message_callback={})
 Convenience constructor overload. More...
 
template<class ... Types>
 SubscribeHandler (const SubscribeHandlerOptions &options, const timeout_callback_t &timeout_callback, Types ... args)
 Convenience constructor overload. More...
 
template<class ObjectType1 , class ... Types>
 SubscribeHandler (const SubscribeHandlerOptions &options, void(ObjectType1::*const timeout_callback)(const std::string &topic_name, const ros::Time &last_msg), ObjectType1 *const obj1, Types ... args)
 Convenience constructor overload. More...
 
template<class ObjectType2 , class ... Types>
 SubscribeHandler (const SubscribeHandlerOptions &options, void(ObjectType2::*const message_callback)(typename MessageType::ConstPtr), ObjectType2 *const obj2, Types ... args)
 Convenience constructor overload. More...
 
template<class ObjectType1 , class ObjectType2 , class ... Types>
 SubscribeHandler (const SubscribeHandlerOptions &options, void(ObjectType2::*const message_callback)(typename MessageType::ConstPtr), ObjectType2 *const obj2, void(ObjectType1::*const timeout_callback)(const std::string &topic_name, const ros::Time &last_msg), ObjectType1 *const obj1, Types ... args)
 Convenience constructor overload. More...
 
template<class ... Types>
 SubscribeHandler (const SubscribeHandlerOptions &options, const ros::Duration &no_message_timeout, Types ... args)
 Convenience constructor overload. More...
 
template<class ... Types>
 SubscribeHandler (const SubscribeHandlerOptions &options, mrs_lib::TimeoutManager &timeout_manager, Types ... args)
 Convenience constructor overload. More...
 
SubscribeHandler (const SubscribeHandler &)=delete
 
+SubscribeHandleroperator= (const SubscribeHandler &)=delete
 
SubscribeHandler (SubscribeHandler &&other)
 
+SubscribeHandleroperator= (SubscribeHandler &&other)
 
+

Detailed Description

+

template<typename MessageType>
+class mrs_lib::SubscribeHandler< MessageType >

+ +

The main class for ROS topic subscription, message timeout handling etc.

+

This class handles the raw ROS Subscriber for a specified topic. The last message received on the topic is remembered and may be retrieved by calling the getMsg() method. To check whether at least one message was received, use hasMsg() (if no message was received and you call getMsg(), a nullptr is returned and an error message is printed). To check whether a new message has arrived since the last call to getMsg(), use newMsg() (useful to check whether a new message needs to be processed in a loop or ROS Timer callback).

+

A timeout callback function may be specified, which is called if no message is received on the topic for a specified timeout (use the timeout_callback and no_message_timeout parameters). If the timeout callback is not set by the user, an error message is printed to the console after the timeout by default.

+

A message callback function may be specified, which is called whenever a new message is received (use the message_callback parameter).

+

The callbacks and timeouts may be stopped and started using the stop() and start() methods.

+

For more details, see the example below (I recommend starting with the simple_example which covers most use-cases).

+
Examples
subscribe_handler/example.cpp, and subscribe_handler/simple_example.cpp.
+
+

Constructor & Destructor Documentation

+ +

◆ SubscribeHandler() [1/9]

+ +
+
+
+template<typename MessageType >
+ + + + + +
+ + + + + + + +
mrs_lib::SubscribeHandler< MessageType >::SubscribeHandler ()
+
+inline
+
+ +

Default constructor to avoid having to use pointers.

+

It does nothing and the SubscribeHandler it constructs will also do nothing. Use some of the other constructors for actual construction of a usable SubscribeHandler.

+ +
+
+ +

◆ SubscribeHandler() [2/9]

+ +
+
+
+template<typename MessageType >
+
+template<class ... Types>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::SubscribeHandler< MessageType >::SubscribeHandler (const SubscribeHandlerOptionsoptions,
const std::string & topic_name,
Types ... args 
)
+
+inline
+
+ +

Main constructor.

+
Parameters
+ + + + +
optionsThe common options struct (see documentation of SubscribeHandlerOptions).
topic_nameName of the topic to be handled by this subscribed.
argsRemaining arguments to be parsed (see other constructors).
+
+
+ +
+
+ +

◆ SubscribeHandler() [3/9]

+ +
+
+
+template<typename MessageType >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
mrs_lib::SubscribeHandler< MessageType >::SubscribeHandler (const SubscribeHandlerOptionsoptions,
const message_callback_tmessage_callback = {} 
)
+
+inline
+
+ +

Convenience constructor overload.

+
Parameters
+ + + +
optionsThe common options struct (see documentation of SubscribeHandlerOptions).
message_callbackThe 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).
+
+
+ +
+
+ +

◆ SubscribeHandler() [4/9]

+ +
+
+
+template<typename MessageType >
+
+template<class ... Types>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::SubscribeHandler< MessageType >::SubscribeHandler (const SubscribeHandlerOptionsoptions,
const timeout_callback_ttimeout_callback,
Types ... args 
)
+
+inline
+
+ +

Convenience constructor overload.

+
Parameters
+ + + + +
optionsThe common options struct (see documentation of SubscribeHandlerOptions).
timeout_callbackThe callback function to call when a new message is not received for the duration, specified in options or in the no_message_timeout parameter.
argsRemaining arguments to be parsed (see other constructors).
+
+
+ +
+
+ +

◆ SubscribeHandler() [5/9]

+ +
+
+
+template<typename MessageType >
+
+template<class ObjectType1 , class ... Types>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::SubscribeHandler< MessageType >::SubscribeHandler (const SubscribeHandlerOptionsoptions,
void(ObjectType1::*)(const std::string &topic_name, const ros::Time &last_msg) timeout_callback,
ObjectType1 *const obj1,
Types ... args 
)
+
+inline
+
+ +

Convenience constructor overload.

+
Parameters
+ + + + + +
optionsThe common options struct (see documentation of SubscribeHandlerOptions).
timeout_callbackThe callback method to call when a new message is not received for the duration, specified in options or in the no_message_timeout parameter.
obj1The object on which the callback method timeout_callback will be called.
argsRemaining arguments to be parsed (see other constructors).
+
+
+ +
+
+ +

◆ SubscribeHandler() [6/9]

+ +
+
+
+template<typename MessageType >
+
+template<class ObjectType2 , class ... Types>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::SubscribeHandler< MessageType >::SubscribeHandler (const SubscribeHandlerOptionsoptions,
void(ObjectType2::*)(typename MessageType::ConstPtr) message_callback,
ObjectType2 *const obj2,
Types ... args 
)
+
+inline
+
+ +

Convenience constructor overload.

+
Parameters
+ + + + + +
optionsThe common options struct (see documentation of SubscribeHandlerOptions).
message_callbackThe callback method to call when a new message is received.
obj2The object on which the callback method timeout_callback will be called.
argsRemaining arguments to be parsed (see other constructors).
+
+
+ +
+
+ +

◆ SubscribeHandler() [7/9]

+ +
+
+
+template<typename MessageType >
+
+template<class ObjectType1 , class ObjectType2 , class ... Types>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::SubscribeHandler< MessageType >::SubscribeHandler (const SubscribeHandlerOptionsoptions,
void(ObjectType2::*)(typename MessageType::ConstPtr) message_callback,
ObjectType2 *const obj2,
void(ObjectType1::*)(const std::string &topic_name, const ros::Time &last_msg) timeout_callback,
ObjectType1 *const obj1,
Types ... args 
)
+
+inline
+
+ +

Convenience constructor overload.

+
Parameters
+ + + + + + + +
optionsThe common options struct (see documentation of SubscribeHandlerOptions).
message_callbackThe callback method to call when a new message is received.
obj2The object on which the callback method timeout_callback will be called.
timeout_callbackThe callback method to call when a new message is not received for the duration, specified in options or in the no_message_timeout parameter.
obj1The object on which the callback method timeout_callback will be called.
argsRemaining arguments to be parsed (see other constructors).
+
+
+ +
+
+ +

◆ SubscribeHandler() [8/9]

+ +
+
+
+template<typename MessageType >
+
+template<class ... Types>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::SubscribeHandler< MessageType >::SubscribeHandler (const SubscribeHandlerOptionsoptions,
const ros::Duration & no_message_timeout,
Types ... args 
)
+
+inline
+
+ +

Convenience constructor overload.

+
Parameters
+ + + + +
optionsThe common options struct (see documentation of SubscribeHandlerOptions).
no_message_timeoutIf 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.
argsRemaining arguments to be parsed (see other constructors).
+
+
+ +
+
+ +

◆ SubscribeHandler() [9/9]

+ +
+
+
+template<typename MessageType >
+
+template<class ... Types>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::SubscribeHandler< MessageType >::SubscribeHandler (const SubscribeHandlerOptionsoptions,
mrs_lib::TimeoutManagertimeout_manager,
Types ... args 
)
+
+inline
+
+ +

Convenience constructor overload.

+
Parameters
+ + + + +
optionsThe common options struct (see documentation of SubscribeHandlerOptions).
timeout_managerThe manager for timeout callbacks.
argsRemaining arguments to be parsed (see other constructors).
+
+
+ +
+
+

Member Function Documentation

+ +

◆ getMsg()

+ +
+
+
+template<typename MessageType >
+ + + + + +
+ + + + + + + +
virtual MessageType::ConstPtr mrs_lib::SubscribeHandler< MessageType >::getMsg ()
+
+inlinevirtual
+
+ +

Returns the last received message on the topic, handled by this SubscribeHandler. Use hasMsg() first to check if at least one message is available or newMsg() to check if a new message since the last call to getMsg() is available.

+
Returns
the last received message.
+ +
+
+ +

◆ hasMsg()

+ +
+
+
+template<typename MessageType >
+ + + + + +
+ + + + + + + +
virtual bool mrs_lib::SubscribeHandler< MessageType >::hasMsg () const
+
+inlinevirtual
+
+ +

Used to check whether at least one message has been received on the handled topic.

+
Returns
true if at least one message was received, otherwise false.
+ +
+
+ +

◆ lastMsgTime()

+ +
+
+
+template<typename MessageType >
+ + + + + +
+ + + + + + + +
virtual ros::Time mrs_lib::SubscribeHandler< MessageType >::lastMsgTime () const
+
+inlinevirtual
+
+ +

Returns time of the last received message on the topic, handled by this SubscribeHandler.

+
Returns
time when the last message was received.
+ +
+
+ +

◆ newMsg()

+ +
+
+
+template<typename MessageType >
+ + + + + +
+ + + + + + + +
virtual bool mrs_lib::SubscribeHandler< MessageType >::newMsg () const
+
+inlinevirtual
+
+ +

Used to check whether at least one message has been received on the handled topic since the last call to getMsg().

+
Returns
true if at least one message was received, otherwise false.
+ +
+
+ +

◆ peekMsg()

+ +
+
+
+template<typename MessageType >
+ + + + + +
+ + + + + + + +
virtual MessageType::ConstPtr mrs_lib::SubscribeHandler< MessageType >::peekMsg () const
+
+inlinevirtual
+
+ +

Returns the last received message on the topic without modifying the newMsg() or usedMsg() flags.

+
Returns
the last received message.
+ +
+
+ +

◆ start()

+ +
+
+
+template<typename MessageType >
+ + + + + +
+ + + + + + + +
virtual void mrs_lib::SubscribeHandler< MessageType >::start ()
+
+inlinevirtual
+
+ +

Enables the callbacks for the handled topic.

+

If the SubscribeHandler object is stopped using the stop() method, no callbacks will be called until the start() method is called.

+ +
+
+ +

◆ stop()

+ +
+
+
+template<typename MessageType >
+ + + + + +
+ + + + + + + +
virtual void mrs_lib::SubscribeHandler< MessageType >::stop ()
+
+inlinevirtual
+
+ +

Disables the callbacks for the handled topic.

+

All messages after this method is called will be ignored until start() is called again. Timeout checking will also be disabled.

+ +
+
+ +

◆ subscribedTopicName()

+ +
+
+
+template<typename MessageType >
+ + + + + +
+ + + + + + + +
virtual std::string mrs_lib::SubscribeHandler< MessageType >::subscribedTopicName () const
+
+inlinevirtual
+
+ +

Returns the subscribed (unresolved) name of the topic, handled by this SubscribeHandler.

+
Returns
name of the handled topic.
+ +
+
+ +

◆ topicName()

+ +
+
+
+template<typename MessageType >
+ + + + + +
+ + + + + + + +
virtual std::string mrs_lib::SubscribeHandler< MessageType >::topicName () const
+
+inlinevirtual
+
+ +

Returns the resolved (full) name of the topic, handled by this SubscribeHandler.

+
Returns
name of the handled topic.
+ +
+
+ +

◆ usedMsg()

+ +
+
+
+template<typename MessageType >
+ + + + + +
+ + + + + + + +
virtual bool mrs_lib::SubscribeHandler< MessageType >::usedMsg () const
+
+inlinevirtual
+
+ +

Used to check whether getMsg() was called at least once on this SubscribeHandler.

+
Returns
true if getMsg() was called at least once, otherwise false.
+ +
+
+ +

◆ waitForNew()

+ +
+
+
+template<typename MessageType >
+ + + + + +
+ + + + + + + + +
virtual MessageType::ConstPtr mrs_lib::SubscribeHandler< MessageType >::waitForNew (const ros::WallDuration & timeout)
+
+inlinevirtual
+
+ +

Blocks until new data becomes available or until the timeout runs out or until a spurious wake-up.

+
Returns
the message if a new message is available after waking up, nullptr otherwise.
+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/classmrs__lib_1_1SubscribeHandler.js b/classmrs__lib_1_1SubscribeHandler.js new file mode 100644 index 00000000..22d053b1 --- /dev/null +++ b/classmrs__lib_1_1SubscribeHandler.js @@ -0,0 +1,33 @@ +var classmrs__lib_1_1SubscribeHandler = +[ + [ "Impl", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html", "classmrs__lib_1_1SubscribeHandler_1_1Impl" ], + [ "ImplThreadsafe", "classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe.html", "classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe" ], + [ "message_callback_t", "classmrs__lib_1_1SubscribeHandler.html#a38b7371b24896e5ea21f5a8dd2821cf6", null ], + [ "message_type", "classmrs__lib_1_1SubscribeHandler.html#aab546ccb302e3e05d8e97e9085f62b9a", null ], + [ "timeout_callback_t", "classmrs__lib_1_1SubscribeHandler.html#a6f12a82506c6967a8af9c2c878a1803a", null ], + [ "SubscribeHandler", "classmrs__lib_1_1SubscribeHandler.html#a13159347fe9f13d778d7c02f2d1b1a98", null ], + [ "SubscribeHandler", "classmrs__lib_1_1SubscribeHandler.html#aaceb7739b06d44d7fe619418d5cecd4e", null ], + [ "SubscribeHandler", "classmrs__lib_1_1SubscribeHandler.html#a40f16a8553532b9685feb4b33f342602", null ], + [ "SubscribeHandler", "classmrs__lib_1_1SubscribeHandler.html#aa625f9d69548da72d92f7e8a25b078e3", null ], + [ "SubscribeHandler", "classmrs__lib_1_1SubscribeHandler.html#ab24f400bfd36d733366d25b63ec8889d", null ], + [ "SubscribeHandler", "classmrs__lib_1_1SubscribeHandler.html#a27ac792b1dfa8a62d087b565bec33925", null ], + [ "SubscribeHandler", "classmrs__lib_1_1SubscribeHandler.html#a14c1c92e119c047a3c40724f1152b7b9", null ], + [ "SubscribeHandler", "classmrs__lib_1_1SubscribeHandler.html#a367e7245e60ee2a87f680a27c0e1a8e5", null ], + [ "SubscribeHandler", "classmrs__lib_1_1SubscribeHandler.html#ab3499b8b5910450df90c905d1811e4a3", null ], + [ "~SubscribeHandler", "classmrs__lib_1_1SubscribeHandler.html#a0998c70780beecf1c27330cc40e2e075", null ], + [ "SubscribeHandler", "classmrs__lib_1_1SubscribeHandler.html#a07bab35d51c35fa0498a179f2038e393", null ], + [ "SubscribeHandler", "classmrs__lib_1_1SubscribeHandler.html#a7f9384fb3e3f96f53fc7c1023a0386c5", null ], + [ "getMsg", "classmrs__lib_1_1SubscribeHandler.html#a19a708c3f200ccfac2695a649b9d6e77", null ], + [ "hasMsg", "classmrs__lib_1_1SubscribeHandler.html#a9c6bcd07e10b60c70f02de2c6d5f632e", null ], + [ "lastMsgTime", "classmrs__lib_1_1SubscribeHandler.html#ab96777b29e74827ad109346504565f9b", null ], + [ "newMsg", "classmrs__lib_1_1SubscribeHandler.html#a46bde5660a9480814caa801e2baf3cd3", null ], + [ "operator=", "classmrs__lib_1_1SubscribeHandler.html#a97d2dff2ee17407fd2981d5682bea986", null ], + [ "operator=", "classmrs__lib_1_1SubscribeHandler.html#a819be17785380080c27761374e17cecc", null ], + [ "peekMsg", "classmrs__lib_1_1SubscribeHandler.html#a6638d8d589149edba21bf08fa571f18e", null ], + [ "start", "classmrs__lib_1_1SubscribeHandler.html#af8bc123e16de75e3b6c00724b817eaaf", null ], + [ "stop", "classmrs__lib_1_1SubscribeHandler.html#a36a097cf480a16bf239885be6e35b5d0", null ], + [ "subscribedTopicName", "classmrs__lib_1_1SubscribeHandler.html#a2ee619f8b6fe5ce56599752e63161b51", null ], + [ "topicName", "classmrs__lib_1_1SubscribeHandler.html#a512ffa88a2164e420f1c4a6ae1823e68", null ], + [ "usedMsg", "classmrs__lib_1_1SubscribeHandler.html#ab027bb4a6edece35701e17ba0c137cfc", null ], + [ "waitForNew", "classmrs__lib_1_1SubscribeHandler.html#a94f4bedf9229325ca6a14202f5cfbcc5", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1SubscribeHandler_1_1Impl-members.html b/classmrs__lib_1_1SubscribeHandler_1_1Impl-members.html new file mode 100644 index 00000000..9e81315a --- /dev/null +++ b/classmrs__lib_1_1SubscribeHandler_1_1Impl-members.html @@ -0,0 +1,137 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType > Member List
+
+
+ +

This is the complete list of members for mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
data_callback(const typename MessageType::ConstPtr &msg) (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >inlineprotectedvirtual
data_callback_t typedef (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >
default_timeout_callback(const std::string &topic_name, const ros::Time &last_msg) (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >inlineprotected
getMsg() (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >inlinevirtual
hasMsg() const (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >inlinevirtual
Impl(const SubscribeHandlerOptions &options, const message_callback_t &message_callback=message_callback_t()) (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >inline
lastMsgTime() const (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >inlinevirtual
m_got_data (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >protected
m_latest_message (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >protected
m_latest_message_time (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >protected
m_message_callback (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >protected
m_new_data (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >protected
m_new_data_cv (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >mutableprotected
m_new_data_mtx (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >mutableprotected
m_nh (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >protected
m_node_name (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >protected
m_sub (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >protected
m_timeout_id (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >protected
m_timeout_manager (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >protected
m_topic_name (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >protected
m_used_data (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >protected
message_callback_t typedef (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >
newMsg() const (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >inlinevirtual
peekMsg() const (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >inlinevirtual
process_new_message(const typename MessageType::ConstPtr &msg) (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >inlineprotected
start() (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >inlinevirtual
stop() (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >inlinevirtual
SubscribeHandler< MessageType > (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >friend
timeout_callback_t typedef (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >
topicName() const (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >inlinevirtual
usedMsg() const (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >inlinevirtual
waitForNew(const ros::WallDuration &timeout) (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >inlinevirtual
~Impl()=default (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >virtual
+
+ + + + diff --git a/classmrs__lib_1_1SubscribeHandler_1_1Impl.html b/classmrs__lib_1_1SubscribeHandler_1_1Impl.html new file mode 100644 index 00000000..2465f924 --- /dev/null +++ b/classmrs__lib_1_1SubscribeHandler_1_1Impl.html @@ -0,0 +1,235 @@ + + + + + + + +mrs_lib: mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType > Class Template Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType > Class Template Reference
+
+
+
+ + Inheritance diagram for mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >:
+
+
+ + + + + + + + + +

+Public Types

+using timeout_callback_t = typename SubscribeHandler< MessageType >::timeout_callback_t
 
+using message_callback_t = typename SubscribeHandler< MessageType >::message_callback_t
 
+using data_callback_t = std::function< void(const typename MessageType::ConstPtr &)>
 
+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

Impl (const SubscribeHandlerOptions &options, const message_callback_t &message_callback=message_callback_t())
 
+virtual MessageType::ConstPtr getMsg ()
 
+virtual MessageType::ConstPtr peekMsg () const
 
+virtual bool hasMsg () const
 
+virtual bool newMsg () const
 
+virtual bool usedMsg () const
 
+virtual MessageType::ConstPtr waitForNew (const ros::WallDuration &timeout)
 
+virtual ros::Time lastMsgTime () const
 
+virtual std::string topicName () const
 
+virtual void start ()
 
+virtual void stop ()
 
+ + + + + + + +

+Protected Member Functions

+void default_timeout_callback (const std::string &topic_name, const ros::Time &last_msg)
 
+void process_new_message (const typename MessageType::ConstPtr &msg)
 
+virtual void data_callback (const typename MessageType::ConstPtr &msg)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Protected Attributes

+ros::NodeHandle m_nh
 
+ros::Subscriber m_sub
 
+std::string m_topic_name
 
+std::string m_node_name
 
+bool m_got_data
 
+std::mutex m_new_data_mtx
 
+std::condition_variable m_new_data_cv
 
+bool m_new_data
 
+bool m_used_data
 
+std::shared_ptr< mrs_lib::TimeoutManagerm_timeout_manager
 
+mrs_lib::TimeoutManager::timeout_id_t m_timeout_id
 
+ros::Time m_latest_message_time
 
+MessageType::ConstPtr m_latest_message
 
+message_callback_t m_message_callback
 
+ + + +

+Friends

+class SubscribeHandler< MessageType >
 
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/classmrs__lib_1_1SubscribeHandler_1_1Impl.js b/classmrs__lib_1_1SubscribeHandler_1_1Impl.js new file mode 100644 index 00000000..8c478c0c --- /dev/null +++ b/classmrs__lib_1_1SubscribeHandler_1_1Impl.js @@ -0,0 +1,36 @@ +var classmrs__lib_1_1SubscribeHandler_1_1Impl = +[ + [ "data_callback_t", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#a89bb4d49903f55eb790ead15582ccd05", null ], + [ "message_callback_t", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#a19157dcc4440a0fa0e283a17f19d5485", null ], + [ "timeout_callback_t", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#aa65463365778487a41552febfe3931d6", null ], + [ "Impl", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#ada5369f408df3cabd3a25a795e76eb49", null ], + [ "~Impl", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#ad51b14e5e42e9c91ffb930420f554c6c", null ], + [ "data_callback", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#ac85af50444ae0b553c63ce4a670c8d96", null ], + [ "default_timeout_callback", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#a52d8b09cd1355cf7e5fac187e7a7dde8", null ], + [ "getMsg", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#a61d2ef76608dc33a70c76847f57e85fe", null ], + [ "hasMsg", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#acc18c8db6a849b4fb9c7fd64057767c6", null ], + [ "lastMsgTime", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#a53d5cbf53519cd6e3593c8fa5671543d", null ], + [ "newMsg", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#aa3924b5f6b81bec1b87efa9c3491263f", null ], + [ "peekMsg", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#affc322724df698018685f231ee268dc0", null ], + [ "process_new_message", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#a514a48538f4274d53a5754b03c1423a0", null ], + [ "start", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#a2befe840e5845a3a5f7740a2926353a3", null ], + [ "stop", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#a8008c57727936335f6391f1ee4a76827", null ], + [ "topicName", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#aab47ab2bc38ef2d98aa39e64f5a40684", null ], + [ "usedMsg", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#a7d65da6f26ad33681d974c13c20caa71", null ], + [ "waitForNew", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#acd9e00eba5485260f3298fe1ee0bc983", null ], + [ "SubscribeHandler< MessageType >", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#a5d89598edbe518d7c8361ffee1338b1f", null ], + [ "m_got_data", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#a469824a3611aaf0be7cc78025934e6c2", null ], + [ "m_latest_message", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#a939ad78600cde6f1f26aa107e47ccc4b", null ], + [ "m_latest_message_time", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#ab8cfa618e9abb7449518243e2c3b2153", null ], + [ "m_message_callback", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#ad0ae2c6dfdf85295274ef0697d329212", null ], + [ "m_new_data", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#a452854cb52f9d66ce4ed7a260c924d32", null ], + [ "m_new_data_cv", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#aee968b4238c2358e8453ce3118bc5b4d", null ], + [ "m_new_data_mtx", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#afa3f3a02ed2b9288331b87740c9e3c11", null ], + [ "m_nh", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#ad7ea1462737db59b6f5fc24cef317bde", null ], + [ "m_node_name", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#ac6c39708344e50fc417eb8ed9fcf162a", null ], + [ "m_sub", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#a21c301a2e394e0f84c4e15eafa985af3", null ], + [ "m_timeout_id", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#aef32a0e5255a7af437d8c43531fe50f1", null ], + [ "m_timeout_manager", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#a28b6576623069f62af301ac15140cf20", null ], + [ "m_topic_name", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#ae8c35aafab690edfac687551da0c1ba1", null ], + [ "m_used_data", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html#afaf3e823c1c50cd539540212d26f826e", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe-members.html b/classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe-members.html new file mode 100644 index 00000000..a8d03ad4 --- /dev/null +++ b/classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe-members.html @@ -0,0 +1,139 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType > Member List
+
+
+ +

This is the complete list of members for mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
data_callback(const typename MessageType::ConstPtr &msg) override (defined in mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >)mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >inlineprotectedvirtual
data_callback_t typedef (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >
default_timeout_callback(const std::string &topic_name, const ros::Time &last_msg) (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >inlineprotected
getMsg() override (defined in mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >)mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >inlinevirtual
hasMsg() const override (defined in mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >)mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >inlinevirtual
Impl(const SubscribeHandlerOptions &options, const message_callback_t &message_callback=message_callback_t()) (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >inline
ImplThreadsafe(const SubscribeHandlerOptions &options, const message_callback_t &message_callback=message_callback_t()) (defined in mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >)mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >inline
lastMsgTime() const override (defined in mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >)mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >inlinevirtual
m_got_data (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >protected
m_latest_message (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >protected
m_latest_message_time (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >protected
m_message_callback (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >protected
m_new_data (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >protected
m_new_data_cv (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >mutableprotected
m_new_data_mtx (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >mutableprotected
m_nh (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >protected
m_node_name (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >protected
m_sub (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >protected
m_timeout_id (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >protected
m_timeout_manager (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >protected
m_topic_name (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >protected
m_used_data (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >protected
message_callback_t typedef (defined in mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >)mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >
newMsg() const override (defined in mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >)mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >inlinevirtual
peekMsg() const override (defined in mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >)mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >inlinevirtual
process_new_message(const typename MessageType::ConstPtr &msg) (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >inlineprotected
start() override (defined in mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >)mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >inlinevirtual
stop() override (defined in mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >)mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >inlinevirtual
SubscribeHandler< MessageType > (defined in mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >)mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >friend
timeout_callback_t typedef (defined in mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >)mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >
topicName() const override (defined in mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >)mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >inlinevirtual
usedMsg() const override (defined in mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >)mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >inlinevirtual
waitForNew(const ros::WallDuration &timeout) (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >inlinevirtual
~Impl()=default (defined in mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >)mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >virtual
~ImplThreadsafe() override=default (defined in mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >)mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >virtual
+
+ + + + diff --git a/classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe.html b/classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe.html new file mode 100644 index 00000000..1b446027 --- /dev/null +++ b/classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe.html @@ -0,0 +1,258 @@ + + + + + + + +mrs_lib: mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType > Class Template Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType > Class Template Reference
+
+
+
+ + Inheritance diagram for mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >:
+
+
+ +
+ + Collaboration diagram for mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >:
+
+
+ + + + + + + + + + + + + + +

+Public Types

+using timeout_callback_t = typename impl_class_t::timeout_callback_t
 
+using message_callback_t = typename impl_class_t::message_callback_t
 
- Public Types inherited from mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >
+using timeout_callback_t = typename SubscribeHandler< MessageType >::timeout_callback_t
 
+using message_callback_t = typename SubscribeHandler< MessageType >::message_callback_t
 
+using data_callback_t = std::function< void(const typename MessageType::ConstPtr &)>
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

ImplThreadsafe (const SubscribeHandlerOptions &options, const message_callback_t &message_callback=message_callback_t())
 
+virtual bool hasMsg () const override
 
+virtual bool newMsg () const override
 
+virtual bool usedMsg () const override
 
+virtual MessageType::ConstPtr getMsg () override
 
+virtual MessageType::ConstPtr peekMsg () const override
 
+virtual ros::Time lastMsgTime () const override
 
+virtual std::string topicName () const override
 
+virtual void start () override
 
+virtual void stop () override
 
- Public Member Functions inherited from mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >
Impl (const SubscribeHandlerOptions &options, const message_callback_t &message_callback=message_callback_t())
 
+virtual MessageType::ConstPtr waitForNew (const ros::WallDuration &timeout)
 
+ + + + + + + + +

+Protected Member Functions

+virtual void data_callback (const typename MessageType::ConstPtr &msg) override
 
- Protected Member Functions inherited from mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >
+void default_timeout_callback (const std::string &topic_name, const ros::Time &last_msg)
 
+void process_new_message (const typename MessageType::ConstPtr &msg)
 
+ + + +

+Friends

+class SubscribeHandler< MessageType >
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Protected Attributes inherited from mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >
+ros::NodeHandle m_nh
 
+ros::Subscriber m_sub
 
+std::string m_topic_name
 
+std::string m_node_name
 
+bool m_got_data
 
+std::mutex m_new_data_mtx
 
+std::condition_variable m_new_data_cv
 
+bool m_new_data
 
+bool m_used_data
 
+std::shared_ptr< mrs_lib::TimeoutManagerm_timeout_manager
 
+mrs_lib::TimeoutManager::timeout_id_t m_timeout_id
 
+ros::Time m_latest_message_time
 
+MessageType::ConstPtr m_latest_message
 
+message_callback_t m_message_callback
 
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe.js b/classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe.js new file mode 100644 index 00000000..ac3fbcc9 --- /dev/null +++ b/classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe.js @@ -0,0 +1,18 @@ +var classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe = +[ + [ "message_callback_t", "classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe.html#a9e7cb71939d6a240d0bc832af779aa19", null ], + [ "timeout_callback_t", "classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe.html#a3a9882fa62b740b62e627dd49525be0c", null ], + [ "ImplThreadsafe", "classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe.html#a38d1a156c17a76eb9ef72d2d97732a42", null ], + [ "~ImplThreadsafe", "classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe.html#a3af936a107fd3f114aa61b996113a51f", null ], + [ "data_callback", "classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe.html#a441aee22642f0d5471520693ba2898c3", null ], + [ "getMsg", "classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe.html#a789925f2ea5df5120d8ca21007b86fb3", null ], + [ "hasMsg", "classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe.html#ad79f33835407688ccd931124b28ad698", null ], + [ "lastMsgTime", "classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe.html#aa8083b8f538ff2a566303a03a0921c66", null ], + [ "newMsg", "classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe.html#a6f929f4d55f7cf94ecd4080819cc8709", null ], + [ "peekMsg", "classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe.html#aa32577a0057ebd1de797050340da2c36", null ], + [ "start", "classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe.html#a587dd0aae17d21da6f6e4a070a2ff320", null ], + [ "stop", "classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe.html#aee90c5d7a54e567cddf382f01ed8eae4", null ], + [ "topicName", "classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe.html#a1167a6f31c8e2a956f76323b266d2875", null ], + [ "usedMsg", "classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe.html#ae65eaec53030b58b0fc686672a267b9f", null ], + [ "SubscribeHandler< MessageType >", "classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe.html#a5d89598edbe518d7c8361ffee1338b1f", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe__coll__graph.map b/classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe__coll__graph.map new file mode 100644 index 00000000..deda5763 --- /dev/null +++ b/classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe__coll__graph.md5 b/classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe__coll__graph.md5 new file mode 100644 index 00000000..11da4bc1 --- /dev/null +++ b/classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe__coll__graph.md5 @@ -0,0 +1 @@ +16e3cd6a2cab9ba5c99660c3e4170aaa \ No newline at end of file diff --git a/classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe__coll__graph.png b/classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..d921a7d140b4ce7e943fd1dac4215b18e528a532 GIT binary patch literal 8548 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%0DlJ&w$(o%# zaC8(QBqSucemw-xtiS0;{6Ai1W=t?B(ndxsE5#xoUK>~t>u*Uy+Pny(K_{l*kVtRb zAQTg;xBoCWJxvGsNAB0JG60Guy>UNG=*=RvmH1z4XN;$(H=|h)L=S*FCK&Mj_0f;y zo1cZcCw2C${wyuMMzp|*4{$y@{}F4&yZn<6F6od{2?@cmAAyMbxd=!?U`Ia? z`y%)51?fGYf)P8gjqnx{^RP_x>Ck(1ml3gUUWbz}GNak#@ol-a-Z#8l`oS`(l5Tu( zU;==T>##i|@9ZoJ+6mN*KgZMTm!Nw2goHlVrO*hNpw9tAsCdY<3bH;H6rWzmq`9(ElyDW4qlw`sTi zIvS=nHaF$n@VIFbIbcJ1`v(QGNm-g$Xc zKaeYp$v{dNWExc`-oUyB=u^w_@!H`{_Vg43$9j5e* z45t(Sm+eS^MzpMh#3wQ!g>2}a2E}VZ^PlW*XPf8}?^^kTXoK@%#@*`y#zK%Sqq7}g zOG{opR%T2-__+WP`nLdN%)}Mc-HHYV3^2*xZjI31pF||s*!+)#DV3fu7&yrNFq6T< zrQ>Ljjz(<8ceSO22g~59V(v2p$LMYpT~(Erl~1E%$C$7q`ywaKiLb7T8BO-3+n-nP z;r*+FDe(x_g&&dL6w!z*tlYA+bVh7eX%399Z&&yK^CeOBRm4M2bQQps4?Uw|a@k29dXil`&BSAszKT2T#^`IUs`mdr1U8;Y&y&hHOR9O53qKKrs$2j? zt~bIV6L^lsGs~!a%V10*f1H&|Md_+i|Fz=OCU+txL|m%*&Ao=b6^5Ln?NYZ LKb9+!dFlOMXxnYK literal 0 HcmV?d00001 diff --git a/classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe__inherit__graph.map b/classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe__inherit__graph.map new file mode 100644 index 00000000..deda5763 --- /dev/null +++ b/classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe__inherit__graph.md5 b/classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe__inherit__graph.md5 new file mode 100644 index 00000000..11da4bc1 --- /dev/null +++ b/classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe__inherit__graph.md5 @@ -0,0 +1 @@ +16e3cd6a2cab9ba5c99660c3e4170aaa \ No newline at end of file diff --git a/classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe__inherit__graph.png b/classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..d921a7d140b4ce7e943fd1dac4215b18e528a532 GIT binary patch literal 8548 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%0DlJ&w$(o%# zaC8(QBqSucemw-xtiS0;{6Ai1W=t?B(ndxsE5#xoUK>~t>u*Uy+Pny(K_{l*kVtRb zAQTg;xBoCWJxvGsNAB0JG60Guy>UNG=*=RvmH1z4XN;$(H=|h)L=S*FCK&Mj_0f;y zo1cZcCw2C${wyuMMzp|*4{$y@{}F4&yZn<6F6od{2?@cmAAyMbxd=!?U`Ia? z`y%)51?fGYf)P8gjqnx{^RP_x>Ck(1ml3gUUWbz}GNak#@ol-a-Z#8l`oS`(l5Tu( zU;==T>##i|@9ZoJ+6mN*KgZMTm!Nw2goHlVrO*hNpw9tAsCdY<3bH;H6rWzmq`9(ElyDW4qlw`sTi zIvS=nHaF$n@VIFbIbcJ1`v(QGNm-g$Xc zKaeYp$v{dNWExc`-oUyB=u^w_@!H`{_Vg43$9j5e* z45t(Sm+eS^MzpMh#3wQ!g>2}a2E}VZ^PlW*XPf8}?^^kTXoK@%#@*`y#zK%Sqq7}g zOG{opR%T2-__+WP`nLdN%)}Mc-HHYV3^2*xZjI31pF||s*!+)#DV3fu7&yrNFq6T< zrQ>Ljjz(<8ceSO22g~59V(v2p$LMYpT~(Erl~1E%$C$7q`ywaKiLb7T8BO-3+n-nP z;r*+FDe(x_g&&dL6w!z*tlYA+bVh7eX%399Z&&yK^CeOBRm4M2bQQps4?Uw|a@k29dXil`&BSAszKT2T#^`IUs`mdr1U8;Y&y&hHOR9O53qKKrs$2j? zt~bIV6L^lsGs~!a%V10*f1H&|Md_+i|Fz=OCU+txL|m%*&Ao=b6^5Ln?NYZ LKb9+!dFlOMXxnYK literal 0 HcmV?d00001 diff --git a/classmrs__lib_1_1SubscribeHandler_1_1Impl__inherit__graph.map b/classmrs__lib_1_1SubscribeHandler_1_1Impl__inherit__graph.map new file mode 100644 index 00000000..4ce4cf69 --- /dev/null +++ b/classmrs__lib_1_1SubscribeHandler_1_1Impl__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/classmrs__lib_1_1SubscribeHandler_1_1Impl__inherit__graph.md5 b/classmrs__lib_1_1SubscribeHandler_1_1Impl__inherit__graph.md5 new file mode 100644 index 00000000..79e66f5f --- /dev/null +++ b/classmrs__lib_1_1SubscribeHandler_1_1Impl__inherit__graph.md5 @@ -0,0 +1 @@ +b4bdda37e14263126ea2e5cc022a72ae \ No newline at end of file diff --git a/classmrs__lib_1_1SubscribeHandler_1_1Impl__inherit__graph.png b/classmrs__lib_1_1SubscribeHandler_1_1Impl__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..efdf7c6ffa4ea6c3ddc113a53c6082cf188e63d5 GIT binary patch literal 8735 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 literal 0 HcmV?d00001 diff --git a/classmrs__lib_1_1ThreadTimer-members.html b/classmrs__lib_1_1ThreadTimer-members.html new file mode 100644 index 00000000..52820f7d --- /dev/null +++ b/classmrs__lib_1_1ThreadTimer-members.html @@ -0,0 +1,123 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::ThreadTimer Member List
+
+
+ +

This is the complete list of members for mrs_lib::ThreadTimer, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + +
callback_t typedef (defined in mrs_lib::MRSTimer)mrs_lib::MRSTimer
MRSTimer(const MRSTimer &)=default (defined in mrs_lib::MRSTimer)mrs_lib::MRSTimer
MRSTimer(MRSTimer &&)=default (defined in mrs_lib::MRSTimer)mrs_lib::MRSTimer
MRSTimer()=default (defined in mrs_lib::MRSTimer)mrs_lib::MRSTimerprotected
operator=(const ThreadTimer &)=delete (defined in mrs_lib::ThreadTimer)mrs_lib::ThreadTimer
operator=(ThreadTimer &&)=delete (defined in mrs_lib::ThreadTimer)mrs_lib::ThreadTimer
operator=(const MRSTimer &)=default (defined in mrs_lib::MRSTimer)mrs_lib::MRSTimer
operator=(MRSTimer &&)=default (defined in mrs_lib::MRSTimer)mrs_lib::MRSTimer
running() overridemrs_lib::ThreadTimervirtual
setPeriod(const ros::Duration &duration, const bool reset=true) overridemrs_lib::ThreadTimervirtual
start() overridemrs_lib::ThreadTimervirtual
stop() overridemrs_lib::ThreadTimervirtual
ThreadTimer() (defined in mrs_lib::ThreadTimer)mrs_lib::ThreadTimer
ThreadTimer(const ros::NodeHandle &nh, const ros::Rate &rate, void(ObjectType::*const callback)(const ros::TimerEvent &), ObjectType *const obj, const bool oneshot=false, const bool autostart=true)mrs_lib::ThreadTimer
ThreadTimer(const ros::NodeHandle &nh, const ros::Duration &duration, void(ObjectType::*const callback)(const ros::TimerEvent &), ObjectType *const obj, bool oneshot=false, const bool autostart=true)mrs_lib::ThreadTimer
ThreadTimer(const ThreadTimer &)=delete (defined in mrs_lib::ThreadTimer)mrs_lib::ThreadTimer
ThreadTimer(ThreadTimer &&)=delete (defined in mrs_lib::ThreadTimer)mrs_lib::ThreadTimer
~MRSTimer()=default (defined in mrs_lib::MRSTimer)mrs_lib::MRSTimervirtual
~ThreadTimer() overridemrs_lib::ThreadTimerinlinevirtual
+
+ + + + diff --git a/classmrs__lib_1_1ThreadTimer.html b/classmrs__lib_1_1ThreadTimer.html new file mode 100644 index 00000000..9b421924 --- /dev/null +++ b/classmrs__lib_1_1ThreadTimer.html @@ -0,0 +1,512 @@ + + + + + + + +mrs_lib: mrs_lib::ThreadTimer Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::ThreadTimer Class Reference
+
+
+ +

Custom thread-based Timers with the same interface as mrs_lib::ROSTimer. + More...

+ +

#include <timer.h>

+
+ + Inheritance diagram for mrs_lib::ThreadTimer:
+
+
+ +
+ + Collaboration diagram for mrs_lib::ThreadTimer:
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

template<class ObjectType >
 ThreadTimer (const ros::NodeHandle &nh, const ros::Rate &rate, void(ObjectType::*const callback)(const ros::TimerEvent &), ObjectType *const obj, const bool oneshot=false, const bool autostart=true)
 Constructs the object. More...
 
template<class ObjectType >
 ThreadTimer (const ros::NodeHandle &nh, const ros::Duration &duration, void(ObjectType::*const callback)(const ros::TimerEvent &), ObjectType *const obj, bool oneshot=false, const bool autostart=true)
 Constructs the object. More...
 
virtual void stop () override
 stop the timer More...
 
virtual void start () override
 start the timer More...
 
virtual void setPeriod (const ros::Duration &duration, const bool reset=true) override
 set the timer period/duration More...
 
virtual bool running () override
 returns true if callbacks should be called More...
 
virtual ~ThreadTimer () override
 stops the timer and then destroys the object More...
 
ThreadTimer (const ThreadTimer &)=delete
 
ThreadTimer (ThreadTimer &&)=delete
 
+ThreadTimeroperator= (const ThreadTimer &)=delete
 
+ThreadTimeroperator= (ThreadTimer &&)=delete
 
- Public Member Functions inherited from mrs_lib::MRSTimer
MRSTimer (const MRSTimer &)=default
 
MRSTimer (MRSTimer &&)=default
 
+MRSTimeroperator= (const MRSTimer &)=default
 
+MRSTimeroperator= (MRSTimer &&)=default
 
+ + + + +

+Additional Inherited Members

- Public Types inherited from mrs_lib::MRSTimer
+using callback_t = std::function< void(const ros::TimerEvent &)>
 
+

Detailed Description

+

Custom thread-based Timers with the same interface as mrs_lib::ROSTimer.

+

Constructor & Destructor Documentation

+ +

◆ ThreadTimer() [1/2]

+ +
+
+
+template<class ObjectType >
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::ThreadTimer::ThreadTimer (const ros::NodeHandle & nh,
const ros::Rate & rate,
void(ObjectType::*)(const ros::TimerEvent &) callback,
ObjectType *const obj,
const bool oneshot = false,
const bool autostart = true 
)
+
+ +

Constructs the object.

+
Template Parameters
+ + +
ObjectType
+
+
+
Parameters
+ + + + + + + +
nhignored (used just for consistency with ROSTimer)
raterate at which the callback should be called.
ObjectType::*constcallback callback method to be called.
objobject for the method.
oneshotwhether the callback should only be called once after starting.
autostartwhether the timer should immediately start after construction.
+
+
+ +
+
+ +

◆ ThreadTimer() [2/2]

+ +
+
+
+template<class ObjectType >
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::ThreadTimer::ThreadTimer (const ros::NodeHandle & nh,
const ros::Duration & duration,
void(ObjectType::*)(const ros::TimerEvent &) callback,
ObjectType *const obj,
bool oneshot = false,
const bool autostart = true 
)
+
+ +

Constructs the object.

+
Template Parameters
+ + +
ObjectType
+
+
+
Parameters
+ + + + + + + +
nhignored (used just for consistency with ROSTimer)
durationdesired callback period.
ObjectType::*constcallback callback method to be called.
objobject for the method.
oneshotwhether the callback should only be called once after starting.
autostartwhether the timer should immediately start after construction.
+
+
+ +
+
+ +

◆ ~ThreadTimer()

+ +
+
+ + + + + +
+ + + + + + + +
virtual mrs_lib::ThreadTimer::~ThreadTimer ()
+
+inlineoverridevirtual
+
+ +

stops the timer and then destroys the object

+

No more callbacks will be called when the destructor is started.

+ +
+
+

Member Function Documentation

+ +

◆ running()

+ +
+
+ + + + + +
+ + + + + + + +
bool mrs_lib::ThreadTimer::running ()
+
+overridevirtual
+
+ +

returns true if callbacks should be called

+
Returns
true if timer is running
+ +

Implements mrs_lib::MRSTimer.

+ +
+
+ +

◆ setPeriod()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void mrs_lib::ThreadTimer::setPeriod (const ros::Duration & duration,
const bool reset = true 
)
+
+overridevirtual
+
+ +

set the timer period/duration

+

The new period will be applied after the next callback.

+
Parameters
+ + + +
durationthe new desired callback period.
resetignored in this implementation.
+
+
+ +

Implements mrs_lib::MRSTimer.

+ +
+
+ +

◆ start()

+ +
+
+ + + + + +
+ + + + + + + +
void mrs_lib::ThreadTimer::start ()
+
+overridevirtual
+
+ +

start the timer

+

The first callback will be called in now + period.

+
Note
If the timer is already started, nothing will change.
+ +

Implements mrs_lib::MRSTimer.

+ +
+
+ +

◆ stop()

+ +
+
+ + + + + +
+ + + + + + + +
void mrs_lib::ThreadTimer::stop ()
+
+overridevirtual
+
+ +

stop the timer

+

No more callbacks will be called after this method returns.

+ +

Implements mrs_lib::MRSTimer.

+ +
+
+
The documentation for this class was generated from the following files:
    +
  • include/mrs_lib/timer.h
  • +
  • src/timer/timer.cpp
  • +
+
+
+ + + + diff --git a/classmrs__lib_1_1ThreadTimer.js b/classmrs__lib_1_1ThreadTimer.js new file mode 100644 index 00000000..e211b9d1 --- /dev/null +++ b/classmrs__lib_1_1ThreadTimer.js @@ -0,0 +1,15 @@ +var classmrs__lib_1_1ThreadTimer = +[ + [ "ThreadTimer", "classmrs__lib_1_1ThreadTimer.html#adeeefbee9903e230a18edea3868cc412", null ], + [ "ThreadTimer", "classmrs__lib_1_1ThreadTimer.html#ac2e365201eccac6aae67400e4da4438f", null ], + [ "ThreadTimer", "classmrs__lib_1_1ThreadTimer.html#a2ccbea65e537f1f73da1fa75f37833fc", null ], + [ "~ThreadTimer", "classmrs__lib_1_1ThreadTimer.html#a175a2bcce428cfca8bbf3f4ef836f4ed", null ], + [ "ThreadTimer", "classmrs__lib_1_1ThreadTimer.html#aefe278c61da9ed8f45f673dc609c06ab", null ], + [ "ThreadTimer", "classmrs__lib_1_1ThreadTimer.html#a0205a00458be53b0f4d6b852d928e80a", null ], + [ "operator=", "classmrs__lib_1_1ThreadTimer.html#a47415fa3c6e6434d1070c41c96f9fc14", null ], + [ "operator=", "classmrs__lib_1_1ThreadTimer.html#a1651fa6c2eea20f0214dd5eab311db95", null ], + [ "running", "classmrs__lib_1_1ThreadTimer.html#ab3ecdba649fd5c849acd94ce9ad0c824", null ], + [ "setPeriod", "classmrs__lib_1_1ThreadTimer.html#a038246468811544860d5d2d1c4091e2d", null ], + [ "start", "classmrs__lib_1_1ThreadTimer.html#a0425600320550d52408d1499ee3d7891", null ], + [ "stop", "classmrs__lib_1_1ThreadTimer.html#a26d89795a716aa2ae6d7f890626c0aaa", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1ThreadTimer__coll__graph.map b/classmrs__lib_1_1ThreadTimer__coll__graph.map new file mode 100644 index 00000000..9da02825 --- /dev/null +++ b/classmrs__lib_1_1ThreadTimer__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/classmrs__lib_1_1ThreadTimer__coll__graph.md5 b/classmrs__lib_1_1ThreadTimer__coll__graph.md5 new file mode 100644 index 00000000..cbc45e81 --- /dev/null +++ b/classmrs__lib_1_1ThreadTimer__coll__graph.md5 @@ -0,0 +1 @@ +7cc0dd2cc3b839666ec74c9bd53436fc \ No newline at end of file diff --git a/classmrs__lib_1_1ThreadTimer__coll__graph.png b/classmrs__lib_1_1ThreadTimer__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..9ce79ddc4c9a96db65be4c2c702e83b6da259109 GIT binary patch literal 3366 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 tn%a}2{he{u_l-` + + + diff --git a/classmrs__lib_1_1ThreadTimer__inherit__graph.md5 b/classmrs__lib_1_1ThreadTimer__inherit__graph.md5 new file mode 100644 index 00000000..cbc45e81 --- /dev/null +++ b/classmrs__lib_1_1ThreadTimer__inherit__graph.md5 @@ -0,0 +1 @@ +7cc0dd2cc3b839666ec74c9bd53436fc \ No newline at end of file diff --git a/classmrs__lib_1_1ThreadTimer__inherit__graph.png b/classmrs__lib_1_1ThreadTimer__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..9ce79ddc4c9a96db65be4c2c702e83b6da259109 GIT binary patch literal 3366 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 tn%a}2{he{u_l-` + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::TimeoutManager Member List
+
+
+ +

This is the complete list of members for mrs_lib::TimeoutManager, including all inherited members.

+ + + + + + + + + + + + + +
callback_t typedef (defined in mrs_lib::TimeoutManager)mrs_lib::TimeoutManager
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) (defined in mrs_lib::TimeoutManager)mrs_lib::TimeoutManager
lastReset(const timeout_id_t id) (defined in mrs_lib::TimeoutManager)mrs_lib::TimeoutManager
pause(const timeout_id_t id) (defined in mrs_lib::TimeoutManager)mrs_lib::TimeoutManager
pauseAll() (defined in mrs_lib::TimeoutManager)mrs_lib::TimeoutManager
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) (defined in mrs_lib::TimeoutManager)mrs_lib::TimeoutManager
reset(const timeout_id_t id, const ros::Time &time=ros::Time::now()) (defined in mrs_lib::TimeoutManager)mrs_lib::TimeoutManager
start(const timeout_id_t id, const ros::Time &time=ros::Time::now()) (defined in mrs_lib::TimeoutManager)mrs_lib::TimeoutManager
startAll(const ros::Time &time=ros::Time::now()) (defined in mrs_lib::TimeoutManager)mrs_lib::TimeoutManager
started(const timeout_id_t id) (defined in mrs_lib::TimeoutManager)mrs_lib::TimeoutManager
timeout_id_t typedef (defined in mrs_lib::TimeoutManager)mrs_lib::TimeoutManager
TimeoutManager(const ros::NodeHandle &nh, const ros::Rate &update_rate)mrs_lib::TimeoutManager
+
+ + + + diff --git a/classmrs__lib_1_1TimeoutManager.html b/classmrs__lib_1_1TimeoutManager.html new file mode 100644 index 00000000..4f095fbd --- /dev/null +++ b/classmrs__lib_1_1TimeoutManager.html @@ -0,0 +1,192 @@ + + + + + + + +mrs_lib: mrs_lib::TimeoutManager Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::TimeoutManager Class Reference
+
+
+ +

TODO. + More...

+ +

#include <timeout_manager.h>

+ + + + + + +

+Public Types

+using timeout_id_t = size_t
 
+using callback_t = std::function< void(const ros::Time &)>
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 TimeoutManager (const ros::NodeHandle &nh, const ros::Rate &update_rate)
 TODO. More...
 
+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)
 
+void reset (const timeout_id_t id, const ros::Time &time=ros::Time::now())
 
+void pause (const timeout_id_t id)
 
+void start (const timeout_id_t id, const ros::Time &time=ros::Time::now())
 
+void pauseAll ()
 
+void startAll (const ros::Time &time=ros::Time::now())
 
+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)
 
+ros::Time lastReset (const timeout_id_t id)
 
+bool started (const timeout_id_t id)
 
+

Detailed Description

+

TODO.

+

Constructor & Destructor Documentation

+ +

◆ TimeoutManager()

+ +
+
+ + + + + + + + + + + + + + + + + + +
mrs_lib::TimeoutManager::TimeoutManager (const ros::NodeHandle & nh,
const ros::Rate & update_rate 
)
+
+ +

TODO.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/classmrs__lib_1_1TimeoutManager.js b/classmrs__lib_1_1TimeoutManager.js new file mode 100644 index 00000000..14d1f47f --- /dev/null +++ b/classmrs__lib_1_1TimeoutManager.js @@ -0,0 +1,15 @@ +var classmrs__lib_1_1TimeoutManager = +[ + [ "callback_t", "classmrs__lib_1_1TimeoutManager.html#aaa362ddd47a87442c46f763fc74045d7", null ], + [ "timeout_id_t", "classmrs__lib_1_1TimeoutManager.html#a5607caa89e3da009d39c6343f5d2b2fb", null ], + [ "TimeoutManager", "classmrs__lib_1_1TimeoutManager.html#a7627ccd5204a4f13c832db2cb558128f", null ], + [ "change", "classmrs__lib_1_1TimeoutManager.html#a2acb13d7a30b3e62ccbbf41a3a9f4755", null ], + [ "lastReset", "classmrs__lib_1_1TimeoutManager.html#ae70c094760d7b3b707872dbd78318563", null ], + [ "pause", "classmrs__lib_1_1TimeoutManager.html#ad9eac0dcd59c253eb559f1a8da6495eb", null ], + [ "pauseAll", "classmrs__lib_1_1TimeoutManager.html#aeec77f82c5c403b914ba29640ca6c1a2", null ], + [ "registerNew", "classmrs__lib_1_1TimeoutManager.html#a7e7f174308a44ab6ed647bcc8db8bf42", null ], + [ "reset", "classmrs__lib_1_1TimeoutManager.html#a0fdaec453e6db200aa47f38999c5aa44", null ], + [ "start", "classmrs__lib_1_1TimeoutManager.html#aded1164d59ca86f39ebaf147c91187c8", null ], + [ "startAll", "classmrs__lib_1_1TimeoutManager.html#a2dfe6dc322c5e159f21b8bb131e54766", null ], + [ "started", "classmrs__lib_1_1TimeoutManager.html#ad4eefb7364d8f62ac18186a3d9001f28", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1TransformBroadcaster-members.html b/classmrs__lib_1_1TransformBroadcaster-members.html new file mode 100644 index 00000000..cbb3b0c0 --- /dev/null +++ b/classmrs__lib_1_1TransformBroadcaster-members.html @@ -0,0 +1,107 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::TransformBroadcaster Member List
+
+
+ +

This is the complete list of members for mrs_lib::TransformBroadcaster, including all inherited members.

+ + + + +
sendTransform(const geometry_msgs::TransformStamped &transform)mrs_lib::TransformBroadcaster
sendTransform(const std::vector< geometry_msgs::TransformStamped > &transforms)mrs_lib::TransformBroadcaster
TransformBroadcaster()mrs_lib::TransformBroadcaster
+
+ + + + diff --git a/classmrs__lib_1_1TransformBroadcaster.html b/classmrs__lib_1_1TransformBroadcaster.html new file mode 100644 index 00000000..9e56da12 --- /dev/null +++ b/classmrs__lib_1_1TransformBroadcaster.html @@ -0,0 +1,183 @@ + + + + + + + +mrs_lib: mrs_lib::TransformBroadcaster Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::TransformBroadcaster Class Reference
+
+
+ +

Wrapper for the tf2_ros::TransformBroadcaster. With each sendTransform() command, the message is checked against the last message with the same frame IDs. If the transform was already published in this ros::Time step, then the transform is skipped. Prevents endless stream of warnings from spamming the console output. + More...

+ +

#include <transform_broadcaster.h>

+ + + + + + + + + + + +

+Public Member Functions

TransformBroadcaster ()
 constructor, internally starts the TransformBroadcaster
 
void sendTransform (const geometry_msgs::TransformStamped &transform)
 check if the transform is newer than the last published one and publish it. Transform is skipped if a duplicit timestamp is found More...
 
void sendTransform (const std::vector< geometry_msgs::TransformStamped > &transforms)
 check if the transforms are newer than the last published ones and publish them. A transform is skipped if a duplicit timestamp is found More...
 
+

Detailed Description

+

Wrapper for the tf2_ros::TransformBroadcaster. With each sendTransform() command, the message is checked against the last message with the same frame IDs. If the transform was already published in this ros::Time step, then the transform is skipped. Prevents endless stream of warnings from spamming the console output.

+

Member Function Documentation

+ +

◆ sendTransform() [1/2]

+ +
+
+ + + + + + + + +
void mrs_lib::TransformBroadcaster::sendTransform (const geometry_msgs::TransformStamped & transform)
+
+ +

check if the transform is newer than the last published one and publish it. Transform is skipped if a duplicit timestamp is found

+
Parameters
+ + +
transformto be published
+
+
+ +
+
+ +

◆ sendTransform() [2/2]

+ +
+
+ + + + + + + + +
void mrs_lib::TransformBroadcaster::sendTransform (const std::vector< geometry_msgs::TransformStamped > & transforms)
+
+ +

check if the transforms are newer than the last published ones and publish them. A transform is skipped if a duplicit timestamp is found

+
Parameters
+ + +
transformsvector of transforms to be published
+
+
+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/classmrs__lib_1_1TransformBroadcaster.js b/classmrs__lib_1_1TransformBroadcaster.js new file mode 100644 index 00000000..a724f72d --- /dev/null +++ b/classmrs__lib_1_1TransformBroadcaster.js @@ -0,0 +1,6 @@ +var classmrs__lib_1_1TransformBroadcaster = +[ + [ "TransformBroadcaster", "classmrs__lib_1_1TransformBroadcaster.html#ab8760c98f2d7111cc029f45b11e24bb9", null ], + [ "sendTransform", "classmrs__lib_1_1TransformBroadcaster.html#a93913661cb31baeedb7d4e1f72142b93", null ], + [ "sendTransform", "classmrs__lib_1_1TransformBroadcaster.html#a2adf5bd449b5561323fb7d8633e04bf5", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1Transformer-members.html b/classmrs__lib_1_1Transformer-members.html new file mode 100644 index 00000000..98777281 --- /dev/null +++ b/classmrs__lib_1_1Transformer-members.html @@ -0,0 +1,135 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::Transformer Member List
+
+
+ +

This is the complete list of members for mrs_lib::Transformer, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
beQuiet(const bool quiet=true)mrs_lib::Transformerinline
frame_from(const geometry_msgs::TransformStamped &msg)mrs_lib::Transformerinlinestatic
frame_from(geometry_msgs::TransformStamped &msg)mrs_lib::Transformerinlinestatic
frame_to(const geometry_msgs::TransformStamped &msg)mrs_lib::Transformerinlinestatic
frame_to(geometry_msgs::TransformStamped &msg)mrs_lib::Transformerinlinestatic
getTransform(const std::string &from_frame, const std::string &to_frame, const ros::Time &time_stamp=ros::Time(0))mrs_lib::Transformer
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)mrs_lib::Transformer
inverse(const geometry_msgs::TransformStamped &msg)mrs_lib::Transformerinlinestatic
operator=(Transformer &&other)mrs_lib::Transformer
resolveFrame(const std::string &frame_id)mrs_lib::Transformerinline
retryLookupNewest(const bool retry=true)mrs_lib::Transformerinline
setDefaultFrame(const std::string &frame_id)mrs_lib::Transformerinline
setDefaultPrefix(const std::string &prefix)mrs_lib::Transformerinline
setLatLon(const double lat, const double lon)mrs_lib::Transformer
setLookupTimeout(const ros::Duration timeout=ros::Duration(0))mrs_lib::Transformerinline
transform(const T &what, const geometry_msgs::TransformStamped &tf)mrs_lib::Transformer
transform(const boost::shared_ptr< const T > &what, const geometry_msgs::TransformStamped &tf)mrs_lib::Transformerinline
transform(const boost::shared_ptr< T > &what, const geometry_msgs::TransformStamped &tf)mrs_lib::Transformerinline
transformAsPoint(const Eigen::Vector3d &what, const geometry_msgs::TransformStamped &tf)mrs_lib::Transformer
transformAsPoint(const std::string &from_frame, const Eigen::Vector3d &what, const std::string &to_frame, const ros::Time &time_stamp=ros::Time(0))mrs_lib::Transformer
transformAsVector(const Eigen::Vector3d &what, const geometry_msgs::TransformStamped &tf)mrs_lib::Transformer
transformAsVector(const std::string &from_frame, const Eigen::Vector3d &what, const std::string &to_frame, const ros::Time &time_stamp=ros::Time(0))mrs_lib::Transformer
Transformer()mrs_lib::Transformer
Transformer(const std::string &node_name, const ros::Duration &cache_time=ros::Duration(tf2_ros::Buffer::DEFAULT_CACHE_TIME))mrs_lib::Transformer
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))mrs_lib::Transformer
transformSingle(const T &what, const std::string &to_frame)mrs_lib::Transformer
transformSingle(const boost::shared_ptr< T > &what, const std::string &to_frame)mrs_lib::Transformerinline
transformSingle(const boost::shared_ptr< const T > &what, const std::string &to_frame)mrs_lib::Transformerinline
transformSingle(const std::string &from_frame, const T &what, const std::string &to_frame, const ros::Time &time_stamp=ros::Time(0))mrs_lib::Transformer
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))mrs_lib::Transformerinline
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))mrs_lib::Transformerinline
+
+ + + + diff --git a/classmrs__lib_1_1Transformer.html b/classmrs__lib_1_1Transformer.html new file mode 100644 index 00000000..78022bee --- /dev/null +++ b/classmrs__lib_1_1Transformer.html @@ -0,0 +1,1541 @@ + + + + + + + +mrs_lib: mrs_lib::Transformer Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::Transformer Class Reference
+
+
+ +

A convenience wrapper class for ROS's native TF2 API to simplify transforming of various messages. + More...

+ +

#include <transformer.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 Transformer ()
 A convenience constructor that doesn't initialize anything. More...
 
 Transformer (const std::string &node_name, const ros::Duration &cache_time=ros::Duration(tf2_ros::Buffer::DEFAULT_CACHE_TIME))
 The main constructor that actually initializes stuff. More...
 
 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))
 The main constructor that actually initializes stuff. More...
 
Transformeroperator= (Transformer &&other)
 A convenience move assignment operator. More...
 
void setDefaultFrame (const std::string &frame_id)
 Sets the default frame ID to be used instead of any empty frame ID. More...
 
void setDefaultPrefix (const std::string &prefix)
 Sets the default frame ID prefix to be used if no prefix is present in the frame. More...
 
void setLatLon (const double lat, const double lon)
 Sets the curret lattitude and longitude for UTM zone calculation. More...
 
void setLookupTimeout (const ros::Duration timeout=ros::Duration(0))
 Set a timeout for transform lookup. More...
 
void retryLookupNewest (const bool retry=true)
 Enable/disable retry of a failed transform lookup with ros::Time(0). More...
 
void beQuiet (const bool quiet=true)
 Enable/disable some prints that may be too noisy. More...
 
std::string resolveFrame (const std::string &frame_id)
 Deduce the full frame ID from a shortened or empty string using current default prefix and default frame rules. More...
 
template<class T >
std::optional< T > transformSingle (const T &what, const std::string &to_frame)
 Transforms a single variable to a new frame and returns it or std::nullopt if transformation fails. More...
 
template<class T >
std::optional< boost::shared_ptr< T > > transformSingle (const boost::shared_ptr< T > &what, const std::string &to_frame)
 Transforms a single variable to a new frame. More...
 
template<class T >
std::optional< boost::shared_ptr< T > > transformSingle (const boost::shared_ptr< const T > &what, const std::string &to_frame)
 Transforms a single variable to a new frame. More...
 
template<class T >
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))
 Transforms a single variable to a new frame and returns it or std::nullopt if transformation fails. More...
 
template<class T >
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))
 Transforms a single variable to a new frame and returns it or std::nullopt if transformation fails. More...
 
template<class T >
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))
 Transforms a single variable to a new frame and returns it or std::nullopt if transformation fails. More...
 
template<class T >
std::optional< T > transform (const T &what, const geometry_msgs::TransformStamped &tf)
 Transform a variable to new frame using a particular transformation. More...
 
template<class T >
std::optional< boost::shared_ptr< T > > transform (const boost::shared_ptr< const T > &what, const geometry_msgs::TransformStamped &tf)
 Transform a variable to new frame using a particular transformation. More...
 
template<class T >
std::optional< boost::shared_ptr< T > > transform (const boost::shared_ptr< T > &what, const geometry_msgs::TransformStamped &tf)
 Transform a variable to new frame using a particular transformation. More...
 
std::optional< Eigen::Vector3d > transformAsVector (const Eigen::Vector3d &what, const geometry_msgs::TransformStamped &tf)
 Transform an Eigen::Vector3d (interpreting it as a vector). More...
 
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))
 Transform an Eigen::Vector3d (interpreting it as a vector). More...
 
std::optional< Eigen::Vector3d > transformAsPoint (const Eigen::Vector3d &what, const geometry_msgs::TransformStamped &tf)
 Transform an Eigen::Vector3d (interpreting it as a point). More...
 
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))
 Transform an Eigen::Vector3d (interpreting it as a point). More...
 
std::optional< geometry_msgs::TransformStamped > getTransform (const std::string &from_frame, const std::string &to_frame, const ros::Time &time_stamp=ros::Time(0))
 Obtains a transform between two frames in a given time. More...
 
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)
 Obtains a transform between two frames in a given time. More...
 
+ + + + + + + + + + + + + + + + +

+Static Public Member Functions

static constexpr const std::string & frame_from (const geometry_msgs::TransformStamped &msg)
 A convenience function that returns the frame from which the message transforms. More...
 
static constexpr std::string & frame_from (geometry_msgs::TransformStamped &msg)
 A convenience function that returns the frame from which the message transforms. More...
 
static constexpr const std::string & frame_to (const geometry_msgs::TransformStamped &msg)
 A convenience function that returns the frame to which the message transforms. More...
 
static constexpr std::string & frame_to (geometry_msgs::TransformStamped &msg)
 A convenience function that returns the frame to which the message transforms. More...
 
static geometry_msgs::TransformStamped inverse (const geometry_msgs::TransformStamped &msg)
 A convenience function implements returns the inverse of the transform message as a one-liner. More...
 
+

Detailed Description

+

A convenience wrapper class for ROS's native TF2 API to simplify transforming of various messages.

+

Implements optional automatic frame prefix deduction, seamless transformation lattitude/longitude coordinates and UTM coordinates, simple transformation of MRS messages etc.

+

Constructor & Destructor Documentation

+ +

◆ Transformer() [1/3]

+ +
+
+ + + + + + + +
mrs_lib::Transformer::Transformer ()
+
+ +

A convenience constructor that doesn't initialize anything.

+

This constructor is just to enable usign the Transformer as a member variable of nodelets etc. To actually initialize the class, use the alternative constructor.

+
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.
+ +
+
+ +

◆ Transformer() [2/3]

+ +
+
+ + + + + + + + + + + + + + + + + + +
mrs_lib::Transformer::Transformer (const std::string & node_name,
const ros::Duration & cache_time = ros::Duration(tf2_ros::Buffer::DEFAULT_CACHE_TIME) 
)
+
+ +

The main constructor that actually initializes stuff.

+

This constructor initializes the class and the TF2 transform listener.

+
Parameters
+ + + +
node_namethe name of the node running the transformer, is used in ROS prints. If you don't care, just set it to an empty string.
cache_timeduration of the transformation buffer's cache into the past that will be kept.
+
+
+ +
+
+ +

◆ Transformer() [3/3]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::Transformer::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) 
)
+
+ +

The main constructor that actually initializes stuff.

+

This constructor initializes the class and the TF2 transform listener.

+
Parameters
+ + + + +
nhthe node handle to be used for subscribing to the transformations.
node_namethe name of the node running the transformer, is used in ROS prints. If you don't care, just set it to an empty string.
cache_timeduration of the transformation buffer's cache into the past that will be kept.
+
+
+ +
+
+

Member Function Documentation

+ +

◆ beQuiet()

+ +
+
+ + + + + +
+ + + + + + + + +
void mrs_lib::Transformer::beQuiet (const bool quiet = true)
+
+inline
+
+ +

Enable/disable some prints that may be too noisy.

+
Parameters
+ + +
quietenables or disables quiet mode.
+
+
+
Note
Disabled by default.
+ +
+
+ +

◆ frame_from() [1/2]

+ +
+
+ + + + + +
+ + + + + + + + +
static constexpr const std::string& mrs_lib::Transformer::frame_from (const geometry_msgs::TransformStamped & msg)
+
+inlinestaticconstexpr
+
+ +

A convenience function that returns the frame from which the message transforms.

+
Parameters
+ + +
msgthe message representing the transformation.
+
+
+
Returns
the frame from which the transformation in \msg transforms.
+ +
+
+ +

◆ frame_from() [2/2]

+ +
+
+ + + + + +
+ + + + + + + + +
static constexpr std::string& mrs_lib::Transformer::frame_from (geometry_msgs::TransformStamped & msg)
+
+inlinestaticconstexpr
+
+ +

A convenience function that returns the frame from which the message transforms.

+

This overload returns a reference to the string in the message representing the frame id so that it can be modified.

+
Parameters
+ + +
msgthe message representing the transformation.
+
+
+
Returns
a reference to the field in the message containing the string with the frame id from which the transformation in \msg transforms.
+ +
+
+ +

◆ frame_to() [1/2]

+ +
+
+ + + + + +
+ + + + + + + + +
static constexpr const std::string& mrs_lib::Transformer::frame_to (const geometry_msgs::TransformStamped & msg)
+
+inlinestaticconstexpr
+
+ +

A convenience function that returns the frame to which the message transforms.

+
Parameters
+ + +
msgthe message representing the transformation.
+
+
+
Returns
the frame to which the transformation in \msg transforms.
+ +
+
+ +

◆ frame_to() [2/2]

+ +
+
+ + + + + +
+ + + + + + + + +
static constexpr std::string& mrs_lib::Transformer::frame_to (geometry_msgs::TransformStamped & msg)
+
+inlinestaticconstexpr
+
+ +

A convenience function that returns the frame to which the message transforms.

+

This overload returns a reference to the string in the message representing the frame id so that it can be modified.

+
Parameters
+ + +
msgthe message representing the transformation.
+
+
+
Returns
a reference to the field in the message containing the string with the frame id to which the transformation in \msg transforms.
+ +
+
+ +

◆ getTransform() [1/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
std::optional< geometry_msgs::TransformStamped > mrs_lib::Transformer::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 
)
+
+ +

Obtains a transform between two frames in a given time.

+

This overload enables the user to select a different time of the source frame and the target frame.

+
Parameters
+ + + + + + +
from_frameThe original frame of the transformation.
from_stampThe time at which the original frame should be evaluated. (0 will get the latest)
to_frameThe target frame of the transformation.
to_stampThe time to which the data should be transformed. (0 will get the latest)
fixed_frameThe frame that may be assumed constant in time (the "world" frame).
+
+
+
Returns
std::nullopt if failed, optional containing the requested transformation otherwise.
+
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
+ +
+
+ +

◆ getTransform() [2/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
std::optional< geometry_msgs::TransformStamped > mrs_lib::Transformer::getTransform (const std::string & from_frame,
const std::string & to_frame,
const ros::Time & time_stamp = ros::Time(0) 
)
+
+ +

Obtains a transform between two frames in a given time.

+
Parameters
+ + + + +
from_frameThe original frame of the transformation.
to_frameThe target frame of the transformation.
time_stampThe time stamp of the transformation. (0 will get the latest)
+
+
+
Returns
std::nullopt if failed, optional containing the requested transformation otherwise.
+ +
+
+ +

◆ inverse()

+ +
+
+ + + + + +
+ + + + + + + + +
static geometry_msgs::TransformStamped mrs_lib::Transformer::inverse (const geometry_msgs::TransformStamped & msg)
+
+inlinestatic
+
+ +

A convenience function implements returns the inverse of the transform message as a one-liner.

+
Parameters
+ + +
msgthe message representing the transformation.
+
+
+
Returns
a new message representing an inverse of the original transformation.
+ +
+
+ +

◆ operator=()

+ +
+
+ + + + + + + + +
Transformer & mrs_lib::Transformer::operator= (Transformer && other)
+
+ +

A convenience move assignment operator.

+

This operator moves all data from the object that is being assigned from, invalidating it.

+
Parameters
+ + +
otherthe object to assign from. It will be invalid after this method returns.
+
+
+
Returns
a reference to the object being assigned to.
+ +
+
+ +

◆ resolveFrame()

+ +
+
+ + + + + +
+ + + + + + + + +
std::string mrs_lib::Transformer::resolveFrame (const std::string & frame_id)
+
+inline
+
+ +

Deduce the full frame ID from a shortened or empty string using current default prefix and default frame rules.

+

Example assuming default prefix is "uav1" and default frame is "uav1/gps_origin": "" -> "uav1/gps_origin" "local_origin" -> "uav1/local_origin"

+
Parameters
+ + +
frame_idThe frame ID to be resolved.
+
+
+
Returns
The resolved frame ID.
+ +
+
+ +

◆ retryLookupNewest()

+ +
+
+ + + + + +
+ + + + + + + + +
void mrs_lib::Transformer::retryLookupNewest (const bool retry = true)
+
+inline
+
+ +

Enable/disable retry of a failed transform lookup with ros::Time(0).

+

If enabled, a failed transform lookup will be retried. The new try will ignore the requested timestamp and will attempt to fetch the latest transformation between the two frames.

+
Note
Disabled by default.
+
Parameters
+ + +
retryenables or disables retry.
+
+
+ +
+
+ +

◆ setDefaultFrame()

+ +
+
+ + + + + +
+ + + + + + + + +
void mrs_lib::Transformer::setDefaultFrame (const std::string & frame_id)
+
+inline
+
+ +

Sets the default frame ID to be used instead of any empty frame ID.

+

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.

+
Parameters
+ + +
frame_idthe default frame ID. Use an empty string to disable default frame ID deduction.
+
+
+
Note
Disabled by default.
+ +
+
+ +

◆ setDefaultPrefix()

+ +
+
+ + + + + +
+ + + + + + + + +
void mrs_lib::Transformer::setDefaultPrefix (const std::string & prefix)
+
+inline
+
+ +

Sets the default frame ID prefix to be used if no prefix is present in the frame.

+

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. The forward slash should therefore not be included in the prefix.

+

Example frame ID resolution assuming default prefix is "uav1": "local_origin" -> "uav1/local_origin"

+
Parameters
+ + +
prefixthe default frame ID prefix (without the forward slash at the end). Use an empty string to disable default frame ID prefixing.
+
+
+
Note
Disabled by default. The prefix will be applied as a namespace (with a forward slash between the prefix and raw frame ID).
+ +
+
+ +

◆ setLatLon()

+ +
+
+ + + + + + + + + + + + + + + + + + +
void mrs_lib::Transformer::setLatLon (const double lat,
const double lon 
)
+
+ +

Sets the curret lattitude and longitude for UTM zone calculation.

+

The Transformer uses this to deduce the current UTM zone used for transforming stuff to latlon_origin.

+
Parameters
+ + + +
latthe latitude in degrees.
lonthe longitude in degrees.
+
+
+
Note
Any transformation to latlon_origin will fail if this function is not called first!
+ +
+
+ +

◆ setLookupTimeout()

+ +
+
+ + + + + +
+ + + + + + + + +
void mrs_lib::Transformer::setLookupTimeout (const ros::Duration timeout = ros::Duration(0))
+
+inline
+
+ +

Set a timeout for transform lookup.

+

The transform lookup operation will block up to this duration if the transformation is not available immediately.

+
Note
Disabled by default.
+
Parameters
+ + +
timeoutthe lookup timeout. Set to zero to disable blocking.
+
+
+ +
+
+ +

◆ transform() [1/3]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
std::optional<boost::shared_ptr<T> > mrs_lib::Transformer::transform (const boost::shared_ptr< const T > & what,
const geometry_msgs::TransformStamped & tf 
)
+
+inline
+
+ +

Transform a variable to new frame using a particular transformation.

+

A convenience override for shared pointers to const.

+
Parameters
+ + + +
tfThe transformation to be used.
whatThe object to be transformed.
+
+
+
Returns
std::nullopt if failed, optional containing the transformed object otherwise.
+ +
+
+ +

◆ transform() [2/3]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
std::optional<boost::shared_ptr<T> > mrs_lib::Transformer::transform (const boost::shared_ptr< T > & what,
const geometry_msgs::TransformStamped & tf 
)
+
+inline
+
+ +

Transform a variable to new frame using a particular transformation.

+

A convenience override for shared pointers.

+
Parameters
+ + + +
tfThe transformation to be used.
whatThe object to be transformed.
+
+
+
Returns
std::nullopt if failed, optional containing the transformed object otherwise.
+ +
+
+ +

◆ transform() [3/3]

+ +
+
+
+template<class T >
+ + + + + + + + + + + + + + + + + + +
std::optional< T > mrs_lib::Transformer::transform (const T & what,
const geometry_msgs::TransformStamped & tf 
)
+
+ +

Transform a variable to new frame using a particular transformation.

+
Parameters
+ + + +
tfThe transformation to be used.
whatThe object to be transformed.
+
+
+
Returns
std::nullopt if failed, optional containing the transformed object otherwise.
+ +
+
+ +

◆ transformAsPoint() [1/2]

+ +
+
+ + + + + + + + + + + + + + + + + + +
std::optional< Eigen::Vector3d > mrs_lib::Transformer::transformAsPoint (const Eigen::Vector3d & what,
const geometry_msgs::TransformStamped & tf 
)
+
+ +

Transform an Eigen::Vector3d (interpreting it as a point).

+

Both the rotation and translation will be applied to the variable.

+
Parameters
+ + + +
tfThe transformation to be used.
whatThe object to be transformed.
+
+
+
Returns
std::nullopt if failed, optional containing the transformed object otherwise.
+ +
+
+ +

◆ transformAsPoint() [2/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
std::optional< Eigen::Vector3d > mrs_lib::Transformer::transformAsPoint (const std::string & from_frame,
const Eigen::Vector3d & what,
const std::string & to_frame,
const ros::Time & time_stamp = ros::Time(0) 
)
+
+ +

Transform an Eigen::Vector3d (interpreting it as a point).

+

Both the rotation and translation will be applied to the variable.

+
Parameters
+ + + + + +
from_frameThe current frame of what.
whatThe object to be transformed.
to_frameThe desired frame of what.
time_stampFrom which time to take the transformation (use ros::Time(0) for the latest time).
+
+
+
Returns
std::nullopt if failed, optional containing the transformed object otherwise.
+ +
+
+ +

◆ transformAsVector() [1/2]

+ +
+
+ + + + + + + + + + + + + + + + + + +
std::optional< Eigen::Vector3d > mrs_lib::Transformer::transformAsVector (const Eigen::Vector3d & what,
const geometry_msgs::TransformStamped & tf 
)
+
+ +

Transform an Eigen::Vector3d (interpreting it as a vector).

+

Only the rotation will be applied to the variable.

+
Parameters
+ + + +
tfThe transformation to be used.
whatThe vector to be transformed.
+
+
+
Returns
std::nullopt if failed, optional containing the transformed object otherwise.
+ +
+
+ +

◆ transformAsVector() [2/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
std::optional< Eigen::Vector3d > mrs_lib::Transformer::transformAsVector (const std::string & from_frame,
const Eigen::Vector3d & what,
const std::string & to_frame,
const ros::Time & time_stamp = ros::Time(0) 
)
+
+ +

Transform an Eigen::Vector3d (interpreting it as a vector).

+

Only the rotation will be applied to the variable.

+
Parameters
+ + + + + +
from_frameThe current frame of what.
whatThe vector to be transformed.
to_frameThe desired frame of what.
time_stampFrom which time to take the transformation (use ros::Time(0) for the latest time).
+
+
+
Returns
std::nullopt if failed, optional containing the transformed object otherwise.
+ +
+
+ +

◆ transformSingle() [1/6]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
std::optional<boost::shared_ptr<T> > mrs_lib::Transformer::transformSingle (const boost::shared_ptr< const T > & what,
const std::string & to_frame 
)
+
+inline
+
+ +

Transforms a single variable to a new frame.

+

A convenience override for shared pointers to const.

+
Parameters
+ + + +
whatThe object to be transformed.
to_frameThe target fram ID.
+
+
+
Returns
std::nullopt if failed, optional containing the transformed object otherwise.
+ +
+
+ +

◆ transformSingle() [2/6]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
std::optional<boost::shared_ptr<T> > mrs_lib::Transformer::transformSingle (const boost::shared_ptr< T > & what,
const std::string & to_frame 
)
+
+inline
+
+ +

Transforms a single variable to a new frame.

+

A convenience override for shared pointers.

+
Parameters
+ + + +
whatThe object to be transformed.
to_frameThe target fram ID.
+
+
+
Returns
std::nullopt if failed, optional containing the transformed object otherwise.
+ +
+
+ +

◆ transformSingle() [3/6]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
std::optional<boost::shared_ptr<T> > mrs_lib::Transformer::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) 
)
+
+inline
+
+ +

Transforms a single variable to a new frame and returns it or std::nullopt if transformation fails.

+

A convenience overload for shared pointers to const headerless variables.

+
Parameters
+ + + + + +
from_framethe original target frame ID.
whatthe object to be transformed.
to_framethe target frame ID.
time_stampthe time of the transformation.
+
+
+
Returns
std::nullopt if failed, optional containing the transformed object otherwise.
+ +
+
+ +

◆ transformSingle() [4/6]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
std::optional<boost::shared_ptr<T> > mrs_lib::Transformer::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) 
)
+
+inline
+
+ +

Transforms a single variable to a new frame and returns it or std::nullopt if transformation fails.

+

A convenience overload for shared pointers to headerless variables.

+
Parameters
+ + + + + +
from_framethe original target frame ID.
whatthe object to be transformed.
to_framethe target frame ID.
time_stampthe time of the transformation.
+
+
+
Returns
std::nullopt if failed, optional containing the transformed object otherwise.
+ +
+
+ +

◆ transformSingle() [5/6]

+ +
+
+
+template<class T >
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
std::optional< T > mrs_lib::Transformer::transformSingle (const std::string & from_frame,
const T & what,
const std::string & to_frame,
const ros::Time & time_stamp = ros::Time(0) 
)
+
+ +

Transforms a single variable to a new frame and returns it or std::nullopt if transformation fails.

+

A convenience overload for headerless variables.

+
Parameters
+ + + + + +
from_framethe original target frame ID.
whatthe object to be transformed.
to_framethe target frame ID.
time_stampthe time of the transformation.
+
+
+
Returns
std::nullopt if failed, optional containing the transformed object otherwise.
+ +
+
+ +

◆ transformSingle() [6/6]

+ +
+
+
+template<class T >
+ + + + + + + + + + + + + + + + + + +
std::optional< T > mrs_lib::Transformer::transformSingle (const T & what,
const std::string & to_frame 
)
+
+ +

Transforms a single variable to a new frame and returns it or std::nullopt if transformation fails.

+
Parameters
+ + + +
whatthe object to be transformed.
to_framethe target frame ID.
+
+
+
Returns
std::nullopt if failed, optional containing the transformed object otherwise.
+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/classmrs__lib_1_1Transformer.js b/classmrs__lib_1_1Transformer.js new file mode 100644 index 00000000..01a5b8d3 --- /dev/null +++ b/classmrs__lib_1_1Transformer.js @@ -0,0 +1,29 @@ +var classmrs__lib_1_1Transformer = +[ + [ "Transformer", "classmrs__lib_1_1Transformer.html#aca0408b710e4fa6e163ac23719d30fd1", null ], + [ "Transformer", "classmrs__lib_1_1Transformer.html#ae1a34c10d53059f9dfaf4c8c05a4f617", null ], + [ "Transformer", "classmrs__lib_1_1Transformer.html#a561b0c5342c38dea6071ab400b8eaae4", null ], + [ "beQuiet", "classmrs__lib_1_1Transformer.html#ab1e3fff472e6c6320a41d6f6ca331ca0", null ], + [ "getTransform", "classmrs__lib_1_1Transformer.html#a73ce6b60499d9ed491859a444f8d8afd", null ], + [ "getTransform", "classmrs__lib_1_1Transformer.html#a3a29dfb385f1b9c4deee695181880995", null ], + [ "operator=", "classmrs__lib_1_1Transformer.html#a6c4c846758bf173c7aeb488c8ff773b1", null ], + [ "resolveFrame", "classmrs__lib_1_1Transformer.html#aa4cf06770b355a01c66f227363a4967f", null ], + [ "retryLookupNewest", "classmrs__lib_1_1Transformer.html#abef2a59ed83e09ab103c060abb31dbb1", null ], + [ "setDefaultFrame", "classmrs__lib_1_1Transformer.html#a16a54cd35b1f071a80197cbccccfe9c0", null ], + [ "setDefaultPrefix", "classmrs__lib_1_1Transformer.html#a5d6f4288d53f09474c92bda26d0c9f55", null ], + [ "setLatLon", "classmrs__lib_1_1Transformer.html#a54764308675cc6df1782954870e1f3c2", null ], + [ "setLookupTimeout", "classmrs__lib_1_1Transformer.html#ac073019d60f1d9c6d48a0c207bafb678", null ], + [ "transform", "classmrs__lib_1_1Transformer.html#a8b05fe85c78f490b938bbf3d5884fce4", null ], + [ "transform", "classmrs__lib_1_1Transformer.html#a6509524feeb70fe794964b7462f28409", null ], + [ "transform", "classmrs__lib_1_1Transformer.html#a8a66075edc7025976292ebd401d7de16", null ], + [ "transformAsPoint", "classmrs__lib_1_1Transformer.html#ae56ae48888d4fcaf21c912ed491b35d1", null ], + [ "transformAsPoint", "classmrs__lib_1_1Transformer.html#ab1533c559b6c94b406322bfbfc700ef7", null ], + [ "transformAsVector", "classmrs__lib_1_1Transformer.html#af17729e67e82876f6bbce2d5cec55613", null ], + [ "transformAsVector", "classmrs__lib_1_1Transformer.html#a1c71e387e846a2591616e83a88071d24", null ], + [ "transformSingle", "classmrs__lib_1_1Transformer.html#a2c45ff29ac5f482ba9b9c2537d82b8fb", null ], + [ "transformSingle", "classmrs__lib_1_1Transformer.html#a58e8e6d80098e192a0d415a14c6deec0", null ], + [ "transformSingle", "classmrs__lib_1_1Transformer.html#a4d01ec1804bb492694d328704dada907", null ], + [ "transformSingle", "classmrs__lib_1_1Transformer.html#a5afde5d58bc9a558cba5da9e0c2d4d1b", null ], + [ "transformSingle", "classmrs__lib_1_1Transformer.html#a7cea399425c4a51a676ba5aa285612d4", null ], + [ "transformSingle", "classmrs__lib_1_1Transformer.html#a623af4e8100b71ac700ad5ffac96d2e2", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1UKF-members.html b/classmrs__lib_1_1UKF-members.html new file mode 100644 index 00000000..06f91d2f --- /dev/null +++ b/classmrs__lib_1_1UKF-members.html @@ -0,0 +1,145 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::UKF< n_states, n_inputs, n_measurements > Member List
+
+
+ +

This is the complete list of members for mrs_lib::UKF< n_states, n_inputs, n_measurements >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Base_class typedefmrs_lib::UKF< n_states, n_inputs, n_measurements >protected
computeInverse(const Pzz_t &Pzz) const (defined in mrs_lib::UKF< n_states, n_inputs, n_measurements >)mrs_lib::UKF< n_states, n_inputs, n_measurements >protected
computeKalmanGain([[maybe_unused]] const x_t &x, [[maybe_unused]] const z_t &inn, const K_t &Pxz, const Pzz_t &Pzz) const (defined in mrs_lib::UKF< n_states, n_inputs, n_measurements >)mrs_lib::UKF< n_states, n_inputs, n_measurements >protectedvirtual
computePaSqrt(const P_t &P) const (defined in mrs_lib::UKF< n_states, n_inputs, n_measurements >)mrs_lib::UKF< n_states, n_inputs, n_measurements >protected
computeSigmas(const x_t &x, const P_t &P) const (defined in mrs_lib::UKF< n_states, n_inputs, n_measurements >)mrs_lib::UKF< n_states, n_inputs, n_measurements >protected
computeWeights() (defined in mrs_lib::UKF< n_states, n_inputs, n_measurements >)mrs_lib::UKF< n_states, n_inputs, n_measurements >protected
correct(const statecov_t &sc, const z_t &z, const R_t &R) const overridemrs_lib::UKF< n_states, n_inputs, n_measurements >virtual
mrs_lib::KalmanFilter::correct(const statecov_t &sc, const z_t &z, const R_t &R) const =0mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >privatepure virtual
K_t typedefmrs_lib::UKF< n_states, n_inputs, n_measurements >protected
mmrs_lib::UKF< n_states, n_inputs, n_measurements >protectedstatic
m_alpha (defined in mrs_lib::UKF< n_states, n_inputs, n_measurements >)mrs_lib::UKF< n_states, n_inputs, n_measurements >protected
m_beta (defined in mrs_lib::UKF< n_states, n_inputs, n_measurements >)mrs_lib::UKF< n_states, n_inputs, n_measurements >protected
m_kappa (defined in mrs_lib::UKF< n_states, n_inputs, n_measurements >)mrs_lib::UKF< n_states, n_inputs, n_measurements >protected
m_lambda (defined in mrs_lib::UKF< n_states, n_inputs, n_measurements >)mrs_lib::UKF< n_states, n_inputs, n_measurements >protected
m_observation_model (defined in mrs_lib::UKF< n_states, n_inputs, n_measurements >)mrs_lib::UKF< n_states, n_inputs, n_measurements >protected
m_transition_model (defined in mrs_lib::UKF< n_states, n_inputs, n_measurements >)mrs_lib::UKF< n_states, n_inputs, n_measurements >protected
m_Wc (defined in mrs_lib::UKF< n_states, n_inputs, n_measurements >)mrs_lib::UKF< n_states, n_inputs, n_measurements >protected
m_Wm (defined in mrs_lib::UKF< n_states, n_inputs, n_measurements >)mrs_lib::UKF< n_states, n_inputs, n_measurements >protected
nmrs_lib::UKF< n_states, n_inputs, n_measurements >protectedstatic
observation_model_t typedefmrs_lib::UKF< n_states, n_inputs, n_measurements >
pmrs_lib::UKF< n_states, n_inputs, n_measurements >protectedstatic
P_t typedefmrs_lib::UKF< n_states, n_inputs, n_measurements >
predict(const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const overridemrs_lib::UKF< n_states, n_inputs, n_measurements >virtual
mrs_lib::KalmanFilter::predict(const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const =0mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >privatepure virtual
Pzz_t typedefmrs_lib::UKF< n_states, n_inputs, n_measurements >protected
Q_t typedefmrs_lib::UKF< n_states, n_inputs, n_measurements >
R_t typedefmrs_lib::UKF< n_states, n_inputs, n_measurements >
setConstants(const double alpha, const double kappa, const double beta)mrs_lib::UKF< n_states, n_inputs, n_measurements >
setObservationModel(const observation_model_t &observation_model)mrs_lib::UKF< n_states, n_inputs, n_measurements >
setTransitionModel(const transition_model_t &transition_model)mrs_lib::UKF< n_states, n_inputs, n_measurements >
statecov_t typedefmrs_lib::UKF< n_states, n_inputs, n_measurements >
transition_model_t typedefmrs_lib::UKF< n_states, n_inputs, n_measurements >
u_t typedefmrs_lib::UKF< n_states, n_inputs, n_measurements >
UKF()mrs_lib::UKF< n_states, n_inputs, n_measurements >
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)mrs_lib::UKF< n_states, n_inputs, n_measurements >
wmrs_lib::UKF< n_states, n_inputs, n_measurements >protectedstatic
W_t typedefmrs_lib::UKF< n_states, n_inputs, n_measurements >
X_t typedefmrs_lib::UKF< n_states, n_inputs, n_measurements >protected
x_t typedefmrs_lib::UKF< n_states, n_inputs, n_measurements >
z_t typedefmrs_lib::UKF< n_states, n_inputs, n_measurements >
Z_t typedefmrs_lib::UKF< n_states, n_inputs, n_measurements >protected
+
+ + + + diff --git a/classmrs__lib_1_1UKF.html b/classmrs__lib_1_1UKF.html new file mode 100644 index 00000000..32356b72 --- /dev/null +++ b/classmrs__lib_1_1UKF.html @@ -0,0 +1,626 @@ + + + + + + + +mrs_lib: mrs_lib::UKF< n_states, n_inputs, n_measurements > Class Template Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::UKF< n_states, n_inputs, n_measurements > Class Template Reference
+
+
+ +

Implementation of the Unscented Kalman filter [4]. + More...

+ +

#include <ukf.h>

+
+ + Inheritance diagram for mrs_lib::UKF< n_states, n_inputs, n_measurements >:
+
+
+ +
+ + Collaboration diagram for mrs_lib::UKF< n_states, n_inputs, n_measurements >:
+
+
+ + + + + + + + + +

+Classes

struct  inverse_exception
 is thrown when taking the inverse of a matrix fails during kalman gain calculation More...
 
struct  square_root_exception
 is thrown when taking the square root of a matrix fails during sigma generation More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Types

+using x_t = typename Base_class::x_t
 state vector n*1 typedef
 
+using u_t = typename Base_class::u_t
 input vector m*1 typedef
 
+using z_t = typename Base_class::z_t
 measurement vector p*1 typedef
 
+using P_t = typename Base_class::P_t
 state covariance n*n typedef
 
+using R_t = typename Base_class::R_t
 measurement covariance p*p typedef
 
+using Q_t = typename Base_class::Q_t
 process covariance n*n typedef
 
+using W_t = typename Eigen::Matrix< double, w, 1 >
 weights vector (2n+1)*1 typedef
 
+using statecov_t = typename Base_class::statecov_t
 typedef of a helper struct for state and covariance
 
+using transition_model_t = typename std::function< x_t(const x_t &, const u_t &, double)>
 function of the state transition model typedef
 
+using observation_model_t = typename std::function< z_t(const x_t &)>
 function of the observation model typedef
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 UKF ()
 Convenience default constructor. More...
 
 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)
 The main constructor. More...
 
virtual statecov_t correct (const statecov_t &sc, const z_t &z, const R_t &R) const override
 Implements the state correction step (measurement update). More...
 
virtual statecov_t predict (const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const override
 Implements the state prediction step (time update). More...
 
void setConstants (const double alpha, const double kappa, const double beta)
 Changes the Unscented Transform parameters. More...
 
void setTransitionModel (const transition_model_t &transition_model)
 Changes the transition model function. More...
 
void setObservationModel (const observation_model_t &observation_model)
 Changes the observation model function. More...
 
+ + + + + + + + + + + + + + + + +

+Protected Types

+using Base_class = KalmanFilter< n, m, p >
 Base class of this class.
 
+using X_t = typename Eigen::Matrix< double, n, w >
 State sigma points matrix.
 
+using Z_t = typename Eigen::Matrix< double, p, w >
 Measurement sigma points matrix.
 
+using Pzz_t = typename Eigen::Matrix< double, p, p >
 Pzz helper matrix.
 
+using K_t = typename Eigen::Matrix< double, n, p >
 Kalman gain matrix.
 
+ + + + + + + + + + + +

+Protected Member Functions

+void computeWeights ()
 
+X_t computeSigmas (const x_t &x, const P_t &P) const
 
+P_t computePaSqrt (const P_t &P) const
 
+Pzz_t computeInverse (const Pzz_t &Pzz) const
 
+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
 
+ + + + + + + + + + + + + + + + + +

+Protected Attributes

+double m_alpha
 
+double m_kappa
 
+double m_beta
 
+double m_lambda
 
+W_t m_Wm
 
+W_t m_Wc
 
+transition_model_t m_transition_model
 
+observation_model_t m_observation_model
 
+ + + + + + + + + + + + + +

+Static Protected Attributes

+static constexpr int n = n_states
 Length of the state vector of the system.
 
+static constexpr int m = n_inputs
 Length of the input vector of the system.
 
+static constexpr int p = n_measurements
 Length of the measurement vector of the system.
 
+static constexpr int w = 2 * n + 1
 Number of sigma points/weights.
 
+

Detailed Description

+

template<int n_states, int n_inputs, int n_measurements>
+class mrs_lib::UKF< n_states, n_inputs, n_measurements >

+ +

Implementation of the Unscented Kalman filter [4].

+

The Unscented Kalman filter (abbreviated UKF, [4]) is a variant of the Kalman filter, which may be used for state filtration or estimation of non-linear systems as opposed to the Linear Kalman Filter (which is implemented in LKF). The UKF tends to be more accurate than the simpler Extended Kalman Filter, espetially for highly non-linear systems. However, it is generally less stable than the LKF because of the extra matrix square root in the sigma points calculation, so it is recommended to use LKF for linear systems.

+

The UKF C++ class itself is templated. This has its advantages and disadvantages. Main disadvantage is that it may be harder to use if you're not familiar with C++ templates, which, admittedly, can get somewhat messy, espetially during compilation. Another disadvantage is that if used unwisely, the compilation times can get much higher when using templates. The main advantage is compile-time checking (if it compiles, then it has a lower chance of crashing at runtime) and enabling more effective optimalizations during compilation. Also in case of Eigen, the code is arguably more readable when you use aliases to the specific Matrix instances instead of having Eigen::MatrixXd and Eigen::VectorXd everywhere.

+
Template Parameters
+ + + + +
n_statesnumber of states of the system (length of the $ \mathbf{x} $ vector).
n_inputsnumber of inputs of the system (length of the $ \mathbf{u} $ vector).
n_measurementsnumber of measurements of the system (length of the $ \mathbf{z} $ vector).
+
+
+
Examples
ukf/example.cpp.
+
+

Constructor & Destructor Documentation

+ +

◆ UKF() [1/2]

+ +
+
+
+template<int n_states, int n_inputs, int n_measurements>
+ + + + +
mrs_lib::UKF< n_states, n_inputs, n_measurements >::UKF
+
+ +

Convenience default constructor.

+

This constructor should not be used if applicable. If used, the main constructor has to be called afterwards, otherwise the UKF object is invalid (not initialized).

+ +
+
+ +

◆ UKF() [2/2]

+ +
+
+
+template<int n_states, int n_inputs, int n_measurements>
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::UKF< n_states, n_inputs, n_measurements >::UKF (const transition_model_ttransition_model,
const observation_model_tobservation_model,
const double alpha = 1e-3,
const double kappa = 1,
const double beta = 2 
)
+
+ +

The main constructor.

+
Parameters
+ + + + + + +
alphaScaling parameter of the sigma generation (a small positive value, e.g. 1e-3).
kappaSecondary scaling parameter of the sigma generation (usually set to 0 or 1).
betaIncorporates prior knowledge about the distribution (for Gaussian distribution, 2 is optimal).
transition_modelState transition model function.
observation_modelObservation model function.
+
+
+ +
+
+

Member Function Documentation

+ +

◆ correct()

+ +
+
+
+template<int n_states, int n_inputs, int n_measurements>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
UKF< n_states, n_inputs, n_measurements >::statecov_t mrs_lib::UKF< n_states, n_inputs, n_measurements >::correct (const statecov_tsc,
const z_tz,
const R_tR 
) const
+
+overridevirtual
+
+ +

Implements the state correction step (measurement update).

+
Parameters
+ + + + +
scPrevious estimate of the state and covariance.
zMeasurement vector.
RMeasurement covariance matrix.
+
+
+
Returns
The state and covariance after applying the correction step.
+ +

Reimplemented in mrs_lib::NCUKF< n_states, n_inputs, n_measurements >.

+ +
+
+ +

◆ predict()

+ +
+
+
+template<int n_states, int n_inputs, int n_measurements>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
UKF< n_states, n_inputs, n_measurements >::statecov_t mrs_lib::UKF< n_states, n_inputs, n_measurements >::predict (const statecov_tsc,
const u_tu,
const Q_tQ,
double dt 
) const
+
+overridevirtual
+
+ +

Implements the state prediction step (time update).

+
Parameters
+ + + + + +
scPrevious estimate of the state and covariance.
uInput vector.
QProcess noise covariance matrix.
dtDuration since the previous estimate.
+
+
+
Returns
The state and covariance after applying the correction step.
+ +
+
+ +

◆ setConstants()

+ +
+
+
+template<int n_states, int n_inputs, int n_measurements>
+ + + + + + + + + + + + + + + + + + + + + + + + +
void mrs_lib::UKF< n_states, n_inputs, n_measurements >::setConstants (const double alpha,
const double kappa,
const double beta 
)
+
+ +

Changes the Unscented Transform parameters.

+
Parameters
+ + + + +
alphaScaling parameter of the sigma generation (a small positive value - e.g. 1e-3).
kappaSecondary scaling parameter of the sigma generation (usually set to 0 or 1).
betaIncorporates prior knowledge about the distribution (for Gaussian distribution, 2 is optimal).
+
+
+ +
+
+ +

◆ setObservationModel()

+ +
+
+
+template<int n_states, int n_inputs, int n_measurements>
+ + + + + + + + +
void mrs_lib::UKF< n_states, n_inputs, n_measurements >::setObservationModel (const observation_model_tobservation_model)
+
+ +

Changes the observation model function.

+
Parameters
+ + +
observation_modelthe new observation model
+
+
+ +
+
+ +

◆ setTransitionModel()

+ +
+
+
+template<int n_states, int n_inputs, int n_measurements>
+ + + + + + + + +
void mrs_lib::UKF< n_states, n_inputs, n_measurements >::setTransitionModel (const transition_model_ttransition_model)
+
+ +

Changes the transition model function.

+
Parameters
+ + +
transition_modelthe new transition model
+
+
+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/classmrs__lib_1_1UKF.js b/classmrs__lib_1_1UKF.js new file mode 100644 index 00000000..07a159b3 --- /dev/null +++ b/classmrs__lib_1_1UKF.js @@ -0,0 +1,40 @@ +var classmrs__lib_1_1UKF = +[ + [ "inverse_exception", "structmrs__lib_1_1UKF_1_1inverse__exception.html", "structmrs__lib_1_1UKF_1_1inverse__exception" ], + [ "square_root_exception", "structmrs__lib_1_1UKF_1_1square__root__exception.html", "structmrs__lib_1_1UKF_1_1square__root__exception" ], + [ "Base_class", "classmrs__lib_1_1UKF.html#ae5a0eb2f31131ed4cec117d4a1000080", null ], + [ "K_t", "classmrs__lib_1_1UKF.html#ace5416fd8ac52fba822337bceaf751a7", null ], + [ "observation_model_t", "classmrs__lib_1_1UKF.html#ac515ea8c688d7ee67250c384417f9ab9", null ], + [ "P_t", "classmrs__lib_1_1UKF.html#ac1128f5d7fa36305a52859a752a97fda", null ], + [ "Pzz_t", "classmrs__lib_1_1UKF.html#af11dc75b608a43930e8289c51e8ab7c6", null ], + [ "Q_t", "classmrs__lib_1_1UKF.html#abd8f845f1b3f138949bd95c7dc12e011", null ], + [ "R_t", "classmrs__lib_1_1UKF.html#a0af0d9a246df0798b1cb1308cec82fd2", null ], + [ "statecov_t", "classmrs__lib_1_1UKF.html#a604c0bfee69ee5a34dc4412af3cc6e53", null ], + [ "transition_model_t", "classmrs__lib_1_1UKF.html#a986f17f015282a33b140af4adabce091", null ], + [ "u_t", "classmrs__lib_1_1UKF.html#a6589d6a1f5eba355f1bec91e99826b71", null ], + [ "W_t", "classmrs__lib_1_1UKF.html#aca628bd6d14b59b9d0a10652a2665a32", null ], + [ "X_t", "classmrs__lib_1_1UKF.html#a1435f2ed4e333151990355813cee95ba", null ], + [ "x_t", "classmrs__lib_1_1UKF.html#a5ab9d25f7b2470c7abeacda7f8b80630", null ], + [ "Z_t", "classmrs__lib_1_1UKF.html#a06a3fae37e8a0613d8169b638c4c0001", null ], + [ "z_t", "classmrs__lib_1_1UKF.html#a7a68877ffa7bd8bb10f16d1f104e0a73", null ], + [ "UKF", "classmrs__lib_1_1UKF.html#acf37d546ec0e03f1ef4c031f96057733", null ], + [ "UKF", "classmrs__lib_1_1UKF.html#a43f196bc0b8ef4dd75feba3b025576cb", null ], + [ "computeInverse", "classmrs__lib_1_1UKF.html#a2d0824ac1a567b4542a6cc26d0672fba", null ], + [ "computeKalmanGain", "classmrs__lib_1_1UKF.html#ad22d268a16cf223c7853225038f02ee6", null ], + [ "computePaSqrt", "classmrs__lib_1_1UKF.html#ac2eb18554e24af946d18b3b1f56d6cd9", null ], + [ "computeSigmas", "classmrs__lib_1_1UKF.html#a2655c5ad51b0a5c3a7e07430637bd216", null ], + [ "computeWeights", "classmrs__lib_1_1UKF.html#a82f19aab6f21c1c8794024b9ae9d88c9", null ], + [ "correct", "classmrs__lib_1_1UKF.html#ad31a0a6b6c1ea433daa0bae83e6fb6e4", null ], + [ "predict", "classmrs__lib_1_1UKF.html#a4c9c1e158bb4b6739b8bfdbdc1369c41", null ], + [ "setConstants", "classmrs__lib_1_1UKF.html#a646b7755aaa478bb86d89e1923d5ed2a", null ], + [ "setObservationModel", "classmrs__lib_1_1UKF.html#a272c7435d05b9a8867df4bd131f01177", null ], + [ "setTransitionModel", "classmrs__lib_1_1UKF.html#a724d2e508dd45e4e6cb7b08b023cae34", null ], + [ "m_alpha", "classmrs__lib_1_1UKF.html#a6fc172677f265d23c58dd44d24f9d00a", null ], + [ "m_beta", "classmrs__lib_1_1UKF.html#add72fa54f7a0e53cb8d6c804d5bec410", null ], + [ "m_kappa", "classmrs__lib_1_1UKF.html#afc26c675257c6be3eb3d09ac2eece61f", null ], + [ "m_lambda", "classmrs__lib_1_1UKF.html#a6b89b8f55bb6574760d2b4eb4281b35a", null ], + [ "m_observation_model", "classmrs__lib_1_1UKF.html#af6339fd2d89c4e7223c2646ec7cb490c", null ], + [ "m_transition_model", "classmrs__lib_1_1UKF.html#ad1ca73c805660d45a2c77393f7a14374", null ], + [ "m_Wc", "classmrs__lib_1_1UKF.html#abecb7ce280f0f1ff79d6b094c7a78299", null ], + [ "m_Wm", "classmrs__lib_1_1UKF.html#a135f047421ef49fb886a3259bf545096", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1UKF__coll__graph.map b/classmrs__lib_1_1UKF__coll__graph.map new file mode 100644 index 00000000..3093075c --- /dev/null +++ b/classmrs__lib_1_1UKF__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/classmrs__lib_1_1UKF__coll__graph.md5 b/classmrs__lib_1_1UKF__coll__graph.md5 new file mode 100644 index 00000000..944f7113 --- /dev/null +++ b/classmrs__lib_1_1UKF__coll__graph.md5 @@ -0,0 +1 @@ +63ef0b009c70a1fa3d5a344012b7d3b1 \ No newline at end of file diff --git a/classmrs__lib_1_1UKF__coll__graph.png b/classmrs__lib_1_1UKF__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..262070c21a7911860cbaf6e1a0489e086bdab45a GIT binary patch literal 5988 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 + + + + diff --git a/classmrs__lib_1_1UKF__inherit__graph.md5 b/classmrs__lib_1_1UKF__inherit__graph.md5 new file mode 100644 index 00000000..1ca0fbd8 --- /dev/null +++ b/classmrs__lib_1_1UKF__inherit__graph.md5 @@ -0,0 +1 @@ +c8291fc1663bc04ac7dc0f6f0aab5ec2 \ No newline at end of file diff --git a/classmrs__lib_1_1UKF__inherit__graph.png b/classmrs__lib_1_1UKF__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..343ee820617cd4583b9243273a00977815529e4f GIT binary patch literal 9258 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 + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::Vector3Converter Member List
+
+
+ +

This is the complete list of members for mrs_lib::Vector3Converter, including all inherited members.

+ + + + + + + + +
operator Eigen::Vector3d() constmrs_lib::Vector3Converter
operator geometry_msgs::Vector3() constmrs_lib::Vector3Converter
operator tf2::Vector3() constmrs_lib::Vector3Converter
Vector3Converter(const tf2::Vector3 &vector3)mrs_lib::Vector3Converterinline
Vector3Converter(const Eigen::Vector3d &vector3)mrs_lib::Vector3Converter
Vector3Converter(const geometry_msgs::Vector3 &vector3)mrs_lib::Vector3Converter
Vector3Converter(const double &x, const double &y, const double &z)mrs_lib::Vector3Converter
+
+ + + + diff --git a/classmrs__lib_1_1Vector3Converter.html b/classmrs__lib_1_1Vector3Converter.html new file mode 100644 index 00000000..1f31702c --- /dev/null +++ b/classmrs__lib_1_1Vector3Converter.html @@ -0,0 +1,333 @@ + + + + + + + +mrs_lib: mrs_lib::Vector3Converter Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::Vector3Converter Class Reference
+
+
+ +

Converter of Vector3 representations. Instantiate it with any type of vector3 in constructor and convert it by assigning it to any other type of vector3 variable. + More...

+ +

#include <attitude_converter.h>

+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 Vector3Converter (const tf2::Vector3 &vector3)
 Constructor with tf2::Vector3. More...
 
 Vector3Converter (const Eigen::Vector3d &vector3)
 Constructor with Eigen::Vector3. More...
 
 Vector3Converter (const geometry_msgs::Vector3 &vector3)
 Constructor with geometry_msgs::Vector3. More...
 
 Vector3Converter (const double &x, const double &y, const double &z)
 Constructor with doubles: x, y, z. More...
 
 operator tf2::Vector3 () const
 typecast overloaded for tf2::Vector3 More...
 
 operator Eigen::Vector3d () const
 typecast overloaded for Eigen::Vector3 More...
 
 operator geometry_msgs::Vector3 () const
 typecast overloaded for geometry_msgs::Vector3 More...
 
+

Detailed Description

+

Converter of Vector3 representations. Instantiate it with any type of vector3 in constructor and convert it by assigning it to any other type of vector3 variable.

+

Constructor & Destructor Documentation

+ +

◆ Vector3Converter() [1/4]

+ +
+
+ + + + + +
+ + + + + + + + +
mrs_lib::Vector3Converter::Vector3Converter (const tf2::Vector3 & vector3)
+
+inline
+
+ +

Constructor with tf2::Vector3.

+
Parameters
+ + +
vector3
+
+
+ +
+
+ +

◆ Vector3Converter() [2/4]

+ +
+
+ + + + + + + + +
mrs_lib::Vector3Converter::Vector3Converter (const Eigen::Vector3d & vector3)
+
+ +

Constructor with Eigen::Vector3.

+
Parameters
+ + +
vector3
+
+
+ +
+
+ +

◆ Vector3Converter() [3/4]

+ +
+
+ + + + + + + + +
mrs_lib::Vector3Converter::Vector3Converter (const geometry_msgs::Vector3 & vector3)
+
+ +

Constructor with geometry_msgs::Vector3.

+
Parameters
+ + +
vector3
+
+
+ +
+
+ +

◆ Vector3Converter() [4/4]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::Vector3Converter::Vector3Converter (const double & x,
const double & y,
const double & z 
)
+
+ +

Constructor with doubles: x, y, z.

+
Parameters
+ + + + +
x
y
z
+
+
+ +
+
+

Member Function Documentation

+ +

◆ operator Eigen::Vector3d()

+ +
+
+ + + + + + + +
mrs_lib::Vector3Converter::operator Eigen::Vector3d () const
+
+ +

typecast overloaded for Eigen::Vector3

+
Returns
vector3
+ +
+
+ +

◆ operator geometry_msgs::Vector3()

+ +
+
+ + + + + + + +
mrs_lib::Vector3Converter::operator geometry_msgs::Vector3 () const
+
+ +

typecast overloaded for geometry_msgs::Vector3

+
Returns
vector3
+ +
+
+ +

◆ operator tf2::Vector3()

+ +
+
+ + + + + + + +
mrs_lib::Vector3Converter::operator tf2::Vector3 () const
+
+ +

typecast overloaded for tf2::Vector3

+
Returns
vector3
+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/classmrs__lib_1_1Vector3Converter.js b/classmrs__lib_1_1Vector3Converter.js new file mode 100644 index 00000000..d46afbc9 --- /dev/null +++ b/classmrs__lib_1_1Vector3Converter.js @@ -0,0 +1,10 @@ +var classmrs__lib_1_1Vector3Converter = +[ + [ "Vector3Converter", "classmrs__lib_1_1Vector3Converter.html#ac5cf91c41293661ea55749d55aec4d48", null ], + [ "Vector3Converter", "classmrs__lib_1_1Vector3Converter.html#abf2c3e688787834522c8a99c374f656e", null ], + [ "Vector3Converter", "classmrs__lib_1_1Vector3Converter.html#aec2780b4e6f0b58ee2c465ab2338df17", null ], + [ "Vector3Converter", "classmrs__lib_1_1Vector3Converter.html#a3936cad709ed1018aba1d05d47639c80", null ], + [ "operator Eigen::Vector3d", "classmrs__lib_1_1Vector3Converter.html#a69c3a9a8dbcff2876e40d28022c019e3", null ], + [ "operator geometry_msgs::Vector3", "classmrs__lib_1_1Vector3Converter.html#a6f6edf59403aded9e3bffcd603cce5c0", null ], + [ "operator tf2::Vector3", "classmrs__lib_1_1Vector3Converter.html#a96b9daae53786acb4f52e09e8fb7bc8a", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1VisualObject-members.html b/classmrs__lib_1_1VisualObject-members.html new file mode 100644 index 00000000..64bdc549 --- /dev/null +++ b/classmrs__lib_1_1VisualObject-members.html @@ -0,0 +1,121 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::VisualObject Member List
+
+
+ +

This is the complete list of members for mrs_lib::VisualObject, including all inherited members.

+ + + + + + + + + + + + + + + + + + +
getColors() const (defined in mrs_lib::VisualObject)mrs_lib::VisualObject
getID() const (defined in mrs_lib::VisualObject)mrs_lib::VisualObject
getPoints() const (defined in mrs_lib::VisualObject)mrs_lib::VisualObject
getType() const (defined in mrs_lib::VisualObject)mrs_lib::VisualObject
isTimedOut() const (defined in mrs_lib::VisualObject)mrs_lib::VisualObject
operator<(const VisualObject &other) const (defined in mrs_lib::VisualObject)mrs_lib::VisualObjectinline
operator==(const VisualObject &other) const (defined in mrs_lib::VisualObject)mrs_lib::VisualObjectinline
operator>(const VisualObject &other) const (defined in mrs_lib::VisualObject)mrs_lib::VisualObjectinline
VisualObject(const Eigen::Vector3d &point, const double r, const double g, const double b, const double a, const ros::Duration &timeout, const unsigned long &id) (defined in mrs_lib::VisualObject)mrs_lib::VisualObject
VisualObject(const mrs_lib::geometry::Ray &ray, const double r, const double g, const double b, const double a, const ros::Duration &timeout, const unsigned long &id) (defined in mrs_lib::VisualObject)mrs_lib::VisualObject
VisualObject(const mrs_lib::geometry::Triangle &triangle, const double r, const double g, const double b, const double a, const ros::Duration &timeout, const bool filled, const unsigned long &id) (defined in mrs_lib::VisualObject)mrs_lib::VisualObject
VisualObject(const mrs_lib::geometry::Rectangle &rectangle, const double r, const double g, const double b, const double a, const ros::Duration &timeout, const bool filled, const unsigned long &id) (defined in mrs_lib::VisualObject)mrs_lib::VisualObject
VisualObject(const mrs_lib::geometry::Cuboid &cuboid, const double r, const double g, const double b, const double a, const ros::Duration &timeout, const bool filled, const unsigned long &id) (defined in mrs_lib::VisualObject)mrs_lib::VisualObject
VisualObject(const mrs_lib::geometry::Ellipse &ellipse, const double r, const double g, const double b, const double a, const ros::Duration &timeout, const bool filled, const unsigned long &id, const int num_points=DEFAULT_ELLIPSE_POINTS) (defined in mrs_lib::VisualObject)mrs_lib::VisualObject
VisualObject(const mrs_lib::geometry::Cylinder &cylinder, const double r, const double g, const double b, const double a, const ros::Duration &timeout, const bool filled, const bool capped, const unsigned long &id, const int num_sides=DEFAULT_ELLIPSE_POINTS) (defined in mrs_lib::VisualObject)mrs_lib::VisualObject
VisualObject(const mrs_lib::geometry::Cone &cone, const double r, const double g, const double b, const double a, const ros::Duration &timeout, const bool filled, const bool capped, const unsigned long &id, const int num_sides=DEFAULT_ELLIPSE_POINTS) (defined in mrs_lib::VisualObject)mrs_lib::VisualObject
VisualObject(const mrs_msgs::TrajectoryReference &traj, const double r, const double g, const double b, const double a, const ros::Duration &timeout, const bool filled, const unsigned long &id) (defined in mrs_lib::VisualObject)mrs_lib::VisualObject
+
+ + + + diff --git a/classmrs__lib_1_1VisualObject.html b/classmrs__lib_1_1VisualObject.html new file mode 100644 index 00000000..2770ccdf --- /dev/null +++ b/classmrs__lib_1_1VisualObject.html @@ -0,0 +1,164 @@ + + + + + + + +mrs_lib: mrs_lib::VisualObject Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::VisualObject Class Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

VisualObject (const Eigen::Vector3d &point, const double r, const double g, const double b, const double a, const ros::Duration &timeout, const unsigned long &id)
 
VisualObject (const mrs_lib::geometry::Ray &ray, const double r, const double g, const double b, const double a, const ros::Duration &timeout, const unsigned long &id)
 
VisualObject (const mrs_lib::geometry::Triangle &triangle, const double r, const double g, const double b, const double a, const ros::Duration &timeout, const bool filled, const unsigned long &id)
 
VisualObject (const mrs_lib::geometry::Rectangle &rectangle, const double r, const double g, const double b, const double a, const ros::Duration &timeout, const bool filled, const unsigned long &id)
 
VisualObject (const mrs_lib::geometry::Cuboid &cuboid, const double r, const double g, const double b, const double a, const ros::Duration &timeout, const bool filled, const unsigned long &id)
 
VisualObject (const mrs_lib::geometry::Ellipse &ellipse, const double r, const double g, const double b, const double a, const ros::Duration &timeout, const bool filled, const unsigned long &id, const int num_points=DEFAULT_ELLIPSE_POINTS)
 
VisualObject (const mrs_lib::geometry::Cylinder &cylinder, const double r, const double g, const double b, const double a, const ros::Duration &timeout, const bool filled, const bool capped, const unsigned long &id, const int num_sides=DEFAULT_ELLIPSE_POINTS)
 
VisualObject (const mrs_lib::geometry::Cone &cone, const double r, const double g, const double b, const double a, const ros::Duration &timeout, const bool filled, const bool capped, const unsigned long &id, const int num_sides=DEFAULT_ELLIPSE_POINTS)
 
VisualObject (const mrs_msgs::TrajectoryReference &traj, const double r, const double g, const double b, const double a, const ros::Duration &timeout, const bool filled, const unsigned long &id)
 
+unsigned long getID () const
 
+int getType () const
 
+bool isTimedOut () const
 
+const std::vector< geometry_msgs::Point > getPoints () const
 
+const std::vector< std_msgs::ColorRGBA > getColors () const
 
+bool operator< (const VisualObject &other) const
 
+bool operator> (const VisualObject &other) const
 
+bool operator== (const VisualObject &other) const
 
+
The documentation for this class was generated from the following files:
    +
  • include/mrs_lib/visual_object.h
  • +
  • src/batch_visualizer/visual_object.cpp
  • +
+
+
+ + + + diff --git a/classmrs__lib_1_1VisualObject.js b/classmrs__lib_1_1VisualObject.js new file mode 100644 index 00000000..6644a983 --- /dev/null +++ b/classmrs__lib_1_1VisualObject.js @@ -0,0 +1,20 @@ +var classmrs__lib_1_1VisualObject = +[ + [ "VisualObject", "classmrs__lib_1_1VisualObject.html#a537ad5e03d10f706e84aeb1a6df41dc2", null ], + [ "VisualObject", "classmrs__lib_1_1VisualObject.html#a505ca7f7b51e0f8efb819bf053c735da", null ], + [ "VisualObject", "classmrs__lib_1_1VisualObject.html#aad92d42138c0dad5afd9130123ca2127", null ], + [ "VisualObject", "classmrs__lib_1_1VisualObject.html#ae8e57406273b7d5c00f8ecaba37ee81c", null ], + [ "VisualObject", "classmrs__lib_1_1VisualObject.html#a449c8ae671d076894e96ed63fcec510b", null ], + [ "VisualObject", "classmrs__lib_1_1VisualObject.html#a6f616e3ec81d7002c723894c626d5d82", null ], + [ "VisualObject", "classmrs__lib_1_1VisualObject.html#a5a36ccd92270bab79ac997a83d003c41", null ], + [ "VisualObject", "classmrs__lib_1_1VisualObject.html#ae564f914d9ebd0356ba34895fe463ec2", null ], + [ "VisualObject", "classmrs__lib_1_1VisualObject.html#a9ed70bde3a0a02eec25631f98398fb04", null ], + [ "getColors", "classmrs__lib_1_1VisualObject.html#a9d899ed5c052674c63659b4e78387c2d", null ], + [ "getID", "classmrs__lib_1_1VisualObject.html#aed4d30ede23a86744b3a4f71f5d3d3f4", null ], + [ "getPoints", "classmrs__lib_1_1VisualObject.html#a9114ebc384c0f43adbfad0032f1bd005", null ], + [ "getType", "classmrs__lib_1_1VisualObject.html#a3f49d662c10bffb3e813adb2cb0359c9", null ], + [ "isTimedOut", "classmrs__lib_1_1VisualObject.html#af6fb444f6a341a8c00678b501a00a33d", null ], + [ "operator<", "classmrs__lib_1_1VisualObject.html#a296a929f9957021c1dbf0f22e12a6e04", null ], + [ "operator==", "classmrs__lib_1_1VisualObject.html#a5a9fccab5d43bb63a3b1392476f8e2f4", null ], + [ "operator>", "classmrs__lib_1_1VisualObject.html#a3d3550fd1da2c29f60b9e61e7a586103", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1geometry_1_1Cone-members.html b/classmrs__lib_1_1geometry_1_1Cone-members.html new file mode 100644 index 00000000..82c127f4 --- /dev/null +++ b/classmrs__lib_1_1geometry_1_1Cone-members.html @@ -0,0 +1,114 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::geometry::Cone Member List
+
+
+ +

This is the complete list of members for mrs_lib::geometry::Cone, including all inherited members.

+ + + + + + + + + + + +
center() constmrs_lib::geometry::Cone
Cone()mrs_lib::geometry::Cone
Cone(Eigen::Vector3d origin_point, double angle, double height, Eigen::Vector3d orientation)mrs_lib::geometry::Cone
direction() constmrs_lib::geometry::Cone
getCap() constmrs_lib::geometry::Cone
h() constmrs_lib::geometry::Cone
origin() constmrs_lib::geometry::Cone
projectPoint(const Eigen::Vector3d &point) constmrs_lib::geometry::Cone
theta() constmrs_lib::geometry::Cone
~Cone()mrs_lib::geometry::Cone
+
+ + + + diff --git a/classmrs__lib_1_1geometry_1_1Cone.html b/classmrs__lib_1_1geometry_1_1Cone.html new file mode 100644 index 00000000..a3ec7c4b --- /dev/null +++ b/classmrs__lib_1_1geometry_1_1Cone.html @@ -0,0 +1,352 @@ + + + + + + + +mrs_lib: mrs_lib::geometry::Cone Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::geometry::Cone Class Reference
+
+
+ +

geometric representaiton of a cone + More...

+ +

#include <shapes.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

Cone ()
 constructor without setting the internal variables
 
~Cone ()
 destructor
 
 Cone (Eigen::Vector3d origin_point, double angle, double height, Eigen::Vector3d orientation)
 constructor from a given origin point (tip of the cone), angle, height and orientation More...
 
const Eigen::Vector3d origin () const
 getter for the tip point More...
 
const Eigen::Vector3d direction () const
 getter for the direction. Normalized direction from origin towards base More...
 
const Eigen::Vector3d center () const
 getter for the center point. Center point lies in half of the body height More...
 
double theta () const
 getter for angle between body height and body side More...
 
double h () const
 getter for body height More...
 
const Ellipse getCap () const
 getter for the cap of the cone More...
 
const std::optional< Eigen::Vector3d > projectPoint (const Eigen::Vector3d &point) const
 Project a 3D point orthogonally onto the Cone surface. More...
 
+

Detailed Description

+

geometric representaiton of a cone

+

Constructor & Destructor Documentation

+ +

◆ Cone()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::geometry::Cone::Cone (Eigen::Vector3d origin_point,
double angle,
double height,
Eigen::Vector3d orientation 
)
+
+ +

constructor from a given origin point (tip of the cone), angle, height and orientation

+
Parameters
+ + + + + +
origin_pointtip of the cone
angleangle between body height and side in radians
heightdistance between tip and base
orientationoffset from the default orientation. Default orientation is with body height aligned with Z axis, standing on the tip
+
+
+ +
+
+

Member Function Documentation

+ +

◆ center()

+ +
+
+ + + + + + + +
const Eigen::Vector3d mrs_lib::geometry::Cone::center () const
+
+ +

getter for the center point. Center point lies in half of the body height

+
Returns
vector3
+ +
+
+ +

◆ direction()

+ +
+
+ + + + + + + +
const Eigen::Vector3d mrs_lib::geometry::Cone::direction () const
+
+ +

getter for the direction. Normalized direction from origin towards base

+
Returns
vector3, normalized
+ +
+
+ +

◆ getCap()

+ +
+
+ + + + + + + +
const Ellipse mrs_lib::geometry::Cone::getCap () const
+
+ +

getter for the cap of the cone

+
Returns
ellipse representing the cap of the cone
+ +
+
+ +

◆ h()

+ +
+
+ + + + + + + +
double mrs_lib::geometry::Cone::h () const
+
+ +

getter for body height

+
Returns
+ +
+
+ +

◆ origin()

+ +
+
+ + + + + + + +
const Eigen::Vector3d mrs_lib::geometry::Cone::origin () const
+
+ +

getter for the tip point

+
Returns
vector3
+ +
+
+ +

◆ projectPoint()

+ +
+
+ + + + + + + + +
const std::optional< Eigen::Vector3d > mrs_lib::geometry::Cone::projectPoint (const Eigen::Vector3d & point) const
+
+ +

Project a 3D point orthogonally onto the Cone surface.

+
Parameters
+ + +
pointin 3D
+
+
+
Returns
projected point
+ +
+
+ +

◆ theta()

+ +
+
+ + + + + + + +
double mrs_lib::geometry::Cone::theta () const
+
+ +

getter for angle between body height and body side

+
Returns
angle in radians
+ +
+
+
The documentation for this class was generated from the following files:
    +
  • include/mrs_lib/geometry/shapes.h
  • +
  • src/geometry/shapes.cpp
  • +
+
+
+ + + + diff --git a/classmrs__lib_1_1geometry_1_1Cone.js b/classmrs__lib_1_1geometry_1_1Cone.js new file mode 100644 index 00000000..a0b72b5e --- /dev/null +++ b/classmrs__lib_1_1geometry_1_1Cone.js @@ -0,0 +1,13 @@ +var classmrs__lib_1_1geometry_1_1Cone = +[ + [ "Cone", "classmrs__lib_1_1geometry_1_1Cone.html#a27103a8552d930ae3a3a2513990d9399", null ], + [ "~Cone", "classmrs__lib_1_1geometry_1_1Cone.html#ae687be891abfb2db67245cd2c13f8586", null ], + [ "Cone", "classmrs__lib_1_1geometry_1_1Cone.html#a078bc613852240cbf2a0adb086d3d127", null ], + [ "center", "classmrs__lib_1_1geometry_1_1Cone.html#a2553c04b3dfef8dfceb938699e11f432", null ], + [ "direction", "classmrs__lib_1_1geometry_1_1Cone.html#aa973eb3025776015d9e542af7aea730f", null ], + [ "getCap", "classmrs__lib_1_1geometry_1_1Cone.html#a2e0546bb5ccb22ee88f1056dccc9a488", null ], + [ "h", "classmrs__lib_1_1geometry_1_1Cone.html#a319fa2045f6d56c94f3fa198bd7ae7fc", null ], + [ "origin", "classmrs__lib_1_1geometry_1_1Cone.html#a35b559777042218051ff46c3b7353232", null ], + [ "projectPoint", "classmrs__lib_1_1geometry_1_1Cone.html#a80223a2934d899aead407545c044e279", null ], + [ "theta", "classmrs__lib_1_1geometry_1_1Cone.html#a708721c0fde7cb53e7ba4e585a2d5743", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1geometry_1_1Cuboid-members.html b/classmrs__lib_1_1geometry_1_1Cuboid-members.html new file mode 100644 index 00000000..daa35390 --- /dev/null +++ b/classmrs__lib_1_1geometry_1_1Cuboid-members.html @@ -0,0 +1,113 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::geometry::Cuboid Member List
+
+
+ +

This is the complete list of members for mrs_lib::geometry::Cuboid, including all inherited members.

+ + + + + + + + + + +
center() constmrs_lib::geometry::Cuboid
Cuboid()mrs_lib::geometry::Cuboid
Cuboid(Eigen::Vector3d p0, Eigen::Vector3d p1, Eigen::Vector3d p2, Eigen::Vector3d p3, Eigen::Vector3d p4, Eigen::Vector3d p5, Eigen::Vector3d p6, Eigen::Vector3d p7)mrs_lib::geometry::Cuboid
Cuboid(std::vector< Eigen::Vector3d > points)mrs_lib::geometry::Cuboid
Cuboid(Eigen::Vector3d center, Eigen::Vector3d size, Eigen::Quaterniond orientation)mrs_lib::geometry::Cuboid
getRectangle(int face_idx) constmrs_lib::geometry::Cuboid
intersectionRay(Ray r, double epsilon=1e-4) constmrs_lib::geometry::Cuboid
vertices() constmrs_lib::geometry::Cuboid
~Cuboid()mrs_lib::geometry::Cuboid
+
+ + + + diff --git a/classmrs__lib_1_1geometry_1_1Cuboid.html b/classmrs__lib_1_1geometry_1_1Cuboid.html new file mode 100644 index 00000000..f2e5c3ad --- /dev/null +++ b/classmrs__lib_1_1geometry_1_1Cuboid.html @@ -0,0 +1,405 @@ + + + + + + + +mrs_lib: mrs_lib::geometry::Cuboid Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::geometry::Cuboid Class Reference
+
+
+ +

geometric representation of a cuboid + More...

+ +

#include <shapes.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

Cuboid ()
 constructor for initialization with all points set to [0,0,0]
 
~Cuboid ()
 virtual destructor
 
 Cuboid (Eigen::Vector3d p0, Eigen::Vector3d p1, Eigen::Vector3d p2, Eigen::Vector3d p3, Eigen::Vector3d p4, Eigen::Vector3d p5, Eigen::Vector3d p6, Eigen::Vector3d p7)
 constructor from six provided points (vector3) More...
 
 Cuboid (std::vector< Eigen::Vector3d > points)
 constructor from a std::vector of provided points More...
 
 Cuboid (Eigen::Vector3d center, Eigen::Vector3d size, Eigen::Quaterniond orientation)
 constructor from a provided center point, size and orientation More...
 
const std::vector< Eigen::Vector3d > vertices () const
 getter for all vertices (vector3) of this cuboid More...
 
const Eigen::Vector3d center () const
 getter for the center point More...
 
const Rectangle getRectangle (int face_idx) const
 getter for one side corresponding to a provided index More...
 
const std::vector< Eigen::Vector3d > intersectionRay (Ray r, double epsilon=1e-4) const
 calculate the intersection between this cuboid and a provided ray within a given tolerance. Can result in 0, 1 or 2 intersection points More...
 
+

Detailed Description

+

geometric representation of a cuboid

+

Constructor & Destructor Documentation

+ +

◆ Cuboid() [1/3]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::geometry::Cuboid::Cuboid (Eigen::Vector3d p0,
Eigen::Vector3d p1,
Eigen::Vector3d p2,
Eigen::Vector3d p3,
Eigen::Vector3d p4,
Eigen::Vector3d p5,
Eigen::Vector3d p6,
Eigen::Vector3d p7 
)
+
+ +

constructor from six provided points (vector3)

+
Parameters
+ + + + + + + + + +
p0vector3
p1vector3
p2vector3
p3vector3
p4vector3
p5vector3
p6vector3
p7vector3
+
+
+ +
+
+ +

◆ Cuboid() [2/3]

+ +
+
+ + + + + + + + +
mrs_lib::geometry::Cuboid::Cuboid (std::vector< Eigen::Vector3d > points)
+
+ +

constructor from a std::vector of provided points

+
Parameters
+ + +
pointsstd::vector<vector3>
+
+
+ +
+
+ +

◆ Cuboid() [3/3]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::geometry::Cuboid::Cuboid (Eigen::Vector3d center,
Eigen::Vector3d size,
Eigen::Quaterniond orientation 
)
+
+ +

constructor from a provided center point, size and orientation

+
Parameters
+ + + + +
centervector3
sizevector3
orientationquaternion
+
+
+ +
+
+

Member Function Documentation

+ +

◆ center()

+ +
+
+ + + + + + + +
const Eigen::Vector3d mrs_lib::geometry::Cuboid::center () const
+
+ +

getter for the center point

+
Returns
vector3
+ +
+
+ +

◆ getRectangle()

+ +
+
+ + + + + + + + +
const Rectangle mrs_lib::geometry::Cuboid::getRectangle (int face_idx) const
+
+ +

getter for one side corresponding to a provided index

+
Parameters
+ + +
face_idxindex of the side to lookup points for
+
+
+
Returns
rectangle representing the cuboid side
+ +
+
+ +

◆ intersectionRay()

+ +
+
+ + + + + + + + + + + + + + + + + + +
const std::vector< Eigen::Vector3d > mrs_lib::geometry::Cuboid::intersectionRay (Ray r,
double epsilon = 1e-4 
) const
+
+ +

calculate the intersection between this cuboid and a provided ray within a given tolerance. Can result in 0, 1 or 2 intersection points

+
Parameters
+ + + +
rray to check intersection with
epsilontolerance for the calculation
+
+
+
Returns
std::vector<vector3> list of intersection points (depending on the geometry, can yield 0, 1 or 2 points)
+ +
+
+ +

◆ vertices()

+ +
+
+ + + + + + + +
const std::vector< Eigen::Vector3d > mrs_lib::geometry::Cuboid::vertices () const
+
+ +

getter for all vertices (vector3) of this cuboid

+
Returns
std::vector<vector3>
+ +
+
+
The documentation for this class was generated from the following files:
    +
  • include/mrs_lib/geometry/shapes.h
  • +
  • src/geometry/shapes.cpp
  • +
+
+
+ + + + diff --git a/classmrs__lib_1_1geometry_1_1Cuboid.js b/classmrs__lib_1_1geometry_1_1Cuboid.js new file mode 100644 index 00000000..db59ce75 --- /dev/null +++ b/classmrs__lib_1_1geometry_1_1Cuboid.js @@ -0,0 +1,12 @@ +var classmrs__lib_1_1geometry_1_1Cuboid = +[ + [ "Cuboid", "classmrs__lib_1_1geometry_1_1Cuboid.html#a31a698a34b8443596be58a06f3046c79", null ], + [ "~Cuboid", "classmrs__lib_1_1geometry_1_1Cuboid.html#a5a78508d282bd8d273d97f3055ae0357", null ], + [ "Cuboid", "classmrs__lib_1_1geometry_1_1Cuboid.html#a1dfbd69913658cddfc2394d8cfed8215", null ], + [ "Cuboid", "classmrs__lib_1_1geometry_1_1Cuboid.html#adcacc925347e73dbfd81529842ff3c21", null ], + [ "Cuboid", "classmrs__lib_1_1geometry_1_1Cuboid.html#a34b3cc64de7244e0b3ac2f71cdb22d95", null ], + [ "center", "classmrs__lib_1_1geometry_1_1Cuboid.html#a7ce6626c7018bdae2722073490c1729f", null ], + [ "getRectangle", "classmrs__lib_1_1geometry_1_1Cuboid.html#a4279ad2916689b183e9647fbede9bcfb", null ], + [ "intersectionRay", "classmrs__lib_1_1geometry_1_1Cuboid.html#adfde2a501c9806bd6e6e99dcf0cac6ff", null ], + [ "vertices", "classmrs__lib_1_1geometry_1_1Cuboid.html#ae03413de879b1dd07df7a8f26b0a75f2", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1geometry_1_1Cylinder-members.html b/classmrs__lib_1_1geometry_1_1Cylinder-members.html new file mode 100644 index 00000000..afbd26d7 --- /dev/null +++ b/classmrs__lib_1_1geometry_1_1Cylinder-members.html @@ -0,0 +1,114 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::geometry::Cylinder Member List
+
+
+ +

This is the complete list of members for mrs_lib::geometry::Cylinder, including all inherited members.

+ + + + + + + + + + + +
BOTTOM enum value (defined in mrs_lib::geometry::Cylinder)mrs_lib::geometry::Cylinder
center() constmrs_lib::geometry::Cylinder
Cylinder()mrs_lib::geometry::Cylinder
Cylinder(Eigen::Vector3d center, double radius, double height, Eigen::Quaterniond orientation)mrs_lib::geometry::Cylinder
getCap(int index) constmrs_lib::geometry::Cylinder
h() constmrs_lib::geometry::Cylinder
orientation() constmrs_lib::geometry::Cylinder
r() constmrs_lib::geometry::Cylinder
TOP enum value (defined in mrs_lib::geometry::Cylinder)mrs_lib::geometry::Cylinder
~Cylinder()mrs_lib::geometry::Cylinder
+
+ + + + diff --git a/classmrs__lib_1_1geometry_1_1Cylinder.html b/classmrs__lib_1_1geometry_1_1Cylinder.html new file mode 100644 index 00000000..03601ed4 --- /dev/null +++ b/classmrs__lib_1_1geometry_1_1Cylinder.html @@ -0,0 +1,315 @@ + + + + + + + +mrs_lib: mrs_lib::geometry::Cylinder Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::geometry::Cylinder Class Reference
+
+
+ +

geometric representation of a cylinder + More...

+ +

#include <shapes.h>

+ + + + + +

+Public Types

enum  { BOTTOM = 0, +TOP = 1 + }
 cap indexing
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

Cylinder ()
 constructor without setting the internal variables
 
~Cylinder ()
 destructor
 
 Cylinder (Eigen::Vector3d center, double radius, double height, Eigen::Quaterniond orientation)
 constructor using a given center point, radius, height and orietnation More...
 
const Eigen::Vector3d center () const
 getter for the center point More...
 
const Eigen::Quaterniond orientation () const
 getter for the orientation More...
 
double r () const
 getter for cap radius More...
 
double h () const
 getter for the body height More...
 
const Ellipse getCap (int index) const
 getter for a cap corresponding to a provided index More...
 
+

Detailed Description

+

geometric representation of a cylinder

+

Constructor & Destructor Documentation

+ +

◆ Cylinder()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::geometry::Cylinder::Cylinder (Eigen::Vector3d center,
double radius,
double height,
Eigen::Quaterniond orientation 
)
+
+ +

constructor using a given center point, radius, height and orietnation

+
Parameters
+ + + + + +
centergeometric center in the middle of body height
radiusradius of the cap
heightdistance between caps
orientationquaternion
+
+
+ +
+
+

Member Function Documentation

+ +

◆ center()

+ +
+
+ + + + + + + +
const Eigen::Vector3d mrs_lib::geometry::Cylinder::center () const
+
+ +

getter for the center point

+
Returns
vector3
+ +
+
+ +

◆ getCap()

+ +
+
+ + + + + + + + +
const Ellipse mrs_lib::geometry::Cylinder::getCap (int index) const
+
+ +

getter for a cap corresponding to a provided index

+
Parameters
+ + +
indexof the cap
+
+
+
Returns
ellipse representing the cap
+ +
+
+ +

◆ h()

+ +
+
+ + + + + + + +
double mrs_lib::geometry::Cylinder::h () const
+
+ +

getter for the body height

+
Returns
body height
+ +
+
+ +

◆ orientation()

+ +
+
+ + + + + + + +
const Eigen::Quaterniond mrs_lib::geometry::Cylinder::orientation () const
+
+ +

getter for the orientation

+
Returns
quaternion
+ +
+
+ +

◆ r()

+ +
+
+ + + + + + + +
double mrs_lib::geometry::Cylinder::r () const
+
+ +

getter for cap radius

+
Returns
radius of the cap
+ +
+
+
The documentation for this class was generated from the following files:
    +
  • include/mrs_lib/geometry/shapes.h
  • +
  • src/geometry/shapes.cpp
  • +
+
+
+ + + + diff --git a/classmrs__lib_1_1geometry_1_1Cylinder.js b/classmrs__lib_1_1geometry_1_1Cylinder.js new file mode 100644 index 00000000..c9eca599 --- /dev/null +++ b/classmrs__lib_1_1geometry_1_1Cylinder.js @@ -0,0 +1,13 @@ +var classmrs__lib_1_1geometry_1_1Cylinder = +[ + [ "BOTTOM", "classmrs__lib_1_1geometry_1_1Cylinder.html#a5546b5ccb1073d1ced17e242137e9366a19aca8f1f4fd2193d246c741c6328aae", null ], + [ "TOP", "classmrs__lib_1_1geometry_1_1Cylinder.html#a5546b5ccb1073d1ced17e242137e9366abbf05c17c362c360fcdf14aa1cf61922", null ], + [ "Cylinder", "classmrs__lib_1_1geometry_1_1Cylinder.html#ae4b5f3500ae892f398ab88f5e545e0aa", null ], + [ "~Cylinder", "classmrs__lib_1_1geometry_1_1Cylinder.html#a9a558196740fd2be133a3c2df7173f4f", null ], + [ "Cylinder", "classmrs__lib_1_1geometry_1_1Cylinder.html#a868fdc0baa204d3bf78d614b532aa32e", null ], + [ "center", "classmrs__lib_1_1geometry_1_1Cylinder.html#a766270eba57b916335ad0901fec74355", null ], + [ "getCap", "classmrs__lib_1_1geometry_1_1Cylinder.html#a9730caea8c6bd44467038a8e04212fe6", null ], + [ "h", "classmrs__lib_1_1geometry_1_1Cylinder.html#a730fee04b106aa4ec3fe08be6bb90751", null ], + [ "orientation", "classmrs__lib_1_1geometry_1_1Cylinder.html#aa7eccea15c92f1df02fc48684bb4d219", null ], + [ "r", "classmrs__lib_1_1geometry_1_1Cylinder.html#aa442455784da2246f8bc25aa0eccadbb", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1geometry_1_1Ellipse-members.html b/classmrs__lib_1_1geometry_1_1Ellipse-members.html new file mode 100644 index 00000000..1e2a772b --- /dev/null +++ b/classmrs__lib_1_1geometry_1_1Ellipse-members.html @@ -0,0 +1,111 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::geometry::Ellipse Member List
+
+
+ +

This is the complete list of members for mrs_lib::geometry::Ellipse, including all inherited members.

+ + + + + + + + +
a() constmrs_lib::geometry::Ellipse
b() constmrs_lib::geometry::Ellipse
center() constmrs_lib::geometry::Ellipse
Ellipse()mrs_lib::geometry::Ellipse
Ellipse(Eigen::Vector3d center, Eigen::Quaterniond orientation, double a, double b)mrs_lib::geometry::Ellipse
orientation() constmrs_lib::geometry::Ellipse
~Ellipse()mrs_lib::geometry::Ellipse
+
+ + + + diff --git a/classmrs__lib_1_1geometry_1_1Ellipse.html b/classmrs__lib_1_1geometry_1_1Ellipse.html new file mode 100644 index 00000000..80d004f2 --- /dev/null +++ b/classmrs__lib_1_1geometry_1_1Ellipse.html @@ -0,0 +1,276 @@ + + + + + + + +mrs_lib: mrs_lib::geometry::Ellipse Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::geometry::Ellipse Class Reference
+
+
+ +

geometric representation of an ellipse + More...

+ +

#include <shapes.h>

+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

Ellipse ()
 constructor for initialization without setting internal variables
 
~Ellipse ()
 destructor
 
 Ellipse (Eigen::Vector3d center, Eigen::Quaterniond orientation, double a, double b)
 constructor using a provided center point, orientation, major semi-axis length and minor semi-axis length More...
 
double a () const
 getter for major semi-axis More...
 
double b () const
 getter for minor semi-axis More...
 
const Eigen::Vector3d center () const
 getter for the center point More...
 
const Eigen::Quaterniond orientation () const
 getter for the orientation More...
 
+

Detailed Description

+

geometric representation of an ellipse

+

Constructor & Destructor Documentation

+ +

◆ Ellipse()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::geometry::Ellipse::Ellipse (Eigen::Vector3d center,
Eigen::Quaterniond orientation,
double a,
double b 
)
+
+ +

constructor using a provided center point, orientation, major semi-axis length and minor semi-axis length

+
Parameters
+ + + + + +
centervector3
orientationquaternion
amajor semi-axis length
bminor semi-axis length
+
+
+ +
+
+

Member Function Documentation

+ +

◆ a()

+ +
+
+ + + + + + + +
double mrs_lib::geometry::Ellipse::a () const
+
+ +

getter for major semi-axis

+
Returns
length of major semi-axis
+ +
+
+ +

◆ b()

+ +
+
+ + + + + + + +
double mrs_lib::geometry::Ellipse::b () const
+
+ +

getter for minor semi-axis

+
Returns
length of minor semi-axis
+ +
+
+ +

◆ center()

+ +
+
+ + + + + + + +
const Eigen::Vector3d mrs_lib::geometry::Ellipse::center () const
+
+ +

getter for the center point

+
Returns
vector3
+ +
+
+ +

◆ orientation()

+ +
+
+ + + + + + + +
const Eigen::Quaterniond mrs_lib::geometry::Ellipse::orientation () const
+
+ +

getter for the orientation

+
Returns
quaternion
+ +
+
+
The documentation for this class was generated from the following files:
    +
  • include/mrs_lib/geometry/shapes.h
  • +
  • src/geometry/shapes.cpp
  • +
+
+
+ + + + diff --git a/classmrs__lib_1_1geometry_1_1Ellipse.js b/classmrs__lib_1_1geometry_1_1Ellipse.js new file mode 100644 index 00000000..cf01bda4 --- /dev/null +++ b/classmrs__lib_1_1geometry_1_1Ellipse.js @@ -0,0 +1,10 @@ +var classmrs__lib_1_1geometry_1_1Ellipse = +[ + [ "Ellipse", "classmrs__lib_1_1geometry_1_1Ellipse.html#ab891e8f86df11bb34f0571ebeb136c2a", null ], + [ "~Ellipse", "classmrs__lib_1_1geometry_1_1Ellipse.html#a973caa18f7b0c2e41b263a4267914650", null ], + [ "Ellipse", "classmrs__lib_1_1geometry_1_1Ellipse.html#ad64c67ccd7e0c21b5698a6791adf6831", null ], + [ "a", "classmrs__lib_1_1geometry_1_1Ellipse.html#aee622887a91b50f8fa8bbd476614006e", null ], + [ "b", "classmrs__lib_1_1geometry_1_1Ellipse.html#ab42e4c580aeda44204c5854e1ccd4513", null ], + [ "center", "classmrs__lib_1_1geometry_1_1Ellipse.html#a058c83435e1cf0f393c1bde54e94f570", null ], + [ "orientation", "classmrs__lib_1_1geometry_1_1Ellipse.html#a65f59ca228eea37a914ce0d6d6695b2d", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1geometry_1_1Ray-members.html b/classmrs__lib_1_1geometry_1_1Ray-members.html new file mode 100644 index 00000000..4e6f69ee --- /dev/null +++ b/classmrs__lib_1_1geometry_1_1Ray-members.html @@ -0,0 +1,112 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::geometry::Ray Member List
+
+
+ +

This is the complete list of members for mrs_lib::geometry::Ray, including all inherited members.

+ + + + + + + + + +
direction() constmrs_lib::geometry::Ray
directionCast(Eigen::Vector3d origin, Eigen::Vector3d direction)mrs_lib::geometry::Raystatic
p1() constmrs_lib::geometry::Ray
p2() constmrs_lib::geometry::Ray
Ray()mrs_lib::geometry::Ray
Ray(Eigen::Vector3d p1, Eigen::Vector3d p2)mrs_lib::geometry::Ray
twopointCast(Eigen::Vector3d pointFrom, Eigen::Vector3d pointTo)mrs_lib::geometry::Raystatic
~Ray()mrs_lib::geometry::Ray
+
+ + + + diff --git a/classmrs__lib_1_1geometry_1_1Ray.html b/classmrs__lib_1_1geometry_1_1Ray.html new file mode 100644 index 00000000..37239095 --- /dev/null +++ b/classmrs__lib_1_1geometry_1_1Ray.html @@ -0,0 +1,341 @@ + + + + + + + +mrs_lib: mrs_lib::geometry::Ray Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::geometry::Ray Class Reference
+
+
+ +

geometric representation of a ray. Instantiate it by two input Vector3. Use static methods for from-to raycast, or a point-direction raycast. + More...

+ +

#include <shapes.h>

+ + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

Ray ()
 constructor without initialization of internal variables
 
~Ray ()
 destructor
 
 Ray (Eigen::Vector3d p1, Eigen::Vector3d p2)
 default constructor More...
 
const Eigen::Vector3d p1 () const
 get the origin point More...
 
const Eigen::Vector3d p2 () const
 get the end point More...
 
const Eigen::Vector3d direction () const
 get the direction of ray (normalized) More...
 
+ + + + + + + +

+Static Public Member Functions

static Ray twopointCast (Eigen::Vector3d pointFrom, Eigen::Vector3d pointTo)
 static method for generating new rays by raycasting from-to More...
 
static Ray directionCast (Eigen::Vector3d origin, Eigen::Vector3d direction)
 static method for generating new rays by raycasting origin-direction More...
 
+

Detailed Description

+

geometric representation of a ray. Instantiate it by two input Vector3. Use static methods for from-to raycast, or a point-direction raycast.

+

Constructor & Destructor Documentation

+ +

◆ Ray()

+ +
+
+ + + + + + + + + + + + + + + + + + +
mrs_lib::geometry::Ray::Ray (Eigen::Vector3d p1,
Eigen::Vector3d p2 
)
+
+ +

default constructor

+
Parameters
+ + + +
p1origin of the ray
p2endpoint of the ray
+
+
+ +
+
+

Member Function Documentation

+ +

◆ direction()

+ +
+
+ + + + + + + +
const Eigen::Vector3d mrs_lib::geometry::Ray::direction () const
+
+ +

get the direction of ray (normalized)

+
Returns
direction (normalized)
+ +
+
+ +

◆ directionCast()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Ray mrs_lib::geometry::Ray::directionCast (Eigen::Vector3d origin,
Eigen::Vector3d direction 
)
+
+static
+
+ +

static method for generating new rays by raycasting origin-direction

+
Parameters
+ + + +
originorigin of the ray
directionof the ray
+
+
+
Returns
new Ray instance created by raycasting
+ +
+
+ +

◆ p1()

+ +
+
+ + + + + + + +
const Eigen::Vector3d mrs_lib::geometry::Ray::p1 () const
+
+ +

get the origin point

+
Returns
ray origin point
+ +
+
+ +

◆ p2()

+ +
+
+ + + + + + + +
const Eigen::Vector3d mrs_lib::geometry::Ray::p2 () const
+
+ +

get the end point

+
Returns
ray end point
+ +
+
+ +

◆ twopointCast()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Ray mrs_lib::geometry::Ray::twopointCast (Eigen::Vector3d pointFrom,
Eigen::Vector3d pointTo 
)
+
+static
+
+ +

static method for generating new rays by raycasting from-to

+
Parameters
+ + + +
pointFromorigin of the ray
pointToendpoint of the ray
+
+
+
Returns
new Ray instance created by raycasting
+ +
+
+
The documentation for this class was generated from the following files:
    +
  • include/mrs_lib/geometry/shapes.h
  • +
  • src/geometry/shapes.cpp
  • +
+
+
+ + + + diff --git a/classmrs__lib_1_1geometry_1_1Ray.js b/classmrs__lib_1_1geometry_1_1Ray.js new file mode 100644 index 00000000..27db87bf --- /dev/null +++ b/classmrs__lib_1_1geometry_1_1Ray.js @@ -0,0 +1,9 @@ +var classmrs__lib_1_1geometry_1_1Ray = +[ + [ "Ray", "classmrs__lib_1_1geometry_1_1Ray.html#aa0bff9427d14806607b5689f1d71604d", null ], + [ "~Ray", "classmrs__lib_1_1geometry_1_1Ray.html#ad79e6fdb9416510694f14fd92ca41c7a", null ], + [ "Ray", "classmrs__lib_1_1geometry_1_1Ray.html#ab7466369083c82552f805fb20a16a8aa", null ], + [ "direction", "classmrs__lib_1_1geometry_1_1Ray.html#a01b7ff2bb88b61c178f4991c8cd847bf", null ], + [ "p1", "classmrs__lib_1_1geometry_1_1Ray.html#a8591c6b82a120832a7ed349fbd90163a", null ], + [ "p2", "classmrs__lib_1_1geometry_1_1Ray.html#a7c830a43aa9550ef6d7b798dcb69f3f5", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1geometry_1_1Rectangle-members.html b/classmrs__lib_1_1geometry_1_1Rectangle-members.html new file mode 100644 index 00000000..f2045511 --- /dev/null +++ b/classmrs__lib_1_1geometry_1_1Rectangle-members.html @@ -0,0 +1,119 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::geometry::Rectangle Member List
+
+
+ +

This is the complete list of members for mrs_lib::geometry::Rectangle, including all inherited members.

+ + + + + + + + + + + + + + + + +
a() constmrs_lib::geometry::Rectangle
b() constmrs_lib::geometry::Rectangle
c() constmrs_lib::geometry::Rectangle
center() constmrs_lib::geometry::Rectangle
d() constmrs_lib::geometry::Rectangle
intersectionRay(Ray r, double epsilon=1e-4) constmrs_lib::geometry::Rectangle
isFacing(Eigen::Vector3d point) constmrs_lib::geometry::Rectangle
normal() constmrs_lib::geometry::Rectangle
Rectangle()mrs_lib::geometry::Rectangle
Rectangle(std::vector< Eigen::Vector3d > points)mrs_lib::geometry::Rectangle
Rectangle(Eigen::Vector3d a, Eigen::Vector3d b, Eigen::Vector3d c, Eigen::Vector3d d)mrs_lib::geometry::Rectangle
solidAngleRelativeTo(Eigen::Vector3d point) constmrs_lib::geometry::Rectangle
triangles() constmrs_lib::geometry::Rectangle
vertices() constmrs_lib::geometry::Rectangle
~Rectangle()mrs_lib::geometry::Rectangle
+
+ + + + diff --git a/classmrs__lib_1_1geometry_1_1Rectangle.html b/classmrs__lib_1_1geometry_1_1Rectangle.html new file mode 100644 index 00000000..3db2197b --- /dev/null +++ b/classmrs__lib_1_1geometry_1_1Rectangle.html @@ -0,0 +1,498 @@ + + + + + + + +mrs_lib: mrs_lib::geometry::Rectangle Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::geometry::Rectangle Class Reference
+
+
+ +

geometric representation of a rectangle (can represent any quadrilateral) + More...

+ +

#include <shapes.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

Rectangle ()
 constructor for initialization with points set to [0,0,0], [1,0,0], [1,1,0] and [0,1,0]
 
~Rectangle ()
 destructor
 
 Rectangle (std::vector< Eigen::Vector3d > points)
 constructor using a std::vector of points (vector3). Provide points in a counter-clockwise order for correct behavior More...
 
 Rectangle (Eigen::Vector3d a, Eigen::Vector3d b, Eigen::Vector3d c, Eigen::Vector3d d)
 constructor using four points (vector3). Provide points in a counter-clockwise order for correct behavior More...
 
const Eigen::Vector3d a () const
 getter for first point More...
 
const Eigen::Vector3d b () const
 getter for the second point More...
 
const Eigen::Vector3d c () const
 getter for the third point More...
 
const Eigen::Vector3d d () const
 getter for the fourth point More...
 
const Eigen::Vector3d center () const
 getter for center point More...
 
const Eigen::Vector3d normal () const
 getter for the normal vector. It originates in the center of the Rectangle, length is normalized, orientation follows the right-hand rule, assuiming the points are provided in counter-clockwise order More...
 
const std::vector< Eigen::Vector3d > vertices () const
 getter for all the points of this rectangle provided as std::vector More...
 
const std::vector< Triangletriangles () const
 getter for the triangles forming this rectangle More...
 
const boost::optional< Eigen::Vector3d > intersectionRay (Ray r, double epsilon=1e-4) const
 calculate an intersection of this rectangle with a given ray with given tolerance More...
 
bool isFacing (Eigen::Vector3d point) const
 check if the normal is facing a given point, i.e. if the point lies in the same half-space as the rectangle normal More...
 
double solidAngleRelativeTo (Eigen::Vector3d point) const
 compute the solid angle of this rectangle relative to a given sphere center More...
 
+

Detailed Description

+

geometric representation of a rectangle (can represent any quadrilateral)

+

Constructor & Destructor Documentation

+ +

◆ Rectangle() [1/2]

+ +
+
+ + + + + + + + +
mrs_lib::geometry::Rectangle::Rectangle (std::vector< Eigen::Vector3d > points)
+
+ +

constructor using a std::vector of points (vector3). Provide points in a counter-clockwise order for correct behavior

+
Parameters
+ + +
pointsstd::vector of points in 3d
+
+
+ +
+
+ +

◆ Rectangle() [2/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::geometry::Rectangle::Rectangle (Eigen::Vector3d a,
Eigen::Vector3d b,
Eigen::Vector3d c,
Eigen::Vector3d d 
)
+
+ +

constructor using four points (vector3). Provide points in a counter-clockwise order for correct behavior

+
Parameters
+ + + + + +
a
b
c
d
+
+
+ +
+
+

Member Function Documentation

+ +

◆ a()

+ +
+
+ + + + + + + +
const Eigen::Vector3d mrs_lib::geometry::Rectangle::a () const
+
+ +

getter for first point

+
Returns
1st point (vector3)
+ +
+
+ +

◆ b()

+ +
+
+ + + + + + + +
const Eigen::Vector3d mrs_lib::geometry::Rectangle::b () const
+
+ +

getter for the second point

+
Returns
2nd point (vector3)
+ +
+
+ +

◆ c()

+ +
+
+ + + + + + + +
const Eigen::Vector3d mrs_lib::geometry::Rectangle::c () const
+
+ +

getter for the third point

+
Returns
3rd point (vector3)
+ +
+
+ +

◆ center()

+ +
+
+ + + + + + + +
const Eigen::Vector3d mrs_lib::geometry::Rectangle::center () const
+
+ +

getter for center point

+
Returns
center point (vector3)
+ +
+
+ +

◆ d()

+ +
+
+ + + + + + + +
const Eigen::Vector3d mrs_lib::geometry::Rectangle::d () const
+
+ +

getter for the fourth point

+
Returns
4th point (vector3)
+ +
+
+ +

◆ intersectionRay()

+ +
+
+ + + + + + + + + + + + + + + + + + +
const boost::optional< Eigen::Vector3d > mrs_lib::geometry::Rectangle::intersectionRay (Ray r,
double epsilon = 1e-4 
) const
+
+ +

calculate an intersection of this rectangle with a given ray with given tolerance

+
Parameters
+ + + +
rray to calculate intersection with
epsiloncalculation tolerance
+
+
+
Returns
vector3 intersection if exists, boost::none if no intersection is found
+ +
+
+ +

◆ isFacing()

+ +
+
+ + + + + + + + +
bool mrs_lib::geometry::Rectangle::isFacing (Eigen::Vector3d point) const
+
+ +

check if the normal is facing a given point, i.e. if the point lies in the same half-space as the rectangle normal

+
Parameters
+ + +
pointvector3 to check against
+
+
+
Returns
true if the normal is facing given point. Returns false for angle >= 90 degrees
+ +
+
+ +

◆ normal()

+ +
+
+ + + + + + + +
const Eigen::Vector3d mrs_lib::geometry::Rectangle::normal () const
+
+ +

getter for the normal vector. It originates in the center of the Rectangle, length is normalized, orientation follows the right-hand rule, assuiming the points are provided in counter-clockwise order

+
Returns
normal vector3
+ +
+
+ +

◆ solidAngleRelativeTo()

+ +
+
+ + + + + + + + +
double mrs_lib::geometry::Rectangle::solidAngleRelativeTo (Eigen::Vector3d point) const
+
+ +

compute the solid angle of this rectangle relative to a given sphere center

+
Parameters
+ + +
pointcenter of a sphere to compute the solid angle for
+
+
+
Returns
solid angle in steradians
+ +
+
+ +

◆ triangles()

+ +
+
+ + + + + + + +
const std::vector< Triangle > mrs_lib::geometry::Rectangle::triangles () const
+
+ +

getter for the triangles forming this rectangle

+
Returns
std::vector of triangles
+ +
+
+ +

◆ vertices()

+ +
+
+ + + + + + + +
const std::vector< Eigen::Vector3d > mrs_lib::geometry::Rectangle::vertices () const
+
+ +

getter for all the points of this rectangle provided as std::vector

+
Returns
std::vector of points (vector3)
+ +
+
+
The documentation for this class was generated from the following files:
    +
  • include/mrs_lib/geometry/shapes.h
  • +
  • src/geometry/shapes.cpp
  • +
+
+
+ + + + diff --git a/classmrs__lib_1_1geometry_1_1Rectangle.js b/classmrs__lib_1_1geometry_1_1Rectangle.js new file mode 100644 index 00000000..20d66be7 --- /dev/null +++ b/classmrs__lib_1_1geometry_1_1Rectangle.js @@ -0,0 +1,18 @@ +var classmrs__lib_1_1geometry_1_1Rectangle = +[ + [ "Rectangle", "classmrs__lib_1_1geometry_1_1Rectangle.html#af119a484beb0dbae7dd0a9a2d5f5123d", null ], + [ "~Rectangle", "classmrs__lib_1_1geometry_1_1Rectangle.html#a66d9286f92d6f8ea5c7ebc7400cb29be", null ], + [ "Rectangle", "classmrs__lib_1_1geometry_1_1Rectangle.html#a3b85d8ba9c03a1b2962eda68293da077", null ], + [ "Rectangle", "classmrs__lib_1_1geometry_1_1Rectangle.html#a707a6df742b90d626e5321a4324d75fd", null ], + [ "a", "classmrs__lib_1_1geometry_1_1Rectangle.html#a5370711517c0449167cfd0efaee8e821", null ], + [ "b", "classmrs__lib_1_1geometry_1_1Rectangle.html#a82cb0598bd97e772d5fdbeeb5fde3657", null ], + [ "c", "classmrs__lib_1_1geometry_1_1Rectangle.html#a9cd35540a57a2b0663a2a4b360e02d8c", null ], + [ "center", "classmrs__lib_1_1geometry_1_1Rectangle.html#ab541a2748c4876234b4af0f3c220fb2d", null ], + [ "d", "classmrs__lib_1_1geometry_1_1Rectangle.html#aec6ae68b84c5a24580068fbc70a9452d", null ], + [ "intersectionRay", "classmrs__lib_1_1geometry_1_1Rectangle.html#a0b92252c39c755b3a7cba989fbb5c854", null ], + [ "isFacing", "classmrs__lib_1_1geometry_1_1Rectangle.html#a62a1b7d39bd141d4c38d8079d43ffe02", null ], + [ "normal", "classmrs__lib_1_1geometry_1_1Rectangle.html#a5cf41dfd6e82f02c8bcc18bc134d235b", null ], + [ "solidAngleRelativeTo", "classmrs__lib_1_1geometry_1_1Rectangle.html#a803dbb3eb6f8a24146bd4c01877769ce", null ], + [ "triangles", "classmrs__lib_1_1geometry_1_1Rectangle.html#a4f2e1bce541675c91179b723aa4f9176", null ], + [ "vertices", "classmrs__lib_1_1geometry_1_1Rectangle.html#a05fbbe3a262e09d5834431bc31f2648b", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1geometry_1_1Triangle-members.html b/classmrs__lib_1_1geometry_1_1Triangle-members.html new file mode 100644 index 00000000..85c2d158 --- /dev/null +++ b/classmrs__lib_1_1geometry_1_1Triangle-members.html @@ -0,0 +1,114 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::geometry::Triangle Member List
+
+
+ +

This is the complete list of members for mrs_lib::geometry::Triangle, including all inherited members.

+ + + + + + + + + + + +
a() constmrs_lib::geometry::Triangle
b() constmrs_lib::geometry::Triangle
c() constmrs_lib::geometry::Triangle
center() constmrs_lib::geometry::Triangle
intersectionRay(Ray r, double epsilon=1e-4) constmrs_lib::geometry::Triangle
normal() constmrs_lib::geometry::Triangle
Triangle()mrs_lib::geometry::Triangle
Triangle(Eigen::Vector3d a, Eigen::Vector3d b, Eigen::Vector3d c)mrs_lib::geometry::Triangle
vertices() constmrs_lib::geometry::Triangle
~Triangle()mrs_lib::geometry::Triangle
+
+ + + + diff --git a/classmrs__lib_1_1geometry_1_1Triangle.html b/classmrs__lib_1_1geometry_1_1Triangle.html new file mode 100644 index 00000000..6d97953c --- /dev/null +++ b/classmrs__lib_1_1geometry_1_1Triangle.html @@ -0,0 +1,356 @@ + + + + + + + +mrs_lib: mrs_lib::geometry::Triangle Class Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::geometry::Triangle Class Reference
+
+
+ +

geometric representation of a triangle. Instantiate a new triangle by providing three vertices + More...

+ +

#include <shapes.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

Triangle ()
 constructor for initialization with default values (points [0,0,0], [1,0,0] and [0,0,1]
 
~Triangle ()
 destructor
 
 Triangle (Eigen::Vector3d a, Eigen::Vector3d b, Eigen::Vector3d c)
 default constructor for creating a new triangle from given vertices More...
 
const Eigen::Vector3d a () const
 getter for first point More...
 
const Eigen::Vector3d b () const
 getter for second point More...
 
const Eigen::Vector3d c () const
 getter for third point More...
 
const Eigen::Vector3d center () const
 get position on the triangle center More...
 
const Eigen::Vector3d normal () const
 get normal vector of this triangle. The vector origin is placed at triangle center, length is normalized and direction follows the right-hand rule with respect to vertex order a-b-c More...
 
const std::vector< Eigen::Vector3d > vertices () const
 get a vector of all vertices More...
 
const boost::optional< Eigen::Vector3d > intersectionRay (Ray r, double epsilon=1e-4) const
 calculate an intersection of this triangle with a given ray with given tolerance More...
 
+

Detailed Description

+

geometric representation of a triangle. Instantiate a new triangle by providing three vertices

+

Constructor & Destructor Documentation

+ +

◆ Triangle()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::geometry::Triangle::Triangle (Eigen::Vector3d a,
Eigen::Vector3d b,
Eigen::Vector3d c 
)
+
+ +

default constructor for creating a new triangle from given vertices

+
Parameters
+ + + + +
a
b
c
+
+
+ +
+
+

Member Function Documentation

+ +

◆ a()

+ +
+
+ + + + + + + +
const Eigen::Vector3d mrs_lib::geometry::Triangle::a () const
+
+ +

getter for first point

+
Returns
1st point (vector3)
+ +
+
+ +

◆ b()

+ +
+
+ + + + + + + +
const Eigen::Vector3d mrs_lib::geometry::Triangle::b () const
+
+ +

getter for second point

+
Returns
2nd point (vector3)
+ +
+
+ +

◆ c()

+ +
+
+ + + + + + + +
const Eigen::Vector3d mrs_lib::geometry::Triangle::c () const
+
+ +

getter for third point

+
Returns
3rd point (vector3)
+ +
+
+ +

◆ center()

+ +
+
+ + + + + + + +
const Eigen::Vector3d mrs_lib::geometry::Triangle::center () const
+
+ +

get position on the triangle center

+
Returns
vector3
+ +
+
+ +

◆ intersectionRay()

+ +
+
+ + + + + + + + + + + + + + + + + + +
const boost::optional< Eigen::Vector3d > mrs_lib::geometry::Triangle::intersectionRay (Ray r,
double epsilon = 1e-4 
) const
+
+ +

calculate an intersection of this triangle with a given ray with given tolerance

+
Parameters
+ + + +
rray to calculate intersection with
epsiloncalculation tolerance
+
+
+
Returns
vector3 intersection if exists, boost::none if no intersection is found
+ +
+
+ +

◆ normal()

+ +
+
+ + + + + + + +
const Eigen::Vector3d mrs_lib::geometry::Triangle::normal () const
+
+ +

get normal vector of this triangle. The vector origin is placed at triangle center, length is normalized and direction follows the right-hand rule with respect to vertex order a-b-c

+
Returns
vector3
+ +
+
+ +

◆ vertices()

+ +
+
+ + + + + + + +
const std::vector< Eigen::Vector3d > mrs_lib::geometry::Triangle::vertices () const
+
+ +

get a vector of all vertices

+
Returns
std::vector<vector3>
+ +
+
+
The documentation for this class was generated from the following files:
    +
  • include/mrs_lib/geometry/shapes.h
  • +
  • src/geometry/shapes.cpp
  • +
+
+
+ + + + diff --git a/classmrs__lib_1_1geometry_1_1Triangle.js b/classmrs__lib_1_1geometry_1_1Triangle.js new file mode 100644 index 00000000..712c47c1 --- /dev/null +++ b/classmrs__lib_1_1geometry_1_1Triangle.js @@ -0,0 +1,13 @@ +var classmrs__lib_1_1geometry_1_1Triangle = +[ + [ "Triangle", "classmrs__lib_1_1geometry_1_1Triangle.html#a14203384b0eb6d3a7ff01330ab24f679", null ], + [ "~Triangle", "classmrs__lib_1_1geometry_1_1Triangle.html#ad5cc0e9eb09f9f4900f94fa1908b60f3", null ], + [ "Triangle", "classmrs__lib_1_1geometry_1_1Triangle.html#af765e8be7fef5ae4cfb972ec51c4a6e8", null ], + [ "a", "classmrs__lib_1_1geometry_1_1Triangle.html#abd847d705725f4dffa10e6e00ba5f24c", null ], + [ "b", "classmrs__lib_1_1geometry_1_1Triangle.html#a6ac4e01a62fbb343d177bf47b3d38219", null ], + [ "c", "classmrs__lib_1_1geometry_1_1Triangle.html#aff6f8fb09fb5e7d4ebf2116142b85638", null ], + [ "center", "classmrs__lib_1_1geometry_1_1Triangle.html#a419f55d2c47dac6035495004fec746c9", null ], + [ "intersectionRay", "classmrs__lib_1_1geometry_1_1Triangle.html#a94238065a0e8d0c27135f55e1daa4ed3", null ], + [ "normal", "classmrs__lib_1_1geometry_1_1Triangle.html#ac9b355e443d37f91d83ab76bbfa35aa6", null ], + [ "vertices", "classmrs__lib_1_1geometry_1_1Triangle.html#ad873b5c4ba04613f24dd12348f898487", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1varstepLKF-members.html b/classmrs__lib_1_1varstepLKF-members.html new file mode 100644 index 00000000..cb0d11be --- /dev/null +++ b/classmrs__lib_1_1varstepLKF-members.html @@ -0,0 +1,138 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib::varstepLKF< n_states, n_inputs, n_measurements > Member List
+
+
+ +

This is the complete list of members for mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Amrs_lib::LKF< n_states, n_inputs, n_measurements >
A_t typedef (defined in mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >)mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >
Bmrs_lib::LKF< n_states, n_inputs, n_measurements >
B_t typedef (defined in mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >)mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >
Base_class typedef (defined in mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >)mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >
computeKalmanGain(const statecov_t &sc, [[maybe_unused]] const z_t &z, const R_t &R, const H_t &H) const (defined in mrs_lib::LKF< n_states, n_inputs, n_measurements >)mrs_lib::LKF< n_states, n_inputs, n_measurements >inlineprotectedvirtual
correct(const statecov_t &sc, const z_t &z, const R_t &R) const overridemrs_lib::LKF< n_states, n_inputs, n_measurements >inlinevirtual
mrs_lib::KalmanFilter::correct(const statecov_t &sc, const z_t &z, const R_t &R) const =0mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >pure virtual
correction_impl(const statecov_t &sc, const z_t &z, const R_t &R, const H_t &H) const (defined in mrs_lib::LKF< n_states, n_inputs, n_measurements >)mrs_lib::LKF< n_states, n_inputs, n_measurements >inlineprotected
covariance_predict(const A_t &A, const P_t &P, const Q_t &Q, const double dt) (defined in mrs_lib::LKF< n_states, n_inputs, n_measurements >)mrs_lib::LKF< n_states, n_inputs, n_measurements >inlineprotectedstatic
generateA_t typedef (defined in mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >)mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >
generateB_t typedef (defined in mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >)mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >
Hmrs_lib::LKF< n_states, n_inputs, n_measurements >
H_t typedef (defined in mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >)mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >
invert_W(R_t W) (defined in mrs_lib::LKF< n_states, n_inputs, n_measurements >)mrs_lib::LKF< n_states, n_inputs, n_measurements >inlineprotectedstatic
K_t typedefmrs_lib::LKF< n_states, n_inputs, n_measurements >
LKF()mrs_lib::LKF< n_states, n_inputs, n_measurements >inline
LKF(const A_t &A, const B_t &B, const H_t &H)mrs_lib::LKF< n_states, n_inputs, n_measurements >inline
m (defined in mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >)mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >static
n (defined in mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >)mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >static
p (defined in mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >)mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >static
P_t typedef (defined in mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >)mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >
predict(const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const overridemrs_lib::varstepLKF< n_states, n_inputs, n_measurements >inlinevirtual
mrs_lib::LKF::predict(const statecov_t &sc, const u_t &u, const Q_t &Q, [[maybe_unused]] double dt) const overridemrs_lib::LKF< n_states, n_inputs, n_measurements >inlinevirtual
mrs_lib::KalmanFilter::predict(const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const =0mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >pure virtual
Q_t typedef (defined in mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >)mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >
R_t typedef (defined in mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >)mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >
state_predict(const A_t &A, const x_t &x, [[maybe_unused]] const B_t &B, [[maybe_unused]] const u_t &u) (defined in mrs_lib::LKF< n_states, n_inputs, n_measurements >)mrs_lib::LKF< n_states, n_inputs, n_measurements >inlineprotectedstatic
state_predict(const A_t &A, const x_t &x, const B_t &B, const u_t &u) (defined in mrs_lib::LKF< n_states, n_inputs, n_measurements >)mrs_lib::LKF< n_states, n_inputs, n_measurements >inlineprotectedstatic
statecov_t typedef (defined in mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >)mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >
u_t typedef (defined in mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >)mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >
varstepLKF(const generateA_t &generateA, const generateB_t &generateB, const H_t &H)mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >inline
x_t typedef (defined in mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >)mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >
z_t typedef (defined in mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >)mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >
+
+ + + + diff --git a/classmrs__lib_1_1varstepLKF.html b/classmrs__lib_1_1varstepLKF.html new file mode 100644 index 00000000..4ef0ce80 --- /dev/null +++ b/classmrs__lib_1_1varstepLKF.html @@ -0,0 +1,476 @@ + + + + + + + +mrs_lib: mrs_lib::varstepLKF< n_states, n_inputs, n_measurements > Class Template Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
mrs_lib::varstepLKF< n_states, n_inputs, n_measurements > Class Template Reference
+
+
+
+ + Inheritance diagram for mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >:
+
+
+ +
+ + Collaboration diagram for mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >:
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Types

+using Base_class = LKF< n, m, p >
 
+using x_t = typename Base_class::x_t
 
+using u_t = typename Base_class::u_t
 
+using z_t = typename Base_class::z_t
 
+using P_t = typename Base_class::P_t
 
+using R_t = typename Base_class::R_t
 
+using statecov_t = typename Base_class::statecov_t
 
+using A_t = typename Base_class::A_t
 
+using B_t = typename Base_class::B_t
 
+using H_t = typename Base_class::H_t
 
+using Q_t = typename Base_class::Q_t
 
+using generateA_t = std::function< A_t(double)>
 
+using generateB_t = std::function< B_t(double)>
 
- Public Types inherited from mrs_lib::LKF< n_states, n_inputs, n_measurements >
+using Base_class = KalmanFilter< n, m, p >
 Base class of this class.
 
+using x_t = typename Base_class::x_t
 State vector type $n \times 1$.
 
+using u_t = typename Base_class::u_t
 Input vector type $m \times 1$.
 
+using z_t = typename Base_class::z_t
 Measurement vector type $p \times 1$.
 
+using P_t = typename Base_class::P_t
 State uncertainty covariance matrix type $n \times n$.
 
+using R_t = typename Base_class::R_t
 Measurement noise covariance matrix type $p \times p$.
 
+using Q_t = typename Base_class::Q_t
 Process noise covariance matrix type $n \times n$.
 
+using statecov_t = typename Base_class::statecov_t
 Helper struct for passing around the state and its covariance in one variable.
 
+typedef Eigen::Matrix< double, n, nA_t
 System transition matrix type $n \times n$.
 
+typedef Eigen::Matrix< double, n, mB_t
 Input to state mapping matrix type $n \times m$.
 
+typedef Eigen::Matrix< double, p, nH_t
 State to measurement mapping matrix type $p \times n$.
 
+typedef Eigen::Matrix< double, n, pK_t
 Kalman gain matrix type $n \times p$.
 
- Public Types inherited from mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >
+typedef Eigen::Matrix< double, n, 1 > x_t
 State vector type $n \times 1$.
 
+typedef Eigen::Matrix< double, m, 1 > u_t
 Input vector type $m \times 1$.
 
+typedef Eigen::Matrix< double, p, 1 > z_t
 Measurement vector type $p \times 1$.
 
+typedef Eigen::Matrix< double, n, nP_t
 State uncertainty covariance matrix type $n \times n$.
 
+typedef Eigen::Matrix< double, p, pR_t
 Measurement noise covariance matrix type $p \times p$.
 
+typedef Eigen::Matrix< double, n, nQ_t
 Process noise covariance matrix type $n \times n$.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 varstepLKF (const generateA_t &generateA, const generateB_t &generateB, const H_t &H)
 The main constructor. More...
 
virtual statecov_t predict (const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const override
 Applies the prediction (time) step of the Kalman filter. More...
 
- Public Member Functions inherited from mrs_lib::LKF< n_states, n_inputs, n_measurements >
 LKF ()
 Convenience default constructor. More...
 
 LKF (const A_t &A, const B_t &B, const H_t &H)
 The main constructor. More...
 
virtual statecov_t correct (const statecov_t &sc, const z_t &z, const R_t &R) const override
 Applies the correction (update, measurement, data) step of the Kalman filter. More...
 
virtual statecov_t predict (const statecov_t &sc, const u_t &u, const Q_t &Q, [[maybe_unused]] double dt) const override
 Applies the prediction (time) step of the Kalman filter. More...
 
- Public Member Functions inherited from mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >
virtual statecov_t correct (const statecov_t &sc, const z_t &z, const R_t &R) const =0
 Applies the correction (update, measurement, data) step of the Kalman filter. More...
 
virtual statecov_t predict (const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const =0
 Applies the prediction (time) step of the Kalman filter. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Static Public Attributes

+static const int n = n_states
 
+static const int m = n_inputs
 
+static const int p = n_measurements
 
- Static Public Attributes inherited from mrs_lib::LKF< n_states, n_inputs, n_measurements >
+static constexpr int n = n_states
 Length of the state vector of the system.
 
+static constexpr int m = n_inputs
 Length of the input vector of the system.
 
+static constexpr int p = n_measurements
 Length of the measurement vector of the system.
 
- Static Public Attributes inherited from mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >
+static const int n = n_states
 Length of the state vector of the system.
 
+static const int m = n_inputs
 Length of the input vector of the system.
 
+static const int p = n_measurements
 Length of the measurement vector of the system.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Attributes inherited from mrs_lib::LKF< n_states, n_inputs, n_measurements >
+A_t A
 The system transition matrix $n \times n$.
 
+B_t B
 The input to state mapping matrix $n \times m$.
 
+H_t H
 The state to measurement mapping matrix $p \times n$.
 
- Protected Member Functions inherited from mrs_lib::LKF< n_states, n_inputs, n_measurements >
+virtual K_t computeKalmanGain (const statecov_t &sc, [[maybe_unused]] const z_t &z, const R_t &R, const H_t &H) const
 
+statecov_t ::type correction_impl (const statecov_t &sc, const z_t &z, const R_t &R, const H_t &H) const
 
- Static Protected Member Functions inherited from mrs_lib::LKF< n_states, n_inputs, n_measurements >
+static P_t covariance_predict (const A_t &A, const P_t &P, const Q_t &Q, const double dt)
 
+template<int check = n_inputs>
static std::enable_if< check==0, x_t >::type state_predict (const A_t &A, const x_t &x, [[maybe_unused]] const B_t &B, [[maybe_unused]] const u_t &u)
 
+template<int check = n_inputs>
static 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)
 
+static R_t invert_W (R_t W)
 
+

Constructor & Destructor Documentation

+ +

◆ varstepLKF()

+ +
+
+
+template<int n_states, int n_inputs, int n_measurements>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >::varstepLKF (const generateA_t & generateA,
const generateB_t & generateB,
const H_tH 
)
+
+inline
+
+ +

The main constructor.

+
Parameters
+ + + + +
generateAa function, which returns the state transition matrix A based on the time difference dt.
generateBa function, which returns the input to state mapping matrix B based on the time difference dt.
Hthe state to measurement mapping matrix.
+
+
+ +
+
+

Member Function Documentation

+ +

◆ predict()

+ +
+
+
+template<int n_states, int n_inputs, int n_measurements>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
virtual statecov_t mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >::predict (const statecov_tsc,
const u_tu,
const Q_tQ,
double dt 
) const
+
+inlineoverridevirtual
+
+ +

Applies the prediction (time) step of the Kalman filter.

+

This method applies the linear Kalman filter prediction step to the state and covariance passed in sc using the input u and process noise Q. The process noise covariance Q is scaled by the dt parameter. The updated state and covariance after the prediction step is returned.

+
Parameters
+ + + + + +
scThe state and covariance to which the prediction step is to be applied.
uThe input vector to be used for prediction.
QThe process noise covariance matrix to be used for prediction.
dtUsed to scale the process noise covariance Q and to generate the state transition and input to state mapping matrices A and \B using the functions, passed in the object's constructor.
+
+
+
Returns
The state and covariance after the prediction step.
+
Note
Note that the dt parameter is used to scale the process noise covariance Q and to generate the system matrices A or B using the functions, passed in the constructor!
+ +
+
+
The documentation for this class was generated from the following file:
    +
  • include/mrs_lib/lkf.h
  • +
+
+
+ + + + diff --git a/classmrs__lib_1_1varstepLKF.js b/classmrs__lib_1_1varstepLKF.js new file mode 100644 index 00000000..35f5d193 --- /dev/null +++ b/classmrs__lib_1_1varstepLKF.js @@ -0,0 +1,18 @@ +var classmrs__lib_1_1varstepLKF = +[ + [ "A_t", "classmrs__lib_1_1varstepLKF.html#a1f797193292783fd0d33698b8f459b6a", null ], + [ "B_t", "classmrs__lib_1_1varstepLKF.html#a2b26991ee6df4fd05e67f8f673149368", null ], + [ "Base_class", "classmrs__lib_1_1varstepLKF.html#a83cfe493b5409677ec83f01b9f0065bc", null ], + [ "generateA_t", "classmrs__lib_1_1varstepLKF.html#ae85acc5f4b5d251aa70cdda71c0aabfd", null ], + [ "generateB_t", "classmrs__lib_1_1varstepLKF.html#a2b40f86a3d5a5973664ffcccd9c37b4d", null ], + [ "H_t", "classmrs__lib_1_1varstepLKF.html#a0aa9bddf3faf5aa9e09053283df32a7e", null ], + [ "P_t", "classmrs__lib_1_1varstepLKF.html#a346cbdb27120fda35ebc6ec6f6c69cbe", null ], + [ "Q_t", "classmrs__lib_1_1varstepLKF.html#ac69552920fcb4c6db997539466ae5e67", null ], + [ "R_t", "classmrs__lib_1_1varstepLKF.html#a48a9d5c6e193d88308b7b17186b3432c", null ], + [ "statecov_t", "classmrs__lib_1_1varstepLKF.html#af7abb1064d60846b89590e5c95e5841b", null ], + [ "u_t", "classmrs__lib_1_1varstepLKF.html#ac8cb341dceca8811dc40c0891fd71ad2", null ], + [ "x_t", "classmrs__lib_1_1varstepLKF.html#aa948acd2a6adacf7fa10667f2f307994", null ], + [ "z_t", "classmrs__lib_1_1varstepLKF.html#a60b15acb8d478affcf2190b54724f060", null ], + [ "varstepLKF", "classmrs__lib_1_1varstepLKF.html#afe2d9f3643f3f8e4c82879384a4a5eea", null ], + [ "predict", "classmrs__lib_1_1varstepLKF.html#ac1f671eb73017a1c05303e29ddf0c1f2", null ] +]; \ No newline at end of file diff --git a/classmrs__lib_1_1varstepLKF__coll__graph.map b/classmrs__lib_1_1varstepLKF__coll__graph.map new file mode 100644 index 00000000..da1f355f --- /dev/null +++ b/classmrs__lib_1_1varstepLKF__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/classmrs__lib_1_1varstepLKF__coll__graph.md5 b/classmrs__lib_1_1varstepLKF__coll__graph.md5 new file mode 100644 index 00000000..0de052ba --- /dev/null +++ b/classmrs__lib_1_1varstepLKF__coll__graph.md5 @@ -0,0 +1 @@ +972c6314f93bcaf4328e7b5702f86e4c \ No newline at end of file diff --git a/classmrs__lib_1_1varstepLKF__coll__graph.png b/classmrs__lib_1_1varstepLKF__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..8560e0aacc45b60f8271d03c4083d9be5afa5620 GIT binary patch literal 9118 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 + + + + diff --git a/classmrs__lib_1_1varstepLKF__inherit__graph.md5 b/classmrs__lib_1_1varstepLKF__inherit__graph.md5 new file mode 100644 index 00000000..0de052ba --- /dev/null +++ b/classmrs__lib_1_1varstepLKF__inherit__graph.md5 @@ -0,0 +1 @@ +972c6314f93bcaf4328e7b5702f86e4c \ No newline at end of file diff --git a/classmrs__lib_1_1varstepLKF__inherit__graph.png b/classmrs__lib_1_1varstepLKF__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..8560e0aacc45b60f8271d03c4083d9be5afa5620 GIT binary patch literal 9118 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 literal 0 HcmV?d00001 diff --git a/conversions_8h_source.html b/conversions_8h_source.html new file mode 100644 index 00000000..72e7d610 --- /dev/null +++ b/conversions_8h_source.html @@ -0,0 +1,109 @@ + + + + + + + +mrs_lib: include/mrs_lib/geometry/conversions.h Source File + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
conversions.h
+
+
+
1 #ifndef GEOMETRY_CONVERSIONS_H
+
2 #define GEOMETRY_CONVERSIONS_H
+
3 
+
4 #include <mrs_lib/geometry/conversions_eigen.h>
+
5 #include <mrs_lib/geometry/conversions_opencv.h>
+
6 
+
7 #endif // GEOMETRY_CONVERSIONS_H
+
+
+ + + + diff --git a/conversions__eigen_8h_source.html b/conversions__eigen_8h_source.html new file mode 100644 index 00000000..3222de26 --- /dev/null +++ b/conversions__eigen_8h_source.html @@ -0,0 +1,139 @@ + + + + + + + +mrs_lib: include/mrs_lib/geometry/conversions_eigen.h Source File + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
conversions_eigen.h
+
+
+
1 #ifndef GEOMETRY_CONVERSIONS_EIGEN_H
+
2 #define GEOMETRY_CONVERSIONS_EIGEN_H
+
3 
+
4 #include <geometry_msgs/PoseStamped.h>
+
5 #include <geometry_msgs/Vector3.h>
+
6 
+
7 #include <Eigen/Core>
+
8 #include <Eigen/Geometry>
+
9 
+
10 namespace mrs_lib
+
11 {
+
12  namespace geometry
+
13  {
+
14 
+
15  /* conversions from/to Eigen //{ */
+
16 
+
17  geometry_msgs::Point fromEigen(const Eigen::Vector3d& what);
+
18 
+
19  geometry_msgs::Vector3 fromEigenVec(const Eigen::Vector3d& what);
+
20 
+
21  Eigen::Vector3d toEigen(const geometry_msgs::Point& what);
+
22 
+
23  Eigen::Vector3d toEigen(const geometry_msgs::Vector3& what);
+
24 
+
25  Eigen::Matrix<double, 6, 6> toEigenMatrix(const boost::array<double, 36>& what);
+
26 
+
27  geometry_msgs::Quaternion fromEigen(const Eigen::Quaterniond& what);
+
28 
+
29  Eigen::Quaterniond toEigen(const geometry_msgs::Quaternion& what);
+
30 
+
31  //}
+
32 
+
33  }
+
34 }
+
35 
+
36 #endif // GEOMETRY_CONVERSIONS_EIGEN_H
+
+
+
All mrs_lib functions, classes, variables and definitions are contained in this namespace.
Definition: attitude_converter.h:29
+ + + + diff --git a/conversions__opencv_8h_source.html b/conversions__opencv_8h_source.html new file mode 100644 index 00000000..058217a9 --- /dev/null +++ b/conversions__opencv_8h_source.html @@ -0,0 +1,130 @@ + + + + + + + +mrs_lib: include/mrs_lib/geometry/conversions_opencv.h Source File + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
conversions_opencv.h
+
+
+
1 #ifndef GEOMETRY_CONVERSIONS_OPENCV_H
+
2 #define GEOMETRY_CONVERSIONS_OPENCV_H
+
3 
+
4 #include <geometry_msgs/PoseStamped.h>
+
5 #include <geometry_msgs/Vector3.h>
+
6 
+
7 #include <opencv2/core/types.hpp>
+
8 
+
9 namespace mrs_lib
+
10 {
+
11  namespace geometry
+
12  {
+
13 
+
14  /* conversions from/to OpenCV //{ */
+
15 
+
16  geometry_msgs::Point fromCV(const cv::Point3d& what);
+
17 
+
18  cv::Point3d toCV(const geometry_msgs::Point& what);
+
19 
+
20  cv::Point3d toCV(const geometry_msgs::Vector3& what);
+
21 
+
22  //}
+
23 
+
24  }
+
25 }
+
26 
+
27 #endif // GEOMETRY_CONVERSIONS_OPENCV_H
+
+
+
All mrs_lib functions, classes, variables and definitions are contained in this namespace.
Definition: attitude_converter.h:29
+ + + + diff --git a/cyclic_8h.html b/cyclic_8h.html new file mode 100644 index 00000000..570c6430 --- /dev/null +++ b/cyclic_8h.html @@ -0,0 +1,302 @@ + + + + + + + +mrs_lib: include/mrs_lib/geometry/cyclic.h File Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
cyclic.h File Reference
+
+
+ +

Defines the cyclic class for calculations with cyclic quantities. +More...

+
#include <cmath>
+#include <ostream>
+
+ + Include dependency graph for cyclic.h:
+
+
+ +
+ + This graph shows which files directly or indirectly include this file:
+
+
+ +
+

Go to the source code of this file.

+ + + + + + + + + + + + + + + + + +

+Classes

struct  mrs_lib::geometry::cyclic< flt, spec >
 Implementation of the a general cyclic value (such as angles in radians/degrees etc). More...
 
struct  mrs_lib::geometry::radians
 Convenience specialization of the cyclic class for unsigned radians (from $0$ to $2\pi$). More...
 
struct  mrs_lib::geometry::sradians
 Convenience specialization of the cyclic class for signed radians (from $-\pi$ to $\pi$). More...
 
struct  mrs_lib::geometry::degrees
 Convenience specialization of the cyclic class for unsigned degrees (from $0$ to $360$). More...
 
struct  mrs_lib::geometry::sdegrees
 Convenience specialization of the cyclic class for signed degrees (from $-180$ to $180$). More...
 
+ + + + +

+Namespaces

 mrs_lib
 All mrs_lib functions, classes, variables and definitions are contained in this namespace.
 
+ + + + + + + + + + + + + +

+Functions

template<typename flt , class spec >
bool mrs_lib::geometry::operator< (const cyclic< flt, spec > &lhs, const cyclic< flt, spec > &rhs)
 Implementation of the comparison operation between two angles. More...
 
template<typename flt , class spec >
bool mrs_lib::geometry::operator> (const cyclic< flt, spec > &lhs, const cyclic< flt, spec > &rhs)
 Implementation of the comparison operation between two angles. More...
 
template<typename flt , class spec >
std::ostream & mrs_lib::geometry::operator<< (std::ostream &out, const cyclic< flt, spec > &ang)
 Implementation of the stream output operator. More...
 
+

Detailed Description

+

Defines the cyclic class for calculations with cyclic quantities.

+
Author
Matouš Vrba - vrbam.nosp@m.ato@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz
+

Function Documentation

+ +

◆ operator<()

+ +
+
+
+template<typename flt , class spec >
+ + + + + + + + + + + + + + + + + + +
bool mrs_lib::geometry::operator< (const cyclic< flt, spec > & lhs,
const cyclic< flt, spec > & rhs 
)
+
+ +

Implementation of the comparison operation between two angles.

+

An angle is considered to be smaller than another angle if it is shorter - closer to zero.

+
Parameters
+ + + +
lhsleft-hand-side.
rhsright-hand-side.
+
+
+
Returns
true iff the shortest unsigned walk from lhs to 0 is less than from rhs to 0.
+ +
+
+ +

◆ operator<<()

+ +
+
+
+template<typename flt , class spec >
+ + + + + + + + + + + + + + + + + + +
std::ostream& mrs_lib::geometry::operator<< (std::ostream & out,
const cyclic< flt, spec > & ang 
)
+
+ +

Implementation of the stream output operator.

+
Parameters
+ + + +
outthe stream to write the angle to.
angthe angle to be written.
+
+
+
Returns
a reference to the stream.
+ +
+
+ +

◆ operator>()

+ +
+
+
+template<typename flt , class spec >
+ + + + + + + + + + + + + + + + + + +
bool mrs_lib::geometry::operator> (const cyclic< flt, spec > & lhs,
const cyclic< flt, spec > & rhs 
)
+
+ +

Implementation of the comparison operation between two angles.

+

An angle is considered to be larger than another angle if it is longer - further from zero.

+
Parameters
+ + + +
lhsleft-hand-side.
rhsright-hand-side.
+
+
+
Returns
true iff the shortest unsigned walk from lhs to 0 is more than from rhs to 0.
+ +
+
+
+
+ + + + diff --git a/cyclic_8h.js b/cyclic_8h.js new file mode 100644 index 00000000..03bb671d --- /dev/null +++ b/cyclic_8h.js @@ -0,0 +1,11 @@ +var cyclic_8h = +[ + [ "cyclic", "structmrs__lib_1_1geometry_1_1cyclic.html", "structmrs__lib_1_1geometry_1_1cyclic" ], + [ "radians", "structmrs__lib_1_1geometry_1_1radians.html", null ], + [ "sradians", "structmrs__lib_1_1geometry_1_1sradians.html", null ], + [ "degrees", "structmrs__lib_1_1geometry_1_1degrees.html", null ], + [ "sdegrees", "structmrs__lib_1_1geometry_1_1sdegrees.html", null ], + [ "operator<", "cyclic_8h.html#a8bb4c24541320f151f1781100c789cd3", null ], + [ "operator<<", "cyclic_8h.html#aebc05b8cec59b7a37a72024e26a449f7", null ], + [ "operator>", "cyclic_8h.html#a60745f66bbc41c3cb323c8b1c3f050d7", null ] +]; \ No newline at end of file diff --git a/cyclic_8h__dep__incl.map b/cyclic_8h__dep__incl.map new file mode 100644 index 00000000..72780697 --- /dev/null +++ b/cyclic_8h__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/cyclic_8h__dep__incl.md5 b/cyclic_8h__dep__incl.md5 new file mode 100644 index 00000000..c774e999 --- /dev/null +++ b/cyclic_8h__dep__incl.md5 @@ -0,0 +1 @@ +a1358b704fb3ade8de3d4c603443a657 \ No newline at end of file diff --git a/cyclic_8h__dep__incl.png b/cyclic_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..ff4fcdbadd30b79437f3886011464d5e1491af2d GIT binary patch literal 5919 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 Y!p#}-OgpCl;CMrxJ<(DwSF{ZIe-y=ho&W#< literal 0 HcmV?d00001 diff --git a/cyclic_8h__incl.map b/cyclic_8h__incl.map new file mode 100644 index 00000000..7b91b518 --- /dev/null +++ b/cyclic_8h__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/cyclic_8h__incl.md5 b/cyclic_8h__incl.md5 new file mode 100644 index 00000000..5ea28071 --- /dev/null +++ b/cyclic_8h__incl.md5 @@ -0,0 +1 @@ +639eab034e05be9669ef05a33099b25f \ No newline at end of file diff --git a/cyclic_8h__incl.png b/cyclic_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..074c378dfdd9c04fef82640c7d079e2c2c8c71e1 GIT binary patch literal 6145 zcmZWt1yqz>w;n)Xq>+Z95g2Kyk?xK`29S~zR2mcz>F#cj5e0-o-;J;z!)Drl@ zGFMfUgWUc7%V{c1fIui}l;xyR?wR`^-l0&6bKTkY7qk>aa{6RZ95~i;r1wbVNlCku zWyI*B0@j?+^pI4%l%p>lhhxqBSuF%KwzeooLRGP%!qMana6!|^L-U|&}6LR(DXL@p#HMi!I+#e&{rn65jW)XYg~5Hw?W|nGQ=2U*g;HK zj|gz&@#YQ>>YUcGE)Ety;TW=$Cbg|PitO*QM6a!x|2Z4iOnv+!{Apw!5~Zx8Lw0g< zB1Z?-TqS<*@ypN3<`&_n@R%sr+LrcOoTdL?yRX@z$vAXZ_GZ66PAM-g_KS%j+}YWo ztWtURX8JBRmdL2lT`P?I6?bH)>=H>j6WxyCWLqfW!Gj09HdCCeB~PhvDY!dteqZX? zDX>|df3Ck!d>|t$8<(8?&ujh(2ZI8f@Q8@EAI^N{olu>Oc4*UQ$r7187lK#MD$Oyi zhSDEi1>@eo?-vq+?d;+bmz^Ec?Dd;TObljkZx8Ve4#t8>cv4bPQLQ+CJG!{&?oZ;# zEiYd#K4`f;FQ2J;MPg)Zj8-LH_3NmEFfKhE$HKw_rKiU%Awl=#$&-qT3Mo_59OSR= zZUvTy4_D`^ZQO6J1r=iGq6BTGOj~`?{D&M>Vm}|b?;jpx}#(>Cerpt`o51TGyV`E49dcJ@EUQ}M*6UVH0?}i%=Z_AU906~$2MwOSc@1?B&`E~lN z#+FLsg9xUHiAiTySFZS57H)2WprD|uwFn-^wa)u^G(vc82Mck)+>8^k>xG7)LL3vO3KP@CqD*` zcgtJ)CnUA<^Ycyn;vcR!B94xar7bO4UfbBnU$6-Ykt--DAiVz|Tn`pzx6PYH?>sMN zt--}mQc;mHH)kp-DIubuU_*se-R_hOrKVCML`9h&KYp;iy{)9AM6|vBLDVfTFAx3O zw{QOI#l^*rE-n^wl)mU)d_K3Hc=Qr54-b!2erp1-otCk2RDZt;@S6b`aCLR%6%q<= zX=xehgTsfjB^5O^2&T%6aa~+o@L&j{fn+WcSb0fF`{XCRN~d*&XNHCyBO^ouDLjg= zUcs}(-l0R>&v(d9PERpgUPE{tmc)Q(9j&d9@j^{S3kzo5GNbz>BqVs$0?_rI7)3L) z+*mG`&F@{kam;O2UvmozFzxK@D5Kv5+npv%PELN-y}C*TvG zzkIA*864gS5I#*)WE=?;>(u@d$pC7Xd^#=d*586#eO%5j|@YITvI~OF)%7^ zXCIduRO5i(jEs%NZ>#FUa7aQBrKP2?5^)ZCKWLwNn|6584%AnTYI z69<1TYMybDYh+8{Yin!Aom+$U(9t0~bpU;tty#Oix{5|fNJu2(xIOkTFeqqsqFCFX z2j|_^OwYx>asn$F(ShdO?ak=SOei>#pH%*_roKLvyBOUg4h~E}phUu~6s7}(|$MOp~Q70BP~tE(IAbF*tAW2c@jaNor9 z7*j<>Wn^I?5}S~YK}3X_i;HXJ*uA&E-~4PI3u3=mAC#ZZ0`5&-bv2o%1iiyjBU<*b zb^dK)BI!cYdkTDf{Hx<0dMzEDpuPk)x1E@%D13!zSXclyVgClbjg3tt6+hPR%R>sa zFhW|9!22YuP;bHff(9Y99Eas*_di#B?qbht&oQyE)dP<><(ZgM-6szkrC#2HVLS8`J(A&W;(%5bhWs*WS9C`fT_&s+hRsrl&uLj?T}? zM4I27TFuPOF)=Zr`}z4H+>aQn22;^!X=&SNGo#0`SRI|5{3;W6 zh$THt31fG0QV}%E<55L=Mse{Eqrnq#fr0n7c6OLpSmY-E;q_;^=^GrBGcw9tk*O&h z9~<+}$zdqf|B9tusF76f`M$S4RNh_S{dpXXusyFt!PAF%*9lo!(aYYyL4@$#&$fsk zkdV9(37a66f&RU)phVr@z2ke{GRD(88Ftum_q=#NDJ6v&fq1sT2YSBkT$OU!wfuR{ zh?DLjc6?!Ke&99G&IaiO#Y*|$F2efu>Nk)0=LI?Kp}K?cCuHi zzi_(!^Dbzre02QL+rU0{BkCn?dKBz60lvN-EeiHDZx4C26iYCoox2u`PK{Hhk91O! z?m-^?9pWNyplxk!P$;xDOZ@%F!~{!d>ON@u_m_O`yih0<#CPUPp1YgDLv{Te^^x7F z&mABR6^^Si3-xa!&@^9S0rMk#q((+FH&w63>+uVc*(^=wz8Dt}AnSvd`jcX#b657w zF2S%O3FLf(mt;>^KqvS*ks;BeBN$}SZniA8!1nzP1TvV$j~zltukiM*;PvGp&j$>|NW3-j}#|5@LFtH#kiBDn7^OllNg@!lzSVk~&iEx+N5iTAIEQ{^VZj)#I2V4a8z zXUTZROAo9E?zKdSy?~G9jxz4XGpW98Xw01;{UIeg^+RrM#8p1zsdgepQxXT-Sa1!8 zNMd>(Y^xUz`Oo7Ix?1e!Icqt{PN^>G+)%%NVWL+?Df;T^tm)S@{a*Dqi}xT=6-gl% zFHrKM$}mu-5^LJEG^DC|xNaB^~XvX;N~ zkkK#;#-(tsbU!u&xKhR49nY-swx~#3Nxdn+X1bqLkfbb z!PpM*4GpDYxHr>~BB8BCih|)VFs}Nr^OVb?P`>SRy!`xfmK$oYC(dL(f3&8&(84E> zPP}UR`dkFG^?^r6uP6nIVr1s8H%QzfsRf~iwYPe?`!64%V0a`n8R)92+JV6y9F1H; z89~F6*%7e8M32_+`KKpPyytFW2oDG@4A1e-DczBB=&5SNMBx@0aCq!d zU!Q)RSA){z&$DMm2+Ni2aSA1sYkXp2@2&Z1@HEu&d#014n_GJ_7hBurcQdDeSwtPR1BBXbj@PK4IHI0gisXc~Oz7Ikc63EUU7WRsq zGgT=e&(b$sR>s^y8zAbuL>AV6wo^&Z2Y8;82o?57bupstE33`d4CxpE6Ls}-7E5A! zot=LuqM`)gDi4Yf_0mboYHB1TU zDr?2dc8y|+x@P*-)VxkeO$}z1S0*3}p`1%dH8)3PcXkRqf8N1sH>Z?NI*E^hF);)( zu>NdubgIkJtmj_9vXIs)GLR#A|^AXO@;nL97^=fsB<~s=tTOk^0Y5SGqD}c#L zO`=`9BdH>_3+)4jtaA6&|E#BYZk z)Q5bB*;X9w&DT2j>%5yFo)XeFyYthswKXTPA8t@@u}X-dNEGeui&L@R-vf)%(ocR4 zJ^{^z9;rRvU}BN^!8njmVkWBEMl+|ZjF^inZ#gY1+oUXx;s-TbbY`YG;51?4-`A^~ zu5O1ibSbH};lsRSrhtfYU*dzoUhlE$s)|b(6hzj~uckhNa9a4L9hjV~%crPsTKVi* z<(d}@3+G;?zEAwxhGiHo#Z<@8P}#t4=|zOIy6k#qT!J>!iDCSZm9$|-Q~^&D(SfNh zZ?6F0-uPs{x(*qIpr8>Y^$vrCHyzLbwDk4++(oaiuXzOpUo<|40Dh|o(8wjdWvp=n zy5ov3-|fwznx&NlDs-4MOl-Za4gsW#*p!r>H`UHAn;Mv$oRJky>-SPKgyDk4_`FTSvoq>B1NuY;W z=lb|q1XVlT-FgL0E=DtTO_MDxwN||fq7<2UfPs|?Z}QTQbrbWrWL_aqOM9#~$$I9_ zs!3P!nj{gYiMrr_2lcupfQF8HGkiK3(pt<#2zF9FP$UZr3rCA?%f)ke)r#Xc`Eg*f zvq*DwY5@pxbmWLYAaXRbC7}5DUAxnE@Dgrr?q{|3v|{4oX12DG#LNl|{QM;EFZSAU zqytQ?tb$(*B>N5f(D3aX9^P4R3DN+3J=5$Z+MBHmqxbp4_vP!?`*{6wdasau?_B^@I$;HKI+6v(`sDcU#3i_`D_7E5lfDsuP zxw5?-Hec(2L3GFl7^s}QeB1my4J#|_)v(Vk26svXaC~NVwrybnc6)ov{>Y=j-&}8f z^m$>GMJXw?0|36*v$HqF{exNJ8ERQ#X$vhr*^QpR;#pW(<0mFiGEhc~p6G`c7Z)1< z_iq4Zv@xzJ`4HH*+#V~)udh!hB_$=|;NXbQ%v>m5nwrve{(WKh*s_<%`OlS8o41~x z-pPLLGLDz)-b`iZ)Ks#il~w$7xkB9riC%F5DhLTDS#~4&^wEt0K zwQS$bd05p{mNG;4!QBfP+Q8bnSQ~G~d`(ydyg?yPw zi-v)r;eE!y!4IM-SHFJ60nH=_gu4AgK0xu zT`GhD9L?WLj4mcMJw5#M<>Ilad89mJIRYi|+2i^QUR71Kva!K(!4Gr<|GV?^bF-H( zq0G$8xnAJZ{&s*q9k2Iv%*;>%rEGO|l^wn#nH+&|=BBYB1H$m+Eg<8eoYDb8_1%!x*$hWFW0OZMRXQKG%@a#6MI$>Y?`mbAn*m^A!Jk<`ZV^ zzoA$;{RNVJ2z*3u{Zmy(VY)4;E|CLUqCO-4;H??w6{!2oT|dM?WfdOixpQ9eTfi4~~h6QF}W(KMy9sB9wq27*sH*m5_I*fhGwsVq!m_ zAGNi%N^RNeIBbA(1Og@u<}C&&jhUI5m95c_5MQ|VKdqoby}iA+#tR8A_UA)3HY_P= zYUR0AcM3l$#+Y9ntsb481^^{OxBPh&P%UMFW|DV|)O!~AraCj_45h2f#KWVxFEf=S z{XVoRPo|&D*vCOu!^df2EhRukOYz?phjc>zf4=fxSsTYNeG>>;;Uxy2w<)Cxp+LnG zn5zB4Fzn8I8)#&lf}um+WcOqwD;l=mW@ZEKx@R{#J2 literal 0 HcmV?d00001 diff --git a/cyclic_8h_source.html b/cyclic_8h_source.html new file mode 100644 index 00000000..edcd0f7a --- /dev/null +++ b/cyclic_8h_source.html @@ -0,0 +1,387 @@ + + + + + + + +mrs_lib: include/mrs_lib/geometry/cyclic.h Source File + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
cyclic.h
+
+
+Go to the documentation of this file.
1 // clang: MatousFormat
+
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  {
+
47  template <typename flt, class spec>
+
48  struct cyclic
+
49  {
+
55  cyclic() : val(minimum){};
+
61  cyclic(const flt val) : val(wrap(val)){};
+
67  cyclic(const cyclic& other) : val(other.val){};
+
73  cyclic(const spec& other) : val(other.val){};
+
74 
+
80  flt value() const
+
81  {
+
82  return val;
+
83  };
+
84 
+
85  static constexpr flt minimum = spec::minimum;
+
86  static constexpr flt supremum = spec::supremum;
+
87  static constexpr flt range =
+
88  supremum - minimum;
+
89  static constexpr flt half_range =
+
90  range / flt(2);
+
92  /* static_assert((supremum > minimum), "cyclic value: Range not valid"); */
+
93 
+
100  static bool inRange(const flt val)
+
101  {
+
102  return val >= minimum && val < supremum;
+
103  }
+
104 
+
114  static flt wrap(const flt val)
+
115  {
+
116  // these few ifs should cover most cases, improving speed and precision
+
117  if (val >= minimum)
+
118  {
+
119  if (val < supremum) // value is actually in range and doesn't need to be wrapped
+
120  return val;
+
121  else if (val < supremum + range)
+
122  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  if (val >= minimum - range)
+
126  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  const flt rem = std::fmod(val - minimum, range);
+
131  const flt wrapped = rem + minimum + std::signbit(rem) * range;
+
132  return wrapped;
+
133  }
+
134 
+
157  static flt unwrap(const flt what, const flt from)
+
158  {
+
159  return from + diff(what, from);
+
160  }
+
161 
+
171  static flt pdist(const flt from, const flt to)
+
172  {
+
173  return pdist(cyclic(from), cyclic(to));
+
174  }
+
175 
+
176  static flt pdist(const cyclic from, const cyclic to)
+
177  {
+
178  const flt tmp = to.val - from.val;
+
179  const flt dist = tmp + std::signbit(tmp) * range;
+
180  return dist;
+
181  }
+
182 
+
193  static flt diff(const flt minuend, const flt subtrahend)
+
194  {
+
195  return diff(cyclic(minuend), cyclic(subtrahend));
+
196  }
+
197 
+
198  static flt diff(const cyclic minuend, const cyclic subtrahend)
+
199  {
+
200  const flt d = minuend.val - subtrahend.val;
+
201  if (d < -half_range)
+
202  return d + range;
+
203  if (d >= half_range)
+
204  return d - range;
+
205  return d;
+
206  }
+
207 
+
219  static flt dist(const flt from, const flt to)
+
220  {
+
221  return dist(cyclic(from), cyclic(to));
+
222  }
+
223 
+
224  static flt dist(const cyclic from, const cyclic to)
+
225  {
+
226  return std::abs(diff(from, to));
+
227  }
+
228 
+
242  static flt interpUnwrapped(const flt from, const flt to, const flt coeff)
+
243  {
+
244  return interpUnwrapped(cyclic(from), cyclic(to), coeff);
+
245  }
+
246 
+
247  static flt interpUnwrapped(const cyclic from, const cyclic to, const flt coeff)
+
248  {
+
249  const flt dang = diff(to, from);
+
250  const flt intp = from.val + coeff * dang;
+
251  return intp;
+
252  }
+
253 
+
264  static flt interp(const flt from, const flt to, const flt coeff)
+
265  {
+
266  return wrap(interpUnwrapped(from, to, coeff));
+
267  }
+
268 
+
269  static flt interp(const cyclic from, const cyclic to, const flt coeff)
+
270  {
+
271  return wrap(interpUnwrapped(from, to, coeff));
+
272  }
+
273 
+
288  static flt pinterpUnwrapped(const flt from, const flt to, const flt coeff)
+
289  {
+
290  return pinterpUnwrapped(cyclic(from), cyclic(to), coeff);
+
291  }
+
292 
+
293  static flt pinterpUnwrapped(const cyclic from, const cyclic to, const flt coeff)
+
294  {
+
295  const flt dang = pdist(to, from);
+
296  const flt intp = from.val + coeff * dang;
+
297  return intp;
+
298  }
+
299 
+
311  static flt pinterp(const flt from, const flt to, const flt coeff)
+
312  {
+
313  return pinterpUnwrapped(cyclic(from), cyclic(to), coeff);
+
314  }
+
315 
+
316  static flt pinterp(const cyclic from, const cyclic to, const flt coeff)
+
317  {
+
318  return wrap(pinterpUnwrapped(from, to, coeff));
+
319  }
+
320 
+
333  template <class other_t>
+
334  static other_t convert(const cyclic& what)
+
335  {
+
336  return other_t(what.val / range * other_t::range);
+
337  }
+
338 
+
350  template <class other_t>
+
351  other_t convert() const
+
352  {
+
353  return other_t(val / range * other_t::range);
+
354  }
+
355 
+
356  // | ------------------------ Operators ----------------------- |
+
363  cyclic& operator=(const flt nval)
+
364  {
+
365  val = wrap(nval);
+
366  return *this;
+
367  };
+
374  cyclic& operator=(const cyclic& other)
+
375  {
+
376  val = other.val;
+
377  return *this;
+
378  };
+ +
386  {
+
387  val = other.val;
+
388  return *this;
+
389  };
+
390 
+
397  cyclic& operator+=(const cyclic& other)
+
398  {
+
399  val = wrap(val + other.val);
+
400  return *this;
+
401  };
+
402 
+
409  cyclic& operator-=(const cyclic& other)
+
410  {
+
411  val = diff(val, other.val);
+
412  return *this;
+
413  };
+
414 
+
422  friend spec operator+(const cyclic& lhs, const cyclic& rhs)
+
423  {
+
424  return wrap(lhs.val + rhs.val);
+
425  }
+
426 
+
434  friend flt operator-(const cyclic& lhs, const cyclic& rhs)
+
435  {
+
436  return diff(lhs, rhs);
+
437  }
+
438 
+
439  protected:
+
440  flt val;
+
441  };
+
442 
+
452  template <typename flt, class spec>
+
453  bool operator<(const cyclic<flt, spec>& lhs, const cyclic<flt, spec>& rhs)
+
454  {
+
455  return cyclic<flt, spec>::dist(lhs, 0) < cyclic<flt, spec>::dist(rhs, 0);
+
456  }
+
457 
+
467  template <typename flt, class spec>
+
468  bool operator>(const cyclic<flt, spec>& lhs, const cyclic<flt, spec>& rhs)
+
469  {
+
470  return cyclic<flt, spec>::dist(lhs, 0) > cyclic<flt, spec>::dist(rhs, 0);
+
471  }
+
472 
+
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 
+
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 
+
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 
+
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 
+
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
+
+
+
flt value() const
Getter for val.
Definition: cyclic.h:80
+
static flt pdist(const flt from, const flt to)
Returns length of the shortest walk in the positive direction from the first parameter to the second ...
Definition: cyclic.h:171
+
Convenience specialization of the cyclic class for signed degrees (from $-180$ to $180$).
Definition: cyclic.h:519
+
cyclic & operator=(const flt nval)
Assignment operator.
Definition: cyclic.h:363
+
cyclic()
Default constructor.
Definition: cyclic.h:55
+
bool operator<(const cyclic< flt, spec > &lhs, const cyclic< flt, spec > &rhs)
Implementation of the comparison operation between two angles.
Definition: cyclic.h:453
+
std::ostream & operator<<(std::ostream &out, const cyclic< flt, spec > &ang)
Implementation of the stream output operator.
Definition: cyclic.h:481
+
static flt interpUnwrapped(const flt from, const flt to, const flt coeff)
Interpolation between two circular quantities without wrapping of the result.
Definition: cyclic.h:242
+
friend spec operator+(const cyclic &lhs, const cyclic &rhs)
Addition operator.
Definition: cyclic.h:422
+
static flt diff(const flt minuend, const flt subtrahend)
Returns the difference between the two circular values.
Definition: cyclic.h:193
+
static flt dist(const flt from, const flt to)
Returns the distance between the two circular values.
Definition: cyclic.h:219
+
Convenience specialization of the cyclic class for unsigned degrees (from $0$ to $360$).
Definition: cyclic.h:509
+
cyclic(const cyclic &other)
Copy constructor.
Definition: cyclic.h:67
+
Implementation of the a general cyclic value (such as angles in radians/degrees etc).
Definition: cyclic.h:48
+
Convenience specialization of the cyclic class for unsigned radians (from $0$ to $2\pi$).
Definition: cyclic.h:489
+
Convenience specialization of the cyclic class for signed radians (from $-\pi$ to $\pi$).
Definition: cyclic.h:499
+
cyclic(const spec &other)
Copy constructor.
Definition: cyclic.h:73
+
bool operator>(const cyclic< flt, spec > &lhs, const cyclic< flt, spec > &rhs)
Implementation of the comparison operation between two angles.
Definition: cyclic.h:468
+
static bool inRange(const flt val)
Checks if val is within the valid interval of wrapped values.
Definition: cyclic.h:100
+
static flt unwrap(const flt what, const flt from)
Returns value of the parameter what modified so that there is no "jump" between from and \t what.
Definition: cyclic.h:157
+
static constexpr flt supremum
Supremum of the valid interval of wrapped values .
Definition: cyclic.h:86
+
static constexpr flt half_range
Half of the range of the valid interval of wrapped values (used for some calculations).
Definition: cyclic.h:89
+
static constexpr flt minimum
Minimum of the valid interval of wrapped values .
Definition: cyclic.h:85
+
cyclic & operator=(const cyclic &other)
Assignment operator.
Definition: cyclic.h:374
+
All mrs_lib functions, classes, variables and definitions are contained in this namespace.
Definition: attitude_converter.h:29
+
cyclic(const flt val)
Constructor overload.
Definition: cyclic.h:61
+
friend flt operator-(const cyclic &lhs, const cyclic &rhs)
Subtraction operator (uses the diff() method).
Definition: cyclic.h:434
+
other_t convert() const
Conversion between two different circular quantities.
Definition: cyclic.h:351
+
cyclic & operator=(cyclic &&other)
Move operator.
Definition: cyclic.h:385
+
static flt pinterp(const flt from, const flt to, const flt coeff)
Interpolation between two circular quantities in the positive direction.
Definition: cyclic.h:311
+
cyclic & operator+=(const cyclic &other)
Addition compound operator.
Definition: cyclic.h:397
+
static flt interp(const flt from, const flt to, const flt coeff)
Interpolation between two circular quantities.
Definition: cyclic.h:264
+
cyclic & operator-=(const cyclic &other)
Subtraction compound operator.
Definition: cyclic.h:409
+
static flt pinterpUnwrapped(const flt from, const flt to, const flt coeff)
Interpolation between two circular quantities in the positive direction without wrapping of the resul...
Definition: cyclic.h:288
+
static flt wrap(const flt val)
Returns val, converted to the valid interval of values.
Definition: cyclic.h:114
+
static constexpr flt range
Range of the valid interval of wrapped values (also the period of the cyclic quantity).
Definition: cyclic.h:87
+
static other_t convert(const cyclic &what)
Conversion between two different circular quantities.
Definition: cyclic.h:334
+ + + + diff --git a/cyclic__example_8cpp.html b/cyclic__example_8cpp.html new file mode 100644 index 00000000..2913cfb6 --- /dev/null +++ b/cyclic__example_8cpp.html @@ -0,0 +1,161 @@ + + + + + + + +mrs_lib: src/geometry/cyclic_example.cpp File Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
cyclic_example.cpp File Reference
+
+
+ +

Example file for the cyclical values implementation (see the cyclic class) +More...

+
#include <mrs_lib/geometry/cyclic.h>
+#include <random>
+#include <ros/ros.h>
+
+ + Include dependency graph for cyclic_example.cpp:
+
+
+ +
+ + + +

+Classes

struct  degrees
 
+ + + + + +

+Typedefs

+using radians = mrs_lib::geometry::radians
 
+using sradians = mrs_lib::geometry::sradians
 
+ + + + + + + + + +

+Functions

+template<class T >
void printit (const T &a, const std::string &name)
 
+template<class T >
void printcont (const T &cont, const std::string &name)
 
+int main ()
 
+

Detailed Description

+

Example file for the cyclical values implementation (see the cyclic class)

+
Author
Matouš Vrba - vrbam.nosp@m.ato@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz
+

This example may be run after building mrs_lib by executing rosrun mrs_lib cyclic_example.

+

See geometry/cyclic_example.cpp.

+
+
+ + + + diff --git a/cyclic__example_8cpp.js b/cyclic__example_8cpp.js new file mode 100644 index 00000000..59cff1de --- /dev/null +++ b/cyclic__example_8cpp.js @@ -0,0 +1,9 @@ +var cyclic__example_8cpp = +[ + [ "degrees", "structdegrees.html", null ], + [ "radians", "cyclic__example_8cpp.html#a71facd116ff8e4ba2919e639ce57c843", null ], + [ "sradians", "cyclic__example_8cpp.html#a88fa1de76b3de0c8c9546625214f6d3e", null ], + [ "main", "cyclic__example_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4", null ], + [ "printcont", "cyclic__example_8cpp.html#a2051a3b3cac629f0a52bd0d305dc6370", null ], + [ "printit", "cyclic__example_8cpp.html#a5505149b5d840ca0ec0c223194fe0cb5", null ] +]; \ No newline at end of file diff --git a/cyclic__example_8cpp__incl.map b/cyclic__example_8cpp__incl.map new file mode 100644 index 00000000..e9ab10dd --- /dev/null +++ b/cyclic__example_8cpp__incl.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/cyclic__example_8cpp__incl.md5 b/cyclic__example_8cpp__incl.md5 new file mode 100644 index 00000000..940e4bc6 --- /dev/null +++ b/cyclic__example_8cpp__incl.md5 @@ -0,0 +1 @@ +673bc3e9cd79c9c1895611b2d3b15ddc \ No newline at end of file diff --git a/cyclic__example_8cpp__incl.png b/cyclic__example_8cpp__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..d03f89cb7ffd0046f49988218adf11e564f8f8e2 GIT binary patch literal 11822 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 + + + + + + +mrs_lib: include/mrs_lib -> geometry Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

mrs_lib → geometry Relation

File in include/mrs_libIncludes file in include/mrs_lib/geometry
attitude_converter.hmisc.h
batch_visualizer.hshapes.h
dkf.hmisc.h
transformer.hmisc.h
visual_object.hshapes.h
+
+ + + + diff --git a/dir_000002_000004.html b/dir_000002_000004.html new file mode 100644 index 00000000..cd3604d9 --- /dev/null +++ b/dir_000002_000004.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: include/mrs_lib -> impl Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

mrs_lib → impl Relation

File in include/mrs_libIncludes file in include/mrs_lib/impl
ukf.hukf.hpp
vector_converter.hvector_converter.hpp
+
+ + + + diff --git a/dir_000008_000001.html b/dir_000008_000001.html new file mode 100644 index 00000000..2f2f6fd7 --- /dev/null +++ b/dir_000008_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: src/attitude_converter -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

attitude_converter → include Relation

File in src/attitude_converterIncludes file in include
attitude_converter.cppmrs_lib / attitude_converter.h
attitude_converter.cppmrs_lib / utils.h
+
+ + + + diff --git a/dir_000009_000001.html b/dir_000009_000001.html new file mode 100644 index 00000000..10a0ba96 --- /dev/null +++ b/dir_000009_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: src/batch_visualizer -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

batch_visualizer → include Relation

File in src/batch_visualizerIncludes file in include
batch_visualizer.cppmrs_lib / batch_visualizer.h
batch_visualizer.cppmrs_lib / geometry / shapes.h
batch_visualizer_demo.cppmrs_lib / batch_visualizer.h
batch_visualizer_demo.cppmrs_lib / geometry / misc.h
batch_visualizer_demo.cppmrs_lib / geometry / shapes.h
visual_object.cppmrs_lib / visual_object.h
+
+ + + + diff --git a/dir_000010_000001.html b/dir_000010_000001.html new file mode 100644 index 00000000..c68edc88 --- /dev/null +++ b/dir_000010_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: src/dynamic_publisher -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

dynamic_publisher → include Relation

File in src/dynamic_publisherIncludes file in include
dynamic_publisher.cppmrs_lib / dynamic_publisher.h
example.cppmrs_lib / dynamic_publisher.h
+
+ + + + diff --git a/dir_000012_000001.html b/dir_000012_000001.html new file mode 100644 index 00000000..ff0dbfb1 --- /dev/null +++ b/dir_000012_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: src/param_loader -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

param_loader → include Relation

File in src/param_loaderIncludes file in include
example.cppmrs_lib / param_loader.h
param_loader.cppmrs_lib / param_loader.h
param_provider.cppmrs_lib / param_provider.h
param_provider_example.cppmrs_lib / param_provider.h
+
+ + + + diff --git a/dir_000013_000001.html b/dir_000013_000001.html new file mode 100644 index 00000000..338d50ad --- /dev/null +++ b/dir_000013_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: src/repredictor -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

repredictor → include Relation

File in src/repredictorIncludes file in include
example.cppmrs_lib / mutex.h
+
+ + + + diff --git a/dir_000014_000001.html b/dir_000014_000001.html new file mode 100644 index 00000000..67ad5644 --- /dev/null +++ b/dir_000014_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: src/rheiv -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

rheiv → include Relation

File in src/rheivIncludes file in include
example.cppmrs_lib / rheiv.h
+
+ + + + diff --git a/dir_000015_000001.html b/dir_000015_000001.html new file mode 100644 index 00000000..14a3b325 --- /dev/null +++ b/dir_000015_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: src/service_client_handler -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

service_client_handler → include Relation

File in src/service_client_handlerIncludes file in include
example.cppmrs_lib / service_client_handler.h
+
+ + + + diff --git a/dir_000016_000001.html b/dir_000016_000001.html new file mode 100644 index 00000000..3bd55fb4 --- /dev/null +++ b/dir_000016_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: src/subscribe_handler -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

subscribe_handler → include Relation

File in src/subscribe_handlerIncludes file in include
example.cppmrs_lib / subscribe_handler.h
simple_example.cppmrs_lib / subscribe_handler.h
+
+ + + + diff --git a/dir_000017_000001.html b/dir_000017_000001.html new file mode 100644 index 00000000..fc3135f7 --- /dev/null +++ b/dir_000017_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: src/transformer -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

transformer → include Relation

File in src/transformerIncludes file in include
transformer.cppmrs_lib / gps_conversions.h
+
+ + + + diff --git a/dir_000018_000001.html b/dir_000018_000001.html new file mode 100644 index 00000000..f806b33a --- /dev/null +++ b/dir_000018_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: src/ukf -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

ukf → include Relation

File in src/ukfIncludes file in include
example.cppmrs_lib / ukf.h
+
+ + + + diff --git a/dir_000019_000001.html b/dir_000019_000001.html new file mode 100644 index 00000000..294b5815 --- /dev/null +++ b/dir_000019_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: src/vector_converter -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

vector_converter → include Relation

File in src/vector_converterIncludes file in include
example.cppmrs_lib / vector_converter.h
vector_converter.cppmrs_lib / vector_converter.h
+
+ + + + diff --git a/dir_000020_000001.html b/dir_000020_000001.html new file mode 100644 index 00000000..a67bde7e --- /dev/null +++ b/dir_000020_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: src/geometry -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

geometry → include Relation

File in src/geometryIncludes file in include
cyclic.cppmrs_lib / geometry / cyclic.h
cyclic_example.cppmrs_lib / geometry / cyclic.h
misc.cppmrs_lib / geometry / misc.h
shapes.cppmrs_lib / geometry / misc.h
shapes.cppmrs_lib / geometry / shapes.h
tests.cppmrs_lib / geometry / cyclic.h
+
+ + + + diff --git a/dir_000021_000001.html b/dir_000021_000001.html new file mode 100644 index 00000000..0802ab84 --- /dev/null +++ b/dir_000021_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: src/iir_filter -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

iir_filter → include Relation

File in src/iir_filterIncludes file in include
iir_filter.cppmrs_lib / iir_filter.h
+
+ + + + diff --git a/dir_000023_000001.html b/dir_000023_000001.html new file mode 100644 index 00000000..21ac868b --- /dev/null +++ b/dir_000023_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: src/math -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

math → include Relation

File in src/mathIncludes file in include
math.cppmrs_lib / math.h
+
+ + + + diff --git a/dir_000024_000001.html b/dir_000024_000001.html new file mode 100644 index 00000000..f563f423 --- /dev/null +++ b/dir_000024_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: src/median_filter -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

median_filter → include Relation

File in src/median_filterIncludes file in include
median_filter.cppmrs_lib / median_filter.h
+
+ + + + diff --git a/dir_000025_000001.html b/dir_000025_000001.html new file mode 100644 index 00000000..a899bf99 --- /dev/null +++ b/dir_000025_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: src/mutex -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

mutex → include Relation

File in src/mutexIncludes file in include
mutex_tests.cppmrs_lib / mutex.h
+
+ + + + diff --git a/dir_000027_000001.html b/dir_000027_000001.html new file mode 100644 index 00000000..57c1234d --- /dev/null +++ b/dir_000027_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: src/notch_filter -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

notch_filter → include Relation

File in src/notch_filterIncludes file in include
notch_filter.cppmrs_lib / notch_filter.h
+
+ + + + diff --git a/dir_000028_000001.html b/dir_000028_000001.html new file mode 100644 index 00000000..3eaaaff0 --- /dev/null +++ b/dir_000028_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: src/profiler -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

profiler → include Relation

File in src/profilerIncludes file in include
profiler.cppmrs_lib / profiler.h
+
+ + + + diff --git a/dir_000031_000001.html b/dir_000031_000001.html new file mode 100644 index 00000000..146e38b7 --- /dev/null +++ b/dir_000031_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: src/scope_timer -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

scope_timer → include Relation

File in src/scope_timerIncludes file in include
scope_timer.cppmrs_lib / scope_timer.h
+
+ + + + diff --git a/dir_000032_000001.html b/dir_000032_000001.html new file mode 100644 index 00000000..394b690c --- /dev/null +++ b/dir_000032_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: src/timeout_manager -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

timeout_manager → include Relation

File in src/timeout_managerIncludes file in include
timeout_manager.cppmrs_lib / timeout_manager.h
+
+ + + + diff --git a/dir_000035_000001.html b/dir_000035_000001.html new file mode 100644 index 00000000..2c2da400 --- /dev/null +++ b/dir_000035_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: src/utils -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

utils → include Relation

File in src/utilsIncludes file in include
utils.cppmrs_lib / utils.h
+
+ + + + diff --git a/dir_000036_000001.html b/dir_000036_000001.html new file mode 100644 index 00000000..d16cc575 --- /dev/null +++ b/dir_000036_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: test/attitude_converter -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

attitude_converter → include Relation

File in test/attitude_converterIncludes file in include
test.cppmrs_lib / attitude_converter.h
test.cppmrs_lib / geometry / cyclic.h
+
+ + + + diff --git a/dir_000037_000001.html b/dir_000037_000001.html new file mode 100644 index 00000000..337a5076 --- /dev/null +++ b/dir_000037_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: test/geometry -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

geometry → include Relation

File in test/geometryIncludes file in include
test.cppmrs_lib / geometry / cyclic.h
test.cppmrs_lib / geometry / misc.h
+
+ + + + diff --git a/dir_000038_000001.html b/dir_000038_000001.html new file mode 100644 index 00000000..9708451c --- /dev/null +++ b/dir_000038_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: test/math -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

math → include Relation

File in test/mathIncludes file in include
test.cppmrs_lib / math.h
+
+ + + + diff --git a/dir_000039_000001.html b/dir_000039_000001.html new file mode 100644 index 00000000..32dfbdb7 --- /dev/null +++ b/dir_000039_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: test/median_filter -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

median_filter → include Relation

File in test/median_filterIncludes file in include
test.cppmrs_lib / median_filter.h
+
+ + + + diff --git a/dir_000040_000001.html b/dir_000040_000001.html new file mode 100644 index 00000000..75e0af5d --- /dev/null +++ b/dir_000040_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: test/param_loader -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

param_loader → include Relation

File in test/param_loaderIncludes file in include
test.cppmrs_lib / param_loader.h
+
+ + + + diff --git a/dir_000041_000001.html b/dir_000041_000001.html new file mode 100644 index 00000000..8bf54628 --- /dev/null +++ b/dir_000041_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: test/publisher_handler -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

publisher_handler → include Relation

File in test/publisher_handlerIncludes file in include
test.cppmrs_lib / publisher_handler.h
+
+ + + + diff --git a/dir_000043_000001.html b/dir_000043_000001.html new file mode 100644 index 00000000..d967bb5a --- /dev/null +++ b/dir_000043_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: test/service_client_handler -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

service_client_handler → include Relation

File in test/service_client_handlerIncludes file in include
test.cppmrs_lib / service_client_handler.h
+
+ + + + diff --git a/dir_000044_000001.html b/dir_000044_000001.html new file mode 100644 index 00000000..ead7fa04 --- /dev/null +++ b/dir_000044_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: test/subscribe_handler -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

subscribe_handler → include Relation

File in test/subscribe_handlerIncludes file in include
test.cppmrs_lib / subscribe_handler.h
+
+ + + + diff --git a/dir_000045_000001.html b/dir_000045_000001.html new file mode 100644 index 00000000..5796db32 --- /dev/null +++ b/dir_000045_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: test/timeout_manager -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

timeout_manager → include Relation

File in test/timeout_managerIncludes file in include
test.cppmrs_lib / timeout_manager.h
test.cppmrs_lib / utils.h
+
+ + + + diff --git a/dir_000046_000001.html b/dir_000046_000001.html new file mode 100644 index 00000000..f976a418 --- /dev/null +++ b/dir_000046_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: test/timer -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

timer → include Relation

File in test/timerIncludes file in include
test.cppmrs_lib / utils.h
+
+ + + + diff --git a/dir_000047_000001.html b/dir_000047_000001.html new file mode 100644 index 00000000..424eb104 --- /dev/null +++ b/dir_000047_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: test/transformer -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

transformer → include Relation

File in test/transformerIncludes file in include
test.cppmrs_lib / attitude_converter.h
test.cppmrs_lib / gps_conversions.h
+
+ + + + diff --git a/dir_000048_000001.html b/dir_000048_000001.html new file mode 100644 index 00000000..cd29c606 --- /dev/null +++ b/dir_000048_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: test/ukf -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

ukf → include Relation

File in test/ukfIncludes file in include
test.cppmrs_lib / ukf.h
+
+ + + + diff --git a/dir_000049_000001.html b/dir_000049_000001.html new file mode 100644 index 00000000..7b8f34c2 --- /dev/null +++ b/dir_000049_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: test/utils -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

utils → include Relation

File in test/utilsIncludes file in include
test.cppmrs_lib / utils.h
+
+ + + + diff --git a/dir_000050_000001.html b/dir_000050_000001.html new file mode 100644 index 00000000..c47c451f --- /dev/null +++ b/dir_000050_000001.html @@ -0,0 +1,98 @@ + + + + + + + +mrs_lib: test/vector_converter -> include Relation + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

vector_converter → include Relation

File in test/vector_converterIncludes file in include
test.cppmrs_lib / vector_converter.h
+
+ + + + diff --git a/dir_137818f07b93cd14b6ce92e51caad2df.html b/dir_137818f07b93cd14b6ce92e51caad2df.html new file mode 100644 index 00000000..0283c68d --- /dev/null +++ b/dir_137818f07b93cd14b6ce92e51caad2df.html @@ -0,0 +1,115 @@ + + + + + + + +mrs_lib: test/math Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
math Directory Reference
+
+
+
+ + Directory dependency graph for math:
+
+
+ +
+
+ + + + diff --git a/dir_137818f07b93cd14b6ce92e51caad2df.js b/dir_137818f07b93cd14b6ce92e51caad2df.js new file mode 100644 index 00000000..59ebf7bc --- /dev/null +++ b/dir_137818f07b93cd14b6ce92e51caad2df.js @@ -0,0 +1,4 @@ +var dir_137818f07b93cd14b6ce92e51caad2df = +[ + [ "probit_gts.h", "probit__gts_8h_source.html", null ] +]; \ No newline at end of file diff --git a/dir_137818f07b93cd14b6ce92e51caad2df_dep.map b/dir_137818f07b93cd14b6ce92e51caad2df_dep.map new file mode 100644 index 00000000..bfd7126f --- /dev/null +++ b/dir_137818f07b93cd14b6ce92e51caad2df_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_137818f07b93cd14b6ce92e51caad2df_dep.md5 b/dir_137818f07b93cd14b6ce92e51caad2df_dep.md5 new file mode 100644 index 00000000..4c7e4bb2 --- /dev/null +++ b/dir_137818f07b93cd14b6ce92e51caad2df_dep.md5 @@ -0,0 +1 @@ +bd83889bf384c23cc91292ad74a2ab11 \ No newline at end of file diff --git a/dir_137818f07b93cd14b6ce92e51caad2df_dep.png b/dir_137818f07b93cd14b6ce92e51caad2df_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..833def93b17ed6b151101aee0633cd9101b5ec78 GIT binary patch literal 2915 zcma);c{J2}AIE>9)vkq*7PqLF!A&M(Nx6w(cuI*93L^;(GZSMgAxoB;L1gL5zLtGv z3=v|krYudCnaREkGnmoD7@m2~dCooeo^$Vgp7UKkpYK1PKfd4B=ly-h+QBWPcPZ}z z06^OEqWL9J3>B@e9a}{E!^RSMQP_41W?>F&{%7Pi6+Q<5NhM2jGy4ZG7wF-3IFwq; z61BR9Qb8%N`su#b76NK432C6CDXH;fms5Dep)x6`ChkVLYpP-5<)_X;Lw8PHIAd^0 zdEEaQvhdLPJZtZ9iKjo}`_{!C#oq;$rRcVlG!Xfnm$7PA%l@*0pzH!& z67Xtzt7Q|07q*R|6y|rX!~ca*?LV*`)oDh*Z})eptpCtjo2;pimzPq0@e_K5GcmeZ zx1KF6Ep3q)QcCMYzI>KcJs1YL|7&a?XoMghar5AHCqfqMCb_&0O^w|he`etv?N7y9 z7fdj|x2{}?;`3KzM$!CxTNZBG+Zk|hlAzQ2dGBebhzRbyX4Tx zZVxmCO#UG#b0pm9JLTwDjQIGHFiqa_ewAaxcoW1$?1K@z>~+F7&Y^o${MJ{edQ|rA z)i*PnOETTat0zdxUzOlUI?65rGs7SfR@X)HjM%K14Ah| z-k8Nfe7Vae8iTBbh163dXmhKoC)TgbIlF@&Q5r|{%dRasVFka$w0#~4 z`L#-i|D`Y`qK!zl5{EXhre*5%WWR<%qFwW zt2Rl?3Ag%wcT$-%QBS>1^Z9CLyK(-dr_MEA4{w@|a;f#W)G!mzgk^T<)+eKZn^;dz zPZy^4+L^^ewYAu|xP1X9j*oEZ_5Tkpf8fc8Y3q7=dI_5AKQY~0K%;)Udn%hq8@STh z(Ge3B#f54S=H}?fk8>Xn9{_HKuB-%c_br-efoe0RRgg1liIIfyTsEW#Dl_-@>Ea-J z=S~8+dE}vS{NYs}%tLM#J2v*s-o3+b5V|+Wea<%|`i&2p)qD0V_xB@O+r-Dl3ss@t z=^8mc8HV~sddT^=9+eF@KLbZiLTq8+#|IamhePG zz0W;kQxUi3kG(q*EVs+DEud9cc{>bHR4$|uPzSS2{W5jcO|-Qe^C#C+)O%dQ>AV34 zeSQ5a^QWO0Hj9nMprmnWn*q}w!6hXdVn9x4-Q~jgd~Wqrv>$D&!bs}sP&K9!u54Eto7zH z1;&~yiBT@Es`|0inPaEfA-Z($dd#4YX~KrQR9aPbr@X3BqH{83a#y?3cQuxEd+8nx5tu-^zk7L z46#-_don3T6i;rZXks{OiUwRF=OZKFRCst0rar>tw}_dKn4EvouRj3!hje{&bHLVA zd$2mD%`amkbgU6;)vXFBDK)fns`!CxyyB&C_0B|TUMn{L^=~^R`xYUGsPv}QlMXdb zD{*@{BwnvkWs`c+Ut_9Zptyhk{;%AK%6tB}7g_w?V zv9XcAb=_7hNN*eer#>qyQTP z0&)Gi3h`xn`iwth0(qvRAF{hoC{bKoj6$K#H=V#+-8-G>RQ`Pmcfs14wmbKvuMJZ3|}#MD%9fZnEtF3RBqep{s32|Ppi%=*~RN>YrR-Y2oeP+($W zVnjIMQEZ=)np$9g;$H=)^p3EyGcuIrqf)km-5Xpu;U55^3x8paD`Tl0xCxdAr^DFC~4y1%=|Gy2(wA0>}qx=Ded?PJV@sgB#flUkOW-$zTZ|PQF)78KFwu&WeAPs zx3Ur*%svAqi3~#9A~ajGl2bNK+84U#NdvLyf9mX$N^D3-h@<16uwH=g@!b8bY0-<` zIK|cVVnV%qeBKA&JuJsWbr|dzGtBFoWdyUz-@iAK?#hRPD)rTc}i8SDN%0&W!@F+6UB8bh`z;T7X^78WABHfn8 z+7Z-jp{RlCedz>0CfRIwCXjG%xX!sbjDG7)nNw|?bMb(;$l}~NowxmAOH1-trR7ISXsH!KpQbD+94SJfD0ri qMT}&^x`3l9a>W8e|7$=u#T*lxcjabodoOa$faNc6^NMq>kNyq3`U3g@ literal 0 HcmV?d00001 diff --git a/dir_13e138d54eb8818da29c3992edef070a.html b/dir_13e138d54eb8818da29c3992edef070a.html new file mode 100644 index 00000000..3f69864f --- /dev/null +++ b/dir_13e138d54eb8818da29c3992edef070a.html @@ -0,0 +1,146 @@ + + + + + + + +mrs_lib: test Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
test Directory Reference
+
+
+
+ + Directory dependency graph for test:
+
+
+ + + +

+Directories

+
+
+ + + + diff --git a/dir_13e138d54eb8818da29c3992edef070a.js b/dir_13e138d54eb8818da29c3992edef070a.js new file mode 100644 index 00000000..122e6d4b --- /dev/null +++ b/dir_13e138d54eb8818da29c3992edef070a.js @@ -0,0 +1,4 @@ +var dir_13e138d54eb8818da29c3992edef070a = +[ + [ "math", "dir_137818f07b93cd14b6ce92e51caad2df.html", "dir_137818f07b93cd14b6ce92e51caad2df" ] +]; \ No newline at end of file diff --git a/dir_13e138d54eb8818da29c3992edef070a_dep.map b/dir_13e138d54eb8818da29c3992edef070a_dep.map new file mode 100644 index 00000000..84b4a168 --- /dev/null +++ b/dir_13e138d54eb8818da29c3992edef070a_dep.map @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dir_13e138d54eb8818da29c3992edef070a_dep.md5 b/dir_13e138d54eb8818da29c3992edef070a_dep.md5 new file mode 100644 index 00000000..4f602624 --- /dev/null +++ b/dir_13e138d54eb8818da29c3992edef070a_dep.md5 @@ -0,0 +1 @@ +5ea72cb7b2b7bf1df9e61b976b56d071 \ No newline at end of file diff --git a/dir_13e138d54eb8818da29c3992edef070a_dep.png b/dir_13e138d54eb8818da29c3992edef070a_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..438538e3c8aa329c610826ea9133075735c9917e GIT binary patch literal 36192 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

s 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 + + + + + + +mrs_lib: src/timeout_manager Directory Reference + + + + + + + + + + + + + +

+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
timeout_manager Directory Reference
+
+
+
+ + Directory dependency graph for timeout_manager:
+
+
+ +
+
+ + + + diff --git a/dir_2489d4eba4efb8e04d8467655cf06abd_dep.map b/dir_2489d4eba4efb8e04d8467655cf06abd_dep.map new file mode 100644 index 00000000..fe0a2402 --- /dev/null +++ b/dir_2489d4eba4efb8e04d8467655cf06abd_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_2489d4eba4efb8e04d8467655cf06abd_dep.md5 b/dir_2489d4eba4efb8e04d8467655cf06abd_dep.md5 new file mode 100644 index 00000000..9a6d412a --- /dev/null +++ b/dir_2489d4eba4efb8e04d8467655cf06abd_dep.md5 @@ -0,0 +1 @@ +f20e3a94f41853cd3c2b5a71241b2338 \ No newline at end of file diff --git a/dir_2489d4eba4efb8e04d8467655cf06abd_dep.png b/dir_2489d4eba4efb8e04d8467655cf06abd_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..56fc2b85687e26160c179926d5d09c1d8340163e GIT binary patch literal 3689 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 C4ho_G literal 0 HcmV?d00001 diff --git a/dir_313caf1132e152dd9b58bea13a4052ca.html b/dir_313caf1132e152dd9b58bea13a4052ca.html new file mode 100644 index 00000000..fb326983 --- /dev/null +++ b/dir_313caf1132e152dd9b58bea13a4052ca.html @@ -0,0 +1,115 @@ + + + + + + + +mrs_lib: src/utils Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
utils Directory Reference
+
+
+
+ + Directory dependency graph for utils:
+
+
+ +
+
+ + + + diff --git a/dir_313caf1132e152dd9b58bea13a4052ca_dep.map b/dir_313caf1132e152dd9b58bea13a4052ca_dep.map new file mode 100644 index 00000000..218bf572 --- /dev/null +++ b/dir_313caf1132e152dd9b58bea13a4052ca_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_313caf1132e152dd9b58bea13a4052ca_dep.md5 b/dir_313caf1132e152dd9b58bea13a4052ca_dep.md5 new file mode 100644 index 00000000..3bf864e4 --- /dev/null +++ b/dir_313caf1132e152dd9b58bea13a4052ca_dep.md5 @@ -0,0 +1 @@ +f961dfe11ba27384880bed835cfbe0f6 \ No newline at end of file diff --git a/dir_313caf1132e152dd9b58bea13a4052ca_dep.png b/dir_313caf1132e152dd9b58bea13a4052ca_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..4b6035af75b3619928834d73df674f998b683aed GIT binary patch literal 2752 zcmb7GXH*l&8U;~gQ4tY!r5eD%Qo^GdLnulMARtl&M7oh8J%lQ&pe#sJ1eWU3j2Iz6 zDAE!XLa0JSgMuMIWDx=hgir(FW%vEs^W3xVojEh#_v5?s&78USo=LT}fgKZ;5a#3K zJ7!^SV#kXKyxA{wfVbXjeR+Zx1ii1oO!)Ty7{7I*a`^a!5f&zw9ioeuDG635VXcM^D62I5RA=@i%@mC4nd~b-U`bzI79At~XnTWP z7v5FF?-Fh#&K!EvizFcAF@%>LY6lKD22OH(7_l;Gnitsx3kJ{dy$g{$Z2Cq1Vv(mG z1J3s`OhyHEt-O#wev%f9O1Vez^8CBh=2f#nMC`>1qEXY^|J_9BH;%K1v|E$q zDY0@Z%e2;rc_8-5b7vX7E&qUkrE=3L_z3ro@7I3CXG=GmEUTP2iMy+r_4OK`3aDx8 zo7Pce5^3Wze7ma35de58d-t`wyL)S>m(rST%yzXr%+koXyT?21)~$)@X&Q|<_=Td6 z<1no3#|(7}5p_BEv($Dd1Y%M3q(BP}fkM$AXVmw9F+%TAW(jy;vR?e{7Z{9wA~y{a z!Us@*Y`1vQY$T}dadDixtEMFG-nM{%z~#$F5N$)7Q%AgHSZucU>7x%p_1BkZwBul4 z;DL+y#FaNYv$JU-_!^G}U(;}wUnNmmk!lx=-p)GgLLA#+XkJu zJ;IS3g7@7WcJ;@Avn?4YRK6J&q^{oHv_6%i*p0fHUu?LK%=TBzVp8Pg@|4A~EkPCz z=)J4O7hP>by?c*tql=_2BZ2mu08a`qQOEM=Yw6&x6ad(+hdXurovpl}EM$ie5&V)n<8yiz_35fwA zAvy(Cx3Jp__7wz8F7BuJE+QjtQ)X)c#hv!_3)hsElnilumV-s(aO5%j-gx~r*DLw8 zh5C~^8X6PS#CN2Ml&i&C=o$9(|jeo5sg=0Q~Wfyeh`&!?)H317l-jCnhHg{4&gZ zv?bhc+&E|EV{JZuvZtr#1DR~YeqkcFz+gm0L}2I5?SYkRR+g3nCdX4v%9{emh0p7r zaN6A3+5#7wHM-X5r^LXF7D4%g{)Ktw3K#>0TucAL=KViljO6Ub#ztr6pz34u+1c5z z;gCLad-*zshK7a~JQF|C(C=$`<%&Q7eBdD2T{#!1pkQA0KHphcJnh8`r5BH%n|V@x z09033k38FFM)ZrNDx5#>_l0_J|Az%S@*%-{b!FunosO+(jb5D{$W`Ho6&{$8X39NQ zQd1k=a2)Q4S<6%R5P`lI7s5aRJS@Ri^Mp~QU9}DBWNPvzC>dD_NWNaXX7C@k=I8zo0 zmfSvK7nacB>>!$SkCuS5sWU1IM_8|JGi{9Mq>+35oFYgbbQYgdSfirK~u*377 zT?WX}4<8P$zmGrHv6k*LO^7k8vRnR)g;kK0#M2HPIb94zX1W;a=@l0h(V0v`_`Bkv zp&=596b4;ov0h>@@VsM!0;boJl9H0MVOcUH?HXI9`$MBY)M*mF7kLIAUhdMwsn^)zqS z21@Q5&+NguX6cEIQ4;C0&^6`UA(ZN$S~$4uDm>r zL1{NOHh%En0eqxXx+TN1N*M%_k&^mAUyq5285-#7>hc@R^YimtUte$HdC^qoWOH|h zBzQ5hEpC&Mk&)q!i-&+fjL%qjRD$z9fy&dDJ<3MSwedEk4Z+XP?~J+W-Wj|8`k08+ z#Zf91$sTo@+E-6`N z-{Q)Sj|myN1yBPoL)BFg$8}Tgy3EO+HRs=q2 o!$ipUaUMbV^zi?2?({?f_^9Vn{ + + + + + + +mrs_lib: src/geometry Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
geometry Directory Reference
+
+
+
+ + Directory dependency graph for geometry:
+
+
+ + + + + + +

+Files

file  cyclic_example.cpp
 Example file for the cyclical values implementation (see the cyclic class)
 
+
+
+ + + + diff --git a/dir_405fd32de3649961a5f009c7a3fe84df.js b/dir_405fd32de3649961a5f009c7a3fe84df.js new file mode 100644 index 00000000..d3ad75fc --- /dev/null +++ b/dir_405fd32de3649961a5f009c7a3fe84df.js @@ -0,0 +1,4 @@ +var dir_405fd32de3649961a5f009c7a3fe84df = +[ + [ "cyclic_example.cpp", "cyclic__example_8cpp.html", "cyclic__example_8cpp" ] +]; \ No newline at end of file diff --git a/dir_405fd32de3649961a5f009c7a3fe84df_dep.map b/dir_405fd32de3649961a5f009c7a3fe84df_dep.map new file mode 100644 index 00000000..29176181 --- /dev/null +++ b/dir_405fd32de3649961a5f009c7a3fe84df_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_405fd32de3649961a5f009c7a3fe84df_dep.md5 b/dir_405fd32de3649961a5f009c7a3fe84df_dep.md5 new file mode 100644 index 00000000..49de0cd0 --- /dev/null +++ b/dir_405fd32de3649961a5f009c7a3fe84df_dep.md5 @@ -0,0 +1 @@ +0593bfd484a88f46ae8adc2db17d1bfe \ No newline at end of file diff --git a/dir_405fd32de3649961a5f009c7a3fe84df_dep.png b/dir_405fd32de3649961a5f009c7a3fe84df_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..09f5d45db1d506597d3a99dd482848432137b30e GIT binary patch literal 3954 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 literal 0 HcmV?d00001 diff --git a/dir_459eb1320bcc4da5aac4b85751529118.html b/dir_459eb1320bcc4da5aac4b85751529118.html new file mode 100644 index 00000000..08e77972 --- /dev/null +++ b/dir_459eb1320bcc4da5aac4b85751529118.html @@ -0,0 +1,122 @@ + + + + + + + +mrs_lib: src/repredictor Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
repredictor Directory Reference
+
+
+
+ + Directory dependency graph for repredictor:
+
+
+ + + + + + +

+Files

file  example.cpp
 Example file for the Repredictor implementation.
 
+
+
+ + + + diff --git a/dir_459eb1320bcc4da5aac4b85751529118.js b/dir_459eb1320bcc4da5aac4b85751529118.js new file mode 100644 index 00000000..ab565f2f --- /dev/null +++ b/dir_459eb1320bcc4da5aac4b85751529118.js @@ -0,0 +1,4 @@ +var dir_459eb1320bcc4da5aac4b85751529118 = +[ + [ "example.cpp", "repredictor_2example_8cpp.html", "repredictor_2example_8cpp" ] +]; \ No newline at end of file diff --git a/dir_459eb1320bcc4da5aac4b85751529118_dep.map b/dir_459eb1320bcc4da5aac4b85751529118_dep.map new file mode 100644 index 00000000..33664385 --- /dev/null +++ b/dir_459eb1320bcc4da5aac4b85751529118_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_459eb1320bcc4da5aac4b85751529118_dep.md5 b/dir_459eb1320bcc4da5aac4b85751529118_dep.md5 new file mode 100644 index 00000000..ed9d7883 --- /dev/null +++ b/dir_459eb1320bcc4da5aac4b85751529118_dep.md5 @@ -0,0 +1 @@ +969ac71d1e618cccd9c5ab6ae7949ef0 \ No newline at end of file diff --git a/dir_459eb1320bcc4da5aac4b85751529118_dep.png b/dir_459eb1320bcc4da5aac4b85751529118_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..6252b78f43062b846cf7705af60b633fbd9e63fa GIT binary patch literal 3663 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 + + + + + + +mrs_lib: test/median_filter Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
median_filter Directory Reference
+
+
+
+ + Directory dependency graph for median_filter:
+
+
+ +
+
+ + + + diff --git a/dir_47f9543a1dcda4cfb704fcee5b674cab_dep.map b/dir_47f9543a1dcda4cfb704fcee5b674cab_dep.map new file mode 100644 index 00000000..b8f27123 --- /dev/null +++ b/dir_47f9543a1dcda4cfb704fcee5b674cab_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_47f9543a1dcda4cfb704fcee5b674cab_dep.md5 b/dir_47f9543a1dcda4cfb704fcee5b674cab_dep.md5 new file mode 100644 index 00000000..5725f2c0 --- /dev/null +++ b/dir_47f9543a1dcda4cfb704fcee5b674cab_dep.md5 @@ -0,0 +1 @@ +81255dc469549eeab6d9ba80a85580dc \ No newline at end of file diff --git a/dir_47f9543a1dcda4cfb704fcee5b674cab_dep.png b/dir_47f9543a1dcda4cfb704fcee5b674cab_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..157bc6e7166e436466b039bfb5351e07a2b1fc3c GIT binary patch literal 3798 zcma)9c{G%7`ycxfBZ($Lp=4_eT7>bHy)cFC-uLvr-}5`q^W4`t&voDDI`@5juFvPX!}SoF?5w=3AP|UMTT4wJ zusOi@jhPV`b?E}@0mEo{Pg4za^83kbz$Sn|;7DyX6+@3S@|2H`;p@hZjb4An6+=yR z2|6uo{@G$Mcd*@%shE+MCT~$oo+CepbatH-lAz6<_1&Zh8E8S^tw+`Na!+Qq0Mt`@f zc&sw-b)aOXM3;R45e{#GXtUw8ETuKh{0)nTVB)@7U_=;EBCtPPbZIqP$x^0zdU}1P zu9t3By19a4HEQI3^gj0$sBx6nXq>O`Qvbm z^}Ex&I;l4VypC*hv3xE^UcqGF44<8I-6>fe)h;Sp2w#SC*St^qe#I$ao3_^?;m00K z-HZCU`T4|((M5d8$JBwazvZ)dm~_m}xne&mgn&YG`I`f zVJ4*)SrSBJTK0bxN;^Mct#9x-&9B5@_lwJ;?jmPft<*c_ z|HR!tV!wYKRa8(AqLI_ubZmsBjyXCynp8S)ewheJk;xIBFSSR>3N?WlhBnb zv^G87k-G44Oc|0k

+D=Lh0U4;j}$!$*dVIHytXYMQH*%c6VS}!4?byL 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 NwAB%6C3h?W{{ + + + + + + +mrs_lib: src/dynamic_publisher Directory Reference + + + + + + + + + + + + + +

+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
dynamic_publisher Directory Reference
+
+
+
+ + Directory dependency graph for dynamic_publisher:
+
+
+ + + + + + +

+Files

file  example.cpp
 Example file for the DynamicPublisher convenience class.
 
+
+
+ + + + diff --git a/dir_4c2e94721b2acbf7eee2d1efd59bf8db.js b/dir_4c2e94721b2acbf7eee2d1efd59bf8db.js new file mode 100644 index 00000000..223a5dda --- /dev/null +++ b/dir_4c2e94721b2acbf7eee2d1efd59bf8db.js @@ -0,0 +1,4 @@ +var dir_4c2e94721b2acbf7eee2d1efd59bf8db = +[ + [ "example.cpp", "dynamic__publisher_2example_8cpp.html", "dynamic__publisher_2example_8cpp" ] +]; \ No newline at end of file diff --git a/dir_4c2e94721b2acbf7eee2d1efd59bf8db_dep.map b/dir_4c2e94721b2acbf7eee2d1efd59bf8db_dep.map new file mode 100644 index 00000000..3df31ed4 --- /dev/null +++ b/dir_4c2e94721b2acbf7eee2d1efd59bf8db_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_4c2e94721b2acbf7eee2d1efd59bf8db_dep.md5 b/dir_4c2e94721b2acbf7eee2d1efd59bf8db_dep.md5 new file mode 100644 index 00000000..06caf9b8 --- /dev/null +++ b/dir_4c2e94721b2acbf7eee2d1efd59bf8db_dep.md5 @@ -0,0 +1 @@ +dae265ed8fc76d46ff3cd7c0532e0a53 \ No newline at end of file diff --git a/dir_4c2e94721b2acbf7eee2d1efd59bf8db_dep.png b/dir_4c2e94721b2acbf7eee2d1efd59bf8db_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..ddc0d78312bb33e4623d000807b79695178dd6c4 GIT binary patch literal 4155 zcmbVQXH-+`wngOt(uD{r1Qeu52_n*)QbcK?1PMX_Q4%oHL5d)vQi5OvDI)C%hu*t% zLp=f^p(IENMLH1zNI(-HH|LEv#{2Qkz2l6#zwzxg#`?4N-fMny&b3iimL@!$7dTm1 zSa|N-HnL&HKbiXr$4TaW9lr6H8Q9#+OpI6f75)s?eK zQ6wZSn;0KcJ?KJN4^Eun5aN$={eOYz>k?jr z7#7_bFKH_-t`E^cbG*nYa=ow)$G_pG;MKhpBPcLtLoIoOxhKP@! z*B_r+ud8Tm)Kc_1N_P><)v`NWM9&EWM0fV~3K7eztIv)@-!vTrs%5sj_2y1ZM^1J! zTW~}DwbkD#ESt?ls79l@cYq401x_YqD$ytMMz!Ez+^bh-l{z$1bC%~n7s)K` zvZ-Y%^2fcGALE!8MSik(;rTM46~5(Kh9-f9Ff(I*q z`J6`Z)=-+F2$_r&(^(TgXGPuL=jG+)CNIu^=HujaZdEHO-5?&(f$Y3XS$apRl7tJ_ zSjp;eY*_SQgL9k4XunBHMzg%6rqrRPLcA<34Ry#^SzSdRE1s+Qr>OW_{NQ(%UF<8JzIH|yd8eNas}5Yx z)YDT5`g8-xUe?^a-h*1?5;9tQQgdT`XED~$kl}&HlNsSfe9gbuN{x6FAw z`V|VchTM3rq3A^tKjy#8?~51?lvmU>K1ec^YHTdO^R5roo2TfgRzh(Q=f7xa0TUEj z!L6bXsMJq^>#f<^O<`fX(FWws!{x-NC>L=xG>vjf>I4iUgxjE$?lv`Sw$w!H*tQ<~BSxR>n(9)c|T_6w^JYwuUm7*2-?Dzb|S5+Na zSHFRcR^Oi{CQDhv;VbDNyXEDxOUv$KiAhN{{-H0!IuQuUY3^|Bi1qDG9p8(qK9SSm zKj5z+7n=MF5{B_nr=q>QURG2bX==IvHMV<`Bttjs0B3;~X7s%kY+8m&M0dAKS$SLN z)(my5NGV6h!OF^aX(9P;WeTkI$**}#UYR|z_uKkhxNYgjW9GM}v^VYa@q~tiKpsAP zZ&QMAYtN^+z#@=Gw9c)`caF9J!QC<781E6ugU`7PQF|E7!OC}qP7!f}k=$#2sZ|!< z-YYFZoZ&a+$fB4B38|rH#s^aqT`d@-8TzmORK7s zl$5kV-pw?ayuCCybH6q^dU>><3=mIDOM_Dt)H07o&GZJ-WwJH=oJgPCdL7+%0_Dqg ztgZcEuxwAyX&KA>Y|MdR4jf&C5GxipruzC1I+Hoit_U<2BNSmR8((X> zy}W|az(GWvg@M6J8DetsXlkyj>qVX{?W0rwn`L%3%f%o4(^IuJHp!Wp%Nxhkt)==gs9v;Q{tvkP7SbOuH=4KtlM9q;%1y=Q= zO5}}4<8?DLI`E01XK?d5YbpLQJgyRA=l%rRO};2L9l;hmJ!>e1256)e}I*q=R6oImbJ{ zelU{0qfxEu3(7-sz3e!Fa7+q*mzV#SWY*6FN(3H4 zoAdG_+o{ClMm5DWO>-BQ+}PM|ncVLWm+FQ*SXtu)1sNC4pC1gor1bzfXbQ$ArSTgeFVMP`Kr1|AM) zPnxGZ2-|3|VYhPZsq9@wlA!(p9&Fr29b5g^a&38vj8<{@0lpb*!bot&Zz) z!^Ev=KzVuF@c7@3ju?bZH=Yv_j;vHE1}>SI;^oyLfo%IROp{Zxa6v3TEv5c_UNKO+ z_C2UaV_x*%TdRbdUPeYnS7Az5B_$*b%8EULBg=Ppcl-Ko`4dEHH>aCy0S#f)M}=JX zWAgL!b93j`=t$x68ii}ulJklUV|kTfaeklwsX*#B*Vfj)eanwTBE`^6j|io2-tZR6 zU%SXbd^cV1IX3OnN&5OVWMjOf4uO-Fl2V2xolq`Ete;E&_RTGN!9Hw8i@FU1_1$8I@hnU3*5OfZ9(|Qd6__BXiabxH)c>7d1TSf0HPpo|cmG>C>mH zu-7Lraa4%j;db}l-rne_4HyhAL@FyVYnxeEV6j-;r~Bn)W%6SU=R{e_r-Pn6DJ&?k z22i`Wl<f3*5KIjL-wVU6E#t5KFx zQL+6|IXE=*u;o^F^kAo0S$jKacDAFllaUmlDQd~2&cwvToU&^|KLffSOn&|PDkkQ` zd!28OF+Dw(6%@EjMp-bUm(|qn7TD;{=v}?aFCtRL2utALjsCE=zdtoOIa0J~=y30z zT&gJ-7uT)QYndysV2?>d}a#;TIGd(>$+}e>83I&Zq-7gh; z5M{W)A*K_uJrjUyXlN*LeEj$^fU{Q;ym6C9lE`6hZl0H)PcSj$jTICTc@0VAz+7+$ z46LVle4U#U2LiE=b#I-B?MmX|<<-*CQd3p62B^9Zq!bo1yU-hG9m6Y0{1d8>W-hIw z`q!0+Mw^u0IweUgcItdanx4+g+1}lCYY~-nUBXN?Cdw&I;7Xk}LYX*nymX1?09;-* zsc^_I3OeJul0qu&~U#FKcG053fxw52nA4kAH+j z7J+k}@7>cHC@?lQ&dAKPx3fD706at>%BB~;eUp=y$7N}b;qmiZTg*aC6y0zO;64)& zTrwUV7l(<98wt!(MG|M*pRRlQ_)sbwn?}d>NP0{Dnz~t#yLTUjNTU1YL7>7S5fPCq z@wDZ1m(tQw+4z=#RbG-MpC@PZi!J>4xKUFXL=Kex^oSNj@=nKG$d^oOZ`akmIk!?; zR8&-1`34Ku$BaoW`8TJgriMjrNR1PTHh|v69jF2mFm82|Kp-$EC`hYhZaXm*94*Ow zVVe>Nfk43NGY%JNP$-mnQt@LI6&1{(1V`D}c;w|(P*>35(qttos_yNCM3Vow^NwS} zJFagnj(Rof#>J%DX$lUzW6U9_HQ0wT+a4Vq-A#+@{Z?LHzQ4cEoHZJd6QhYB5Qs@I zmgeRVSpXBKSFT*y_zeWDzIf@<0&`K~fMhSoVVv-xsM5go G#lHa33Hsjv literal 0 HcmV?d00001 diff --git a/dir_4e76df18d944fae8b852653d4ae3a030.html b/dir_4e76df18d944fae8b852653d4ae3a030.html new file mode 100644 index 00000000..c98ce79d --- /dev/null +++ b/dir_4e76df18d944fae8b852653d4ae3a030.html @@ -0,0 +1,109 @@ + + + + + + + +mrs_lib: src/nckf Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
nckf Directory Reference
+
+
+ + + + + +

+Files

file  nckf_tests.cpp
 Tests for the UKF implementation.
 
+
+
+ + + + diff --git a/dir_4e76df18d944fae8b852653d4ae3a030.js b/dir_4e76df18d944fae8b852653d4ae3a030.js new file mode 100644 index 00000000..7c6a6202 --- /dev/null +++ b/dir_4e76df18d944fae8b852653d4ae3a030.js @@ -0,0 +1,4 @@ +var dir_4e76df18d944fae8b852653d4ae3a030 = +[ + [ "nckf_tests.cpp", "nckf__tests_8cpp.html", "nckf__tests_8cpp" ] +]; \ No newline at end of file diff --git a/dir_52bd7864aeac0cbd0134df90af2e1447.html b/dir_52bd7864aeac0cbd0134df90af2e1447.html new file mode 100644 index 00000000..7624ffb7 --- /dev/null +++ b/dir_52bd7864aeac0cbd0134df90af2e1447.html @@ -0,0 +1,115 @@ + + + + + + + +mrs_lib: src/notch_filter Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
notch_filter Directory Reference
+
+
+
+ + Directory dependency graph for notch_filter:
+
+
+ +
+
+ + + + diff --git a/dir_52bd7864aeac0cbd0134df90af2e1447_dep.map b/dir_52bd7864aeac0cbd0134df90af2e1447_dep.map new file mode 100644 index 00000000..747d6be6 --- /dev/null +++ b/dir_52bd7864aeac0cbd0134df90af2e1447_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_52bd7864aeac0cbd0134df90af2e1447_dep.md5 b/dir_52bd7864aeac0cbd0134df90af2e1447_dep.md5 new file mode 100644 index 00000000..49fcafe9 --- /dev/null +++ b/dir_52bd7864aeac0cbd0134df90af2e1447_dep.md5 @@ -0,0 +1 @@ +1a3c18f6d74392243a1929f65a71744e \ No newline at end of file diff --git a/dir_52bd7864aeac0cbd0134df90af2e1447_dep.png b/dir_52bd7864aeac0cbd0134df90af2e1447_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..f682740c98dab56832e9b55d1106ef55b5ec2195 GIT binary patch literal 3271 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 literal 0 HcmV?d00001 diff --git a/dir_53e6fa9553ac22a5646d2a2b2d7b97a1.html b/dir_53e6fa9553ac22a5646d2a2b2d7b97a1.html new file mode 100644 index 00000000..f9005ea2 --- /dev/null +++ b/dir_53e6fa9553ac22a5646d2a2b2d7b97a1.html @@ -0,0 +1,102 @@ + + + + + + + +mrs_lib: scripts Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
scripts Directory Reference
+
+
+
+
+ + + + diff --git a/dir_59dc5f73bda78a76f6ce4f5474a95632.html b/dir_59dc5f73bda78a76f6ce4f5474a95632.html new file mode 100644 index 00000000..04e4a304 --- /dev/null +++ b/dir_59dc5f73bda78a76f6ce4f5474a95632.html @@ -0,0 +1,115 @@ + + + + + + + +mrs_lib: src/attitude_converter Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
attitude_converter Directory Reference
+
+
+
+ + Directory dependency graph for attitude_converter:
+
+
+ +
+
+ + + + diff --git a/dir_59dc5f73bda78a76f6ce4f5474a95632_dep.map b/dir_59dc5f73bda78a76f6ce4f5474a95632_dep.map new file mode 100644 index 00000000..a945ce63 --- /dev/null +++ b/dir_59dc5f73bda78a76f6ce4f5474a95632_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_59dc5f73bda78a76f6ce4f5474a95632_dep.md5 b/dir_59dc5f73bda78a76f6ce4f5474a95632_dep.md5 new file mode 100644 index 00000000..6eec613b --- /dev/null +++ b/dir_59dc5f73bda78a76f6ce4f5474a95632_dep.md5 @@ -0,0 +1 @@ +62fe6815cf8e779115050f4bff99f432 \ No newline at end of file diff --git a/dir_59dc5f73bda78a76f6ce4f5474a95632_dep.png b/dir_59dc5f73bda78a76f6ce4f5474a95632_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..4f920790ce408ebe02cab4c323274efd1f3e1bc6 GIT binary patch literal 4267 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 literal 0 HcmV?d00001 diff --git a/dir_5b7f8725d4f972ca8245f6a979e7a433.html b/dir_5b7f8725d4f972ca8245f6a979e7a433.html new file mode 100644 index 00000000..c61f33be --- /dev/null +++ b/dir_5b7f8725d4f972ca8245f6a979e7a433.html @@ -0,0 +1,115 @@ + + + + + + + +mrs_lib: src/mutex Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mutex Directory Reference
+
+
+
+ + Directory dependency graph for mutex:
+
+
+ +
+
+ + + + diff --git a/dir_5b7f8725d4f972ca8245f6a979e7a433_dep.map b/dir_5b7f8725d4f972ca8245f6a979e7a433_dep.map new file mode 100644 index 00000000..e822bf80 --- /dev/null +++ b/dir_5b7f8725d4f972ca8245f6a979e7a433_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_5b7f8725d4f972ca8245f6a979e7a433_dep.md5 b/dir_5b7f8725d4f972ca8245f6a979e7a433_dep.md5 new file mode 100644 index 00000000..27aea95f --- /dev/null +++ b/dir_5b7f8725d4f972ca8245f6a979e7a433_dep.md5 @@ -0,0 +1 @@ +d19588e7f6436991d6a7cd593642ae95 \ No newline at end of file diff --git a/dir_5b7f8725d4f972ca8245f6a979e7a433_dep.png b/dir_5b7f8725d4f972ca8245f6a979e7a433_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..372bf508cb93c0b38a9cc6d90935c08dcd563a17 GIT binary patch literal 2996 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 fP{bdN=8kaH6eInDDs{i04F@bQgH0) literal 0 HcmV?d00001 diff --git a/dir_5cd313a56eb052b35bf1996eeb3f0983.html b/dir_5cd313a56eb052b35bf1996eeb3f0983.html new file mode 100644 index 00000000..76b1bc06 --- /dev/null +++ b/dir_5cd313a56eb052b35bf1996eeb3f0983.html @@ -0,0 +1,115 @@ + + + + + + + +mrs_lib: test/service_client_handler Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
service_client_handler Directory Reference
+
+
+
+ + Directory dependency graph for service_client_handler:
+
+
+ +
+
+ + + + diff --git a/dir_5cd313a56eb052b35bf1996eeb3f0983_dep.map b/dir_5cd313a56eb052b35bf1996eeb3f0983_dep.map new file mode 100644 index 00000000..c4a458df --- /dev/null +++ b/dir_5cd313a56eb052b35bf1996eeb3f0983_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_5cd313a56eb052b35bf1996eeb3f0983_dep.md5 b/dir_5cd313a56eb052b35bf1996eeb3f0983_dep.md5 new file mode 100644 index 00000000..656e78e9 --- /dev/null +++ b/dir_5cd313a56eb052b35bf1996eeb3f0983_dep.md5 @@ -0,0 +1 @@ +c6dc08f76f3daa292c8ea2b95427bd0a \ No newline at end of file diff --git a/dir_5cd313a56eb052b35bf1996eeb3f0983_dep.png b/dir_5cd313a56eb052b35bf1996eeb3f0983_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..cdd99e55149f6f00ba700807bc387b3f0967af52 GIT binary patch literal 3856 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 H*fHWCNP(s$ literal 0 HcmV?d00001 diff --git a/dir_627f9e3e44b98db30b77a80b8afbb9e4.html b/dir_627f9e3e44b98db30b77a80b8afbb9e4.html new file mode 100644 index 00000000..fddf6188 --- /dev/null +++ b/dir_627f9e3e44b98db30b77a80b8afbb9e4.html @@ -0,0 +1,115 @@ + + + + + + + +mrs_lib: test/ukf Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
ukf Directory Reference
+
+
+
+ + Directory dependency graph for ukf:
+
+
+ +
+
+ + + + diff --git a/dir_627f9e3e44b98db30b77a80b8afbb9e4_dep.map b/dir_627f9e3e44b98db30b77a80b8afbb9e4_dep.map new file mode 100644 index 00000000..4ece1cbc --- /dev/null +++ b/dir_627f9e3e44b98db30b77a80b8afbb9e4_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_627f9e3e44b98db30b77a80b8afbb9e4_dep.md5 b/dir_627f9e3e44b98db30b77a80b8afbb9e4_dep.md5 new file mode 100644 index 00000000..a91093fb --- /dev/null +++ b/dir_627f9e3e44b98db30b77a80b8afbb9e4_dep.md5 @@ -0,0 +1 @@ +ad80c390f4857718c6d7e16a06d27012 \ No newline at end of file diff --git a/dir_627f9e3e44b98db30b77a80b8afbb9e4_dep.png b/dir_627f9e3e44b98db30b77a80b8afbb9e4_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..24ce07f3d1f84592df1c4828fd9817dd88158a82 GIT binary patch literal 2740 zcmai02{aqn8uqGG38MC0w6*pLwTm*fG-#<>hZdzYrJY(M5kVF01g&lGRHZ{2p`ImU z7m;eLQQIhEni92)B@3y2f0^@^^JdP>d*|N!|Npt?o_o*z|L=bH!??OYMTHfF`S|!m z9Ubi4cs_wQ`h`yLY;x-x37!)Sx(c=9JN~tOPbTE?@d<}I+FkZQzGP1&xJn`v-f|fl z=YT|sIS1tvkGrsskWZ3z)19DeqC#3iHo<)$i*cRwCS0Z=Y^5Ml=cs*&CT?iMAG%dZR zA$i$L^O4HiRjJsg$y0&15pt8tf`1kU_TF1&u~;u&ywFw@hQnL*ii=?uFuuf=z(j~`upi*azb)X9{@oTIr&|juO32D=wxH#^_MS$Wiry9)QE`s znOa!*dU@q$10xUj?qKXL#`-;+U7}Q_0%42hS*q6h3Q!@Co?cC9Y2g0$YS;sGn7$lm znoPa}{c&VuX1uD<`uL#M_ZwYrwrRC@d zgjSujvG4x*QoNg7{yc~Kkj^XJe^v4Sh6S~n4$jVZ5hnDiAn% zAu=*D1W`XjqdC2MXA;p20R=A(B`BIa2ui503%*zY?)x2N{_L=n+NqS3eCwmHcUBHQ zfBswoIcEK`<>d+_ga<=x(b{UhyUU;j zdtB)WQ0sx*IIyBLH#5gq9Pk%scDPEVt~*rmMR6quWqJAjp(Dt~$n+y-@BaORgLP`- z{gkq@p!y$Ngwt%6KI>EGIB98wbGf1PCiY{MzTgNl$xhus4zLjeh3-#26;mDB;QB}@ zliNu90$n4Ck~N6!O-~u=63+7S!_ZL`^IWSf5ClS6?bs(YH-~$CaLQ0Uy&Xy3&pF$h zxQid_g<`Y6PtVLGB0bcA=-m)bx->{aqO-c%B3r^m?5BWXBogW6am(P?;QRtVYL=D{ z`K3r+{%2m_*x=5YPbf{ljyyy*d;Skz_+#SeJUXsTTpz^L!{pIp8>^B7Q`C25LLe&D zmi2JUdx~l+i0NAl zW^(fDC2o`~F86)MsfP0May&j{<;jo(8htQLjxW^n6TXyvJlTNhBy?S54rxo-OUud{ ze!R(f`&$P3J)G)FIF*%^Qua5bLSVg{;v}`E50^AGdxJ0L7Z%!z2irU#Kq$Xu$)>SO zU~pDhMPHu-Zq$L2y~<*xs(ffcuIWB0@~Sdccy?#8p|R1}$Y^8?1Of^2$f)x#LH9Db z%c#d|Yil$bjjJM!u|tvlHS&C-9rAhz>zTgQDyyL6uj=j&DsoZMn?m&?tXsCN=g8;*N!s`t{zb6jHKjXZP?vm zEE&BUH3@P)am?H1L)hlpnm)+xf{do7rpU+$scm{W`S{WjiI+e%ukRN~DqfUwL{S29E3KT1tRYU8P9$ zxrN=5CR*4ifiH`+uJC8S+<(w~+y?gf;T#woK0CnNM2Y!}h)&*7z|~jo&&T22->>4=ecTmXh~f&#g8p3DJu^u8ikh< zi8(;^!hvPdg*2PM@bGYVcS+qjSUPF@1`3Ikd)7m^{%Yuzby9oCxigr~+usxDbo%mX zZ||Ruj*hmrVlBwKSFR!uh~%$Erl+m$PyAh5WxqIb0hu)ZsWsYD$J5D)hJ$9IP$=Hb zhhJHT6Eoc^EqTuXfoS%sa=w0@0Mn654;d)HmzT%J#26VFDOn;%+B+*MD(2_sHLqg< z0KkWd2_Edl#l(E!wMQAGsnejew6qMFzxtA5s|kd~!D3VInp>g7x5PWW77)lnRI3v{ z9fL6#2J7i@m`ryqDV_ZEj@(=?SJ#<^1!)7t-Pc+p{O?gowtV{~(_Iym+ j56}jRj~4$W>$u?&X7Fjt!<>1Z4CQmQcd@Inx&8Pb6mfD{ literal 0 HcmV?d00001 diff --git a/dir_6584bc0d88c193127476cb5dc95baf39.html b/dir_6584bc0d88c193127476cb5dc95baf39.html new file mode 100644 index 00000000..eb88ff9a --- /dev/null +++ b/dir_6584bc0d88c193127476cb5dc95baf39.html @@ -0,0 +1,102 @@ + + + + + + + +mrs_lib: src/image_publisher Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
image_publisher Directory Reference
+
+
+
+
+ + + + diff --git a/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/dir_68267d1309a1af8e8297ef4c3efbcdba.html new file mode 100644 index 00000000..894dfb59 --- /dev/null +++ b/dir_68267d1309a1af8e8297ef4c3efbcdba.html @@ -0,0 +1,165 @@ + + + + + + + +mrs_lib: src Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
src Directory Reference
+
+
+
+ + Directory dependency graph for src:
+
+
+ + + +

+Directories

+
+
+ + + + diff --git a/dir_68267d1309a1af8e8297ef4c3efbcdba.js b/dir_68267d1309a1af8e8297ef4c3efbcdba.js new file mode 100644 index 00000000..3fa81237 --- /dev/null +++ b/dir_68267d1309a1af8e8297ef4c3efbcdba.js @@ -0,0 +1,13 @@ +var dir_68267d1309a1af8e8297ef4c3efbcdba = +[ + [ "dynamic_publisher", "dir_4c2e94721b2acbf7eee2d1efd59bf8db.html", "dir_4c2e94721b2acbf7eee2d1efd59bf8db" ], + [ "geometry", "dir_405fd32de3649961a5f009c7a3fe84df.html", "dir_405fd32de3649961a5f009c7a3fe84df" ], + [ "lkf", "dir_9e9e485811fd7b0342cca4e7c3cf123b.html", "dir_9e9e485811fd7b0342cca4e7c3cf123b" ], + [ "nckf", "dir_4e76df18d944fae8b852653d4ae3a030.html", "dir_4e76df18d944fae8b852653d4ae3a030" ], + [ "param_loader", "dir_d81f13436e73f242cdf25a742f3a9678.html", "dir_d81f13436e73f242cdf25a742f3a9678" ], + [ "repredictor", "dir_459eb1320bcc4da5aac4b85751529118.html", "dir_459eb1320bcc4da5aac4b85751529118" ], + [ "rheiv", "dir_d20a67be47c1454b19aa07d8b0143440.html", "dir_d20a67be47c1454b19aa07d8b0143440" ], + [ "subscribe_handler", "dir_f003de2bf99885e59674f01f3665fb82.html", "dir_f003de2bf99885e59674f01f3665fb82" ], + [ "ukf", "dir_a5078ef47331b4526bf3f96e987ee465.html", "dir_a5078ef47331b4526bf3f96e987ee465" ], + [ "vector_converter", "dir_dcbbf3bfcdb3d005110c6ee2b744bf08.html", "dir_dcbbf3bfcdb3d005110c6ee2b744bf08" ] +]; \ No newline at end of file diff --git a/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.map b/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.map new file mode 100644 index 00000000..c707bf57 --- /dev/null +++ b/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.map @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.md5 b/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.md5 new file mode 100644 index 00000000..2b6c83d9 --- /dev/null +++ b/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.md5 @@ -0,0 +1 @@ +b3da8cdcfd27d1933d5e030747244bef \ No newline at end of file diff --git a/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.png b/dir_68267d1309a1af8e8297ef4c3efbcdba_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..866f01e421005aaa5e42adc9055f7b8d6310d861 GIT binary patch literal 63373 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 + + + + + + +mrs_lib: test/subscribe_handler Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
subscribe_handler Directory Reference
+
+
+
+ + Directory dependency graph for subscribe_handler:
+
+
+ +
+
+ + + + diff --git a/dir_6aa5eb41b348da9a1414d58156a58f5e_dep.map b/dir_6aa5eb41b348da9a1414d58156a58f5e_dep.map new file mode 100644 index 00000000..5f2ae2d9 --- /dev/null +++ b/dir_6aa5eb41b348da9a1414d58156a58f5e_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_6aa5eb41b348da9a1414d58156a58f5e_dep.md5 b/dir_6aa5eb41b348da9a1414d58156a58f5e_dep.md5 new file mode 100644 index 00000000..b01a63a7 --- /dev/null +++ b/dir_6aa5eb41b348da9a1414d58156a58f5e_dep.md5 @@ -0,0 +1 @@ +4401bf5c9a24580ed253b8f50ce4d838 \ No newline at end of file diff --git a/dir_6aa5eb41b348da9a1414d58156a58f5e_dep.png b/dir_6aa5eb41b348da9a1414d58156a58f5e_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..620b2a1af9bf9f0af02f92cf3a5eefd22f1f8bf0 GIT binary patch literal 4065 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 ag~dCwg^F0lhXOr2Nc*;~Mv1z4@c#gVZmFmM literal 0 HcmV?d00001 diff --git a/dir_7164529cd9c8f96b25598799ea656806.html b/dir_7164529cd9c8f96b25598799ea656806.html new file mode 100644 index 00000000..7caa222d --- /dev/null +++ b/dir_7164529cd9c8f96b25598799ea656806.html @@ -0,0 +1,123 @@ + + + + + + + +mrs_lib: include/mrs_lib/impl Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
impl Directory Reference
+
+
+
+ + Directory dependency graph for impl:
+
+
+ + + + + + + + + +

+Files

file  ukf.hpp [code]
 Implements UKF - a class implementing the Unscented Kalman Filter.
 
file  vector_converter.hpp [code]
 Implements the convertTo() and convertFrom() functions for conversion between different vector representations (Eigen, OpenCV, tf2 etc.).
 
+
+
+ + + + diff --git a/dir_7164529cd9c8f96b25598799ea656806.js b/dir_7164529cd9c8f96b25598799ea656806.js new file mode 100644 index 00000000..eecba817 --- /dev/null +++ b/dir_7164529cd9c8f96b25598799ea656806.js @@ -0,0 +1,13 @@ +var dir_7164529cd9c8f96b25598799ea656806 = +[ + [ "dynamic_publisher.hpp", "dynamic__publisher_8hpp_source.html", null ], + [ "param_provider.hpp", "param__provider_8hpp_source.html", null ], + [ "publisher_handler.hpp", "publisher__handler_8hpp_source.html", null ], + [ "service_client_handler.hpp", "service__client__handler_8hpp_source.html", null ], + [ "subscribe_handler.hpp", "subscribe__handler_8hpp_source.html", null ], + [ "timer.hpp", "timer_8hpp_source.html", null ], + [ "transformer.hpp", "transformer_8hpp_source.html", null ], + [ "ukf.hpp", "ukf_8hpp.html", null ], + [ "vector_converter.hpp", "vector__converter_8hpp.html", "vector__converter_8hpp" ], + [ "vector_converter_types.h", "vector__converter__types_8h_source.html", null ] +]; \ No newline at end of file diff --git a/dir_7164529cd9c8f96b25598799ea656806_dep.map b/dir_7164529cd9c8f96b25598799ea656806_dep.map new file mode 100644 index 00000000..bb8537d9 --- /dev/null +++ b/dir_7164529cd9c8f96b25598799ea656806_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/dir_7164529cd9c8f96b25598799ea656806_dep.md5 b/dir_7164529cd9c8f96b25598799ea656806_dep.md5 new file mode 100644 index 00000000..98ea4795 --- /dev/null +++ b/dir_7164529cd9c8f96b25598799ea656806_dep.md5 @@ -0,0 +1 @@ +f63840359d9981fde8b945d5739d027e \ No newline at end of file diff --git a/dir_7164529cd9c8f96b25598799ea656806_dep.png b/dir_7164529cd9c8f96b25598799ea656806_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..136e86cef38566fdb771e90e266fdc5cf5a929fb GIT binary patch literal 1708 zcmaKt3p5jY9LJ~T{hDXnBC<(ju@moifH(Rt6P9UyV&T$ zeohf-53o*oD_3q14JPOk)X*wWE&-BmlK*rp3+;<^glz-b>d4d0aWD>aopzcAa0`(2 zT8+PhA&1-Ex<2dHasO!RUYy~ut-o{oO%_WcUA^l5^XQpk) zr5``hpnMa_V^I0Jc4vGX0zM*WPeM1N0h=#{^^WtJ%(mn2Wc!wuY#yW6~d(P(vl=`9e%$L+Cs^%4I9%;ipfgN=exfN&XR%t}Z_VyRt-b zg=0{V)ho^(th>A7?`(F?MP2%_XU*68zHo)YvSE8Yz4sl@JZOAA$n%lZn#Z(Fy{Iei z6bLAuUj#gadt85m#YCR55@T3C8PGfsa#(AP%|7w*iY;_!-RUy;_%P7XBteM)uI z%0_tHo0=ELdDcBo+nvXGJ6Nq>Rki)K$jyBYHY*Zjb2#=`{I+D0M@DC-n@|{?GB&pM zcwqfz{$gODgx^pLv^hCzY;CQYnz|DVjoHMX=UKfi{rGX+#!Wc6qen4*0c^2!L1{Y_ z;ono7JT*mto8HW_4YxVDqVg;+;rx;N{@nh49SX&$`3(kuEKqYfW{{DosZ{gm;lnj> zczH@w0w5zJ(wCd`OH~aNxc&{qU%D(t3q(RYOx#vqAKd z-E@|cAU8A9_5>2`(4-C*Z|w3QWn z^zxz}4!@fCGBC9pg%~kxnJ$-SW!JuBTuV@*)CV%3UpAxd>e%E||L#eiQZs^=Z zu&(aA(Q!9beFRyJIiWbexTuVb4+*iiu;>h%95GCx;YYg)$Q|#efe^tFJA;K~$(|w< z)$g6@>hVKZ1*f%UXQ z)Eoi_Oz8HZD>d-pnQoAuP)>WDfZ2p(}Z(BWXPwwRI6~gD+E`muA$+kgNF_oqtRe0)yTJ} zSQJ^SwwFk{R$dOYcxjQ67N7Fs#e1uQK`(K{6{4&}n|B$F6sy+QxEEw}^;~)R_MxUX znKdnDpFSq(qX>xO5XoJg?GIy!^f-VAL*`PB~bms?ruPH9buu zH_F3cExm!+K0Je+CNPYHOJ`t2)GD=huLF1Ba2--lPR@urH!%qUKL9B>HD(qkP7_dz zLv_>b8)9Q)TiV+PCgSfP3v9|sOSTR)8a_) + + + + + + +mrs_lib: include/mrs_lib/geometry Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
geometry Directory Reference
+
+
+ + + + + + + + + + + +

+Files

file  cyclic.h [code]
 Defines the cyclic class for calculations with cyclic quantities.
 
file  misc.h [code]
 Defines useful geometry utilities and functions.
 
file  shapes.h [code]
 Defines various geometrical shapes and their relations.
 
+
+
+ + + + diff --git a/dir_85b0de967ad5400027712e30c95ca897.js b/dir_85b0de967ad5400027712e30c95ca897.js new file mode 100644 index 00000000..f941fea7 --- /dev/null +++ b/dir_85b0de967ad5400027712e30c95ca897.js @@ -0,0 +1,17 @@ +var dir_85b0de967ad5400027712e30c95ca897 = +[ + [ "conversions.h", "conversions_8h_source.html", null ], + [ "conversions_eigen.h", "conversions__eigen_8h_source.html", null ], + [ "conversions_opencv.h", "conversions__opencv_8h_source.html", null ], + [ "cyclic.h", "cyclic_8h.html", "cyclic_8h" ], + [ "misc.h", "misc_8h.html", "misc_8h" ], + [ "shapes.h", "shapes_8h.html", [ + [ "Ray", "classmrs__lib_1_1geometry_1_1Ray.html", "classmrs__lib_1_1geometry_1_1Ray" ], + [ "Triangle", "classmrs__lib_1_1geometry_1_1Triangle.html", "classmrs__lib_1_1geometry_1_1Triangle" ], + [ "Rectangle", "classmrs__lib_1_1geometry_1_1Rectangle.html", "classmrs__lib_1_1geometry_1_1Rectangle" ], + [ "Cuboid", "classmrs__lib_1_1geometry_1_1Cuboid.html", "classmrs__lib_1_1geometry_1_1Cuboid" ], + [ "Ellipse", "classmrs__lib_1_1geometry_1_1Ellipse.html", "classmrs__lib_1_1geometry_1_1Ellipse" ], + [ "Cylinder", "classmrs__lib_1_1geometry_1_1Cylinder.html", "classmrs__lib_1_1geometry_1_1Cylinder" ], + [ "Cone", "classmrs__lib_1_1geometry_1_1Cone.html", "classmrs__lib_1_1geometry_1_1Cone" ] + ] ] +]; \ No newline at end of file diff --git a/dir_8607dcdb705c79ef4c5b76c004c42748.html b/dir_8607dcdb705c79ef4c5b76c004c42748.html new file mode 100644 index 00000000..185a2db3 --- /dev/null +++ b/dir_8607dcdb705c79ef4c5b76c004c42748.html @@ -0,0 +1,115 @@ + + + + + + + +mrs_lib: src/transformer Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
transformer Directory Reference
+
+
+
+ + Directory dependency graph for transformer:
+
+
+ +
+
+ + + + diff --git a/dir_8607dcdb705c79ef4c5b76c004c42748_dep.map b/dir_8607dcdb705c79ef4c5b76c004c42748_dep.map new file mode 100644 index 00000000..38ca70c3 --- /dev/null +++ b/dir_8607dcdb705c79ef4c5b76c004c42748_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_8607dcdb705c79ef4c5b76c004c42748_dep.md5 b/dir_8607dcdb705c79ef4c5b76c004c42748_dep.md5 new file mode 100644 index 00000000..7fd7065d --- /dev/null +++ b/dir_8607dcdb705c79ef4c5b76c004c42748_dep.md5 @@ -0,0 +1 @@ +e745e2a121e77baac1d2e587e4db7541 \ No newline at end of file diff --git a/dir_8607dcdb705c79ef4c5b76c004c42748_dep.png b/dir_8607dcdb705c79ef4c5b76c004c42748_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..bbb7b96ff0c23650724f1138d71fbe8c026fa9a2 GIT binary patch literal 3484 zcmb7Hc{r478+TgBzSWT>G08GUgzQ_>SYpOHF^w3NBw0=vYe+>VSt3M?7)(QiY(ofH zCXBIX8B1tHW6jvY_n!0T`ObBH-+A8O`#jhCT=)CD?|nb_@_TUBmZrR1Vq9!&Y`mAv zV79>c61XYH4gtNjucr(!u-~vSg|Qv{dA+VDCIgZ-mthx?L7B{~P-{B}v5!_}&5B}z z5Q8KENwmPlht|QU9G6o^A8~bta!P%@aVK%XGwf}V8hX*TXbKI+el!zpf0*EL)WSg& zTNiM>{dQRe-^VPrvHyTtc)?oZi~n@*F9@^<%D57?=v5X=|j@^(&uo^~To) z`rHYP2>@|QFD>CmMz%*KquisA8E=@lI>XfF)n1WD?QmX;rAMHuu6K@ix-9gfri@QA38=uhK4biH*dBaT&B1} z&J3S0f|a8nH*d0DDA*z3@Nv5SlYzTPk<$FcUJmYFbH-AWZ#m`(KvD!^RVeJ|kJzMR4WxmRiu54|I zpnnMP%A*!VeTw2HCMV_kJIdkD{J&pgv&*w3!4U|7V+A`qwX{>Qk!(o|DehS!5%zhHoW zq2J5W+M;*c#N&rcoC?+wPU(V#MplC|r>62JBO;yvzM(|z?xyw_y4|5{t+X@>L3MOS zH9cd(_ON$N+tW!TPAk0sodt=BitKE6234u4$zuDL!o&o%+UJ1LZ^f^K`Y6Ihtlyl- z9#}Z=$sZgZuDfZv(;NkLbc~&MUnQ8v^%QqMI1QGLHZ+wqbVgw?$(ay9uK`!Qo`Ryh z7Grw4)m62nIhRu!oKjd=sH&jQH#B6Rr{*30y5QLKxtZ5~;hG3K*OLKY4TJdP7TYiyim zq8YaJM_axHV|~4c`ifB#wp&1>&0W9VtLcpl!0rVOf*T(^n7ca!6M#+x%Z0nRysp`* z&CefQ5(>e8|aJs$1UQUTx2&W?XpEF6`|HPIHirgiSTnN+J4`D2qJ`` zZ{Io-gbE4@0L3zRnQ%CqgZ=p9#J08&Xv}*xpDh~%f|p7yA>37yQIBy|F|j}R$KswnD=ZpQQYyv|UtoIlORK|+-@A2}6c$PVZ7&s?V_h_O zZAo2YY-_0aX=dhI5eMwvP71%lmW7j3oGl4SLLNTM)qNJn?&uhb!8C48MpPFw@A<70 zm}8ptdjSF$Brt~zCS~Q_H|myUhlcDGkM9L8PrNXLX6uKtd@H{Th{3!^D=Oc<^`}ax zEfiw4G&HJ0SrTTJ@q%1r-9T?nPR`JKR~j1j`wOnZOxQ<85Iq!162;O_%g#h3netRC zQ^BW!tRnUCCd<>=(z2=OQ+BeQiVxln2BUol9&)TMX#FIU@sf6M#k76wzK#~^v#W7U z->+6{#qPUz>%xoJyw|mZFFrRi`uCvi`E~$-bM6}LMj1s0s0bzNI#`IRy!!=d80nXB z^=nNee{jp8z6U?wI) zP|IusM4;5p(VqXM)yrp~d|QP_O)e@YAwxA^0#R~sljkENBbP2+YHe-x=g75?C731t zjRXK9!NI{i>}OdjBy zkA8VkQO4HRG`|SbTV<%Grlu8$P$EDc?%lfwPVw+>Ko`fy#;V=dV`rNhFh3@G^5o0& zH`%f2Y7%~a>r|@c0x9a_18oojfoN%N{^H46for@vB`L|*2Z{tI2?&Xc>wXO}B_Z3| z+WJl;G(>7w3PIU9IDo1*GPtoQJPmw$=%HXSVBaEV-WNk z1Xw~?n2_$2Vtxw_=c!+vKT&F@DDCR*ZYCw5uBj;ub?d>?$H(C_YKa@Xvw{>C6&WF1 z*`Mtm6ne-d_6RFR<}uRVzLre3;dF3tsBP&zqmJw9l9`)}zO%65(;)pA`R>}Cm)~L% z_(#fHjl6gt6%^I1`P$lC{9tOZaqYCsv8d=*NJTKu08M_rPGXZKJE}Lhn~%%c$5m8o z8ac{E-n_{F`=xUvvoY3 zoVvOn;d(UefNTY6+l_&>bp(lM-}g9ygVhBvxp;VHeaZ3h@oCDKg0;|)kiPzY=8qo* zR@wNZB-I^Rh(R{S-rgjC&R6?U)BMts>|?#~Unt1$e&lPnZ!`QD)H|OyS*!vgkvj^? z&COkg8vpX;&1QIm>WtIuF)l7HRaI5AqvOoX%vmAM$|KgG=i_8QMqj?g#>R%Eq$E&z z#cz7q*w_FW^umP;fah*+Z)f}hnCKJ!)6R|I^&}F7LQzmxM;6;J5_D@H<8>!mTAsAA ze#j{+zZ)OF24;Ty7BEkf1|#TMXVN-J(`zf!Eg}*fGpi-n$k2R}DO5jrEw7*;S^%h> zCUbU|stANfU>dN!b45t-xirVCS4m^x-!nNiK!C|eN3gF5&>VMncNf)kK0dxt`?G1C z+7j^vPy{dV!;b|d6HJ-o&916|oy5e%{Dm6#PcAzYH^u_*n&%f57iZ}PF8QRKS5vc- zKaQ-eug@}H+5Xkg(7<8^e9m_}_&vwk-PLsf2$fs6@)=*Slq2HL34mh>#F<@?lBsVhZ@gdFYdwQ+E$zS+))h$?b; zX9aTA{NlyP%_`REE zm(%>0IVwS8Qi|QYTw!|;RX~CdK~4XbWCHR=lfE5Kxx_YY2SlPr>-^Q#aX(jch)!WM qOoYSm1D`1U;E#SX0@i + + + + + + +mrs_lib: src/safety_zone/polygon Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
polygon Directory Reference
+
+
+
+
+ + + + diff --git a/dir_8c35c1873c2690b478a9950d0638d637.html b/dir_8c35c1873c2690b478a9950d0638d637.html new file mode 100644 index 00000000..573bce94 --- /dev/null +++ b/dir_8c35c1873c2690b478a9950d0638d637.html @@ -0,0 +1,102 @@ + + + + + + + +mrs_lib: src/timer Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
timer Directory Reference
+
+
+
+
+ + + + diff --git a/dir_90cd026696fbcd71297c0f7b96e13f91.html b/dir_90cd026696fbcd71297c0f7b96e13f91.html new file mode 100644 index 00000000..23dbd9d2 --- /dev/null +++ b/dir_90cd026696fbcd71297c0f7b96e13f91.html @@ -0,0 +1,115 @@ + + + + + + + +mrs_lib: src/batch_visualizer Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
batch_visualizer Directory Reference
+
+
+
+ + Directory dependency graph for batch_visualizer:
+
+
+ +
+
+ + + + diff --git a/dir_90cd026696fbcd71297c0f7b96e13f91_dep.map b/dir_90cd026696fbcd71297c0f7b96e13f91_dep.map new file mode 100644 index 00000000..ecd0e23d --- /dev/null +++ b/dir_90cd026696fbcd71297c0f7b96e13f91_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_90cd026696fbcd71297c0f7b96e13f91_dep.md5 b/dir_90cd026696fbcd71297c0f7b96e13f91_dep.md5 new file mode 100644 index 00000000..d91c2896 --- /dev/null +++ b/dir_90cd026696fbcd71297c0f7b96e13f91_dep.md5 @@ -0,0 +1 @@ +90b9ab13e8570f62323023a25b82289c \ No newline at end of file diff --git a/dir_90cd026696fbcd71297c0f7b96e13f91_dep.png b/dir_90cd026696fbcd71297c0f7b96e13f91_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..1319193376f334d4b33f3be629f338f18145ea80 GIT binary patch literal 3994 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 literal 0 HcmV?d00001 diff --git a/dir_9940084939548468b1ec99592b6e2693.html b/dir_9940084939548468b1ec99592b6e2693.html new file mode 100644 index 00000000..60c90acc --- /dev/null +++ b/dir_9940084939548468b1ec99592b6e2693.html @@ -0,0 +1,115 @@ + + + + + + + +mrs_lib: src/service_client_handler Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
service_client_handler Directory Reference
+
+
+
+ + Directory dependency graph for service_client_handler:
+
+
+ +
+
+ + + + diff --git a/dir_9940084939548468b1ec99592b6e2693_dep.map b/dir_9940084939548468b1ec99592b6e2693_dep.map new file mode 100644 index 00000000..b9377698 --- /dev/null +++ b/dir_9940084939548468b1ec99592b6e2693_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_9940084939548468b1ec99592b6e2693_dep.md5 b/dir_9940084939548468b1ec99592b6e2693_dep.md5 new file mode 100644 index 00000000..c36c1bc6 --- /dev/null +++ b/dir_9940084939548468b1ec99592b6e2693_dep.md5 @@ -0,0 +1 @@ +cc87881dfb04c1e1f04c99a9163fe996 \ No newline at end of file diff --git a/dir_9940084939548468b1ec99592b6e2693_dep.png b/dir_9940084939548468b1ec99592b6e2693_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..9318ef06dbae4376cba59d51f5ec7c347380d648 GIT binary patch literal 3814 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 UNQ}MC`f+8uYhbQlrsov#FB1}nhX4Qo literal 0 HcmV?d00001 diff --git a/dir_9dc292e6fbe26797bd73250f006569d0.html b/dir_9dc292e6fbe26797bd73250f006569d0.html new file mode 100644 index 00000000..b84d817d --- /dev/null +++ b/dir_9dc292e6fbe26797bd73250f006569d0.html @@ -0,0 +1,115 @@ + + + + + + + +mrs_lib: src/iir_filter Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
iir_filter Directory Reference
+
+
+
+ + Directory dependency graph for iir_filter:
+
+
+ +
+
+ + + + diff --git a/dir_9dc292e6fbe26797bd73250f006569d0_dep.map b/dir_9dc292e6fbe26797bd73250f006569d0_dep.map new file mode 100644 index 00000000..43de7f10 --- /dev/null +++ b/dir_9dc292e6fbe26797bd73250f006569d0_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_9dc292e6fbe26797bd73250f006569d0_dep.md5 b/dir_9dc292e6fbe26797bd73250f006569d0_dep.md5 new file mode 100644 index 00000000..24b4b668 --- /dev/null +++ b/dir_9dc292e6fbe26797bd73250f006569d0_dep.md5 @@ -0,0 +1 @@ +3b60e338ed416613c933990de7ad17b2 \ No newline at end of file diff --git a/dir_9dc292e6fbe26797bd73250f006569d0_dep.png b/dir_9dc292e6fbe26797bd73250f006569d0_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..676dbc54d6d9f0c433a852bfc143ee45bd7fd2fa GIT binary patch literal 2848 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 literal 0 HcmV?d00001 diff --git a/dir_9de178b262a8e864e9086749ac0a3a65.html b/dir_9de178b262a8e864e9086749ac0a3a65.html new file mode 100644 index 00000000..f57f7bde --- /dev/null +++ b/dir_9de178b262a8e864e9086749ac0a3a65.html @@ -0,0 +1,115 @@ + + + + + + + +mrs_lib: src/scope_timer Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
scope_timer Directory Reference
+
+
+
+ + Directory dependency graph for scope_timer:
+
+
+ +
+
+ + + + diff --git a/dir_9de178b262a8e864e9086749ac0a3a65_dep.map b/dir_9de178b262a8e864e9086749ac0a3a65_dep.map new file mode 100644 index 00000000..e11ad854 --- /dev/null +++ b/dir_9de178b262a8e864e9086749ac0a3a65_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_9de178b262a8e864e9086749ac0a3a65_dep.md5 b/dir_9de178b262a8e864e9086749ac0a3a65_dep.md5 new file mode 100644 index 00000000..070071ac --- /dev/null +++ b/dir_9de178b262a8e864e9086749ac0a3a65_dep.md5 @@ -0,0 +1 @@ +c3ead865c5a97c538a32b06a442a2366 \ No newline at end of file diff --git a/dir_9de178b262a8e864e9086749ac0a3a65_dep.png b/dir_9de178b262a8e864e9086749ac0a3a65_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..d38931b6e63d4887f2b219a9b98c0eeaf6ee169a GIT binary patch literal 3504 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 + + + + + + +mrs_lib: src/lkf Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
lkf Directory Reference
+
+
+ + + + + +

+Files

file  example.cpp
 Example file for the LKF implementation.
 
+
+
+ + + + diff --git a/dir_9e9e485811fd7b0342cca4e7c3cf123b.js b/dir_9e9e485811fd7b0342cca4e7c3cf123b.js new file mode 100644 index 00000000..c7b4e9fb --- /dev/null +++ b/dir_9e9e485811fd7b0342cca4e7c3cf123b.js @@ -0,0 +1,4 @@ +var dir_9e9e485811fd7b0342cca4e7c3cf123b = +[ + [ "example.cpp", "lkf_2example_8cpp.html", "lkf_2example_8cpp" ] +]; \ No newline at end of file diff --git a/dir_a1544262e4e34d2792f5ebccef9b84d2.html b/dir_a1544262e4e34d2792f5ebccef9b84d2.html new file mode 100644 index 00000000..1c76c873 --- /dev/null +++ b/dir_a1544262e4e34d2792f5ebccef9b84d2.html @@ -0,0 +1,115 @@ + + + + + + + +mrs_lib: test/publisher_handler Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
publisher_handler Directory Reference
+
+
+
+ + Directory dependency graph for publisher_handler:
+
+
+ +
+
+ + + + diff --git a/dir_a1544262e4e34d2792f5ebccef9b84d2_dep.map b/dir_a1544262e4e34d2792f5ebccef9b84d2_dep.map new file mode 100644 index 00000000..17404182 --- /dev/null +++ b/dir_a1544262e4e34d2792f5ebccef9b84d2_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_a1544262e4e34d2792f5ebccef9b84d2_dep.md5 b/dir_a1544262e4e34d2792f5ebccef9b84d2_dep.md5 new file mode 100644 index 00000000..06f49d2b --- /dev/null +++ b/dir_a1544262e4e34d2792f5ebccef9b84d2_dep.md5 @@ -0,0 +1 @@ +62661533da641747b85a612d92a7c227 \ No newline at end of file diff --git a/dir_a1544262e4e34d2792f5ebccef9b84d2_dep.png b/dir_a1544262e4e34d2792f5ebccef9b84d2_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..217d03e210b65430814b85bafe275d1cdd09191c GIT binary patch literal 3617 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 literal 0 HcmV?d00001 diff --git a/dir_a17ab943082f893adca96bf9769a804b.html b/dir_a17ab943082f893adca96bf9769a804b.html new file mode 100644 index 00000000..0126df73 --- /dev/null +++ b/dir_a17ab943082f893adca96bf9769a804b.html @@ -0,0 +1,115 @@ + + + + + + + +mrs_lib: test/vector_converter Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
vector_converter Directory Reference
+
+
+
+ + Directory dependency graph for vector_converter:
+
+
+ +
+
+ + + + diff --git a/dir_a17ab943082f893adca96bf9769a804b_dep.map b/dir_a17ab943082f893adca96bf9769a804b_dep.map new file mode 100644 index 00000000..79bfe16f --- /dev/null +++ b/dir_a17ab943082f893adca96bf9769a804b_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_a17ab943082f893adca96bf9769a804b_dep.md5 b/dir_a17ab943082f893adca96bf9769a804b_dep.md5 new file mode 100644 index 00000000..2da312a8 --- /dev/null +++ b/dir_a17ab943082f893adca96bf9769a804b_dep.md5 @@ -0,0 +1 @@ +b081a83b12e0f8e7c0411747763ea54f \ No newline at end of file diff --git a/dir_a17ab943082f893adca96bf9769a804b_dep.png b/dir_a17ab943082f893adca96bf9769a804b_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..9fbdb3b986821e0325ed904247741cc8c5b9e949 GIT binary patch literal 3811 zcmbVPXH*m079LvgqEu;u5UNyxNCzP(T@)!&LL1Npcp{BTtF^O zqzeHe-4HckKzf(n34+8ozIE4nKVDsL=FFTq=ggixbN08-_f3MGttB^?7#9El+}2iR z4q)8?9$kkZ;29ffnhRDCZyQT9;ODPBx3M4%0C+O3&CXoHyjUK=+FfFdbgWa=WMrOB zwok@36sPkg+a;e6LpE~w^K*vJbyS4!6I=dSq@ z6Y~_MZpC1?dl4*;oka~3S_Z6-wA*@XLkP!CF8J4CW8v$nK$u+*Bd1?{{Z=omBx^7pnnOy3_T=Q9Z zgBH!RJ(dh<=ok<9Cr=IcKM)Ni_IGA#moV=Ktohnk02LRtHWJh6VSllvr-kQ&QS54CQjw!9EHVrb5Qx4TI@h!ucKQur1b#_o zoQSR_dn=iq>rTpq!!I}fq?4jK&@00hwziTG9<6cpnA_s>^FBWgR&!dsmB?}2By-!| zXuPCE!sZ-RMm-psjqwhQpL&cF#i|#TmbOliIoG!7b1=*rAJF_D$;C zCvHE|yZH{ZrKjhxz5Uep0Fg#~1w){?pB2c|Qkvu(3asY(kO>pNQXNQcPbQhWyGyi^ zb4+e5oI1_i^()Cxh9J>=jR^W|goz2?R-}>b3&ndm9{VIZ4A~y|%dn)RWPtS3RPF>* zpo8G?pr(ew+b+Amu3pG9xe8|&QO`ED>2U{|%f0Sq!ek+3q^9H7ugm)d2EKo$S@1af zriCL-BI^4L?8kR%%$+ue#0GTMr>|e{4b=pj+Pe)&5SBUyB&KIFTqZZEo9nw%rlNc~8lU5Csiry~1UK?J_ zVv}(quY67L)TyVm&iR!OA8RO9_ncFuTK0C8KMLtehEv&S&5(pN>})-}Bk zvzWKlqxLo4@!A-7B>w&3l=1#mPYq^43(>)m^ zy|5TOo}|vTKIp4pf7#zWvc8T|AF(=mH+)ei_uUVJS&Ge47}Vf7sUZ}%c195i}3!thkNxSXg)xLFghsqV>Ze5%=h5HvXfUBKrD<>jm%wUP1Gg z{Z&%D?kMJHbK}JVsNS0H3%Eyuv}qg*@TDw9+{=qCWPMV9caJF=&$HaomDVO|9K{Zd z$BH0UP)!>f4pH0vbBd~}jvYg_>k{X)PeZh|Gr**_1Db8ruY0yWuy!vU^C|v@Vy^V2 zXE$-d_XpX5=Fj4e;}`Xo!Y^MO3SkZ4Bo^NKCwS>CzK2nat+p)qa!W1kP5D zF|JQj7SR6OeXcmt!_yO0)4mu8zJj)23Te+bI5-$EK_X>={YMwjj5hnJTCNPEO19>= z{#0^LG1T~A3*eFbAr4Nl87Z2<%;)5YH7TRNDl8O+kdbgqDaHBj)2G5u($fp2aXGg1 z9n$8VJ5s}qSP`8ov3u%eZ?{tGm*G@ec))T?%S(ygv5`6hB(-AR&qMO`2_uOPr@F0Y z?qzgY7>pz4V9~I%Xa7)=NI}sME8BhkqetUsdK~Q?93Hf{U(v(uv4h|lt_$V7d$;A` zqepFtLjH=%^>_C6#5;R?TMKd|0pQ57Q-X87#Fmi;Gz;+ZB^l=bITUlSJyTdzhwnb8 z61|y~o~f^CfxEn}VURV(A37KsXs|I3o1fP!?aoJX-kF}3-(4uC@(T$3(G=Yny!a&$ zfBYCvni53Tau2z^AY^s!Tx>>$2rxc^M$5{0ADN{REH3q-1ckF(pD57)kY7qIqM6c1 z#Ai#IHp`KgYEe;;@j>65_iz2DG{XFV>YJ36^{C3AT@# z3JJ|D7z*+-E2D0|uFSApM$Myqx~1eBRi0blDtZx#jtA2UOmL7EW=ruVBu2iz;v$VgGs@ne zmInNN)ySoz0G(IP3B0Nf9K1I?eAQQd z=CP*#XE}BVWM^w0yPQar9L+Yurlh0*k`a{koWq<^VcR%EJ!h9E@Sc>U1X-28lV9Q9zKzql9id}#cldgQ0& zp&EN9r~cWd=g-9e6MujItbJd~^EO^D#wmn*u1J4>zgK69wBOB}D;pIs7;JYs?V^@z zy6d}oli*XLM=;Fqb1&&=TxMEos+Q~HKzw7yNyNL_o(u&90`ZVQp!=EMg6$xLMMOB& z)ysHl81ppFkdP2j4bMAq#i(;bHvr z^fiT&bCT_)kAMGNPD{J$AY%2*eTdgWUy-fb< z*Vnw3#6B%tQJ6P7Af>G> zWI*f%d)p3T7Atarfp>$0#darGhD3gHOReYpWIunxSA7n?vl70;6-nIB87y%gC-V{; zx%%_QJ+ZkH(R>M%XrAfG;1?G^?BU^IW@hFI#w92_W^?w!pKeuL($dmv zo13PAfvT#)NwVm%ldzrm6e2M>SzI@-zFtg8N$FPrM7T34K2e(#T|La2RCjl`#?4{9 z<3^EhEjQ)l{$i`6gM_} z8x=%nWECqK4Nww}DkxvRe0gEH0@#A#Kgtz5eOb$US82;i-x)K!N9fkb$?AdqvNEC3LC)A z&R*yNou8PvySEqlBqL+Uh-5g`0OR2k6HENXPfwl{y8Kwc*VO2O59%MPs;XMZVPj+a z^zq}JuV3A?cUNPQuUT0g0wwZ|fPnP@BtajgJ`ANU@$el#jvp9s{XIW_0u-CIAybey zZ{DEBo9{+IpREB%g#t@&q}4s;|f~Qzyu+ zfq+{qsX=WoIDwxhrK2OfIZFwsG}6@-(G4Db@X5~%jJ<<{!`DD+Z?6Rgqv!4IJ-)h1 z5K?gl(30Ld00$1OX^=bcQ>Y>k|mxphS323S^;ZwTeH%$p7;I+ D8%a{r literal 0 HcmV?d00001 diff --git a/dir_a5078ef47331b4526bf3f96e987ee465.html b/dir_a5078ef47331b4526bf3f96e987ee465.html new file mode 100644 index 00000000..2f6077e3 --- /dev/null +++ b/dir_a5078ef47331b4526bf3f96e987ee465.html @@ -0,0 +1,122 @@ + + + + + + + +mrs_lib: src/ukf Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
ukf Directory Reference
+
+
+
+ + Directory dependency graph for ukf:
+
+
+ + + + + + +

+Files

file  example.cpp
 Example file for the UKF implementation.
 
+
+
+ + + + diff --git a/dir_a5078ef47331b4526bf3f96e987ee465.js b/dir_a5078ef47331b4526bf3f96e987ee465.js new file mode 100644 index 00000000..4aee7f47 --- /dev/null +++ b/dir_a5078ef47331b4526bf3f96e987ee465.js @@ -0,0 +1,4 @@ +var dir_a5078ef47331b4526bf3f96e987ee465 = +[ + [ "example.cpp", "ukf_2example_8cpp.html", "ukf_2example_8cpp" ] +]; \ No newline at end of file diff --git a/dir_a5078ef47331b4526bf3f96e987ee465_dep.map b/dir_a5078ef47331b4526bf3f96e987ee465_dep.map new file mode 100644 index 00000000..9879bf91 --- /dev/null +++ b/dir_a5078ef47331b4526bf3f96e987ee465_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_a5078ef47331b4526bf3f96e987ee465_dep.md5 b/dir_a5078ef47331b4526bf3f96e987ee465_dep.md5 new file mode 100644 index 00000000..aa419ba6 --- /dev/null +++ b/dir_a5078ef47331b4526bf3f96e987ee465_dep.md5 @@ -0,0 +1 @@ +148cf81b6fae66c002294de8dfea2b88 \ No newline at end of file diff --git a/dir_a5078ef47331b4526bf3f96e987ee465_dep.png b/dir_a5078ef47331b4526bf3f96e987ee465_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..5debc29b613330adb63c05fb572c8c286c027ff6 GIT binary patch literal 2693 zcma)8c|60Zv&|0gEDq5o=6%IoiVy?N`_@ zA|i6g#@fPJ$RmZlM|`)CM%R`8C}ewmF2XHD1b^1wnu;?-MD`onSX^)k%~_;JI!Xfy zE#DYwpkGH5&+19+TN+FfH+QZTWmGz6iptramGaq(dq1v&sPac#?PQG^Hod<iIgGF=m z9u7xCHaHEx$b+{|g2Bom%koS#ATKXp;-ZJyxkw}uHLiSk>+R%=5OAiSVl2g3ELzQL z{d~jV9)@Y6)ITy;6-H~JojeYOvXdX_>U3?ZwWY<(x_f`cnL8WHIx{NAkMAM>HUeNf zd`z3oYIWVETQ;_b-7uc+?t;Y{ZA~}gK(DPHexN@*`FZx9_%`aTHz5GfHqfoWXvjCk z%nUgQUJeDPq`G%@RXF4sSB-V52QrxjiC8Q|>+|?{6z?08a1vhXkh^Kr{TkZEnkkkq_8SMyVPCy6=gx!~H@hQQtvCB%Z$2?7%gOUI0|C0a0mn==G-b-z45*%- zl~vy4QnWhqmf_mk?{($2%iE!V>*%q)Aqmm+8`ps&e@E;Zxi>W%P)Aq6G=A&!&=`i) zeNybAYhSZ+K4&`HFF1mbyo)(8Qd9f+qiurEX?UMN9sFa@V(e0grucj ziQ?J~aM{{&ebs@ajZMnyTUWA~#kg}6hC#pU11^JjtuBOAQJ|1_gmM zv0wnNNQe_>CWhJ1r2KN^NfrkH4}})N#_NP5sRN{3kyf{luf$h$nCr(#O~cOINacv zAREs|`%QkX3s}pvw0t3K{ma6GJW{&zaXqThNb@gW{C_T(*b%r%Dve?mj$j>dJ7HgH z(JD|YVANjl`Dt)fp*UyhLTJ_6xZ|1w$t>3e>wZ>0n zc>-R9)1}qbS;J-1lE%&d7r16wdHMMcPBNBGU~mM6eBjF^dS7oZ>WqiEx#-FX=oe#p z{GNYb%Twy=9u=-LiW@sSQFDYM(67gJ7lI6Phi~Q97S+_$6cog|Kf+?6 z_<`HEZ%Y+asTH#K9hR2HG zn{6*XRv*kJBLqzlchz*E9X1&0E%m}B#!)7dc`-|i#b%R9=g?~?6iREtntY;>=?OZF z)K}mGKVjt|USz*R3xAFZO?h)Quj_n3IdWy@U$r^l9rv+CE-$T7UOMXu@Sj$wQHstRLa=?Rn{qT!~4J zmj*G7w;BE%cstu0*XwKR;P8e-63xR(!RFcfiVZ#tv@S6K4oISIgzccM-8@>^y34^r zTt%j1aYrmH3W2)&^UAps6P%cbe}!EtjT~KFUE$3_8ROS=zJ9$LTFF6i&mFDgOMtJ{ zimZN!IMK*Wc`(rtW>wNn*RPv1_m{2 zYikc5J}fQO;BV&S3hWF1y_Eoynn#_w5}C>@@r{HCTx8WxU5KU?iL zO{7rH`^EkssjS1Ua4ox}))2LASVIbUxPHG8jYdNca5%z9Adh_>9zG?9jg5^R7H2-U_{b@?n^ClFfB`TN8EkGI?81M#jjf6W+ z3w@uOno;efktr-{88*d3vT|~In!+hJl2>kiK4WBLghs0h7yni-LGdgbuCK2*oa@+v5J^82op$zMXR|w$ zlG!62Y$iSF#@|b)|4O}`O4quoFs3DC%&3~dcs6HnGn&g{#SQW5f1KiD&+Ymr*ri~0 Y8Bf9o5Am|&h5t$s8%ui&BJ6t1A2ly#ZU6uP literal 0 HcmV?d00001 diff --git a/dir_a801eb2785f54179a3e523b657d76987.html b/dir_a801eb2785f54179a3e523b657d76987.html new file mode 100644 index 00000000..bb009f1c --- /dev/null +++ b/dir_a801eb2785f54179a3e523b657d76987.html @@ -0,0 +1,102 @@ + + + + + + + +mrs_lib: test/repredictor Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
repredictor Directory Reference
+
+
+
+
+ + + + diff --git a/dir_a891666b40284627c385858212667a8e.html b/dir_a891666b40284627c385858212667a8e.html new file mode 100644 index 00000000..1755b06c --- /dev/null +++ b/dir_a891666b40284627c385858212667a8e.html @@ -0,0 +1,115 @@ + + + + + + + +mrs_lib: src/median_filter Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
median_filter Directory Reference
+
+
+
+ + Directory dependency graph for median_filter:
+
+
+ +
+
+ + + + diff --git a/dir_a891666b40284627c385858212667a8e_dep.map b/dir_a891666b40284627c385858212667a8e_dep.map new file mode 100644 index 00000000..60553a44 --- /dev/null +++ b/dir_a891666b40284627c385858212667a8e_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_a891666b40284627c385858212667a8e_dep.md5 b/dir_a891666b40284627c385858212667a8e_dep.md5 new file mode 100644 index 00000000..de39d5bf --- /dev/null +++ b/dir_a891666b40284627c385858212667a8e_dep.md5 @@ -0,0 +1 @@ +78e265d1813426b1fe8de457fde2fd71 \ No newline at end of file diff --git a/dir_a891666b40284627c385858212667a8e_dep.png b/dir_a891666b40284627c385858212667a8e_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..f452f47bff2d3bb331c6707ecf7cc8e800da5ade GIT binary patch literal 3748 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 + + + + + + +mrs_lib: test/param_loader Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
param_loader Directory Reference
+
+
+
+ + Directory dependency graph for param_loader:
+
+
+ +
+
+ + + + diff --git a/dir_a91f64f59277207d470dc7e676106e2d_dep.map b/dir_a91f64f59277207d470dc7e676106e2d_dep.map new file mode 100644 index 00000000..2a7374b9 --- /dev/null +++ b/dir_a91f64f59277207d470dc7e676106e2d_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_a91f64f59277207d470dc7e676106e2d_dep.md5 b/dir_a91f64f59277207d470dc7e676106e2d_dep.md5 new file mode 100644 index 00000000..453dcab5 --- /dev/null +++ b/dir_a91f64f59277207d470dc7e676106e2d_dep.md5 @@ -0,0 +1 @@ +fd00fac7f22199328116533cb303aaa7 \ No newline at end of file diff --git a/dir_a91f64f59277207d470dc7e676106e2d_dep.png b/dir_a91f64f59277207d470dc7e676106e2d_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..efbe99aa390a9f3cb4d3c2e22c252264699549f5 GIT binary patch literal 3497 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 PFW|NwOt(_UDegZ20b3W@ literal 0 HcmV?d00001 diff --git a/dir_aa9be1b82c48662217aefeaa0c6781c6.html b/dir_aa9be1b82c48662217aefeaa0c6781c6.html new file mode 100644 index 00000000..48c22790 --- /dev/null +++ b/dir_aa9be1b82c48662217aefeaa0c6781c6.html @@ -0,0 +1,115 @@ + + + + + + + +mrs_lib: test/utils Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
utils Directory Reference
+
+
+
+ + Directory dependency graph for utils:
+
+
+ +
+
+ + + + diff --git a/dir_aa9be1b82c48662217aefeaa0c6781c6_dep.map b/dir_aa9be1b82c48662217aefeaa0c6781c6_dep.map new file mode 100644 index 00000000..ea7c12aa --- /dev/null +++ b/dir_aa9be1b82c48662217aefeaa0c6781c6_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_aa9be1b82c48662217aefeaa0c6781c6_dep.md5 b/dir_aa9be1b82c48662217aefeaa0c6781c6_dep.md5 new file mode 100644 index 00000000..6c36c243 --- /dev/null +++ b/dir_aa9be1b82c48662217aefeaa0c6781c6_dep.md5 @@ -0,0 +1 @@ +3ca9f3847ea2021cb6f06f31b89f3eb8 \ No newline at end of file diff --git a/dir_aa9be1b82c48662217aefeaa0c6781c6_dep.png b/dir_aa9be1b82c48662217aefeaa0c6781c6_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..4e00d109e75cfef78fddb1816a885a23e0ec92f9 GIT binary patch literal 2801 zcmb7`c{CLK8pkaal`YgOi7e4;n@}q2Yv0EbL-rUWM3x!DFy@s(HH;KP#bCTy(%9dI z#+Hhh7)%&3RAebLgt1TV+x#ynW@;rY$zw=w3&-p&T+fG0$;X~4gczAe( zZLG~*xE9GBJ%W7PIl1}C5w1B9U}t5{v-kH_+**F0hv!h4jk$?yTmh4Tw3mpN?)Ww( z=~Xd&=X|}4MSNv~!lyCWiJMDD%y}_tf&r()RUZyBh!td&F1s0M>-DvW;Y_;`spX(6 zFJ)DfG_CE?1<_iaUGP_Vf-Z;LC=>;;y3p_h)LS1azw?1~BOUhE?s*{{+En7nZkON# zy$ewBnOMGg-j?!OeW67We)7u>*4dxA8O|BF$#xXV!J$u3ICTk#H@LKx`T$l_S=k)< zkzjlDb)>aye?WX3^L>zI)!DB=LFY=s$_iG;htlBYTJStp12d=^mz18&xatp=qMtkv zoBo2ql0(UOd3w%#hcQyf48s#v$ZcO&Co@CBKp4HOj@Mu;bBeDYGH_9kXz1w>`F9%Se-o*z{M(PG+mS7>w8 zqN7K1v*Z9fEOL7Uy_mB#hk9t=Rny+Dp{k0xT^dj8q?Y`xk;JqhL$@oB!j3N2=Ayhn!L7-Iqs%JcFjM@8NCA|*wfn zVX#r%>jQ0Z-*!7wSEmvi#=)V8t)baSdXZtmEL3lsNO728e(zBk8yV9`q=KezE->CV4o0bmE%F5dM z*3CEXe70kn)e^>0HG*YjW~!>{v9{~$>p@jM0v8J4o#iY%8p9}e6n$DT$I!6J! zIy!E=|Ff#vuRY-G)9jv#%}puo&G^~nk14i6x4boNY#+j>yWB`3$Tv+pi8qt5GF#+9 zdQ(KBA083Yx3RI; zNA!XL{Mr^4l;^1KtVvFJS()XdJ_u>N$gn|A2AeIX9q7H-7Be^Lhhhqe=GAyU1_FVw zK5Bn|bUVr6AWc=*ZY5}kY5*>&-&vsW4* zCZaROpla}Pjt7KsDV0$1=~IAZ0_Eg?%GZB^h^I09&pJt3IKQiK_D-Z*7~^S%004CX zip$G069rovlcON)zW*>}Zp%Zh239&r6Qv!*{J zEG#TElu#ZR7)S(FWo3!J8jzZ%vG>{7*aY_%9A6}xmJ9^cy#Z^(MMCJCQ2gMvb16u> zQ)24AE%|`KgYD0`*>C%JjxZd`xReinRn8K>ZB7IoPVG#d;(DQfzUP=p>l(pS&|nBe zBvG@$>5RRNO}4etDKlwVJj~J7R$8ZQF9sK`>ji-*zllrB3}#p;ICFusRzkqaTvao( zveKo8mY1LE%Y)fph5^32OKsp1r;5RA+Z>xnxuVH-nv6(#dppX?Dm@GcgRytFR(aFU z3GM1n?&mXsK+3-Q^u4+*G1p&sSpSc!AN=5^w=7HR#;&8qvaSCZ{kos;J9GbDzYbcg zoOWDBW@2c_RIoX5D;f+|TDv7RJ(X=LSaQa;oOZ<2)XZ#4s<3u19*oeVoRC46kv0J6 z`NYJD^*b{dfMCLgOC7Q$FGsB5!RPQcV3X^UHTJOm!E1@zr};+@yQnw=2-K`R6%((fzFTxP?s7lA}~gLaTA53|C8sDGc=qD$v!D0w|Sz4`sJ264YpN#jhH%EszyEQ2GhP%X2Rl$5lF_E1+wdk{xvXCVLp zAl38*^fIL3ib8gi?)>|kgV&VMZ$3wFYuW(-HQZ{<4FYvhCE-h@LLws1#+e&SQ$^ZA zz5bM2uLG)vZ5>G@5=|mGIT?vWGMP*$Vl)$HVq(IVT+G$wPV_-VgLTq$?>D1?nV$Q@ zp)e3=q);D@Kp<9DR~?It7&o|SieIGHu~-rJdm6*XbrEHzCHXqR*cblu^Yhn2L*KU{ z$zdrJoCfVHdxOPD*j`(BY?tTa;(|9uu|`_A0jyXRbiu`_fUb<=b~yEe!osc5pL;t~ z5ASHy!j~rd`+?2g)u5`&moNLQVlbE@gLs0|nRlV*k*7}+YirM{tE+2i4N|E$rn@o` zt&`*9;|}_(d-OKhe1dgUT|)IQF>22?Ftl#6!2emBYxOgZG-0PZc%xU8b{?_SufsRq u`CTl+S$ZHxgaJi>S>EN{zkY?^g&(P4cRSj&4s!pnJT?|U^J-K7n|}kn#ius_ literal 0 HcmV?d00001 diff --git a/dir_ae9a93452e2a84339148a16bcf2eb561.html b/dir_ae9a93452e2a84339148a16bcf2eb561.html new file mode 100644 index 00000000..45962561 --- /dev/null +++ b/dir_ae9a93452e2a84339148a16bcf2eb561.html @@ -0,0 +1,115 @@ + + + + + + + +mrs_lib: src/math Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
math Directory Reference
+
+
+
+ + Directory dependency graph for math:
+
+
+ +
+
+ + + + diff --git a/dir_ae9a93452e2a84339148a16bcf2eb561_dep.map b/dir_ae9a93452e2a84339148a16bcf2eb561_dep.map new file mode 100644 index 00000000..454bf32e --- /dev/null +++ b/dir_ae9a93452e2a84339148a16bcf2eb561_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_ae9a93452e2a84339148a16bcf2eb561_dep.md5 b/dir_ae9a93452e2a84339148a16bcf2eb561_dep.md5 new file mode 100644 index 00000000..8001d9a6 --- /dev/null +++ b/dir_ae9a93452e2a84339148a16bcf2eb561_dep.md5 @@ -0,0 +1 @@ +77b229e05a46cc920be9a2b7f772a1a7 \ No newline at end of file diff --git a/dir_ae9a93452e2a84339148a16bcf2eb561_dep.png b/dir_ae9a93452e2a84339148a16bcf2eb561_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..5749e06cf9e2d18f758c5b89787758bab652df08 GIT binary patch literal 2864 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 + + + + + + +mrs_lib: include/mrs_lib/safety_zone Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
safety_zone Directory Reference
+
+
+
+
+ + + + diff --git a/dir_b45211e520e4a09b6829419ceab557b0.js b/dir_b45211e520e4a09b6829419ceab557b0.js new file mode 100644 index 00000000..489bf9a2 --- /dev/null +++ b/dir_b45211e520e4a09b6829419ceab557b0.js @@ -0,0 +1,6 @@ +var dir_b45211e520e4a09b6829419ceab557b0 = +[ + [ "line_operations.h", "line__operations_8h_source.html", null ], + [ "polygon.h", "polygon_8h_source.html", null ], + [ "safety_zone.h", "safety__zone_8h_source.html", null ] +]; \ No newline at end of file diff --git a/dir_b51f180547f8d0f0e77de7f16caceac3.html b/dir_b51f180547f8d0f0e77de7f16caceac3.html new file mode 100644 index 00000000..5581b16c --- /dev/null +++ b/dir_b51f180547f8d0f0e77de7f16caceac3.html @@ -0,0 +1,201 @@ + + + + + + + +mrs_lib: include/mrs_lib Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
mrs_lib Directory Reference
+
+
+
+ + Directory dependency graph for mrs_lib:
+
+
+ + + +

+Directories

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Files

file  attitude_converter.h [code]
 Conversions between various representations of object attitude in 3D. Supports Quaternions, Euler angles, Angle-axis and Rotational matrices from tf, tf2, Eigen and geometry_msgs libraries. The default Euler angle notation is the extrinsic RPY.
 
file  batch_visualizer.h [code]
 For convenient and computationally lightweight drawing of geometry in RVIZ using marker arrays.
 
file  dynamic_publisher.h [code]
 Defines DynamicPublisher for easy debug publishing of ROS messages.
 
file  dynamic_reconfigure_mgr.h [code]
 Defines DynamicReconfigureMgr - a convenience class for managing dynamic ROS parameters through dynamic reconfigure.
 
file  gps_conversions.h [code]
 Universal Transverse Mercator transforms. Functions to convert (spherical) latitude and longitude to and from (Euclidean) UTM coordinates.
 
file  iir_filter.h [code]
 
file  kalman_filter.h [code]
 Defines KalmanFilter - an abstract class, defining common interfaces and types for a generic Kalman filter.
 
file  kalman_filter_aloamgarm.h [code]
 Defines KalmanFilter - an abstract class, defining common interfaces and types for a generic Kalman filter.
 
file  math.h [code]
 Defines useful math functions that are not part of the cmath STD library.
 
file  median_filter.h [code]
 Defines the MedianFilter class.
 
file  msg_extractor.h [code]
 utility functions for getting stuff from ROS msgs
 
file  mutex.h [code]
 Defines helper routines for getting and setting variables under mutex locks.
 
file  notch_filter.h [code]
 
file  param_loader.h [code]
 Defines ParamLoader - a convenience class for loading static ROS parameters.
 
file  param_provider.h [code]
 Defines ParamProvider - a helper class for ParamLoader.
 
file  profiler.h [code]
 A scoped function profiler which publishes ROS messages.
 
file  publisher_handler.h [code]
 Defines PublisherHandler and related convenience classes for upgrading the ROS publisher.
 
file  rheiv.h [code]
 Defines RHEIV and related stuff for surface fitting to points with known covariances according to [2].
 
file  scope_timer.h [code]
 Simple timer which times a duration of its scope, with additional optional checkpoints.
 
file  service_client_handler.h [code]
 Defines ServiceClientHandler and related convenience classes for upgrading the ROS service client.
 
file  subscribe_handler.h [code]
 Defines SubscribeHandler and related convenience classes for subscribing to ROS topics.
 
file  timeout_manager.h [code]
 TODO.
 
file  ukf.h [code]
 Defines UKF - a class implementing the Unscented Kalman Filter [4].
 
file  utils.h [code]
 Defines various general utility functions.
 
file  vector_converter.h [code]
 Defines the convert() function for conversion between different vector representations (Eigen, OpenCV, tf2 etc.).
 
file  visual_object.h [code]
 Object abstraction for the Batch Visualizer.
 
+
+
+ + + + diff --git a/dir_b51f180547f8d0f0e77de7f16caceac3.js b/dir_b51f180547f8d0f0e77de7f16caceac3.js new file mode 100644 index 00000000..078b0a83 --- /dev/null +++ b/dir_b51f180547f8d0f0e77de7f16caceac3.js @@ -0,0 +1,84 @@ +var dir_b51f180547f8d0f0e77de7f16caceac3 = +[ + [ "geometry", "dir_85b0de967ad5400027712e30c95ca897.html", "dir_85b0de967ad5400027712e30c95ca897" ], + [ "impl", "dir_7164529cd9c8f96b25598799ea656806.html", "dir_7164529cd9c8f96b25598799ea656806" ], + [ "safety_zone", "dir_b45211e520e4a09b6829419ceab557b0.html", "dir_b45211e520e4a09b6829419ceab557b0" ], + [ "attitude_converter.h", "attitude__converter_8h.html", "attitude__converter_8h" ], + [ "batch_visualizer.h", "batch__visualizer_8h.html", "batch__visualizer_8h" ], + [ "dkf.h", "dkf_8h_source.html", null ], + [ "dynamic_publisher.h", "dynamic__publisher_8h.html", [ + [ "DynamicPublisher", "classmrs__lib_1_1DynamicPublisher.html", "classmrs__lib_1_1DynamicPublisher" ] + ] ], + [ "dynamic_reconfigure_mgr.h", "dynamic__reconfigure__mgr_8h.html", [ + [ "DynamicReconfigureMgr", "classmrs__lib_1_1DynamicReconfigureMgr.html", "classmrs__lib_1_1DynamicReconfigureMgr" ] + ] ], + [ "gps_conversions.h", "gps__conversions_8h.html", "gps__conversions_8h" ], + [ "iir_filter.h", "iir__filter_8h.html", [ + [ "IirFilter", "classmrs__lib_1_1IirFilter.html", "classmrs__lib_1_1IirFilter" ] + ] ], + [ "image_publisher.h", "image__publisher_8h_source.html", null ], + [ "jlkf.h", "jlkf_8h_source.html", null ], + [ "kalman_filter.h", "kalman__filter_8h.html", [ + [ "KalmanFilter", "classmrs__lib_1_1KalmanFilter.html", "classmrs__lib_1_1KalmanFilter" ], + [ "statecov_t", "structmrs__lib_1_1KalmanFilter_1_1statecov__t.html", "structmrs__lib_1_1KalmanFilter_1_1statecov__t" ] + ] ], + [ "kalman_filter_aloamgarm.h", "kalman__filter__aloamgarm_8h.html", [ + [ "KalmanFilterAloamGarm", "classmrs__lib_1_1KalmanFilterAloamGarm.html", "classmrs__lib_1_1KalmanFilterAloamGarm" ], + [ "statecov_t", "structmrs__lib_1_1KalmanFilterAloamGarm_1_1statecov__t.html", "structmrs__lib_1_1KalmanFilterAloamGarm_1_1statecov__t" ] + ] ], + [ "lkf.h", "lkf_8h_source.html", null ], + [ "math.h", "math_8h.html", "math_8h" ], + [ "median_filter.h", "median__filter_8h.html", [ + [ "MedianFilter", "classmrs__lib_1_1MedianFilter.html", "classmrs__lib_1_1MedianFilter" ] + ] ], + [ "mrs_lib.h", "mrs__lib_8h_source.html", null ], + [ "msg_extractor.h", "msg__extractor_8h.html", "msg__extractor_8h" ], + [ "mutex.h", "mutex_8h.html", "mutex_8h" ], + [ "nckf.h", "nckf_8h_source.html", null ], + [ "notch_filter.h", "notch__filter_8h.html", [ + [ "NotchFilter", "classmrs__lib_1_1NotchFilter.html", "classmrs__lib_1_1NotchFilter" ] + ] ], + [ "param_loader.h", "param__loader_8h.html", "param__loader_8h" ], + [ "param_provider.h", "param__provider_8h.html", [ + [ "ParamProvider", "classmrs__lib_1_1ParamProvider.html", "classmrs__lib_1_1ParamProvider" ] + ] ], + [ "profiler.h", "profiler_8h.html", [ + [ "Routine", "classmrs__lib_1_1Routine.html", "classmrs__lib_1_1Routine" ], + [ "Profiler", "classmrs__lib_1_1Profiler.html", "classmrs__lib_1_1Profiler" ] + ] ], + [ "publisher_handler.h", "publisher__handler_8h.html", [ + [ "PublisherHandler_impl", "classmrs__lib_1_1PublisherHandler__impl.html", "classmrs__lib_1_1PublisherHandler__impl" ], + [ "PublisherHandler", "classmrs__lib_1_1PublisherHandler.html", "classmrs__lib_1_1PublisherHandler" ] + ] ], + [ "quadratic_throttle_model.h", "quadratic__throttle__model_8h_source.html", null ], + [ "repredictor.h", "repredictor_8h_source.html", null ], + [ "repredictor_aloamgarm.h", "repredictor__aloamgarm_8h_source.html", null ], + [ "rheiv.h", "rheiv_8h.html", [ + [ "eigenvector_exception", "structmrs__lib_1_1eigenvector__exception.html", "structmrs__lib_1_1eigenvector__exception" ], + [ "RHEIV", "classmrs__lib_1_1RHEIV.html", "classmrs__lib_1_1RHEIV" ] + ] ], + [ "scope_timer.h", "scope__timer_8h.html", [ + [ "ScopeTimerLogger", "classmrs__lib_1_1ScopeTimerLogger.html", "classmrs__lib_1_1ScopeTimerLogger" ], + [ "ScopeTimer", "classmrs__lib_1_1ScopeTimer.html", "classmrs__lib_1_1ScopeTimer" ], + [ "time_point", "structmrs__lib_1_1ScopeTimer_1_1time__point.html", "structmrs__lib_1_1ScopeTimer_1_1time__point" ] + ] ], + [ "service_client_handler.h", "service__client__handler_8h.html", [ + [ "ServiceClientHandler_impl", "classmrs__lib_1_1ServiceClientHandler__impl.html", "classmrs__lib_1_1ServiceClientHandler__impl" ], + [ "ServiceClientHandler", "classmrs__lib_1_1ServiceClientHandler.html", "classmrs__lib_1_1ServiceClientHandler" ] + ] ], + [ "subscribe_handler.h", "subscribe__handler_8h.html", "subscribe__handler_8h" ], + [ "timeout_manager.h", "timeout__manager_8h.html", [ + [ "TimeoutManager", "classmrs__lib_1_1TimeoutManager.html", "classmrs__lib_1_1TimeoutManager" ] + ] ], + [ "timer.h", "timer_8h_source.html", null ], + [ "transform_broadcaster.h", "transform__broadcaster_8h_source.html", null ], + [ "transformer.h", "transformer_8h_source.html", null ], + [ "ukf.h", "ukf_8h.html", [ + [ "UKF", "classmrs__lib_1_1UKF.html", "classmrs__lib_1_1UKF" ], + [ "square_root_exception", "structmrs__lib_1_1UKF_1_1square__root__exception.html", "structmrs__lib_1_1UKF_1_1square__root__exception" ], + [ "inverse_exception", "structmrs__lib_1_1UKF_1_1inverse__exception.html", "structmrs__lib_1_1UKF_1_1inverse__exception" ] + ] ], + [ "utils.h", "utils_8h.html", "utils_8h" ], + [ "vector_converter.h", "vector__converter_8h.html", "vector__converter_8h" ], + [ "visual_object.h", "visual__object_8h.html", "visual__object_8h" ] +]; \ No newline at end of file diff --git a/dir_b51f180547f8d0f0e77de7f16caceac3_dep.map b/dir_b51f180547f8d0f0e77de7f16caceac3_dep.map new file mode 100644 index 00000000..fbf0a46d --- /dev/null +++ b/dir_b51f180547f8d0f0e77de7f16caceac3_dep.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dir_b51f180547f8d0f0e77de7f16caceac3_dep.md5 b/dir_b51f180547f8d0f0e77de7f16caceac3_dep.md5 new file mode 100644 index 00000000..99c92e2e --- /dev/null +++ b/dir_b51f180547f8d0f0e77de7f16caceac3_dep.md5 @@ -0,0 +1 @@ +cafdabed76e6b20c6b9dabbe7b3d7ab8 \ No newline at end of file diff --git a/dir_b51f180547f8d0f0e77de7f16caceac3_dep.png b/dir_b51f180547f8d0f0e77de7f16caceac3_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..332443ca1054fb48eb8cdceab9b8c229db90a286 GIT binary patch literal 6452 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 + + + + + + +mrs_lib: test/timer Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
timer Directory Reference
+
+
+
+ + Directory dependency graph for timer:
+
+
+ +
+
+ + + + diff --git a/dir_bd43be0586985cbd0dfeaf1ebce92195_dep.map b/dir_bd43be0586985cbd0dfeaf1ebce92195_dep.map new file mode 100644 index 00000000..02b0eb6f --- /dev/null +++ b/dir_bd43be0586985cbd0dfeaf1ebce92195_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_bd43be0586985cbd0dfeaf1ebce92195_dep.md5 b/dir_bd43be0586985cbd0dfeaf1ebce92195_dep.md5 new file mode 100644 index 00000000..01947ae0 --- /dev/null +++ b/dir_bd43be0586985cbd0dfeaf1ebce92195_dep.md5 @@ -0,0 +1 @@ +de66fd67f13b60ab9b8d1c36e32a7961 \ No newline at end of file diff --git a/dir_bd43be0586985cbd0dfeaf1ebce92195_dep.png b/dir_bd43be0586985cbd0dfeaf1ebce92195_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..4ec949a4bb31debdec793d1f5cad52fa1d32b30d GIT binary patch literal 2919 zcmb7`dpOkF8pnU6Y!N#`xmA?eDYU6^En6h^wp~ift*Hh>ZsjsF8B8KIL>EzrnUINb zo7{()k)eqxV#swUOk$Y9WX5H%=bYy`&vVZ6?6c24Ydved?_cX(?^@sYvlhn1>CBGp zYTE$-*x_Jrdsb{?#iRWPN%0)tP_k2Owq5=0j4iPFkB%eb(*ZzM!@<_t4f%YIg?3az z>}_7?%BZ>3w*9z~mZ#JlGU-*7l&+&mY$CC&)I4RMTTju(K%~-}5Lc**&=z~Aes5JfM8`JFG|kuBK&*A1*-~b+5~r% zY(n>#S?WMqYVC^ywP-bONhVF;xTdcxr@vM~OOso|ezP@@Y<5x<6t1d9oG(GUzZ{nQui6VD;*~Lfb zr5R;-yR+3gZ=_)+kh$yTO%GLr=Z#Y&%Sry&?;AuY9pp}E3-BfebSuI;ITh5Aegq-E zMPujw&3PKaz04?Psn5in@Un37LvpeWv#1!oI(??9;o3~^9z+Gh#&YiDJyzV@w{Ds^ zStd>4j6`$Nj-2$zy2ni*YQ}bYkM7Z0-fokY7AO3}x24r zmclpEeqMEy!M?tXhe!K-Js4(6k4Rj{V z>V{*#eT)~0rZ^nKJ4s3M-cPZ}Rh}MTYiH*}ihRQ+Z2`KwJMPPUAVm@MGga`+!GVFw zYZ+eza}*^|8d*4sF8%b$0

p?Jx7Hv(yseqE;|e79_g(+w#KDp>z3zQwN4?=iG|N zpBj9~H8YOme_b*&i^d!)K$hx0}~JV~hcyQf*4#UCe_OT31L26=i& zv?lW5%uK@R(~KCs_OXc*m97YlUQOvJx;5*D%inM{AkHoq1IFPAB4W(SOkp9tVMvY6 zdZ1zUQ*Kmz5J~pidK|k3 z4;ymp`Sd9_HO*q;z$8IkzL@aDhoAc9P95 z^Jx@dKzYqt?>6->&C-0X#&S9j%hBB2-B+vYMAm;@06R@tva+&!lCJFj`rU2($f1^o~`hw8odn!7*VRaNu~7h0}>+47rz=$ zAA|m8Gx05ig@pLwnM`J`6U^TJhqoVNbPG8$uV24T(=apYMYLTdvO=FS*c%!>_hhCm z3;H>CS2OJoM1ReKB`Rtr_MNb>STl6e*_QAIo3N6T*z2R0ajnLacriv;cR&&2PFUJ} zXy<6plEC3`pSkKLDQ#DCoj@7Cx+WbnlH}xNWGJhsfCK!|XtcGpLN*e%POH0Vh%w4CxAfktG;x2zwQUt^Q&XOfOZ_RMV`#_|KIC8ZvmBGf+5u2Siz)7ejCNlP26O)W z`B63sg-S_DfkL4)8m-2&tnZrU(z=EuBu%)uxF~*#hUVY}-2q2;4-lf|w$ZYTVI>5D zzRGXm;fr-+aVV@8gTauMk!groc|90B+K8w?P`U$xLqku(XD^CZK6UE06F#DmRY0_$ z@u$mcXd!so8yVeg+2Lx#a{5`iEqK4Nv$QLu^0W?S<1JNZRLNxA-E zxHa+fe~A*a2PlV7J3C?M{bD@~ZY{q=?&w4`cpGJv5{Zw7*GbMXW}`YfI)j*xA6j0_Aq z+2J+S)s~CzbZqpM)YN7o%?GE`(&XW%irvgL(!?H^EKJQL5{cT6UKJETMav5XmVz$} zY$SEK6{A$+IrrL+VQ{Hwc{q$ZH&nx!|3XX1bS3nm1hdmzZmnmTIym?;ti-KkunMNC zq5_A*YinymN9wy9-)xmtdFEIoZaF4ld6qZN;+acJODjv26LoZSjE-K)`1NJqwZX%OJlJfujEsz0 zs;-ey_=oJ{y6J~ZO$VGU_%LsX!uz8x9@AJ(n<$yHKEAY|)%<_M7P_l^Vt}G4;7!F< x#oys@<5%PPW@gRP{-zlgVBWs9t}>JB3{i+|35!)Yhm@>7>@{{bbd@$LWs literal 0 HcmV?d00001 diff --git a/dir_c34e1a38474b6d602bc9081a27b1a010.html b/dir_c34e1a38474b6d602bc9081a27b1a010.html new file mode 100644 index 00000000..7345dbfb --- /dev/null +++ b/dir_c34e1a38474b6d602bc9081a27b1a010.html @@ -0,0 +1,115 @@ + + + + + + + +mrs_lib: test/timeout_manager Directory Reference + + + + + + + + + + + + + +

+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
timeout_manager Directory Reference
+
+
+
+ + Directory dependency graph for timeout_manager:
+
+
+ +
+
+ + + + diff --git a/dir_c34e1a38474b6d602bc9081a27b1a010_dep.map b/dir_c34e1a38474b6d602bc9081a27b1a010_dep.map new file mode 100644 index 00000000..af41c992 --- /dev/null +++ b/dir_c34e1a38474b6d602bc9081a27b1a010_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_c34e1a38474b6d602bc9081a27b1a010_dep.md5 b/dir_c34e1a38474b6d602bc9081a27b1a010_dep.md5 new file mode 100644 index 00000000..3c3fcc5f --- /dev/null +++ b/dir_c34e1a38474b6d602bc9081a27b1a010_dep.md5 @@ -0,0 +1 @@ +310642781c20d2b74a69be3883c3fa0e \ No newline at end of file diff --git a/dir_c34e1a38474b6d602bc9081a27b1a010_dep.png b/dir_c34e1a38474b6d602bc9081a27b1a010_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..e95df6cb29ff2c338766d983bf19184e647f4eed GIT binary patch literal 3858 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 MUbQr;HMoiR2Z1qG8~^|S literal 0 HcmV?d00001 diff --git a/dir_cfc0c72890b8d1e009b6260caa55cd65.html b/dir_cfc0c72890b8d1e009b6260caa55cd65.html new file mode 100644 index 00000000..961f1fa1 --- /dev/null +++ b/dir_cfc0c72890b8d1e009b6260caa55cd65.html @@ -0,0 +1,115 @@ + + + + + + + +mrs_lib: src/profiler Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
profiler Directory Reference
+
+
+
+ + Directory dependency graph for profiler:
+
+
+ +
+
+ + + + diff --git a/dir_cfc0c72890b8d1e009b6260caa55cd65_dep.map b/dir_cfc0c72890b8d1e009b6260caa55cd65_dep.map new file mode 100644 index 00000000..87a24bbc --- /dev/null +++ b/dir_cfc0c72890b8d1e009b6260caa55cd65_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_cfc0c72890b8d1e009b6260caa55cd65_dep.md5 b/dir_cfc0c72890b8d1e009b6260caa55cd65_dep.md5 new file mode 100644 index 00000000..cad9375b --- /dev/null +++ b/dir_cfc0c72890b8d1e009b6260caa55cd65_dep.md5 @@ -0,0 +1 @@ +bc85140384ff934cfca8c48669d29ef4 \ No newline at end of file diff --git a/dir_cfc0c72890b8d1e009b6260caa55cd65_dep.png b/dir_cfc0c72890b8d1e009b6260caa55cd65_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..01bde0942d11d93dc7142ad231c5ac33d9e028de GIT binary patch literal 3058 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 + + + + + + +mrs_lib: src/rheiv Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
rheiv Directory Reference
+
+
+
+ + Directory dependency graph for rheiv:
+
+
+ + + + + + +

+Files

file  example.cpp
 Example file for the RHEIV implementation.
 
+
+
+ + + + diff --git a/dir_d20a67be47c1454b19aa07d8b0143440.js b/dir_d20a67be47c1454b19aa07d8b0143440.js new file mode 100644 index 00000000..b43d486b --- /dev/null +++ b/dir_d20a67be47c1454b19aa07d8b0143440.js @@ -0,0 +1,4 @@ +var dir_d20a67be47c1454b19aa07d8b0143440 = +[ + [ "example.cpp", "rheiv_2example_8cpp.html", "rheiv_2example_8cpp" ] +]; \ No newline at end of file diff --git a/dir_d20a67be47c1454b19aa07d8b0143440_dep.map b/dir_d20a67be47c1454b19aa07d8b0143440_dep.map new file mode 100644 index 00000000..489d1f37 --- /dev/null +++ b/dir_d20a67be47c1454b19aa07d8b0143440_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_d20a67be47c1454b19aa07d8b0143440_dep.md5 b/dir_d20a67be47c1454b19aa07d8b0143440_dep.md5 new file mode 100644 index 00000000..f0c62197 --- /dev/null +++ b/dir_d20a67be47c1454b19aa07d8b0143440_dep.md5 @@ -0,0 +1 @@ +d92eb3e97e1196c8abc7f3923d76c958 \ No newline at end of file diff --git a/dir_d20a67be47c1454b19aa07d8b0143440_dep.png b/dir_d20a67be47c1454b19aa07d8b0143440_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..587f2f3557c917f9ae2f37a1d96767cf83d89e95 GIT binary patch literal 2894 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 literal 0 HcmV?d00001 diff --git a/dir_d44c64559bbebec7f509842c48db8b23.html b/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 00000000..453d4da9 --- /dev/null +++ b/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,117 @@ + + + + + + + +mrs_lib: include Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
include Directory Reference
+
+
+
+ + Directory dependency graph for include:
+
+
+ + + +

+Directories

+
+
+ + + + diff --git a/dir_d44c64559bbebec7f509842c48db8b23.js b/dir_d44c64559bbebec7f509842c48db8b23.js new file mode 100644 index 00000000..b06dc3d9 --- /dev/null +++ b/dir_d44c64559bbebec7f509842c48db8b23.js @@ -0,0 +1,4 @@ +var dir_d44c64559bbebec7f509842c48db8b23 = +[ + [ "mrs_lib", "dir_b51f180547f8d0f0e77de7f16caceac3.html", "dir_b51f180547f8d0f0e77de7f16caceac3" ] +]; \ No newline at end of file diff --git a/dir_d44c64559bbebec7f509842c48db8b23_dep.map b/dir_d44c64559bbebec7f509842c48db8b23_dep.map new file mode 100644 index 00000000..8062d00b --- /dev/null +++ b/dir_d44c64559bbebec7f509842c48db8b23_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/dir_d44c64559bbebec7f509842c48db8b23_dep.md5 b/dir_d44c64559bbebec7f509842c48db8b23_dep.md5 new file mode 100644 index 00000000..9112cb0a --- /dev/null +++ b/dir_d44c64559bbebec7f509842c48db8b23_dep.md5 @@ -0,0 +1 @@ +f57f40f891732e0fdb51abdbcfc4b765 \ No newline at end of file diff --git a/dir_d44c64559bbebec7f509842c48db8b23_dep.png b/dir_d44c64559bbebec7f509842c48db8b23_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..5c635c82516393e372cd0156ebb7c9f341047b1c GIT binary patch literal 1821 zcma)7X;c!37S?o>a&*)T9T%KtMq?y#8DFl?k~A0Gm(pBtq0q^4Awr*}<1%hca+*|J zP}FiKi7ZS(F?ocFnYe&ySlBDa7&m-@D?Z-OxAe|C_uPBWx%b@d+p!lO!CO4kqTHNqPJ(T6;K*9F4}XLR~hODD_%3!u5*{=18Jf?VdBvEC3v!A^z_ z((4@2m;X@j76(%V2s&T;=)G7+GXufc<&cB~mCmAv;@{$`stnj0?@kV>w{>+*Cx((i zdE(EPqRIz$eusTw%+d1V#3r%1Ru}rRfbV|Ery~stUoom99u97>`Us^$JmhUoI*gzJ zw1)JrGV-9&8iN1X^?wXB>`V^@>v`fqw{n=i<`4)3y?-<6hvRN(lE10*MC@}Z$xY1)%$r@J~%CTQ)27C)gK#gXgDjRmK66n;fb_+83)_CE_br}%14lqJ=el4 zDqKJT78Nnf?ES%96gww0X!{p6$G$#xtm*uT)0vXlW$_-Mr_QRgqeIKYX`07t3ekfOt_kUa+1c=r z5VZ7Y$#X1KGn zv&rLcmMpAJQ?Cf*A3kV3aXQ=S*CQ8XJUG?gzI?;OV?{_;t44=UneNTh3 zhK9&Sift(?E9d6s(y*35+=}%bFQiZ#$9Af_wkut+v9U3{-O}DZGO$$Vg!wo>Z+>@V zAT26+^8N^46H4G(|H_U}O0nPB*(qi7l8bC>{S>L<;tsw{G!ktjsIaVqlM2oZ>Hr+> znr};GvL`)8Cbl`Wwj3c##OMuz`S^^oar!B*pX!*Jni?57+u0#GKda?GqY3$ZbG;)b z)^MzLNmF4_k!B%3s7#dJOAC;UkE8gv*Hc9k6AdfT_oy%WY%clS$KwOwaKYx%ceEZe zcrcNc#|vDWZ0YK{#wjzgw6s(ltRV&mh8ivny=4Jys&SK&-Vm!C+eK-6*qxkWQZoi_PGgtQI8XYyu7@EgM$+j6N7?+ zE?qLibGj3VWHOn-V63mNhqU_7@cDDl6D~ab=}PZr5)@JIkR_d_V^e;pATiN{tHL)J zEY`bO=O;|M&*%l(eslA&{Ct)4%*Pk&$mdbBQd7rt*tga7m6hM$@f{yuc=%IT3yDO+ z0XGrG;tMwt$}20S60;viZylWd!nmbrNMo(%ndq(D{YLkKj1-mxLJt(AvGeJ6hPR0_ z#~$+ON_%b)Fn9DoA2I p9qh2XA!DkhYJM*KGhd^Lsmz*11#nT3+KPXt + + + + + + +mrs_lib: test/geometry Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
geometry Directory Reference
+
+
+
+ + Directory dependency graph for geometry:
+
+
+ +
+
+ + + + diff --git a/dir_d49d4fe2bb593f3112f8bcbe6fb5f73b_dep.map b/dir_d49d4fe2bb593f3112f8bcbe6fb5f73b_dep.map new file mode 100644 index 00000000..d5907ece --- /dev/null +++ b/dir_d49d4fe2bb593f3112f8bcbe6fb5f73b_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_d49d4fe2bb593f3112f8bcbe6fb5f73b_dep.md5 b/dir_d49d4fe2bb593f3112f8bcbe6fb5f73b_dep.md5 new file mode 100644 index 00000000..c1ac154b --- /dev/null +++ b/dir_d49d4fe2bb593f3112f8bcbe6fb5f73b_dep.md5 @@ -0,0 +1 @@ +e815e84495ffaaf80c4f7bf694710047 \ No newline at end of file diff --git a/dir_d49d4fe2bb593f3112f8bcbe6fb5f73b_dep.png b/dir_d49d4fe2bb593f3112f8bcbe6fb5f73b_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..23bcbb4bb5dbcf814d2aab92ff6b382920040b15 GIT binary patch literal 3937 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 m@MaQIV}=GF{a>}&gUUJIk3 + + + + + + +mrs_lib: src/param_loader Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
param_loader Directory Reference
+
+
+
+ + Directory dependency graph for param_loader:
+
+
+ + + + + + +

+Files

file  example.cpp
 Example file for the ParamLoader convenience class.
 
+
+
+ + + + diff --git a/dir_d81f13436e73f242cdf25a742f3a9678.js b/dir_d81f13436e73f242cdf25a742f3a9678.js new file mode 100644 index 00000000..0f828bd4 --- /dev/null +++ b/dir_d81f13436e73f242cdf25a742f3a9678.js @@ -0,0 +1,4 @@ +var dir_d81f13436e73f242cdf25a742f3a9678 = +[ + [ "example.cpp", "param__loader_2example_8cpp.html", "param__loader_2example_8cpp" ] +]; \ No newline at end of file diff --git a/dir_d81f13436e73f242cdf25a742f3a9678_dep.map b/dir_d81f13436e73f242cdf25a742f3a9678_dep.map new file mode 100644 index 00000000..e9264cdb --- /dev/null +++ b/dir_d81f13436e73f242cdf25a742f3a9678_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_d81f13436e73f242cdf25a742f3a9678_dep.md5 b/dir_d81f13436e73f242cdf25a742f3a9678_dep.md5 new file mode 100644 index 00000000..3bc6560c --- /dev/null +++ b/dir_d81f13436e73f242cdf25a742f3a9678_dep.md5 @@ -0,0 +1 @@ +f0a85c65f120594bf8d4f5c547262484 \ No newline at end of file diff --git a/dir_d81f13436e73f242cdf25a742f3a9678_dep.png b/dir_d81f13436e73f242cdf25a742f3a9678_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..fe35501757171e61d95921c6c6fc5048771f7aef GIT binary patch literal 3537 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 + + + + + + +mrs_lib: test/transformer Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
transformer Directory Reference
+
+
+
+ + Directory dependency graph for transformer:
+
+
+ +
+
+ + + + diff --git a/dir_dbeb4cbddd5bb6f84539c6e271d9141e_dep.map b/dir_dbeb4cbddd5bb6f84539c6e271d9141e_dep.map new file mode 100644 index 00000000..44966181 --- /dev/null +++ b/dir_dbeb4cbddd5bb6f84539c6e271d9141e_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_dbeb4cbddd5bb6f84539c6e271d9141e_dep.md5 b/dir_dbeb4cbddd5bb6f84539c6e271d9141e_dep.md5 new file mode 100644 index 00000000..49f8a396 --- /dev/null +++ b/dir_dbeb4cbddd5bb6f84539c6e271d9141e_dep.md5 @@ -0,0 +1 @@ +0915d06ca773ab857ec54594052376c8 \ No newline at end of file diff --git a/dir_dbeb4cbddd5bb6f84539c6e271d9141e_dep.png b/dir_dbeb4cbddd5bb6f84539c6e271d9141e_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..ee755b6a692df0c20406fdf36bfc68fff3f2e07f GIT binary patch literal 3655 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 cc3kHyO?q262QZ@wxih5D(=vutLGMNU9| + + + + + + +mrs_lib: src/vector_converter Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
vector_converter Directory Reference
+
+
+
+ + Directory dependency graph for vector_converter:
+
+
+ + + + + + +

+Files

file  example.cpp
 Example file for the convert() vector type conversion function.
 
+
+
+ + + + diff --git a/dir_dcbbf3bfcdb3d005110c6ee2b744bf08.js b/dir_dcbbf3bfcdb3d005110c6ee2b744bf08.js new file mode 100644 index 00000000..10852695 --- /dev/null +++ b/dir_dcbbf3bfcdb3d005110c6ee2b744bf08.js @@ -0,0 +1,4 @@ +var dir_dcbbf3bfcdb3d005110c6ee2b744bf08 = +[ + [ "example.cpp", "vector__converter_2example_8cpp.html", "vector__converter_2example_8cpp" ] +]; \ No newline at end of file diff --git a/dir_dcbbf3bfcdb3d005110c6ee2b744bf08_dep.map b/dir_dcbbf3bfcdb3d005110c6ee2b744bf08_dep.map new file mode 100644 index 00000000..2f1ada80 --- /dev/null +++ b/dir_dcbbf3bfcdb3d005110c6ee2b744bf08_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_dcbbf3bfcdb3d005110c6ee2b744bf08_dep.md5 b/dir_dcbbf3bfcdb3d005110c6ee2b744bf08_dep.md5 new file mode 100644 index 00000000..973bd65b --- /dev/null +++ b/dir_dcbbf3bfcdb3d005110c6ee2b744bf08_dep.md5 @@ -0,0 +1 @@ +2f0d95d66287a1cc096b37eb5bea6659 \ No newline at end of file diff --git a/dir_dcbbf3bfcdb3d005110c6ee2b744bf08_dep.png b/dir_dcbbf3bfcdb3d005110c6ee2b744bf08_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..23d4563d53869b19bd79e8c37bc6751f41efa863 GIT binary patch literal 3906 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 IUv7{71JsqQMgRZ+ literal 0 HcmV?d00001 diff --git a/dir_df4ba55d073265bfa281b5d186f7d37a.html b/dir_df4ba55d073265bfa281b5d186f7d37a.html new file mode 100644 index 00000000..7968e286 --- /dev/null +++ b/dir_df4ba55d073265bfa281b5d186f7d37a.html @@ -0,0 +1,115 @@ + + + + + + + +mrs_lib: test/attitude_converter Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
attitude_converter Directory Reference
+
+
+
+ + Directory dependency graph for attitude_converter:
+
+
+ +
+
+ + + + diff --git a/dir_df4ba55d073265bfa281b5d186f7d37a_dep.map b/dir_df4ba55d073265bfa281b5d186f7d37a_dep.map new file mode 100644 index 00000000..f9a82654 --- /dev/null +++ b/dir_df4ba55d073265bfa281b5d186f7d37a_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_df4ba55d073265bfa281b5d186f7d37a_dep.md5 b/dir_df4ba55d073265bfa281b5d186f7d37a_dep.md5 new file mode 100644 index 00000000..8956b2d9 --- /dev/null +++ b/dir_df4ba55d073265bfa281b5d186f7d37a_dep.md5 @@ -0,0 +1 @@ +1c751195dc81b07d1298697bb6f2c9ff \ No newline at end of file diff --git a/dir_df4ba55d073265bfa281b5d186f7d37a_dep.png b/dir_df4ba55d073265bfa281b5d186f7d37a_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..381c2e3a7cb7098a0464c31f10348b450642127f GIT binary patch literal 4313 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 + + + + + + +mrs_lib: src/safety_zone Directory Reference + + + + + + + + + + + + + +

+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
safety_zone Directory Reference
+
+
+ + +

+Directories

+
+
+ + + + diff --git a/dir_f003de2bf99885e59674f01f3665fb82.html b/dir_f003de2bf99885e59674f01f3665fb82.html new file mode 100644 index 00000000..1e34b0e1 --- /dev/null +++ b/dir_f003de2bf99885e59674f01f3665fb82.html @@ -0,0 +1,125 @@ + + + + + + + +mrs_lib: src/subscribe_handler Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
subscribe_handler Directory Reference
+
+
+
+ + Directory dependency graph for subscribe_handler:
+
+
+ + + + + + + + + +

+Files

file  example.cpp
 Example file for the SubscribeHandler convenience class.
 
file  simple_example.cpp
 Example file for the SubscribeHandler convenience class.
 
+
+
+ + + + diff --git a/dir_f003de2bf99885e59674f01f3665fb82.js b/dir_f003de2bf99885e59674f01f3665fb82.js new file mode 100644 index 00000000..fc122e7f --- /dev/null +++ b/dir_f003de2bf99885e59674f01f3665fb82.js @@ -0,0 +1,5 @@ +var dir_f003de2bf99885e59674f01f3665fb82 = +[ + [ "example.cpp", "subscribe__handler_2example_8cpp.html", "subscribe__handler_2example_8cpp" ], + [ "simple_example.cpp", "simple__example_8cpp.html", "simple__example_8cpp" ] +]; \ No newline at end of file diff --git a/dir_f003de2bf99885e59674f01f3665fb82_dep.map b/dir_f003de2bf99885e59674f01f3665fb82_dep.map new file mode 100644 index 00000000..fc15994d --- /dev/null +++ b/dir_f003de2bf99885e59674f01f3665fb82_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_f003de2bf99885e59674f01f3665fb82_dep.md5 b/dir_f003de2bf99885e59674f01f3665fb82_dep.md5 new file mode 100644 index 00000000..7667a8c0 --- /dev/null +++ b/dir_f003de2bf99885e59674f01f3665fb82_dep.md5 @@ -0,0 +1 @@ +a5422d8116e0d25ab05cf8034a547b23 \ No newline at end of file diff --git a/dir_f003de2bf99885e59674f01f3665fb82_dep.png b/dir_f003de2bf99885e59674f01f3665fb82_dep.png new file mode 100644 index 0000000000000000000000000000000000000000..f2463e3421f058eed8ab7491c6e79e2ad1a4061b GIT binary patch literal 4161 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 HTR;C7{jJt< literal 0 HcmV?d00001 diff --git a/dir_fbb9f35580885fae6f87a033a53c348d.html b/dir_fbb9f35580885fae6f87a033a53c348d.html new file mode 100644 index 00000000..f7fdd554 --- /dev/null +++ b/dir_fbb9f35580885fae6f87a033a53c348d.html @@ -0,0 +1,102 @@ + + + + + + + +mrs_lib: src/transform_broadcaster Directory Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
transform_broadcaster Directory Reference
+
+
+
+
+ + + + diff --git a/dkf_8h_source.html b/dkf_8h_source.html new file mode 100644 index 00000000..57d3bf7f --- /dev/null +++ b/dkf_8h_source.html @@ -0,0 +1,200 @@ + + + + + + + +mrs_lib: include/mrs_lib/dkf.h Source File + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
dkf.h
+
+
+
1 // clang: MatousFormat
+
7 #ifndef DKF_H
+
8 #define DKF_H
+
9 
+
10 #include <mrs_lib/lkf.h>
+
11 #include <mrs_lib/geometry/misc.h>
+
12 #include <iostream>
+
13 
+
14 namespace mrs_lib
+
15 {
+
16 
+
17  /* class DKF //{ */
+
26  class DKF : public LKF<3, -1, 2>
+
27  {
+
28  public:
+
29  /* DKF definitions (typedefs, constants etc) //{ */
+ +
32  static constexpr int n = Base_class::n;
+
33  static constexpr int m = Base_class::m;
+
34  static constexpr int p = Base_class::p;
+
36  using x_t = typename Base_class::x_t;
+
37  using u_t = typename Base_class::u_t;
+
38  using z_t = typename Base_class::z_t;
+
39  using P_t = typename Base_class::P_t;
+
40  using R_t = typename Base_class::R_t;
+
41  using Q_t = typename Base_class::Q_t;
+ +
44  typedef Eigen::Matrix<double, n, n> A_t;
+
45  typedef Eigen::Matrix<double, n, m> B_t;
+
46  typedef Eigen::Matrix<double, p, n> H_t;
+
47  typedef Eigen::Matrix<double, n, p> K_t;
+
49  using mat2_t = Eigen::Matrix<double, 2, 2>;
+
50  using mat3_t = Eigen::Matrix<double, 3, 3>;
+
51  using pt3_t = mrs_lib::geometry::vec3_t;
+
52  using vec3_t = mrs_lib::geometry::vec3_t;
+
53 
+
54  public:
+
61  DKF(){};
+
62 
+
70  DKF(const A_t& A, const B_t& B) : Base_class(A, B, {}) {};
+
71 
+
72  /* correct() method //{ */
+
86  virtual statecov_t correctLine(const statecov_t& sc, const pt3_t& line_origin, const vec3_t& line_direction, const double line_variance) const
+
87  {
+
88  assert(line_direction.norm() > 0.0);
+
89  const vec3_t zunit {0.0, 0.0, 1.0};
+
90  // rot is a rotation matrix, transforming from F to F'
+
91  const mat3_t rot = mrs_lib::geometry::rotationBetween(line_direction, zunit);
+
92  /* const mat3_t rotT = rot.transpose(); */
+
93 
+
94  const H_t Hprime = rot.block<2, 2>(0, 0);
+
95 
+
96  const pt3_t oprime = rot*line_origin;
+
97  const z_t z = oprime.block<2, 1>(0, 0);
+
98 
+
99  const R_t R = line_variance*R_t::Identity();
+
100  return correction_impl(sc, z, R, Hprime);
+
101  };
+
102  //}
+
103  };
+
104  //}
+
105 
+
106 } // namespace mrs_lib
+
107 
+
108 #endif // DKF_H
+
+
+
typename Base_class::statecov_t statecov_t
Helper struct for passing around the state and its covariance in one variable.
Definition: dkf.h:42
+
typename Base_class::R_t R_t
Measurement noise covariance matrix type .
Definition: dkf.h:40
+
typename Base_class::Q_t Q_t
Process noise covariance matrix type .
Definition: lkf.h:52
+
static constexpr int p
Length of the measurement vector of the system.
Definition: lkf.h:44
+
static constexpr int p
Length of the measurement vector of the system.
Definition: dkf.h:34
+
typename Base_class::P_t P_t
State uncertainty covariance matrix type .
Definition: lkf.h:50
+
typename Base_class::z_t z_t
Measurement vector type .
Definition: dkf.h:38
+
static constexpr int n
Length of the state vector of the system.
Definition: dkf.h:32
+
typename Base_class::statecov_t statecov_t
Helper struct for passing around the state and its covariance in one variable.
Definition: lkf.h:53
+
typename Base_class::R_t R_t
Measurement noise covariance matrix type .
Definition: lkf.h:51
+
typename Base_class::P_t P_t
State uncertainty covariance matrix type .
Definition: dkf.h:39
+
DKF(const A_t &A, const B_t &B)
The main constructor.
Definition: dkf.h:70
+
Eigen::Matrix< double, n, p > K_t
Kalman gain matrix type .
Definition: dkf.h:47
+
virtual statecov_t correctLine(const statecov_t &sc, const pt3_t &line_origin, const vec3_t &line_direction, const double line_variance) const
Applies the correction (update, measurement, data) step of the Kalman filter.
Definition: dkf.h:86
+
Eigen::Matrix< double, p, n > H_t
State to measurement mapping matrix type .
Definition: dkf.h:46
+
Defines useful geometry utilities and functions.
+
typename Base_class::x_t x_t
State vector type .
Definition: lkf.h:47
+
DKF()
Convenience default constructor.
Definition: dkf.h:61
+
All mrs_lib functions, classes, variables and definitions are contained in this namespace.
Definition: attitude_converter.h:29
+
static constexpr int n
Length of the state vector of the system.
Definition: lkf.h:42
+
static constexpr int m
Length of the input vector of the system.
Definition: dkf.h:33
+
B_t B
The input to state mapping matrix .
Definition: lkf.h:149
+
Eigen::Matrix< double, n, m > B_t
Input to state mapping matrix type .
Definition: dkf.h:45
+
Implementation of the Linear Kalman filter .
Definition: lkf.h:38
+
typename Base_class::x_t x_t
State vector type .
Definition: dkf.h:36
+
typename Base_class::Q_t Q_t
Process noise covariance matrix type .
Definition: dkf.h:41
+
typename Base_class::z_t z_t
Measurement vector type .
Definition: lkf.h:49
+
static constexpr int m
Length of the input vector of the system.
Definition: lkf.h:43
+
A_t A
The system transition matrix .
Definition: lkf.h:144
+
typename Base_class::u_t u_t
Input vector type .
Definition: lkf.h:48
+
Implementation of the Degenerate measurement Linear Kalman filter.
Definition: dkf.h:26
+
Eigen::Matrix< double, n, n > A_t
System transition matrix type .
Definition: dkf.h:44
+
typename Base_class::u_t u_t
Input vector type .
Definition: dkf.h:37
+ + + + diff --git a/doc.png b/doc.png new file mode 100644 index 0000000000000000000000000000000000000000..17edabff95f7b8da13c9516a04efe05493c29501 GIT binary patch literal 746 zcmV7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t literal 0 HcmV?d00001 diff --git a/doxygen.css b/doxygen.css new file mode 100644 index 00000000..73ecbb2c --- /dev/null +++ b/doxygen.css @@ -0,0 +1,1771 @@ +/* The standard CSS for doxygen 1.8.17 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, p.intertd, p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.qindex, div.navtab{ + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; +} + +div.qindex, div.navpath { + width: 100%; + line-height: 140%; +} + +div.navtab { + margin-right: 15px; +} + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +a.qindex { + font-weight: bold; +} + +a.qindexHL { + font-weight: bold; + background-color: #9CAFD4; + color: #FFFFFF; + border: 1px double #869DCA; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; +} + +dl.citelist dd { + margin:2px 0; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + white-space: nowrap; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +/* +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTableHead tr { +} + +table.markdownTableBodyLeft td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +th.markdownTableHeadLeft th.markdownTableHeadRight th.markdownTableHeadCenter th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft { + text-align: left +} + +th.markdownTableHeadRight { + text-align: right +} + +th.markdownTableHeadCenter { + text-align: center +} +*/ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/doxygen.png b/doxygen.png new file mode 100644 index 0000000000000000000000000000000000000000..3ff17d807fd8aa003bed8bb2a69e8f0909592fd1 GIT binary patch literal 3779 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 literal 0 HcmV?d00001 diff --git a/dynamic__publisher_2example_8cpp.html b/dynamic__publisher_2example_8cpp.html new file mode 100644 index 00000000..8efc3434 --- /dev/null +++ b/dynamic__publisher_2example_8cpp.html @@ -0,0 +1,143 @@ + + + + + + + +mrs_lib: src/dynamic_publisher/example.cpp File Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
example.cpp File Reference
+
+
+ +

Example file for the DynamicPublisher convenience class. +More...

+
#include <mrs_lib/dynamic_publisher.h>
+#include <std_msgs/Float32.h>
+#include <geometry_msgs/Point.h>
+
+ + Include dependency graph for example.cpp:
+
+
+ +
+ + + +

+Functions

+int main (int argc, char **argv)
 
+

Detailed Description

+

Example file for the DynamicPublisher convenience class.

+
Author
Matouš Vrba - vrbam.nosp@m.ato@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz
+

This example may be run after building mrs_lib by executing rosrun mrs_lib dynamic_publisher_example.

+

See dynamic_publisher/example.cpp.

+
+
+ + + + diff --git a/dynamic__publisher_2example_8cpp.js b/dynamic__publisher_2example_8cpp.js new file mode 100644 index 00000000..f29375a3 --- /dev/null +++ b/dynamic__publisher_2example_8cpp.js @@ -0,0 +1,4 @@ +var dynamic__publisher_2example_8cpp = +[ + [ "main", "dynamic__publisher_2example_8cpp.html#a3c04138a5bfe5d72780bb7e82a18e627", null ] +]; \ No newline at end of file diff --git a/dynamic__publisher_2example_8cpp__incl.map b/dynamic__publisher_2example_8cpp__incl.map new file mode 100644 index 00000000..1a9a9007 --- /dev/null +++ b/dynamic__publisher_2example_8cpp__incl.map @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/dynamic__publisher_2example_8cpp__incl.md5 b/dynamic__publisher_2example_8cpp__incl.md5 new file mode 100644 index 00000000..08f88272 --- /dev/null +++ b/dynamic__publisher_2example_8cpp__incl.md5 @@ -0,0 +1 @@ +4e2c598e4daa4f871c9f4c7b78aced19 \ No newline at end of file diff --git a/dynamic__publisher_2example_8cpp__incl.png b/dynamic__publisher_2example_8cpp__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..2b1d793cc62d7e6a6b2dadc7d10fe75eac2c7e29 GIT binary patch literal 31829 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 qPlVE!UVHvg!MB2oS7p1+%^dGm(e2pbri z*xD)=?+V`FCN9nx7#dzfKG3Bklc3=mqQ`yn_&4KKXuHbWi~GU|kj-L^rVQ^$5ajzp zBo**Hr)N9k9krwLK%N>?xa9jvLeS!~YY!*cwviHMyZ*SQ3Hplb<6oi94Da>D59fB! zgQiO~Fw$2pyZ#<#kywC$0B&asq_bvr#E8dlUz5MYculSp!q1jMd(kv~B1`ukc;3zm zt&FYR47d)>hqU)1qoT%_yBEm~y3L1_p2m?HeQTk|_BIf6xY6WAAW$%8Z?t>ibBNuP zMDWv$K<2xVcmYt~9S}Z1+`)q+pn?a9O1OCyy^D=c>MaI3!ZhUb;tJARBoa}iJxo}? on;%@NW>Vk;!q5NzO|LOz+oKLdlafGX5`mDFQj{!tY83c?0L1LjNdN!< literal 0 HcmV?d00001 diff --git a/dynamic__publisher_8h.html b/dynamic__publisher_8h.html new file mode 100644 index 00000000..f7f87cdf --- /dev/null +++ b/dynamic__publisher_8h.html @@ -0,0 +1,161 @@ + + + + + + + +mrs_lib: include/mrs_lib/dynamic_publisher.h File Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
dynamic_publisher.h File Reference
+
+
+ +

Defines DynamicPublisher for easy debug publishing of ROS messages. +More...

+
#include <mutex>
+#include <ros/ros.h>
+#include <mrs_lib/publisher_handler.h>
+#include <mrs_lib/impl/dynamic_publisher.hpp>
+
+ + Include dependency graph for dynamic_publisher.h:
+
+
+ +
+ + This graph shows which files directly or indirectly include this file:
+
+
+ +
+

Go to the source code of this file.

+ + + + + +

+Classes

class  mrs_lib::DynamicPublisher
 A helper class for easy publishing of ROS messages for debugging purposes. More...
 
+ + + + +

+Namespaces

 mrs_lib
 All mrs_lib functions, classes, variables and definitions are contained in this namespace.
 
+

Detailed Description

+

Defines DynamicPublisher for easy debug publishing of ROS messages.

+
Author
Matouš Vrba - vrbam.nosp@m.ato@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz
+
+Tomáš Báča - bacat.nosp@m.oma@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz
+
+
+ + + + diff --git a/dynamic__publisher_8h__dep__incl.map b/dynamic__publisher_8h__dep__incl.map new file mode 100644 index 00000000..d63ab902 --- /dev/null +++ b/dynamic__publisher_8h__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/dynamic__publisher_8h__dep__incl.md5 b/dynamic__publisher_8h__dep__incl.md5 new file mode 100644 index 00000000..66d86d89 --- /dev/null +++ b/dynamic__publisher_8h__dep__incl.md5 @@ -0,0 +1 @@ +6325853d5d03c0319eeb1e6f33c800a7 \ No newline at end of file diff --git a/dynamic__publisher_8h__dep__incl.png b/dynamic__publisher_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..ea74603b6781821369704e935296ae6b2944f4b9 GIT binary patch literal 5168 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 SIF?`p2+>s4LtvDxBmM`SX|BWo literal 0 HcmV?d00001 diff --git a/dynamic__publisher_8h__incl.map b/dynamic__publisher_8h__incl.map new file mode 100644 index 00000000..b77a45ff --- /dev/null +++ b/dynamic__publisher_8h__incl.map @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/dynamic__publisher_8h__incl.md5 b/dynamic__publisher_8h__incl.md5 new file mode 100644 index 00000000..4c1e3e59 --- /dev/null +++ b/dynamic__publisher_8h__incl.md5 @@ -0,0 +1 @@ +944aae8f568ea95237d7c854ae452773 \ No newline at end of file diff --git a/dynamic__publisher_8h__incl.png b/dynamic__publisher_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..fcd15ebf3d2fb35fabfc1aa5c739fcb7c7954b01 GIT binary patch literal 28954 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 bH^?824MWVlr~;wcA(E`5l0> + + + + + + +mrs_lib: include/mrs_lib/dynamic_publisher.h Source File + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+
void publish(const std::string name, const T &msg)
Publishes a message to a topic, advertising the topic if necessary.
+
A helper class for easy publishing of ROS messages for debugging purposes.
Definition: dynamic_publisher.h:26
+
All mrs_lib functions, classes, variables and definitions are contained in this namespace.
Definition: attitude_converter.h:29
+
DynamicPublisher()
A no-parameter constructor.
Definition: dynamic_publisher.cpp:5
+
Defines PublisherHandler and related convenience classes for upgrading the ROS publisher.
+ + + + diff --git a/dynamic__publisher_8hpp_source.html b/dynamic__publisher_8hpp_source.html new file mode 100644 index 00000000..e1e4e372 --- /dev/null +++ b/dynamic__publisher_8hpp_source.html @@ -0,0 +1,152 @@ + + + + + + + +mrs_lib: include/mrs_lib/impl/dynamic_publisher.hpp Source File + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
dynamic_publisher.hpp
+
+
+
+
2 {
+
3 public:
+
4  impl() = default;
+
5 
+
6  impl(const ros::NodeHandle& nh) : m_nh(nh)
+
7  {
+
8  }
+
9 
+
10  template <class T>
+
11  void publish(const std::string name, const T& msg)
+
12  {
+
13  std::scoped_lock lck(m_mtx);
+
14  const std::string msg_md5 = ros::message_traits::MD5Sum<T>::value();
+
15  const std::string msg_datatype = ros::message_traits::DataType<T>::value();
+
16  if (m_publishers.count(name) == 0)
+
17  m_publishers.emplace(name, pub_info_t{m_nh.advertise<T>(name, 10), msg_md5, msg_datatype});
+
18 
+
19  const auto& pub_info = m_publishers.at(name);
+
20  if (pub_info.msg_md5 == "*" ||
+
21  msg_md5 == "*" ||
+
22  pub_info.msg_md5 == msg_md5)
+
23  {
+
24  pub_info.pub.publish(msg);
+
25  }
+
26  else
+
27  {
+
28  ROS_ERROR_STREAM("[DynamicPublisher]: Trying to publish message of type [" << msg_datatype << "/" << msg_md5
+
29  << "] on a publisher with type [" << pub_info.datatype << "/" << pub_info.msg_md5 << "], ignoring!");
+
30  }
+
31  }
+
32 
+
33 private:
+
34  struct pub_info_t
+
35  {
+
36  ros::Publisher pub;
+
37  std::string msg_md5;
+
38  std::string datatype;
+
39  };
+
40  std::mutex m_mtx;
+
41  ros::NodeHandle m_nh;
+
42  std::unordered_map<std::string, pub_info_t> m_publishers;
+
43 };
+
44 
+
45 template <class T>
+
46 void DynamicPublisher::publish(const std::string name, const T& msg)
+
47 {
+
48  m_impl->publish(name, msg);
+
49 }
+
+
+
Definition: dynamic_publisher.hpp:1
+ + + + diff --git a/dynamic__reconfigure__mgr_8h.html b/dynamic__reconfigure__mgr_8h.html new file mode 100644 index 00000000..f3e0bafd --- /dev/null +++ b/dynamic__reconfigure__mgr_8h.html @@ -0,0 +1,160 @@ + + + + + + + +mrs_lib: include/mrs_lib/dynamic_reconfigure_mgr.h File Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
dynamic_reconfigure_mgr.h File Reference
+
+
+ +

Defines DynamicReconfigureMgr - a convenience class for managing dynamic ROS parameters through dynamic reconfigure. +More...

+
#include <ros/ros.h>
+#include <dynamic_reconfigure/server.h>
+#include <string>
+#include <map>
+#include <unordered_set>
+#include <mutex>
+#include <iostream>
+#include <boost/any.hpp>
+#include <Eigen/Dense>
+#include <mrs_lib/param_loader.h>
+
+ + Include dependency graph for dynamic_reconfigure_mgr.h:
+
+
+ +
+

Go to the source code of this file.

+ + + + +

+Classes

class  mrs_lib::DynamicReconfigureMgr< ConfigType >
 
+ + + + +

+Namespaces

 mrs_lib
 All mrs_lib functions, classes, variables and definitions are contained in this namespace.
 
+

Detailed Description

+

Defines DynamicReconfigureMgr - a convenience class for managing dynamic ROS parameters through dynamic reconfigure.

+
Author
Matouš Vrba - vrbam.nosp@m.ato@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz
+
+
+ + + + diff --git a/dynamic__reconfigure__mgr_8h__incl.map b/dynamic__reconfigure__mgr_8h__incl.map new file mode 100644 index 00000000..ede0a1f8 --- /dev/null +++ b/dynamic__reconfigure__mgr_8h__incl.map @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/dynamic__reconfigure__mgr_8h__incl.md5 b/dynamic__reconfigure__mgr_8h__incl.md5 new file mode 100644 index 00000000..d5e49cea --- /dev/null +++ b/dynamic__reconfigure__mgr_8h__incl.md5 @@ -0,0 +1 @@ +42edace0cffb5e67fe169d6e928c01fb \ No newline at end of file diff --git a/dynamic__reconfigure__mgr_8h__incl.png b/dynamic__reconfigure__mgr_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..acf5698463369b1c51ab58bfd6d7fb1768b931f1 GIT binary patch literal 64585 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 literal 0 HcmV?d00001 diff --git a/dynamic__reconfigure__mgr_8h_source.html b/dynamic__reconfigure__mgr_8h_source.html new file mode 100644 index 00000000..7c2f1ed1 --- /dev/null +++ b/dynamic__reconfigure__mgr_8h_source.html @@ -0,0 +1,362 @@ + + + + + + + +mrs_lib: include/mrs_lib/dynamic_reconfigure_mgr.h Source File + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+
bool loadedSuccessfully()
Indicates whether all compulsory parameters were successfully loaded.
Definition: param_loader.h:608
+
All mrs_lib functions, classes, variables and definitions are contained in this namespace.
Definition: attitude_converter.h:29
+
Defines ParamLoader - a convenience class for loading static ROS parameters.
+
bool loadParam(const std::string &name, T &out_value, const T &default_value)
Loads a parameter from the rosparam server with a default value.
Definition: param_loader.h:628
+
Definition: dynamic_reconfigure_mgr.h:40
+
Convenience class for loading parameters from rosparam server.
Definition: param_loader.h:43
+ + + + diff --git a/dynamic_publisher_2example_8cpp-example.html b/dynamic_publisher_2example_8cpp-example.html new file mode 100644 index 00000000..13f81ba2 --- /dev/null +++ b/dynamic_publisher_2example_8cpp-example.html @@ -0,0 +1,147 @@ + + + + + + + +mrs_lib: dynamic_publisher/example.cpp + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
dynamic_publisher/example.cpp
+
+
+

This example may be run after building mrs_lib by executing rosrun mrs_lib dynamic_publisher_example.

+
// clang: MatousFormat
+ +
#include <std_msgs/Float32.h>
+
#include <geometry_msgs/Point.h>
+
+
int main(int argc, char **argv)
+
{
+
/* Set up ROS. */
+
const std::string node_name("dynamic_publisher_example");
+
ros::init(argc, argv, node_name);
+
ros::NodeHandle nh;
+
+
// the class can be copied or initialized without a parameter (but then it won't use your node's namespacing, remapping etc.)
+
mrs_lib::DynamicPublisher dynpub, dynpub2;
+ +
+
ros::Duration slp(0.5);
+
+
std_msgs::Float32 float_msg;
+
geometry_msgs::Point pt_msg;
+
+
ROS_INFO("Publishing topics! Use `rostopic list` and `rostopic echo <topic_name>` to see them.");
+
while (ros::ok())
+
{
+
float_msg.data += 666.0f;
+
dynpub.publish("float_topic", float_msg);
+
/* Avoid publishing a message of different type on the same topic! */
+
/* dynpub.publish("float_topic", pt_msg); */
+
+
pt_msg.x = float_msg.data/1;
+
pt_msg.y = float_msg.data/2;
+
pt_msg.z = float_msg.data/3;
+
dynpub.publish("point_topic", pt_msg);
+
/* Avoid publishing a message of different type on the same topic! They will be ignored and will spam you with errors. */
+
dynpub.publish("point_topic", float_msg);
+
+
ros::spinOnce();
+
slp.sleep();
+
}
+
+
return 0;
+
}
+
+
+
void publish(const std::string name, const T &msg)
Publishes a message to a topic, advertising the topic if necessary.
+
Defines DynamicPublisher for easy debug publishing of ROS messages.
+
A helper class for easy publishing of ROS messages for debugging purposes.
Definition: dynamic_publisher.h:26
+ + + + diff --git a/dynsections.js b/dynsections.js new file mode 100644 index 00000000..ea0a7b39 --- /dev/null +++ b/dynsections.js @@ -0,0 +1,120 @@ +/* + @licstart The following is the entire license notice for the + JavaScript code in this file. + + Copyright (C) 1997-2017 by Dimitri van Heesch + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + @licend The above is the entire license notice + for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l + + + + + + +mrs_lib: Examples + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ + + + + + diff --git a/examples.js b/examples.js new file mode 100644 index 00000000..7e59eb0d --- /dev/null +++ b/examples.js @@ -0,0 +1,13 @@ +var examples = +[ + [ "dynamic_publisher/example.cpp", "dynamic_publisher_2example_8cpp-example.html", null ], + [ "geometry/cyclic_example.cpp", "geometry_2cyclic_example_8cpp-example.html", null ], + [ "lkf/example.cpp", "lkf_2example_8cpp-example.html", null ], + [ "param_loader/example.cpp", "param_loader_2example_8cpp-example.html", null ], + [ "repredictor/example.cpp", "repredictor_2example_8cpp-example.html", null ], + [ "rheiv/example.cpp", "rheiv_2example_8cpp-example.html", null ], + [ "subscribe_handler/example.cpp", "subscribe_handler_2example_8cpp-example.html", null ], + [ "subscribe_handler/simple_example.cpp", "subscribe_handler_2simple_example_8cpp-example.html", null ], + [ "ukf/example.cpp", "ukf_2example_8cpp-example.html", null ], + [ "vector_converter/example.cpp", "vector_converter_2example_8cpp-example.html", null ] +]; \ No newline at end of file diff --git a/files.html b/files.html new file mode 100644 index 00000000..d373f509 --- /dev/null +++ b/files.html @@ -0,0 +1,192 @@ + + + + + + + +mrs_lib: File List + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
File List
+
+
+
Here is a list of all documented files with brief descriptions:
+
[detail level 1234]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  include
  mrs_lib
  geometry
 conversions.h
 conversions_eigen.h
 conversions_opencv.h
 cyclic.hDefines the cyclic class for calculations with cyclic quantities
 misc.hDefines useful geometry utilities and functions
 shapes.hDefines various geometrical shapes and their relations
  impl
 dynamic_publisher.hpp
 param_provider.hpp
 publisher_handler.hpp
 service_client_handler.hpp
 subscribe_handler.hpp
 timer.hpp
 transformer.hpp
 ukf.hppImplements UKF - a class implementing the Unscented Kalman Filter
 vector_converter.hppImplements the convertTo() and convertFrom() functions for conversion between different vector representations (Eigen, OpenCV, tf2 etc.)
 vector_converter_types.h
  safety_zone
 line_operations.h
 polygon.h
 safety_zone.h
 attitude_converter.hConversions between various representations of object attitude in 3D. Supports Quaternions, Euler angles, Angle-axis and Rotational matrices from tf, tf2, Eigen and geometry_msgs libraries. The default Euler angle notation is the extrinsic RPY
 batch_visualizer.hFor convenient and computationally lightweight drawing of geometry in RVIZ using marker arrays
 dkf.h
 dynamic_publisher.hDefines DynamicPublisher for easy debug publishing of ROS messages
 dynamic_reconfigure_mgr.hDefines DynamicReconfigureMgr - a convenience class for managing dynamic ROS parameters through dynamic reconfigure
 gps_conversions.hUniversal Transverse Mercator transforms. Functions to convert (spherical) latitude and longitude to and from (Euclidean) UTM coordinates
 iir_filter.h
 image_publisher.h
 jlkf.h
 kalman_filter.hDefines KalmanFilter - an abstract class, defining common interfaces and types for a generic Kalman filter
 kalman_filter_aloamgarm.hDefines KalmanFilter - an abstract class, defining common interfaces and types for a generic Kalman filter
 lkf.h
 math.hDefines useful math functions that are not part of the cmath STD library
 median_filter.hDefines the MedianFilter class
 mrs_lib.h
 msg_extractor.hUtility functions for getting stuff from ROS msgs
 mutex.hDefines helper routines for getting and setting variables under mutex locks
 nckf.h
 notch_filter.h
 param_loader.hDefines ParamLoader - a convenience class for loading static ROS parameters
 param_provider.hDefines ParamProvider - a helper class for ParamLoader
 profiler.hA scoped function profiler which publishes ROS messages
 publisher_handler.hDefines PublisherHandler and related convenience classes for upgrading the ROS publisher
 quadratic_throttle_model.h
 repredictor.h
 repredictor_aloamgarm.h
 rheiv.hDefines RHEIV and related stuff for surface fitting to points with known covariances according to [2]
 scope_timer.hSimple timer which times a duration of its scope, with additional optional checkpoints
 service_client_handler.hDefines ServiceClientHandler and related convenience classes for upgrading the ROS service client
 subscribe_handler.hDefines SubscribeHandler and related convenience classes for subscribing to ROS topics
 timeout_manager.hTODO
 timer.h
 transform_broadcaster.h
 transformer.h
 ukf.hDefines UKF - a class implementing the Unscented Kalman Filter [4]
 utils.hDefines various general utility functions
 vector_converter.hDefines the convert() function for conversion between different vector representations (Eigen, OpenCV, tf2 etc.)
 visual_object.hObject abstraction for the Batch Visualizer
  src
  dynamic_publisher
 example.cppExample file for the DynamicPublisher convenience class
  geometry
 cyclic_example.cppExample file for the cyclical values implementation (see the cyclic class)
  lkf
 example.cppExample file for the LKF implementation
  nckf
 nckf_tests.cppTests for the UKF implementation
  param_loader
 example.cppExample file for the ParamLoader convenience class
  repredictor
 example.cppExample file for the Repredictor implementation
  rheiv
 example.cppExample file for the RHEIV implementation
  subscribe_handler
 example.cppExample file for the SubscribeHandler convenience class
 simple_example.cppExample file for the SubscribeHandler convenience class
  ukf
 example.cppExample file for the UKF implementation
  vector_converter
 example.cppExample file for the convert() vector type conversion function
  test
  math
 probit_gts.h
+
+
+
+ + + + diff --git a/files_dup.js b/files_dup.js new file mode 100644 index 00000000..5c7a7a2b --- /dev/null +++ b/files_dup.js @@ -0,0 +1,6 @@ +var files_dup = +[ + [ "include", "dir_d44c64559bbebec7f509842c48db8b23.html", "dir_d44c64559bbebec7f509842c48db8b23" ], + [ "src", "dir_68267d1309a1af8e8297ef4c3efbcdba.html", "dir_68267d1309a1af8e8297ef4c3efbcdba" ], + [ "test", "dir_13e138d54eb8818da29c3992edef070a.html", "dir_13e138d54eb8818da29c3992edef070a" ] +]; \ No newline at end of file diff --git a/folderclosed.png b/folderclosed.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8ab35edce8e97554e360005ee9fc5bffb36e66 GIT binary patch literal 616 zcmV-u0+;=XP)a9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA literal 0 HcmV?d00001 diff --git a/formula.repository b/formula.repository new file mode 100644 index 00000000..24410277 --- /dev/null +++ b/formula.repository @@ -0,0 +1,64 @@ +\_form#0:$ \mathbf{x} $ +\_form#1:$ \mathbf{u} $ +\_form#2:$ \mathbf{z} $ +\_form#3:$n \times 1$ +\_form#4:$m \times 1$ +\_form#5:$p \times 1$ +\_form#6:$n \times n$ +\_form#7:$p \times p$ +\_form#8:$n \times m$ +\_form#9:$p \times n$ +\_form#10:$n \times p$ +\_form#11:$ r \in {\rm I\!R} $ +\_form#12:$ v \in {\rm I\!R} $ +\_form#13:$ v + kr,~k \in {\rm I\!N} $ +\_form#14:$ v $ +\_form#15:$ v \in [~m,~s~[ $ +\_form#16:$ m $ +\_form#17:$ s $ +\_form#18:$ s = m + r $ +\_form#19:$ v \in [~-\pi,~\pi~[ $ +\_form#20:$ v \in [~0,~2\pi~[ $ +\_form#21:$ r $ +\_form#22:$ r/2 $ +\_form#23:$ v' = v + kr $ +\_form#24:$ v' $ +\_form#25:$ m = 0,~s=360 $ +\_form#26:$ \pi $ +\_form#27:$ a \times b $ +\_form#28:$ n_q \times 1 $ +\_form#29:$ p \times n_q $ +\_form#30:$ n_q \times p $ +\_form#31:$ r\sum_i c_i $ +\_form#32:$ c_i $ +\_form#33:$ i $ +\_form#34:$ 3\times 1 $ +\_form#35:$ 3\times 2 $ +\_form#36:$ \mathbf{\theta} $ +\_form#37:$ \mathbf{\theta}^T \mathbf{u}\left( \mathbf{x} \right) = 0 $ +\_form#38:$ \mathbf{u}\left( \mathbf{x} \right) $ +\_form#39:$ \left[ \mathbf{x}, 1 \right] $ +\_form#40:$ \partial_{\mathbf{x}} \mathbf{z}\left( \mathbf{x} \right) $ +\_form#41:$ \mathbf{z}\left( \mathbf{x} \right) $ +\_form#42:$ \mathbf{u}\left( \mathbf{x} \right) = \left[ \mathbf{z}\left( \mathbf{x} \right), 1 \right] $ +\_form#43:$ \mathbf{\eta} $ +\_form#44:$k \times 1$ +\_form#45:$l \times 1$ +\_form#46:$k \times k$ +\_form#47:$l_r \times 1$ +\_form#48:$ \mathbf{J} \mathbf{z}\left( \mathbf{x} \right) $ +\_form#49:$m \mathbf{A} 1$ +\_form#50:$l_r \times l_r$ +\_form#51:$m \mathbf{B} 1$ +\_form#52:$m \mathbf{M} 1$ +\_form#53:$m \mathbf{N} 1$ +\_form#54:$ \mathbf{\theta}_{k} $ +\_form#55:$ \mathbf{\theta}_{k-1} $ +\_form#56:$ \mathbf{x}_i $ +\_form#57:$ \mathbf{P}_i $ +\_form#58:$ a x + b y + c z + d = 0 $ +\_form#59:$ a $ +\_form#60:$ b $ +\_form#61:$ c $ +\_form#62:$ d $ +\_form#63:$ \mathbf{ \theta } $ diff --git a/functions.html b/functions.html new file mode 100644 index 00000000..80d925c9 --- /dev/null +++ b/functions.html @@ -0,0 +1,186 @@ + + + + + + + +mrs_lib: Class Members + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- a -

+
+
+ + + + diff --git a/functions_b.html b/functions_b.html new file mode 100644 index 00000000..d71ab4d9 --- /dev/null +++ b/functions_b.html @@ -0,0 +1,129 @@ + + + + + + + +mrs_lib: Class Members + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ + + + + + diff --git a/functions_c.html b/functions_c.html new file mode 100644 index 00000000..37b0d568 --- /dev/null +++ b/functions_c.html @@ -0,0 +1,168 @@ + + + + + + + +mrs_lib: Class Members + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- c -

+
+
+ + + + diff --git a/functions_d.html b/functions_d.html new file mode 100644 index 00000000..5a55f005 --- /dev/null +++ b/functions_d.html @@ -0,0 +1,132 @@ + + + + + + + +mrs_lib: Class Members + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- d -

+
+
+ + + + diff --git a/functions_dup.js b/functions_dup.js new file mode 100644 index 00000000..dce297a9 --- /dev/null +++ b/functions_dup.js @@ -0,0 +1,30 @@ +var functions_dup = +[ + [ "a", "functions.html", null ], + [ "b", "functions_b.html", null ], + [ "c", "functions_c.html", null ], + [ "d", "functions_d.html", null ], + [ "e", "functions_e.html", null ], + [ "f", "functions_f.html", null ], + [ "g", "functions_g.html", null ], + [ "h", "functions_h.html", null ], + [ "i", "functions_i.html", null ], + [ "j", "functions_j.html", null ], + [ "k", "functions_k.html", null ], + [ "l", "functions_l.html", null ], + [ "m", "functions_m.html", null ], + [ "n", "functions_n.html", null ], + [ "o", "functions_o.html", null ], + [ "p", "functions_p.html", null ], + [ "q", "functions_q.html", null ], + [ "r", "functions_r.html", null ], + [ "s", "functions_s.html", null ], + [ "t", "functions_t.html", null ], + [ "u", "functions_u.html", null ], + [ "v", "functions_v.html", null ], + [ "w", "functions_w.html", null ], + [ "x", "functions_x.html", null ], + [ "y", "functions_y.html", null ], + [ "z", "functions_z.html", null ], + [ "~", "functions_~.html", null ] +]; \ No newline at end of file diff --git a/functions_e.html b/functions_e.html new file mode 100644 index 00000000..77d5e38c --- /dev/null +++ b/functions_e.html @@ -0,0 +1,110 @@ + + + + + + + +mrs_lib: Class Members + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- e -

+
+
+ + + + diff --git a/functions_f.html b/functions_f.html new file mode 100644 index 00000000..94d42947 --- /dev/null +++ b/functions_f.html @@ -0,0 +1,122 @@ + + + + + + + +mrs_lib: Class Members + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- f -

+
+
+ + + + diff --git a/functions_func.html b/functions_func.html new file mode 100644 index 00000000..e48d3157 --- /dev/null +++ b/functions_func.html @@ -0,0 +1,173 @@ + + + + + + + +mrs_lib: Class Members - Functions + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- a -

+
+
+ + + + diff --git a/functions_func.js b/functions_func.js new file mode 100644 index 00000000..66108c74 --- /dev/null +++ b/functions_func.js @@ -0,0 +1,26 @@ +var functions_func = +[ + [ "a", "functions_func.html", null ], + [ "b", "functions_func_b.html", null ], + [ "c", "functions_func_c.html", null ], + [ "d", "functions_func_d.html", null ], + [ "e", "functions_func_e.html", null ], + [ "f", "functions_func_f.html", null ], + [ "g", "functions_func_g.html", null ], + [ "h", "functions_func_h.html", null ], + [ "i", "functions_func_i.html", null ], + [ "j", "functions_func_j.html", null ], + [ "l", "functions_func_l.html", null ], + [ "m", "functions_func_m.html", null ], + [ "n", "functions_func_n.html", null ], + [ "o", "functions_func_o.html", null ], + [ "p", "functions_func_p.html", null ], + [ "r", "functions_func_r.html", null ], + [ "s", "functions_func_s.html", null ], + [ "t", "functions_func_t.html", null ], + [ "u", "functions_func_u.html", null ], + [ "v", "functions_func_v.html", null ], + [ "w", "functions_func_w.html", null ], + [ "y", "functions_func_y.html", null ], + [ "~", "functions_func_~.html", null ] +]; \ No newline at end of file diff --git a/functions_func_b.html b/functions_func_b.html new file mode 100644 index 00000000..6ef7544c --- /dev/null +++ b/functions_func_b.html @@ -0,0 +1,112 @@ + + + + + + + +mrs_lib: Class Members - Functions + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ + +
+ + + + diff --git a/functions_func_c.html b/functions_func_c.html new file mode 100644 index 00000000..33595528 --- /dev/null +++ b/functions_func_c.html @@ -0,0 +1,165 @@ + + + + + + + +mrs_lib: Class Members - Functions + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ + + + + + diff --git a/functions_func_d.html b/functions_func_d.html new file mode 100644 index 00000000..84eb68bf --- /dev/null +++ b/functions_func_d.html @@ -0,0 +1,123 @@ + + + + + + + +mrs_lib: Class Members - Functions + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- d -

+
+
+ + + + diff --git a/functions_func_e.html b/functions_func_e.html new file mode 100644 index 00000000..71319238 --- /dev/null +++ b/functions_func_e.html @@ -0,0 +1,107 @@ + + + + + + + +mrs_lib: Class Members - Functions + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- e -

+
+
+ + + + diff --git a/functions_func_f.html b/functions_func_f.html new file mode 100644 index 00000000..db08a092 --- /dev/null +++ b/functions_func_f.html @@ -0,0 +1,116 @@ + + + + + + + +mrs_lib: Class Members - Functions + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- f -

+
+
+ + + + diff --git a/functions_func_g.html b/functions_func_g.html new file mode 100644 index 00000000..c8e08e1c --- /dev/null +++ b/functions_func_g.html @@ -0,0 +1,169 @@ + + + + + + + +mrs_lib: Class Members - Functions + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- g -

+
+
+ + + + diff --git a/functions_func_h.html b/functions_func_h.html new file mode 100644 index 00000000..2ac5e71c --- /dev/null +++ b/functions_func_h.html @@ -0,0 +1,108 @@ + + + + + + + +mrs_lib: Class Members - Functions + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ + +
+ + + + diff --git a/functions_func_i.html b/functions_func_i.html new file mode 100644 index 00000000..e0cd92d4 --- /dev/null +++ b/functions_func_i.html @@ -0,0 +1,127 @@ + + + + + + + +mrs_lib: Class Members - Functions + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ + +
+ + + + diff --git a/functions_func_j.html b/functions_func_j.html new file mode 100644 index 00000000..c136f10b --- /dev/null +++ b/functions_func_j.html @@ -0,0 +1,104 @@ + + + + + + + +mrs_lib: Class Members - Functions + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ + +
+ + + + diff --git a/functions_func_l.html b/functions_func_l.html new file mode 100644 index 00000000..196373fb --- /dev/null +++ b/functions_func_l.html @@ -0,0 +1,146 @@ + + + + + + + +mrs_lib: Class Members - Functions + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- l -

+
+
+ + + + diff --git a/functions_func_m.html b/functions_func_m.html new file mode 100644 index 00000000..37903af5 --- /dev/null +++ b/functions_func_m.html @@ -0,0 +1,107 @@ + + + + + + + +mrs_lib: Class Members - Functions + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- m -

+
+
+ + + + diff --git a/functions_func_n.html b/functions_func_n.html new file mode 100644 index 00000000..d563dca7 --- /dev/null +++ b/functions_func_n.html @@ -0,0 +1,114 @@ + + + + + + + +mrs_lib: Class Members - Functions + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ + + + + + diff --git a/functions_func_o.html b/functions_func_o.html new file mode 100644 index 00000000..5c79202d --- /dev/null +++ b/functions_func_o.html @@ -0,0 +1,158 @@ + + + + + + + +mrs_lib: Class Members - Functions + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- o -

+
+
+ + + + diff --git a/functions_func_p.html b/functions_func_p.html new file mode 100644 index 00000000..dda166b7 --- /dev/null +++ b/functions_func_p.html @@ -0,0 +1,157 @@ + + + + + + + +mrs_lib: Class Members - Functions + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ + + + + + diff --git a/functions_func_r.html b/functions_func_r.html new file mode 100644 index 00000000..4b393195 --- /dev/null +++ b/functions_func_r.html @@ -0,0 +1,136 @@ + + + + + + + +mrs_lib: Class Members - Functions + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- r -

+
+
+ + + + diff --git a/functions_func_s.html b/functions_func_s.html new file mode 100644 index 00000000..c57f0a68 --- /dev/null +++ b/functions_func_s.html @@ -0,0 +1,196 @@ + + + + + + + +mrs_lib: Class Members - Functions + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- s -

+
+
+ + + + diff --git a/functions_func_t.html b/functions_func_t.html new file mode 100644 index 00000000..70911bca --- /dev/null +++ b/functions_func_t.html @@ -0,0 +1,140 @@ + + + + + + + +mrs_lib: Class Members - Functions + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- t -

+
+
+ + + + diff --git a/functions_func_u.html b/functions_func_u.html new file mode 100644 index 00000000..c5e6eb7f --- /dev/null +++ b/functions_func_u.html @@ -0,0 +1,110 @@ + + + + + + + +mrs_lib: Class Members - Functions + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ + +
+ + + + diff --git a/functions_func_v.html b/functions_func_v.html new file mode 100644 index 00000000..007ef661 --- /dev/null +++ b/functions_func_v.html @@ -0,0 +1,115 @@ + + + + + + + +mrs_lib: Class Members - Functions + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ + + + + + diff --git a/functions_func_w.html b/functions_func_w.html new file mode 100644 index 00000000..7f88e5c9 --- /dev/null +++ b/functions_func_w.html @@ -0,0 +1,112 @@ + + + + + + + +mrs_lib: Class Members - Functions + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ + + + + + diff --git a/functions_func_y.html b/functions_func_y.html new file mode 100644 index 00000000..aa8b4bbc --- /dev/null +++ b/functions_func_y.html @@ -0,0 +1,104 @@ + + + + + + + +mrs_lib: Class Members - Functions + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- y -

+
+
+ + + + diff --git a/functions_func_~.html b/functions_func_~.html new file mode 100644 index 00000000..bd6082f8 --- /dev/null +++ b/functions_func_~.html @@ -0,0 +1,149 @@ + + + + + + + +mrs_lib: Class Members - Functions + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- ~ -

+
+
+ + + + diff --git a/functions_g.html b/functions_g.html new file mode 100644 index 00000000..280c139f --- /dev/null +++ b/functions_g.html @@ -0,0 +1,169 @@ + + + + + + + +mrs_lib: Class Members + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- g -

+
+
+ + + + diff --git a/functions_h.html b/functions_h.html new file mode 100644 index 00000000..9dabf2c1 --- /dev/null +++ b/functions_h.html @@ -0,0 +1,124 @@ + + + + + + + +mrs_lib: Class Members + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ + + + + + diff --git a/functions_i.html b/functions_i.html new file mode 100644 index 00000000..2ce303f1 --- /dev/null +++ b/functions_i.html @@ -0,0 +1,130 @@ + + + + + + + +mrs_lib: Class Members + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- i -

+
+
+ + + + diff --git a/functions_j.html b/functions_j.html new file mode 100644 index 00000000..9783253e --- /dev/null +++ b/functions_j.html @@ -0,0 +1,104 @@ + + + + + + + +mrs_lib: Class Members + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- j -

+
+
+ + + + diff --git a/functions_k.html b/functions_k.html new file mode 100644 index 00000000..77d2c09b --- /dev/null +++ b/functions_k.html @@ -0,0 +1,115 @@ + + + + + + + +mrs_lib: Class Members + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ + + + + + diff --git a/functions_l.html b/functions_l.html new file mode 100644 index 00000000..bd05ed78 --- /dev/null +++ b/functions_l.html @@ -0,0 +1,152 @@ + + + + + + + +mrs_lib: Class Members + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- l -

+
+
+ + + + diff --git a/functions_m.html b/functions_m.html new file mode 100644 index 00000000..d58abde2 --- /dev/null +++ b/functions_m.html @@ -0,0 +1,129 @@ + + + + + + + +mrs_lib: Class Members + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ + + + + + diff --git a/functions_n.html b/functions_n.html new file mode 100644 index 00000000..56db08fe --- /dev/null +++ b/functions_n.html @@ -0,0 +1,135 @@ + + + + + + + +mrs_lib: Class Members + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ + + + + + diff --git a/functions_o.html b/functions_o.html new file mode 100644 index 00000000..9b73c605 --- /dev/null +++ b/functions_o.html @@ -0,0 +1,167 @@ + + + + + + + +mrs_lib: Class Members + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- o -

+
+
+ + + + diff --git a/functions_p.html b/functions_p.html new file mode 100644 index 00000000..796d30bf --- /dev/null +++ b/functions_p.html @@ -0,0 +1,194 @@ + + + + + + + +mrs_lib: Class Members + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- p -

+
+
+ + + + diff --git a/functions_q.html b/functions_q.html new file mode 100644 index 00000000..7a558762 --- /dev/null +++ b/functions_q.html @@ -0,0 +1,115 @@ + + + + + + + +mrs_lib: Class Members + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ + + + + + diff --git a/functions_r.html b/functions_r.html new file mode 100644 index 00000000..aa5b3bd9 --- /dev/null +++ b/functions_r.html @@ -0,0 +1,150 @@ + + + + + + + +mrs_lib: Class Members + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ + + + + + diff --git a/functions_rela.html b/functions_rela.html new file mode 100644 index 00000000..aea4cf2b --- /dev/null +++ b/functions_rela.html @@ -0,0 +1,105 @@ + + + + + + + +mrs_lib: Class Members - Related Functions + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ + +
+ + + + diff --git a/functions_s.html b/functions_s.html new file mode 100644 index 00000000..2da9f9dc --- /dev/null +++ b/functions_s.html @@ -0,0 +1,211 @@ + + + + + + + +mrs_lib: Class Members + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- s -

+
+
+ + + + diff --git a/functions_t.html b/functions_t.html new file mode 100644 index 00000000..c680c72f --- /dev/null +++ b/functions_t.html @@ -0,0 +1,164 @@ + + + + + + + +mrs_lib: Class Members + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- t -

+
+
+ + + + diff --git a/functions_type.html b/functions_type.html new file mode 100644 index 00000000..84f3b94c --- /dev/null +++ b/functions_type.html @@ -0,0 +1,368 @@ + + + + + + + +mrs_lib: Class Members - Typedefs + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- a -

+ + +

- b -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- f -

+ + +

- h -

+ + +

- i -

+ + +

- k -

+ + +

- m -

+ + +

- o -

+ + +

- p -

+ + +

- q -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- u -

+ + +

- w -

+ + +

- x -

+ + +

- z -

+
+
+ + + + diff --git a/functions_u.html b/functions_u.html new file mode 100644 index 00000000..cfbb7ea8 --- /dev/null +++ b/functions_u.html @@ -0,0 +1,122 @@ + + + + + + + +mrs_lib: Class Members + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ + + + + + diff --git a/functions_v.html b/functions_v.html new file mode 100644 index 00000000..c56eb03d --- /dev/null +++ b/functions_v.html @@ -0,0 +1,115 @@ + + + + + + + +mrs_lib: Class Members + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- v -

+
+
+ + + + diff --git a/functions_vars.html b/functions_vars.html new file mode 100644 index 00000000..d1bb7f3e --- /dev/null +++ b/functions_vars.html @@ -0,0 +1,263 @@ + + + + + + + +mrs_lib: Class Members - Variables + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- a -

+ + +

- b -

+ + +

- h -

+ + +

- k -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- p -

+ + +

- q -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- w -

+ + +

- x -

+
+
+ + + + diff --git a/functions_w.html b/functions_w.html new file mode 100644 index 00000000..41cd219f --- /dev/null +++ b/functions_w.html @@ -0,0 +1,118 @@ + + + + + + + +mrs_lib: Class Members + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ + + + + + diff --git a/functions_x.html b/functions_x.html new file mode 100644 index 00000000..e8218ee8 --- /dev/null +++ b/functions_x.html @@ -0,0 +1,126 @@ + + + + + + + +mrs_lib: Class Members + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ + + + + + diff --git a/functions_y.html b/functions_y.html new file mode 100644 index 00000000..63cbc8b2 --- /dev/null +++ b/functions_y.html @@ -0,0 +1,104 @@ + + + + + + + +mrs_lib: Class Members + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- y -

+
+
+ + + + diff --git a/functions_z.html b/functions_z.html new file mode 100644 index 00000000..c595c43a --- /dev/null +++ b/functions_z.html @@ -0,0 +1,119 @@ + + + + + + + +mrs_lib: Class Members + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ + + + + + diff --git a/functions_~.html b/functions_~.html new file mode 100644 index 00000000..97b1ac5b --- /dev/null +++ b/functions_~.html @@ -0,0 +1,149 @@ + + + + + + + +mrs_lib: Class Members + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- ~ -

+
+
+ + + + diff --git a/geometry_2cyclic_example_8cpp-example.html b/geometry_2cyclic_example_8cpp-example.html new file mode 100644 index 00000000..124b2e62 --- /dev/null +++ b/geometry_2cyclic_example_8cpp-example.html @@ -0,0 +1,324 @@ + + + + + + + +mrs_lib: geometry/cyclic_example.cpp + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
geometry/cyclic_example.cpp
+
+
+

This example may be run after building mrs_lib by executing rosrun mrs_lib cyclic_example.

+
// clang: MatousFormat
+
// Include the header
+ +
#include <random>
+
#include <ros/ros.h>
+
+
// Define the cyclic quantity we will be using (just a float redefinition of degrees)
+
struct degrees : public mrs_lib::geometry::cyclic<float, degrees>
+
{
+
using cyclic<float, degrees>::cyclic; // necessary to inherit constructors
+
static constexpr double minimum = -180;
+
static constexpr double supremum = 180;
+
};
+
+
// A few helpful aliases to make writing of types shorter
+ + +
+
/* helper printing functions //{ */
+
+
template <class T>
+
void printit(const T& a, const std::string& name)
+
{
+
std::cout << name << ":\t" << std::left << std::showpos << std::setprecision(4) << a.value() << "\tin [ " << a.minimum << ",\t" << a.supremum << "\t["
+
<< std::endl;
+
}
+
+
template <class T>
+
void printcont(const T& cont, const std::string& name)
+
{
+
std::cout << name << ":\t";
+
for (const auto& el : cont)
+
std::cout << el << "\t";
+
std::cout << std::endl;
+
}
+
+
//}
+
+
int main()
+
{
+
// | ---------- Basic initialization and conversions ---------- |
+
+
/* initialization, assignment, conversion //{ */
+
+
degrees a(721.0f); // constructor (equal to 1 degree)
+
radians b(-M_PI_2); // constructor (equal to -45 degrees)
+
radians c(b); // copy constructor
+
radians d = 65; // assignment operator using primitive types will automatically wrap the value to the valid interval
+
radians e = b; // assignment operator (radians class)
+
degrees f = b.convert<degrees>(); // conversion from radians to degrees
+
sradians g = b.convert<sradians>(); // conversion from radians to signed radians
+
degrees h = radians::convert<degrees>(5 * M_PI_2); // static conversion from radians to degrees
+
+
printit(a, "a");
+
printit(b, "b");
+
printit(c, "c");
+
printit(d, "d");
+
printit(e, "e");
+
printit(f, "f");
+
printit(g, "g");
+
printit(h, "h");
+
+
//}
+
+
/* wrong way of converting //{ */
+
+
// this is a wrong way of converting radians to degrees - the argument will be interpreted as degrees (the compiler has no way o knowing whether you mean
+
// radians or degrees - it's all float to him)
+
degrees WRONG1 = degrees(5 * M_PI_2);
+
// this is forbidden (and will not compile) - use the convert methods for conversions between different types of cyclic quantities
+
/* degrees WRONG2 = degrees(b); */
+
+
printit(WRONG1, "WRONG1");
+
/* printit(WRONG2, "WRONG2"); */
+
+
//}
+
+
/* accessors //{ */
+
+
// value of the cyclic quantity object can be accessed using a getter
+
double adouble = a.value();
+
// the minimum, supremum and range are a static property of the class and can be retrieved either from an object of from the class
+
double amin = a.minimum;
+
double asup = degrees::supremum;
+
double aran = degrees::range;
+
std::cout << "adouble:" << std::left << std::showpos << std::setprecision(4) << adouble << "\tin [ " << amin << ",\t" << asup << "\t[\trange: " << aran
+
<< std::endl;
+
+
//}
+
+
std::cout << "----------------------------------------------------------------" << std::endl;
+
// | -------------------- Utility functions ------------------- |
+
+
/* wrapping //{ */
+
+
// you can check whether a value is in the valid range of a type
+
double ang = 666;
+
if (!degrees::inRange(ang))
+
{
+
std::cout << std::left << std::showpos << std::setprecision(4) << ang << "\tis not within [ " << degrees::minimum << ",\t" << degrees::supremum << "\t["
+
<< std::endl;
+
// and wrap it to the correct range if needed
+
double wang = degrees::wrap(ang);
+
std::cout << std::left << std::showpos << std::setprecision(4) << ang << "\tafter wrapping: " << wang << std::endl;
+
}
+
+
//}
+
+
/* unwrapping //{ */
+
+
// if you have a sequence of cyclic values and want to "linearize" it (eg. for a Kalman filter or smh, idk), you can use the unwrap function
+
std::vector<double> data = {0, 61, 122, 183, 244, 305, 6, 67, 128, 189};
+
printcont(data, "data before unwrapping");
+
+
for (size_t it = 1; it < data.size(); it++)
+
{
+
const auto prev = data.at(it - 1);
+
auto& cur = data.at(it);
+
cur = degrees::unwrap(cur, prev);
+
}
+
printcont(data, "data after unwrapping");
+
+
// and then you can wrap it to the corresponding interval! Go crazy!
+
for (auto& el : data)
+
el = degrees::wrap(el);
+
printcont(data, "data after wrapping");
+
+
// AND UNWRAP IT AGAIN BECAUSE IT WORKS LIKE MAGIC!!!
+
for (size_t it = 1; it < data.size(); it++)
+
{
+
const auto prev = data.at(it - 1);
+
auto& cur = data.at(it);
+
cur = degrees::unwrap(cur, prev);
+
}
+
printcont(data, "data after unwrapping");
+
+
//}
+
+
std::cout << "----------------------------------------------------------------" << std::endl;
+
// | ------------------- Distance functions ------------------- |
+
+
/* dist() //{ */
+
+
// there are three distance-related functions provided, each with its own uses
+
// firstly, there is the dist() function, which simply returns the shortest distance from A to B in the cyclic sense
+
degrees A(+33.3);
+
degrees B(-33.3);
+
std::cout << std::left << std::showpos << std::setprecision(4) << "A:\t" << A.value() << std::endl
+
<< "B:\t" << B.value() << std::endl
+
<< "dist(A, B):\t" << degrees::dist(A, B) << std::endl
+
<< "dist(B, A):\t" << degrees::dist(B, A) << std::endl;
+
// notice, that dist() is commutative (perhaps unsurprisingly)
+
+
//}
+
+
/* diff() //{ */
+
+
// secondly, diff() returns the difference between B, subtracted from A
+
// this is the same as dist() except that it is signed (the sign depending on the order of the operands)
+
degrees C(+146.7);
+
degrees D(-146.7);
+
std::cout << std::left << std::showpos << std::setprecision(4) << "C:\t" << C.value() << std::endl
+
<< "D:\t" << D.value() << std::endl
+
<< "diff(C, D):\t" << degrees::diff(C, D) << std::endl
+
<< "diff(D, C):\t" << degrees::diff(D, C) << std::endl;
+
// naturally, uncomutatitve, and diff(C, D) = -diff(D, C) as you'd expect from subtraction
+
+
//}
+
+
/* pdist() //{ */
+
+
// lastly, there is the pdist function, which returns distance from A to B in a positive direction
+
degrees E(+1);
+
degrees F(-1);
+
std::cout << std::left << std::showpos << std::setprecision(4) << "E:\t" << E.value() << std::endl
+
<< "F:\t" << F.value() << std::endl
+
<< "pdist(E, F):\t" << degrees::pdist(E, F) << std::endl
+
<< "pdist(F, E):\t" << degrees::pdist(F, E) << std::endl;
+
// naturally, the result is always positive
+
+
//}
+
+
std::cout << "----------------------------------------------------------------" << std::endl;
+
// | ----------------- Interpolation functions ---------------- |
+
+
/* interpolation //{ */
+
+
// it may happen that during your carrier as a human being, you might want to interpolate two angles
+
// worry not, I've got your back!
+
// this is implemented by the interp() and interpUnwrapped() functions
+
// these differ only whether the result is wrapped to the valid interval of values or not (which might be sometimes useful and is sliiightly faster)
+
// BEHOLD:
+
double a1 = -359;
+
double a2 = -2;
+
double coeff = 1.0 / 3.0;
+
std::cout << std::left << std::showpos << std::setprecision(4) << "a1:\t" << a1 << std::endl
+
<< "a2:\t" << a2 << std::endl
+
<< "coeff:\t" << coeff << std::endl
+
<< "interp(a1, a2, coeff):\t" << degrees::interp(a1, a2, coeff) << std::endl
+
<< "interpUnwrapped(a1, a2, coeff):\t" << degrees::interpUnwrapped(a1, a2, coeff) << std::endl;
+
+
//}
+
+
return 0;
+
}
+
+
+
+
Defines the cyclic class for calculations with cyclic quantities.
+
Definition: cyclic_example.cpp:22
+
static float pdist(const float from, const float to)
Returns length of the shortest walk in the positive direction from the first parameter to the second ...
Definition: cyclic.h:171
+
cyclic()
Default constructor.
Definition: cyclic.h:55
+
static float interpUnwrapped(const float from, const float to, const float coeff)
Interpolation between two circular quantities without wrapping of the result.
Definition: cyclic.h:242
+
static float diff(const float minuend, const float subtrahend)
Returns the difference between the two circular values.
Definition: cyclic.h:193
+
static float dist(const float from, const float to)
Returns the distance between the two circular values.
Definition: cyclic.h:219
+
Implementation of the a general cyclic value (such as angles in radians/degrees etc).
Definition: cyclic.h:48
+
Convenience specialization of the cyclic class for unsigned radians (from $0$ to $2\pi$).
Definition: cyclic.h:489
+
Convenience specialization of the cyclic class for signed radians (from $-\pi$ to $\pi$).
Definition: cyclic.h:499
+
static bool inRange(const float val)
Checks if val is within the valid interval of wrapped values.
Definition: cyclic.h:100
+
static float unwrap(const float what, const float from)
Returns value of the parameter what modified so that there is no "jump" between from and \t what.
Definition: cyclic.h:157
+
static float interp(const float from, const float to, const float coeff)
Interpolation between two circular quantities.
Definition: cyclic.h:264
+
static float wrap(const float val)
Returns val, converted to the valid interval of values.
Definition: cyclic.h:114
+
static constexpr float range
Range of the valid interval of wrapped values (also the period of the cyclic quantity).
Definition: cyclic.h:87
+
static other_t convert(const cyclic &what)
Conversion between two different circular quantities.
Definition: cyclic.h:334
+ + + + diff --git a/gps__conversions_8h.html b/gps__conversions_8h.html new file mode 100644 index 00000000..b13c51ea --- /dev/null +++ b/gps__conversions_8h.html @@ -0,0 +1,186 @@ + + + + + + + +mrs_lib: include/mrs_lib/gps_conversions.h File Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
gps_conversions.h File Reference
+
+
+ +

Universal Transverse Mercator transforms. Functions to convert (spherical) latitude and longitude to and from (Euclidean) UTM coordinates. +More...

+
#include <cmath>
+#include <cstdio>
+#include <cstdlib>
+#include <string>
+
+ + Include dependency graph for gps_conversions.h:
+
+
+ +
+

Go to the source code of this file.

+ + + + + +

+Namespaces

 mrs_lib
 All mrs_lib functions, classes, variables and definitions are contained in this namespace.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Variables

+const double mrs_lib::RADIANS_PER_DEGREE = M_PI / 180.0
 
+const double mrs_lib::DEGREES_PER_RADIAN = 180.0 / M_PI
 
+const double mrs_lib::WGS84_A = 6378137.0
 
+const double mrs_lib::WGS84_B = 6356752.31424518
 
+const double mrs_lib::WGS84_F = 0.0033528107
 
+const double mrs_lib::WGS84_E = 0.0818191908
 
+const double mrs_lib::WGS84_EP = 0.0820944379
 
+const double mrs_lib::UTM_K0 = 0.9996
 
+const double mrs_lib::UTM_FE = 500000.0
 
+const double mrs_lib::UTM_FN_N = 0.0
 
+const double mrs_lib::UTM_FN_S = 10000000.0
 
+const double mrs_lib::UTM_E2 = (WGS84_E * WGS84_E)
 
+const double mrs_lib::UTM_E4 = (UTM_E2 * UTM_E2)
 
+const double mrs_lib::UTM_E6 = (UTM_E4 * UTM_E2)
 
+const double mrs_lib::UTM_EP2 = (UTM_E2 / (1 - UTM_E2))
 
+

Detailed Description

+

Universal Transverse Mercator transforms. Functions to convert (spherical) latitude and longitude to and from (Euclidean) UTM coordinates.

+
Author
Chuck Gantz- chuck.nosp@m..gan.nosp@m.tz@gl.nosp@m.obal.nosp@m.star..nosp@m.com
+
+
+ + + + diff --git a/gps__conversions_8h.js b/gps__conversions_8h.js new file mode 100644 index 00000000..16a056f0 --- /dev/null +++ b/gps__conversions_8h.js @@ -0,0 +1,18 @@ +var gps__conversions_8h = +[ + [ "DEGREES_PER_RADIAN", "gps__conversions_8h.html#a936ac9b087815cba51d58fc1f79e0df5", null ], + [ "RADIANS_PER_DEGREE", "gps__conversions_8h.html#a1b0be1888d6415e50bccf1d97b67569a", null ], + [ "UTM_E2", "gps__conversions_8h.html#af541534981355b9db12705282012786a", null ], + [ "UTM_E4", "gps__conversions_8h.html#a8699db73026f4d4bc2f9147815c92eec", null ], + [ "UTM_E6", "gps__conversions_8h.html#ab21d4291d66fc4b83ec94cf6cfaa5740", null ], + [ "UTM_EP2", "gps__conversions_8h.html#a062139851c2a315cee44dd8c57453e14", null ], + [ "UTM_FE", "gps__conversions_8h.html#a634786a113a5b773e4b51d6235d33ece", null ], + [ "UTM_FN_N", "gps__conversions_8h.html#ab78760950af658f01b7c63bd34b98426", null ], + [ "UTM_FN_S", "gps__conversions_8h.html#a773b1a8b8b3ae12a59841c1a962883a9", null ], + [ "UTM_K0", "gps__conversions_8h.html#a22a17cb8ca411d7cd8b249ba01803aa1", null ], + [ "WGS84_A", "gps__conversions_8h.html#a4c4520b3f93b357fba7dbde5fdb88a9c", null ], + [ "WGS84_B", "gps__conversions_8h.html#a11399734244c9153d49d112430b60d25", null ], + [ "WGS84_E", "gps__conversions_8h.html#addc466a492d572ac9cb23fa2b2a12b4f", null ], + [ "WGS84_EP", "gps__conversions_8h.html#a1c9799ab8aefb1b9b773cca6d94155a0", null ], + [ "WGS84_F", "gps__conversions_8h.html#aa70cc3837c0593f3e96f709a0e4e70eb", null ] +]; \ No newline at end of file diff --git a/gps__conversions_8h__incl.map b/gps__conversions_8h__incl.map new file mode 100644 index 00000000..4147c9fb --- /dev/null +++ b/gps__conversions_8h__incl.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/gps__conversions_8h__incl.md5 b/gps__conversions_8h__incl.md5 new file mode 100644 index 00000000..699084dc --- /dev/null +++ b/gps__conversions_8h__incl.md5 @@ -0,0 +1 @@ +d7ee4c81a10eff367170cd37f9e5d621 \ No newline at end of file diff --git a/gps__conversions_8h__incl.png b/gps__conversions_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..3112d85a5cefa70c472146b3edb7d320a1ed8bf1 GIT binary patch literal 9200 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�aBjAQG0NP^Ynne zR8YWNbFdmo%sO$mwze*P>9*C67DGE?ZIjXAdHV|Ze^phOo`e~GelRC%z+rgy1q%vj z*BpRt*E#@vN&;?k9AF%Gf)aPXG{?bn_Pn3IUdH1527$mPKR*k=dZeVLh5%`I&X@IY z5Y+92q=|SDfz1Wi*K;Q@fB6c)fn-?S{ax=WMpL6czJh)c}>SDRxKvK zjk@6)0{5t#%w^}vQ=axvvw@A1^Waq2zx@EDb$oKtzr9`LZapN;(n2=I)`6!k#| zO(J{gk6B>y5Z(&I2UC50e_*_~KO}11dejvzEes3~qq4BDs5e*=KHeR$0=Jfukr5gA z!CK~(z#RoX8sHh=N_M3Sx>VV$iL_r608^5aGnO^xSI*TA4+8@d3=GWR&=72R-;3a$ zjSH=esoSd93`6C!)Nq{4UH-8Om&yDqUh>eX64nBS^h-iCzdyzZ^8)z#j6L*ZS{I{l^>5}M_50< z9|7O#=69?-o74U$R1!W+3^F0#*jVMnMGjux0pPZ5?C&Fkvbnjv-8df;-SrszibiY; zEEixDpOXqFO8W0OgGVjKr>1&eez+*RYS4z3vSo;PF`j1pstFq|HH>z{>rhpD$<583T~ZQO z;c8k~Pyi3YTwVX + + + + + + +mrs_lib: include/mrs_lib/gps_conversions.h Source File + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
gps_conversions.h
+
+
+Go to the documentation of this file.
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 
+
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 
+
54  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  int cm = ((lon >= 0.0) ? ((int)lon - ((int)lon) % 6 + 3) : ((int)lon - ((int)lon) % 6 - 3));
+
63 
+
64  // convert degrees into radians
+
65  double rlat = lat * RADIANS_PER_DEGREE;
+
66  double rlon = lon * RADIANS_PER_DEGREE;
+
67  double rlon0 = cm * RADIANS_PER_DEGREE;
+
68 
+
69  // compute trigonometric functions
+
70  double slat = sin(rlat);
+
71  double clat = cos(rlat);
+
72  double tlat = tan(rlat);
+
73 
+
74  // decide the false northing at origin
+
75  double fn = (lat > 0) ? UTM_FN_N : UTM_FN_S;
+
76 
+
77  double T = tlat * tlat;
+
78  double C = UTM_EP2 * clat * clat;
+
79  double A = (rlon - rlon0) * clat;
+
80  double M = WGS84_A * (m0 * rlat + m1 * sin(2 * rlat) + m2 * sin(4 * rlat) + m3 * sin(6 * rlat));
+
81  double V = WGS84_A / sqrt(1 - UTM_E2 * slat * slat);
+
82 
+
83  // compute the easting-northing coordinates
+
84  *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  *y = fn +
+
86  UTM_K0 *
+
87  (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  return;
+
90  }
+
91 
+
92 
+
101  static inline char UTMLetterDesignator(double Lat) {
+
102  char LetterDesignator;
+
103 
+
104  if ((84 >= Lat) && (Lat >= 72))
+
105  LetterDesignator = 'X';
+
106  else if ((72 > Lat) && (Lat >= 64))
+
107  LetterDesignator = 'W';
+
108  else if ((64 > Lat) && (Lat >= 56))
+
109  LetterDesignator = 'V';
+
110  else if ((56 > Lat) && (Lat >= 48))
+
111  LetterDesignator = 'U';
+
112  else if ((48 > Lat) && (Lat >= 40))
+
113  LetterDesignator = 'T';
+
114  else if ((40 > Lat) && (Lat >= 32))
+
115  LetterDesignator = 'S';
+
116  else if ((32 > Lat) && (Lat >= 24))
+
117  LetterDesignator = 'R';
+
118  else if ((24 > Lat) && (Lat >= 16))
+
119  LetterDesignator = 'Q';
+
120  else if ((16 > Lat) && (Lat >= 8))
+
121  LetterDesignator = 'P';
+
122  else if ((8 > Lat) && (Lat >= 0))
+
123  LetterDesignator = 'N';
+
124  else if ((0 > Lat) && (Lat >= -8))
+
125  LetterDesignator = 'M';
+
126  else if ((-8 > Lat) && (Lat >= -16))
+
127  LetterDesignator = 'L';
+
128  else if ((-16 > Lat) && (Lat >= -24))
+
129  LetterDesignator = 'K';
+
130  else if ((-24 > Lat) && (Lat >= -32))
+
131  LetterDesignator = 'J';
+
132  else if ((-32 > Lat) && (Lat >= -40))
+
133  LetterDesignator = 'H';
+
134  else if ((-40 > Lat) && (Lat >= -48))
+
135  LetterDesignator = 'G';
+
136  else if ((-48 > Lat) && (Lat >= -56))
+
137  LetterDesignator = 'F';
+
138  else if ((-56 > Lat) && (Lat >= -64))
+
139  LetterDesignator = 'E';
+
140  else if ((-64 > Lat) && (Lat >= -72))
+
141  LetterDesignator = 'D';
+
142  else if ((-72 > Lat) && (Lat >= -80))
+
143  LetterDesignator = 'C';
+
144  // 'Z' is an error flag, the Latitude is outside the UTM limits
+
145  else
+
146  LetterDesignator = 'Z';
+
147  return LetterDesignator;
+
148  }
+
149 
+
159  static inline void LLtoUTM(const double Lat, const double Long, double& UTMNorthing, double& UTMEasting, char* UTMZone) {
+
160  double a = WGS84_A;
+
161  double eccSquared = UTM_E2;
+
162  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  double LongTemp = (Long + 180) - int((Long + 180) / 360) * 360 - 180;
+
170 
+
171  double LatRad = Lat * RADIANS_PER_DEGREE;
+
172  double LongRad = LongTemp * RADIANS_PER_DEGREE;
+
173  double LongOriginRad;
+
174  int ZoneNumber;
+
175 
+
176  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  if (ZoneNumber > 99)
+
180  ZoneNumber = 99;
+
181  if (ZoneNumber < -9)
+
182  ZoneNumber = -9;
+
183 
+
184  if (Lat >= 56.0 && Lat < 64.0 && LongTemp >= 3.0 && LongTemp < 12.0)
+
185  ZoneNumber = 32;
+
186 
+
187  // Special zones for Svalbard
+
188  if (Lat >= 72.0 && Lat < 84.0) {
+
189  if (LongTemp >= 0.0 && LongTemp < 9.0)
+
190  ZoneNumber = 31;
+
191  else if (LongTemp >= 9.0 && LongTemp < 21.0)
+
192  ZoneNumber = 33;
+
193  else if (LongTemp >= 21.0 && LongTemp < 33.0)
+
194  ZoneNumber = 35;
+
195  else if (LongTemp >= 33.0 && LongTemp < 42.0)
+
196  ZoneNumber = 37;
+
197  }
+
198  // +3 puts origin in middle of zone
+
199  LongOrigin = (ZoneNumber - 1) * 6 - 180 + 3;
+
200  LongOriginRad = LongOrigin * RADIANS_PER_DEGREE;
+
201 
+
202  // compute the UTM Zone from the latitude and longitude
+
203  snprintf(UTMZone, 4, "%d%c", ZoneNumber, UTMLetterDesignator(Lat));
+
204 
+
205  eccPrimeSquared = (eccSquared) / (1 - eccSquared);
+
206 
+
207  N = a / sqrt(1 - eccSquared * sin(LatRad) * sin(LatRad));
+
208  T = tan(LatRad) * tan(LatRad);
+
209  C = eccPrimeSquared * cos(LatRad) * cos(LatRad);
+
210  A = cos(LatRad) * (LongRad - LongOriginRad);
+
211 
+
212  M = a * ((1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256) * LatRad -
+
213  (3 * eccSquared / 8 + 3 * eccSquared * eccSquared / 32 + 45 * eccSquared * eccSquared * eccSquared / 1024) * sin(2 * LatRad) +
+
214  (15 * eccSquared * eccSquared / 256 + 45 * eccSquared * eccSquared * eccSquared / 1024) * sin(4 * LatRad) -
+
215  (35 * eccSquared * eccSquared * eccSquared / 3072) * sin(6 * LatRad));
+
216 
+
217  UTMEasting =
+
218  (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  UTMNorthing = (double)(k0 * (M + N * tan(LatRad) *
+
221  (A * A / 2 + (5 - T + 9 * C + 4 * C * C) * A * A * A * A / 24 +
+
222  (61 - 58 * T + T * T + 600 * C - 330 * eccPrimeSquared) * A * A * A * A * A * A / 720)));
+
223  if (Lat < 0)
+
224  UTMNorthing += 10000000.0; // 10000000 meter offset for southern hemisphere
+
225  }
+
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 
+
245  static inline void UTMtoLL(const double UTMNorthing, const double UTMEasting, const char* UTMZone, double& Lat, double& Long) {
+
246  double k0 = UTM_K0;
+
247  double a = WGS84_A;
+
248  double eccSquared = UTM_E2;
+
249  double eccPrimeSquared;
+
250  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  x = UTMEasting - 500000.0; // remove 500,000 meter offset for longitude
+
261  y = UTMNorthing;
+
262 
+
263  ZoneNumber = strtoul(UTMZone, &ZoneLetter, 10);
+
264  if ((*ZoneLetter - 'N') >= 0)
+
265  NorthernHemisphere = 1; // point is in northern hemisphere
+
266  else {
+
267  NorthernHemisphere = 0; // point is in southern hemisphere
+
268  y -= 10000000.0; // remove 10,000,000 meter offset used for southern hemisphere
+
269  }
+
270 
+
271  LongOrigin = (ZoneNumber - 1) * 6 - 180 + 3; //+3 puts origin in middle of zone
+
272 
+
273  eccPrimeSquared = (eccSquared) / (1 - eccSquared);
+
274 
+
275  M = y / k0;
+
276  mu = M / (a * (1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256));
+
277 
+
278  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  (151 * e1 * e1 * e1 / 96) * sin(6 * mu);
+
280  phi1 = phi1Rad * DEGREES_PER_RADIAN;
+
281 
+
282  N1 = a / sqrt(1 - eccSquared * sin(phi1Rad) * sin(phi1Rad));
+
283  T1 = tan(phi1Rad) * tan(phi1Rad);
+
284  C1 = eccPrimeSquared * cos(phi1Rad) * cos(phi1Rad);
+
285  R1 = a * (1 - eccSquared) / pow(1 - eccSquared * sin(phi1Rad) * sin(phi1Rad), 1.5);
+
286  D = x / (N1 * k0);
+
287 
+
288  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  (61 + 90 * T1 + 298 * C1 + 45 * T1 * T1 - 252 * eccPrimeSquared - 3 * C1 * C1) * D * D * D * D * D * D / 720);
+
290  Lat = Lat * DEGREES_PER_RADIAN;
+
291 
+
292  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  cos(phi1Rad);
+
294  Long = LongOrigin + Long * DEGREES_PER_RADIAN;
+
295  }
+
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
+
+
+
All mrs_lib functions, classes, variables and definitions are contained in this namespace.
Definition: attitude_converter.h:29
+ + + + diff --git a/graph_legend.html b/graph_legend.html new file mode 100644 index 00000000..2b83f5df --- /dev/null +++ b/graph_legend.html @@ -0,0 +1,161 @@ + + + + + + + +mrs_lib: Graph Legend + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Graph Legend
+
+
+

This page explains how to interpret the graphs that are generated by doxygen.

+

Consider the following example:

/*! Invisible class because of truncation */
+
class Invisible { };
+
+
/*! Truncated class, inheritance relation is hidden */
+
class Truncated : public Invisible { };
+
+
/* Class not documented with doxygen comments */
+
class Undocumented { };
+
+
/*! Class that is inherited using public inheritance */
+
class PublicBase : public Truncated { };
+
+
/*! A template class */
+
template<class T> class Templ { };
+
+
/*! Class that is inherited using protected inheritance */
+
class ProtectedBase { };
+
+
/*! Class that is inherited using private inheritance */
+
class PrivateBase { };
+
+
/*! Class that is used by the Inherited class */
+
class Used { };
+
+
/*! Super class that inherits a number of other classes */
+
class Inherited : public PublicBase,
+
protected ProtectedBase,
+
private PrivateBase,
+
public Undocumented,
+
public Templ<int>
+
{
+
private:
+
Used *m_usedClass;
+
};
+

This will result in the following graph:

+

The boxes in the above graph have the following meaning:

+
    +
  • +A filled gray box represents the struct or class for which the graph is generated.
  • +
  • +A box with a black border denotes a documented struct or class.
  • +
  • +A box with a gray border denotes an undocumented struct or class.
  • +
  • +A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
  • +
+

The arrows have the following meaning:

+
    +
  • +A dark blue arrow is used to visualize a public inheritance relation between two classes.
  • +
  • +A dark green arrow is used for protected inheritance.
  • +
  • +A dark red arrow is used for private inheritance.
  • +
  • +A purple dashed arrow is used if a class is contained or used by another class. The arrow is labelled with the variable(s) through which the pointed class or struct is accessible.
  • +
  • +A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labelled with the template parameters of the instance.
  • +
+
+
+ + + + diff --git a/graph_legend.md5 b/graph_legend.md5 new file mode 100644 index 00000000..8fcdccd1 --- /dev/null +++ b/graph_legend.md5 @@ -0,0 +1 @@ +f51bf6e9a10430aafef59831b08dcbfe \ No newline at end of file diff --git a/graph_legend.png b/graph_legend.png new file mode 100644 index 0000000000000000000000000000000000000000..7e2cbcfb2d143e382be6ed65635a3d859e53bc36 GIT binary patch literal 20615 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 literal 0 HcmV?d00001 diff --git a/hierarchy.html b/hierarchy.html new file mode 100644 index 00000000..d9303a6c --- /dev/null +++ b/hierarchy.html @@ -0,0 +1,208 @@ + + + + + + + +mrs_lib: Class Hierarchy + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Class Hierarchy
+
+
+
+

Go to the graphical class hierarchy

+This inheritance list is sorted roughly, but not completely, alphabetically:
+
[detail level 1234]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Cmrs_lib::AtomicScopeFlagConvenience class for automatically setting and unsetting an atomic boolean based on the object's scope. Useful e.g. for indicating whether a thread is running or not
 Cmrs_lib::AttitudeConverterThe main convertor class. Instantiate with any type in constructor and get the value in any other type by assigning the instance to your variable, as: tf::Quaternion tf1_quaternion = AttitudeConverter(roll, pitch, yaw); All the default Euler angles are in the extrinsic RPY notation
 Cmrs_lib::BatchVisualizerLibrary for drawing large amounts of geometric objects in RVIZ at the same time
 Cmrs_lib::geometry::ConeGeometric representaiton of a cone
 Cmrs_lib::geometry::CuboidGeometric representation of a cuboid
 Cmrs_lib::geometry::cyclic< flt, spec >Implementation of the a general cyclic value (such as angles in radians/degrees etc)
 Cmrs_lib::geometry::cyclic< double, degrees >
 Cmrs_lib::geometry::degreesConvenience specialization of the cyclic class for unsigned degrees (from $0$ to $360$)
 Cmrs_lib::geometry::cyclic< double, radians >
 Cmrs_lib::geometry::radiansConvenience specialization of the cyclic class for unsigned radians (from $0$ to $2\pi$)
 Cmrs_lib::geometry::cyclic< double, sdegrees >
 Cmrs_lib::geometry::sdegreesConvenience specialization of the cyclic class for signed degrees (from $-180$ to $180$)
 Cmrs_lib::geometry::cyclic< double, sradians >
 Cmrs_lib::geometry::sradiansConvenience specialization of the cyclic class for signed radians (from $-\pi$ to $\pi$)
 Cmrs_lib::geometry::cyclic< float, degrees >
 Cdegrees
 Cmrs_lib::geometry::CylinderGeometric representation of a cylinder
 Cmrs_lib::DynamicPublisherA helper class for easy publishing of ROS messages for debugging purposes
 Cmrs_lib::DynamicReconfigureMgr< ConfigType >
 Cmrs_lib::geometry::EllipseGeometric representation of an ellipse
 Cmrs_lib::EulerAttitudeA small class for storing the Euler angles
 Cexception
 Cmrs_lib::AttitudeConverter::EulerFormatExceptionThrown when the Euler angle format is set wrongly
 Cmrs_lib::AttitudeConverter::GetHeadingExceptionThrown when calculating of heading is not possible due to atan2 exception
 Cmrs_lib::AttitudeConverter::InvalidAttitudeExceptionThrown when the internal attitude becomes invalid
 Cmrs_lib::AttitudeConverter::MathErrorExceptionThrown when math breaks
 Cmrs_lib::AttitudeConverter::SetHeadingExceptionThrown when the heading cannot be set to an existing attitude
 Cmrs_lib::eigenvector_exceptionThis exception may be thrown when solving the generalized eigenvalue problem with the M and N matrices
 Cmrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >::inverse_exceptionThis exception is thrown when taking the inverse of a matrix fails
 Cmrs_lib::LKF< n_states, n_inputs, n_measurements >::inverse_exceptionThis exception is thrown when taking the inverse of a matrix fails
 Cmrs_lib::Polygon::ExtraVertices
 Cmrs_lib::Polygon::WrongNumberOfColumns
 Cmrs_lib::Polygon::WrongNumberOfVertices
 Cmrs_lib::SafetyZone::BorderError
 Cmrs_lib::UKF< n_states, n_inputs, n_measurements >::inverse_exceptionThrown when taking the inverse of a matrix fails during kalman gain calculation
 Cmrs_lib::UKF< n_states, n_inputs, n_measurements >::square_root_exceptionThrown when taking the square root of a matrix fails during sigma generation
 Cmrs_lib::IirFilter
 Cmrs_lib::ImagePubliserData
 Cmrs_lib::ImagePublisher
 CDynamicPublisher::impl
 Cmrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >
 Cmrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >
 CThreadTimer::Impl
 Cmrs_lib::Intersection
 Cmrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >This abstract class defines common interfaces and types for a generic Kalman filter
 Cmrs_lib::LKF< 3, -1, 2 >
 Cmrs_lib::DKFImplementation of the Degenerate measurement Linear Kalman filter
 Cmrs_lib::LKF< 3, 1, 1 >
 Cmrs_lib::LKF_MRS_odom
 Cmrs_lib::LKF< n_states, n_inputs, n_measurements >Implementation of the Linear Kalman filter [3]
 Cmrs_lib::NCLKF< n_states, n_inputs, n_measurements >This class implements the norm-constrained linear Kalman filter [5]
 Cmrs_lib::varstepLKF< n_states, n_inputs, n_measurements >
 Cmrs_lib::UKF< n_states, n_inputs, n_measurements >Implementation of the Unscented Kalman filter [4]
 Cmrs_lib::NCUKF< n_states, n_inputs, n_measurements >
 Cmrs_lib::KalmanFilterAloamGarm< n_states, n_inputs, n_measurements >This abstract class defines common interfaces and types for a generic Kalman filter
 Cmrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >
 Cmrs_lib::MedianFilterImplementation of a median filter with a fixed-length buffer
 Cmrs_lib::quadratic_throttle_model::MotorParams_t
 Cmrs_lib::MRSTimerCommon wrapper representing the functionality of the ros::Timer
 Cmrs_lib::ROSTimerRos::Timer wrapper. The interface is the same as with ros::Timer, except for the initialization method
 Cmrs_lib::ThreadTimerCustom thread-based Timers with the same interface as mrs_lib::ROSTimer
 CMyPoint
 Cmrs_lib::NotchFilter
 Cobj_t
 Cmrs_lib::ParamLoaderConvenience class for loading parameters from rosparam server
 Cmrs_lib::ParamProviderHelper class for ParamLoader
 Cmrs_lib::Polygon
 Cmrs_lib::Profiler
 Cmrs_lib::PublisherHandler< TopicType >User wrapper of the publisher handler implementation
 Cmrs_lib::PublisherHandler_impl< TopicType >Implementation of the publisher handler
 Cmrs_lib::geometry::RayGeometric representation of a ray. Instantiate it by two input Vector3. Use static methods for from-to raycast, or a point-direction raycast
 Cmrs_lib::geometry::RectangleGeometric representation of a rectangle (can represent any quadrilateral)
 Cmrs_lib::Repredictor< Model, disable_reprediction >Implementation of the Repredictor for fusing measurements with variable delays
 Cmrs_lib::Repredictor< Model >
 Cmrs_lib::RepredictorAloamgarm< Model >Implementation of the RepredictorAloamgarm for fusing measurements with variable delays
 Cmrs_lib::RHEIV< n_states, n_params >Implementation of the Reduced Heteroscedastic Errors In Variables surface fitting algorithm [2]
 Cmrs_lib::Routine
 Cmrs_lib::SafetyZone
 Cmrs_lib::ScopeTimerSimple timer which will time a duration of a scope and checkpoints inside the scope in ros time and std::chrono time
 Cmrs_lib::ScopeTimerLoggerSimple file logger of scope timer and its checkpoints
 Cmrs_lib::ServiceClientHandler< ServiceType >User wrapper of the service client handler implementation
 Cmrs_lib::ServiceClientHandler_impl< ServiceType >Implementation of the service client handler
 Cmrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >::statecov_tHelper struct for passing around the state and its covariance in one variable
 Cmrs_lib::KalmanFilterAloamGarm< n_states, n_inputs, n_measurements >::statecov_tHelper struct for passing around the state and its covariance in one variable
 CSubObject
 Cmrs_lib::SubscribeHandler< MessageType >The main class for ROS topic subscription, message timeout handling etc
 Cmrs_lib::SubscribeHandlerOptionsA helper class to simplify setup of SubscribeHandler construction. This class is passed to the SubscribeHandler constructor and specifies its common options
 CTest
 CVectorConverterTest< T >
 Cmrs_lib::ScopeTimer::time_point
 Cmrs_lib::TimeoutManagerTODO
 Cmrs_lib::TransformBroadcasterWrapper for the tf2_ros::TransformBroadcaster. With each sendTransform() command, the message is checked against the last message with the same frame IDs. If the transform was already published in this ros::Time step, then the transform is skipped. Prevents endless stream of warnings from spamming the console output
 Cmrs_lib::TransformerA convenience wrapper class for ROS's native TF2 API to simplify transforming of various messages
 Cmrs_lib::geometry::TriangleGeometric representation of a triangle. Instantiate a new triangle by providing three vertices
 Cstd::tuple_element< 0, mrs_lib::AttitudeConverter >
 Cstd::tuple_element< 1, mrs_lib::AttitudeConverter >
 Cstd::tuple_element< 2, mrs_lib::AttitudeConverter >
 Cstd::tuple_size< mrs_lib::AttitudeConverter >
 Cmrs_lib::Vector3ConverterConverter of Vector3 representations. Instantiate it with any type of vector3 in constructor and convert it by assigning it to any other type of vector3 variable
 Cmrs_lib::VisualObject
+
+
+
+ + + + diff --git a/hierarchy.js b/hierarchy.js new file mode 100644 index 00000000..b4696719 --- /dev/null +++ b/hierarchy.js @@ -0,0 +1,121 @@ +var hierarchy = +[ + [ "mrs_lib::AtomicScopeFlag", "classmrs__lib_1_1AtomicScopeFlag.html", null ], + [ "mrs_lib::AttitudeConverter", "classmrs__lib_1_1AttitudeConverter.html", null ], + [ "mrs_lib::BatchVisualizer", "classmrs__lib_1_1BatchVisualizer.html", null ], + [ "mrs_lib::geometry::Cone", "classmrs__lib_1_1geometry_1_1Cone.html", null ], + [ "mrs_lib::geometry::Cuboid", "classmrs__lib_1_1geometry_1_1Cuboid.html", null ], + [ "mrs_lib::geometry::cyclic< flt, spec >", "structmrs__lib_1_1geometry_1_1cyclic.html", null ], + [ "mrs_lib::geometry::cyclic< double, degrees >", "structmrs__lib_1_1geometry_1_1cyclic.html", [ + [ "mrs_lib::geometry::degrees", "structmrs__lib_1_1geometry_1_1degrees.html", null ] + ] ], + [ "mrs_lib::geometry::cyclic< double, radians >", "structmrs__lib_1_1geometry_1_1cyclic.html", [ + [ "mrs_lib::geometry::radians", "structmrs__lib_1_1geometry_1_1radians.html", null ] + ] ], + [ "mrs_lib::geometry::cyclic< double, sdegrees >", "structmrs__lib_1_1geometry_1_1cyclic.html", [ + [ "mrs_lib::geometry::sdegrees", "structmrs__lib_1_1geometry_1_1sdegrees.html", null ] + ] ], + [ "mrs_lib::geometry::cyclic< double, sradians >", "structmrs__lib_1_1geometry_1_1cyclic.html", [ + [ "mrs_lib::geometry::sradians", "structmrs__lib_1_1geometry_1_1sradians.html", null ] + ] ], + [ "mrs_lib::geometry::cyclic< float, degrees >", "structmrs__lib_1_1geometry_1_1cyclic.html", [ + [ "degrees", "structdegrees.html", null ] + ] ], + [ "mrs_lib::geometry::Cylinder", "classmrs__lib_1_1geometry_1_1Cylinder.html", null ], + [ "mrs_lib::DynamicPublisher", "classmrs__lib_1_1DynamicPublisher.html", null ], + [ "mrs_lib::DynamicReconfigureMgr< ConfigType >", "classmrs__lib_1_1DynamicReconfigureMgr.html", null ], + [ "mrs_lib::geometry::Ellipse", "classmrs__lib_1_1geometry_1_1Ellipse.html", null ], + [ "mrs_lib::EulerAttitude", "classmrs__lib_1_1EulerAttitude.html", null ], + [ "exception", null, [ + [ "mrs_lib::AttitudeConverter::EulerFormatException", "structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException.html", null ], + [ "mrs_lib::AttitudeConverter::GetHeadingException", "structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException.html", null ], + [ "mrs_lib::AttitudeConverter::InvalidAttitudeException", "structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException.html", null ], + [ "mrs_lib::AttitudeConverter::MathErrorException", "structmrs__lib_1_1AttitudeConverter_1_1MathErrorException.html", null ], + [ "mrs_lib::AttitudeConverter::SetHeadingException", "structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException.html", null ], + [ "mrs_lib::eigenvector_exception", "structmrs__lib_1_1eigenvector__exception.html", null ], + [ "mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >::inverse_exception", "structmrs__lib_1_1JLKF_1_1inverse__exception.html", null ], + [ "mrs_lib::LKF< n_states, n_inputs, n_measurements >::inverse_exception", "structmrs__lib_1_1LKF_1_1inverse__exception.html", null ], + [ "mrs_lib::Polygon::ExtraVertices", "structmrs__lib_1_1Polygon_1_1ExtraVertices.html", null ], + [ "mrs_lib::Polygon::WrongNumberOfColumns", "structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns.html", null ], + [ "mrs_lib::Polygon::WrongNumberOfVertices", "structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices.html", null ], + [ "mrs_lib::SafetyZone::BorderError", "structmrs__lib_1_1SafetyZone_1_1BorderError.html", null ], + [ "mrs_lib::UKF< n_states, n_inputs, n_measurements >::inverse_exception", "structmrs__lib_1_1UKF_1_1inverse__exception.html", null ], + [ "mrs_lib::UKF< n_states, n_inputs, n_measurements >::square_root_exception", "structmrs__lib_1_1UKF_1_1square__root__exception.html", null ] + ] ], + [ "mrs_lib::IirFilter", "classmrs__lib_1_1IirFilter.html", null ], + [ "mrs_lib::ImagePubliserData", "structmrs__lib_1_1ImagePubliserData.html", null ], + [ "mrs_lib::ImagePublisher", "classmrs__lib_1_1ImagePublisher.html", null ], + [ "DynamicPublisher::impl", "classDynamicPublisher_1_1impl.html", null ], + [ "mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >", "classmrs__lib_1_1SubscribeHandler_1_1Impl.html", [ + [ "mrs_lib::SubscribeHandler< MessageType >::ImplThreadsafe< MessageType >", "classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe.html", null ] + ] ], + [ "ThreadTimer::Impl", "classThreadTimer_1_1Impl.html", null ], + [ "mrs_lib::Intersection", "structmrs__lib_1_1Intersection.html", null ], + [ "mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >", "classmrs__lib_1_1KalmanFilter.html", [ + [ "mrs_lib::LKF< 3, -1, 2 >", "classmrs__lib_1_1LKF.html", [ + [ "mrs_lib::DKF", "classmrs__lib_1_1DKF.html", null ] + ] ], + [ "mrs_lib::LKF< 3, 1, 1 >", "classmrs__lib_1_1LKF.html", [ + [ "mrs_lib::LKF_MRS_odom", "classmrs__lib_1_1LKF__MRS__odom.html", null ] + ] ], + [ "mrs_lib::LKF< n_states, n_inputs, n_measurements >", "classmrs__lib_1_1LKF.html", [ + [ "mrs_lib::NCLKF< n_states, n_inputs, n_measurements >", "classmrs__lib_1_1NCLKF.html", [ + [ "mrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states >", "classmrs__lib_1_1NCLKF__partial.html", null ] + ] ], + [ "mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >", "classmrs__lib_1_1varstepLKF.html", null ] + ] ], + [ "mrs_lib::UKF< n_states, n_inputs, n_measurements >", "classmrs__lib_1_1UKF.html", [ + [ "mrs_lib::NCUKF< n_states, n_inputs, n_measurements >", "classmrs__lib_1_1NCUKF.html", null ] + ] ] + ] ], + [ "mrs_lib::KalmanFilterAloamGarm< n_states, n_inputs, n_measurements >", "classmrs__lib_1_1KalmanFilterAloamGarm.html", [ + [ "mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >", "classmrs__lib_1_1JLKF.html", null ] + ] ], + [ "mrs_lib::MedianFilter", "classmrs__lib_1_1MedianFilter.html", null ], + [ "mrs_lib::quadratic_throttle_model::MotorParams_t", "structmrs__lib_1_1quadratic__throttle__model_1_1MotorParams__t.html", null ], + [ "mrs_lib::MRSTimer", "classmrs__lib_1_1MRSTimer.html", [ + [ "mrs_lib::ROSTimer", "classmrs__lib_1_1ROSTimer.html", null ], + [ "mrs_lib::ThreadTimer", "classmrs__lib_1_1ThreadTimer.html", null ] + ] ], + [ "MyPoint", "structMyPoint.html", null ], + [ "mrs_lib::NotchFilter", "classmrs__lib_1_1NotchFilter.html", null ], + [ "obj_t", "structobj__t.html", null ], + [ "mrs_lib::ParamLoader", "classmrs__lib_1_1ParamLoader.html", null ], + [ "mrs_lib::ParamProvider", "classmrs__lib_1_1ParamProvider.html", null ], + [ "mrs_lib::Polygon", "classmrs__lib_1_1Polygon.html", null ], + [ "mrs_lib::Profiler", "classmrs__lib_1_1Profiler.html", null ], + [ "mrs_lib::PublisherHandler< TopicType >", "classmrs__lib_1_1PublisherHandler.html", null ], + [ "mrs_lib::PublisherHandler_impl< TopicType >", "classmrs__lib_1_1PublisherHandler__impl.html", null ], + [ "mrs_lib::geometry::Ray", "classmrs__lib_1_1geometry_1_1Ray.html", null ], + [ "mrs_lib::geometry::Rectangle", "classmrs__lib_1_1geometry_1_1Rectangle.html", null ], + [ "mrs_lib::Repredictor< Model, disable_reprediction >", "classmrs__lib_1_1Repredictor.html", null ], + [ "mrs_lib::Repredictor< Model >", "classmrs__lib_1_1Repredictor.html", [ + [ "mrs_lib::RepredictorAloamgarm< Model >", "classmrs__lib_1_1RepredictorAloamgarm.html", null ] + ] ], + [ "mrs_lib::RHEIV< n_states, n_params >", "classmrs__lib_1_1RHEIV.html", null ], + [ "mrs_lib::Routine", "classmrs__lib_1_1Routine.html", null ], + [ "mrs_lib::SafetyZone", "classmrs__lib_1_1SafetyZone.html", null ], + [ "mrs_lib::ScopeTimer", "classmrs__lib_1_1ScopeTimer.html", null ], + [ "mrs_lib::ScopeTimerLogger", "classmrs__lib_1_1ScopeTimerLogger.html", null ], + [ "mrs_lib::ServiceClientHandler< ServiceType >", "classmrs__lib_1_1ServiceClientHandler.html", null ], + [ "mrs_lib::ServiceClientHandler_impl< ServiceType >", "classmrs__lib_1_1ServiceClientHandler__impl.html", null ], + [ "mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >::statecov_t", "structmrs__lib_1_1KalmanFilter_1_1statecov__t.html", null ], + [ "mrs_lib::KalmanFilterAloamGarm< n_states, n_inputs, n_measurements >::statecov_t", "structmrs__lib_1_1KalmanFilterAloamGarm_1_1statecov__t.html", null ], + [ "SubObject", "classSubObject.html", null ], + [ "mrs_lib::SubscribeHandler< MessageType >", "classmrs__lib_1_1SubscribeHandler.html", null ], + [ "mrs_lib::SubscribeHandlerOptions", "structmrs__lib_1_1SubscribeHandlerOptions.html", null ], + [ "Test", null, [ + [ "VectorConverterTest< T >", "classVectorConverterTest.html", null ] + ] ], + [ "mrs_lib::ScopeTimer::time_point", "structmrs__lib_1_1ScopeTimer_1_1time__point.html", null ], + [ "mrs_lib::TimeoutManager", "classmrs__lib_1_1TimeoutManager.html", null ], + [ "mrs_lib::TransformBroadcaster", "classmrs__lib_1_1TransformBroadcaster.html", null ], + [ "mrs_lib::Transformer", "classmrs__lib_1_1Transformer.html", null ], + [ "mrs_lib::geometry::Triangle", "classmrs__lib_1_1geometry_1_1Triangle.html", null ], + [ "std::tuple_element< 0, mrs_lib::AttitudeConverter >", "structstd_1_1tuple__element_3_010_00_01mrs__lib_1_1AttitudeConverter_01_4.html", null ], + [ "std::tuple_element< 1, mrs_lib::AttitudeConverter >", "structstd_1_1tuple__element_3_011_00_01mrs__lib_1_1AttitudeConverter_01_4.html", null ], + [ "std::tuple_element< 2, mrs_lib::AttitudeConverter >", "structstd_1_1tuple__element_3_012_00_01mrs__lib_1_1AttitudeConverter_01_4.html", null ], + [ "std::tuple_size< mrs_lib::AttitudeConverter >", "structstd_1_1tuple__size_3_01mrs__lib_1_1AttitudeConverter_01_4.html", null ], + [ "mrs_lib::Vector3Converter", "classmrs__lib_1_1Vector3Converter.html", null ], + [ "mrs_lib::VisualObject", "classmrs__lib_1_1VisualObject.html", null ] +]; \ No newline at end of file diff --git a/iir__filter_8h.html b/iir__filter_8h.html new file mode 100644 index 00000000..56c310da --- /dev/null +++ b/iir__filter_8h.html @@ -0,0 +1,144 @@ + + + + + + + +mrs_lib: include/mrs_lib/iir_filter.h File Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
iir_filter.h File Reference
+
+
+
#include <ros/ros.h>
+
+ + Include dependency graph for iir_filter.h:
+
+
+ +
+ + This graph shows which files directly or indirectly include this file:
+
+
+ +
+

Go to the source code of this file.

+ + + + +

+Classes

class  mrs_lib::IirFilter
 
+ + + + +

+Namespaces

 mrs_lib
 All mrs_lib functions, classes, variables and definitions are contained in this namespace.
 
+

Detailed Description

+
+
+ + + + diff --git a/iir__filter_8h__dep__incl.map b/iir__filter_8h__dep__incl.map new file mode 100644 index 00000000..064b1faa --- /dev/null +++ b/iir__filter_8h__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/iir__filter_8h__dep__incl.md5 b/iir__filter_8h__dep__incl.md5 new file mode 100644 index 00000000..6cbb6d54 --- /dev/null +++ b/iir__filter_8h__dep__incl.md5 @@ -0,0 +1 @@ +d5954449838f983536a58c263d70bb27 \ No newline at end of file diff --git a/iir__filter_8h__dep__incl.png b/iir__filter_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..f2128b53a96cd2ddd7a7118c4464ecdc6ea9fbe0 GIT binary patch literal 4437 zcmcJT`8$+v`^RsZ?4;o{sVG^-zVG`Ql98CQW*KWUWGz#&Zy_X+j4c{M_K_t^C=z4r zgb2x&rR+<5uRhQ5eg1>zm}BPp>7MJnuJe7q&)0d!m>BCbGn`|9Ac*;jfvzc7-+*sC z9X0qR=FxD1g$8p~Ul%(5`^jl6NQR)(3|Dlu(D;m%%-ber=I1*o{85_JREvD>Nkd^d zZ_zJeud{RL>&}K9VMwg5Rz{e3>C&)sEs4;aDgP%4 zu8By7klggv@7>p;51K|~=?%4?GIs6-Dk~}N)E#FW%!}^OD?BnSgt2zDGk8+59)==A zG}$zB=((W~q52Eu4sA4!3n3g&!osLC$9U^kSy*B8OiZu(+?2UaN-=A{EN^PE9l;fC z7(mcyxr2^{McM^g?Z@Qo;G;UvDfL^4VK{0!St?jMM2$?RpP8M#YG~L#dGs;v%=Gj$ zreYNT)DI*3M@mX+Zf-7rL`Ls1hWb_+(J~h&@cONSH|A&Hc9d{>8vx~qr^nJ3e3mYe?%Y% z{Jjyfsbp6$wWB>fr3D4^pOSd1tE*+td63iPECOP5pArbxmX=D2ii!c-KP8%W zTfclc8yH7+iH?Zirh~Jw$+-4pfNk>gk*==ugM)(|i5JhXvokR>U)I&-6A<8~3&XO| z(-#&O6wK@b^_?V-^Cr>FzQDQ9>g5jlcCUFS7+1yx38}cq={5n$-_!#mTz<^xpR1U7#wxH#&e{M?PiJ9KkV$f$Yg~( z69##G!XhGa)$ue)y=JrK(|Ja;SVd*!+>`Ja7{qb*?Be2LMP;RrukV1|GZR5lMMVoW z=Crbk3Kay-XznpFG&DCm>wA3k=S!7qa;KA=6xfIlPEQDbQ&OU@r&sQ{=%;Mub@wj0 zyIb|{(lZOu?X9g_HFq-0%F0SB`xJ|uUz*TCCIf%3j@N;K&2468Cf7s|T+GDRulhJ0 zo}}{PFy<_vPCVX%5B_ol-ni|i3DXj{Yce954$YK*aYrT>7Hj)?hqO9Lzc9)-Eo|_f z)x%&g4i1-=Tr%Ik%AGsOh4W4+jY@DJn9>$pr3i zR#sMmE1IWd&wu}(lXBT-YU6D6%%@Lzk_=i~TY;Aho%`_dqqD1PnO*ZFne4H(G$bb{=k{l^ zF(8pssq*#!($BxQw>MLSSzu(Jxve2BN_bBYKEvhQn4OE@hT7uVlV7B&LI8UuEWQ_;UWlLbmj zN*pnmbwut-M>id_&U#xjnPyA$jT>^O+pSBCI6Z1nwE5FJQ^5-OZXnV4^9n^b^z`)d ziNrDxKr7jZ_;xY^oA(Xn(kb zfzlfu8L?}?|LT4r!^z^h*iXcZq{Gq(^opFunwn6gHWjpcaA4OQbgK$wW0QgHr^4Jp zF08Eyz+>>mX-;WFt&(bLe^$S~gFM;}+( zC5O|rQ>KksMZJ~1e0;FCZzpxl*>7@^#x6|-9juhzdbiGsV-W3womaTi;J;?;h#H2BicS5|txZKzO&6&rCb=-Zk^hxH?e zoIbY)s!N*lN$)dWm#tY;ez%6+lL-OT)P6^67F8{|Be3TZ8ldWRd0xI=xHM_C{=o;8 zgBF&seUoZ9XIiMLaU9B@_$U<@MtjQYUH#F{PnFP|vif>vb0s{c4yid$O)}zxi`%`O zINPF);!YNdjlEz*WoAy*16#^S}d>GA(I8{9S=wn-rr@{=8)=qQ~ zcKNcLS^nX26gLX25+8s1+?AbXdukP=fPoQ52NRp(*Ju6SPs9!^w{XSDXxU}I%FVT1*3%R>N26so zx2_nKG1!Urz=*^|V*mA;Fkm&L%?hC{Bbcao=;q8v`{3hZvV)%9C5T%DCw9}(({uK_ zZj090AfwL`=?Sy~0oc7(L2f^Zqz8~KX3v8pa6{WKU_k_bcFG$ z7YO9`s|?~^bvBS@P>}khwh;sHZAp$YTag=|y1Lq~aj3J>vB1JkObQ#JY;Cia?vDJf zJ$E%AHi`Ih&urc6|KkmbL9xQ&02WlXw{P9LMHlAh?|=T#d z-1{3prp0s_*(}eu;|s!ba&o%6yB|HG6HZxLTMPcPf0xu$Rwf}N)Crt#X|T}S+Z&iU zR*QqF9r#hNbYh1Nt1cg$3Id(VQWTM5$jrpl;I{}L4gxp@o&rs{uP^B%rn;ua(es}( zXUZ%pT0egVoFb^Cq$Ddl*wZ5}DY*_jS3mKBvm^(o{)&nUhDhpxjHIN~2!xBL=W)ly z;0#6Y*70$I_RENJn*%JyhJP(`_}zS7`K6e!6)2)a@(|9``}r!O4MfsDbLA+9>An}fSj#kRM%0SPTHF5Y%`_w)Adq)<9!-__QF4C^D4y%jlmk}NDO zg^~=4ii+;7O{%q@DjlXbD=;p3{hBrI3P$W7p%(NZ2+#RLZ6VZ~wH! z<9C10b@iQ?@5v1K(S7#kpw)pdDXomwZ9+;mgg)VdT5Rg|GaGo-O$w>7a8ZsHE2rh_ zD+7Jo+n9G#Q%2K8YLlq4Df-KEK1wNupk-aYW{6Ba*xxsinhM{H| zN$VttsI+vnYpFEhj7%&nF$DY4-YB`9`mZCBwmwycYlBBTx`eebwPGf zZp6#Kp!RKbHG!Khj2lM%5@1eA2{UA3WmWGrtqpQQ;@|dNm6w+Xu%i9aUV{Ird9w?c z8bT2bjg1mEwdJmqtZ(1Gl~~uPKiD)dCkv{ps~0(6NGvEsRpo(!;F*wFLqkLF{^CGE z`0+dmeIFH!Z6DNWxQ>XjwYBxBofG-Oa@T097||Z0ziQ zAg@UVgOih4>FKdI_xJb3Ez0cyc7p+nNaR;j<6^AE4i%9J3JUV_EX>SmfY_ClA2>My zG6j@hVIkT`Onv@5cx%X65|5i`nVv z>FeuW)ilv8TwoNr=kM=YVSyWI+MiAWHw^@2XJ?0q+XDE9*#gPQlycNVquDc!r@$=p zgG{)>XX@72Zawe|Vj77&#{m^`n8 zw?@R49yr4@#P-*sPBpk2&+{&g<3nE+m3M#`3Wv{2E=HTrjN$=p85$ab^4)zH1f2Zt z-Rk&w=E+zj6#%rQr6u6RU>Jm;u<-Ec=xDj|H0i4o7>w@4fq;v7)f`3hKVAU zqb~-1>g;T}xs^T;>XLeo#8++AZYlT30ba{SJ4B#KUUf-A($muet9IK1=m~H^tQh%c zu#%L=UwA{Nr>LM;B2>j2a=BOKcDRmj$j!~2n6UBm^b}5cu)988a4lQ?{%=^IKhTd6 zGFg-RHCM{BXPZX{YssD8cX#ojn!SB}4nEUSANo=2>3nh~or=W{PhhJbTHv0DLYLcp zeASxV_+>FMjf~R0i`FhN{0T6urB%rlY_$%U7E(nm!=f$B>|>B7UHw>;>1;_K>2)cb zZ0`@<=Y>{TxYLac**Jv98MR(Kdv}7dd;46<6(zVP6XSng0|2D5Iun(;ZKClA!S--> sIy!%Zs^v6nwVM0C{qk>Pht} + + + diff --git a/iir__filter_8h__incl.md5 b/iir__filter_8h__incl.md5 new file mode 100644 index 00000000..450eb2c3 --- /dev/null +++ b/iir__filter_8h__incl.md5 @@ -0,0 +1 @@ +6fd681bcfbf038c0c337c630624730ff \ No newline at end of file diff --git a/iir__filter_8h__incl.png b/iir__filter_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..eff5b273913b973e42990024bceb6d5009ffee21 GIT binary patch literal 3597 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 + + + + + + +mrs_lib: include/mrs_lib/iir_filter.h Source File + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
iir_filter.h
+
+
+Go to the documentation of this file.
1 
+
4 #ifndef IIR_FILTER_H
+
5 #define IIR_FILTER_H
+
6 
+
7 #include <ros/ros.h>
+
8 
+
9 namespace mrs_lib
+
10 {
+
11 
+
12 class IirFilter {
+
13 
+
14 public:
+
15  IirFilter(const std::vector<double>& a, const std::vector<double>& b);
+
16 
+
17  double iterate(const double& input);
+
18 
+
19 
+
20 private:
+
21  std::vector<double> a_;
+
22  std::vector<double> b_;
+
23  size_t order_;
+
24  std::vector<double> buffer_;
+
25 };
+
26 
+
27 } // namespace mrs_lib
+
28 
+
29 #endif
+
+
+
Definition: iir_filter.h:12
+
All mrs_lib functions, classes, variables and definitions are contained in this namespace.
Definition: attitude_converter.h:29
+ + + + diff --git a/image__publisher_8h_source.html b/image__publisher_8h_source.html new file mode 100644 index 00000000..f1e3374d --- /dev/null +++ b/image__publisher_8h_source.html @@ -0,0 +1,151 @@ + + + + + + + +mrs_lib: include/mrs_lib/image_publisher.h Source File + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
image_publisher.h
+
+
+
1 #ifndef _IMAGE_TRANSPORTER_
+
2 #define _IMAGE_TRANSPORTER_
+
3 
+
4 #include <opencv2/core/core.hpp>
+
5 #include <cv_bridge/cv_bridge.h>
+
6 #include <image_transport/image_transport.h>
+
7 #include <ros/ros.h>
+
8 #include <mutex>
+
9 #include <memory>
+
10 
+
11 namespace mrs_lib {
+
12 
+ +
14  ImagePubliserData(const image_transport::Publisher& publisher, const std::string& topic_name, const ros::Time& last_hit)
+
15  :
+
16  publisher(publisher),
+
17  topic_name(topic_name),
+
18  last_hit(last_hit) {};
+
19  image_transport::Publisher publisher;
+
20  std::string topic_name;
+
21  std::mutex pub_mutex;
+
22  ros::Time last_hit;
+
23  };
+
24 
+ +
26  public:
+
27  ImagePublisher(ros::NodeHandlePtr nh_);
+
28  bool publish(std::string topic_name, double throttle_period, cv::Mat& image, bool bgr_order = false);
+
29 
+
30  private:
+
31  std::string getEncoding(cv::Mat& input, bool bgr_order);
+
32  bool throttle(int index, double throttle_period);
+
33 
+
34  ros::NodeHandlePtr nh;
+
35  std::vector<std::unique_ptr<ImagePubliserData>> imagePublishers;
+
36  std::unique_ptr<image_transport::ImageTransport> transport;
+
37  cv_bridge::CvImage outputImage;
+
38  sensor_msgs::ImagePtr msg;
+
39  bool throttle_pass;
+
40  std::mutex main_pub_mutex;
+
41 
+
42 
+
43  };
+
44 
+
45 }
+
46 #endif //_IMAGE_TRANSPORTER_
+
+
+
Definition: image_publisher.h:13
+
All mrs_lib functions, classes, variables and definitions are contained in this namespace.
Definition: attitude_converter.h:29
+
Definition: image_publisher.h:25
+ + + + diff --git a/index.html b/index.html new file mode 100644 index 00000000..35b288ab --- /dev/null +++ b/index.html @@ -0,0 +1,125 @@ + + + + + + + +mrs_lib: MRS libraries + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
MRS libraries
+
+
+

+
+

:warning: Attention please: This README is outdated.

+

The MRS UAV System 1.5 is being released and this page needs updating. Please, keep in mind that the information on this page might not be valid.

+
+

+Overview

+

This ROS package contains various useful libraries (mostly C++) for the MRS UAV system.

+ +

+Notable libraries:

+
    +
  • ParamLoader - wrapper around ROS's param loading for C++ (documentation)
  • +
  • Transformer - wrapper around ROS's transfomation library (documentation)
  • +
  • SubscribeHandler - wrapper around ROS's subscriber (documentation)
  • +
  • AttitudeConverter - a proxy class for converting representations of 3D orientation (documentation)
  • +
  • LKF - Linear Kalman Filter (documentation)
  • +
  • UKF - Unscented Kalman Filter (documentation)
  • +
  • Repredictor - algorithm for fusing variably time-delayed measurements (documentation)
  • +
  • Profiler - scoped profiling routine (documentation)
  • +
+
+
+
+ + + + diff --git a/inherit_graph_0.map b/inherit_graph_0.map new file mode 100644 index 00000000..038102cb --- /dev/null +++ b/inherit_graph_0.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_0.md5 b/inherit_graph_0.md5 new file mode 100644 index 00000000..14f960fb --- /dev/null +++ b/inherit_graph_0.md5 @@ -0,0 +1 @@ +0241e8942447845c64994ffe3967e84b \ No newline at end of file diff --git a/inherit_graph_0.png b/inherit_graph_0.png new file mode 100644 index 0000000000000000000000000000000000000000..190007c42705118433cb226c7f397396d97677b1 GIT binary patch literal 1861 zcmV-L2fFx)P)Kb5X@YEMpa!cPh#FH^y)bc( zAz@(HKzdZ_O%Xn%OCgvTR%>GF%pj%6z=UeEOv)Fo%-ShkY&c65T%neZt!w?9B43za200};zX&|J5rh$+Kng&9eP+~`?)7974 zua^|aKTCOed3t&}-u>TBGc`4()oRyV66BvotJO|TO%X>zy@NVCJJ(7NBnUuJ)MEsm zX&|J5rh$+Kng&7|Xc|uh0)a-O@g7f0OS^I7#wsWIcOX@c2SIO|)f69GN!Ky22P-j6 zc6K(3q9}?|sZ<`1CzVQvhK2&J%un=s{jp=md<5WX>2&(OeftIm2G$_yUt+!Tda%Ns zMxjt(7-qNIA3l7zW5cxNqB(CWC{%potT(F5JVslT)1#SBoZ+gjQIHY$B!R_7_nH4 zq9}zz;c~f`FJH!gsv!^v%FD}zLSaNiL}Fs%;NW0gT^*avj*N^fDJgNg-5`v(W6#dc zDijJXmm3uob^Q48pFe*R)iM~2>gwvbxjCIqhad=>&3^La3Aki7n^6?C*=(Tu?%g|~ zP{?2~l9Q94KY#9BI5BBsVTM37>_X+4Bo{$91ev-!QpV2Or}^Y1}g)K zt*op(c<>;dPQQEiZdFy)u3fvpC1RVH*U$A42m}=s6~4o_Eh#<(bXU{MU zJ8|NKR4T_kWj~l;y`BG3&aPi{B&!0cL-EO5)`TO_pm1&5Ji*vbL zA3uKdz65p}hr^-Q>qR0F7^G6E_{w@5jlru67#$sDv)MlK=H});di3b!%asvLh%2bLNa%t!`{=#LF%%Ev>1k zdGX@KA3q;1EG)R)?#RfLL8_w@Amh!+S1 zH*emw*=!RN6KBt!C0u^`YI|aK79D#bUIxw7bwSv z!o0jZxm<2E8t3QdU%h%Ikw||1`sE$D+(CF{_+O5ntk5)I!>7~f+1c5jK7G>ZbVMl< ziG)I-WMpLgvD&z}xSE=pf`S4DgHc{ye)#a=mFWR!G@7KOq^ztg9*_6>_3Mm`3?ISO z)z#C}(<~NCEEap@Eh#CftgMWQiD_+Z?d|Qw-vzumaNq!w$;`>giHeF+DwQ1_9T5=` zK9Z`{>V$-ZoSdBK=;*StGPzv7apOj^Ws=4Ja{Pt3Rr+}l{v(Tvi<>uZZfk2>{Zx=u z!sqkv+_|%w8IZqp5cY84_3PKERO*oQkA7QPM@bGXZliAYJ;`;~;30?wk z8t)IokagtEn>PWUGw8qNhO9l%G!W82(?CcAO#>m#5(nXqj*hk00SO|OFin1b{@Uw+ z1Q93(|33|cB=AfFAq_MQgf!4J5Yj-?KuGf+?N@~$Ci#*H00000NkvXXu0mjf)eMM0 literal 0 HcmV?d00001 diff --git a/inherit_graph_1.map b/inherit_graph_1.map new file mode 100644 index 00000000..abf3afa0 --- /dev/null +++ b/inherit_graph_1.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_1.md5 b/inherit_graph_1.md5 new file mode 100644 index 00000000..34dc54d7 --- /dev/null +++ b/inherit_graph_1.md5 @@ -0,0 +1 @@ +5640707098c638512660aef3e7d2d0ff \ No newline at end of file diff --git a/inherit_graph_1.png b/inherit_graph_1.png new file mode 100644 index 0000000000000000000000000000000000000000..de94de405f9bd9cdd316559f864f39c3a4fba9ea GIT binary patch literal 2119 zcmV-N2)Or&P)%6HOP#cLD2#QmA4L6iN%2Ac;bN1o!|d0ijroHDE!4 zA{sPlu(4i&#KcGpUI1?~R6rClP!RbbjTl0}7(!Jb2wozEw$c_vssbXYK==JHdH30e zmRicwqGW!bW=;FGM1 z4tLAW&fczI_`O7Dk~^0s;bBT3UcH zH#gVY+grblAjp#^Pgbv9ee>o`g+lTA^=n{EOiXNVZ{NRvKZ>FuAt4BYeERfh&z?Or z8g1RWb^G@1`|{<>ydouv92*-G2m~w^i%O*)I&|p!_wPePLw$XH$BrFyb8~ZWaEOYE zl1LdcihBS4eOFgkTU*jA0f4+3-Qbk3DdGi()7M?qIPOVn+c)Zxy z*x}(}hg zo7dCRlh{_P)kd64N=j5J6^TSbQPkPld0=1we0gS}QmO3h?3hd@=z=X3TrHZDd#d=C!~8yg#~R!dwk;^N{= zQ9Cp=l$4Zo=FFMF!9kr)S5QzeJw1&e2%SzJA0NjLSaP|19w{JTrTfH&hK8)Htlr+< zsi~=%nVHGSNz=~+L<$QFpFVy1?c2A@moKZ;YA%Z>(|lIQISZbR4RjmgAF;XGcz;INCjfG+SFL?t-oAC~Ryv)2 z`0(Ki7cO{tc`+D_qN1YG($dJtNQ2JC#TX2~tgOt($A`^k(`dAejEvOO)aA>UnLly-;KfinT z?pc3ci9|xBQh)2Ff0j4!{uTrx7K`od?6z&&CYQ@kojR46m}tfzi}qYzsZ^qRq^71W zmL3R^$jHd*>S_-U4-SVD5fPD>muJQxi?(htnM@4++wFYl?CiAKTx-^>sjRGA;2=x< z_e97d0&5FmDPV0uECsABh@~)amanR+vc3+;-;P?Xp7j%)f!gBnc-GPbSyIHu#}m6K xd=LP!5b(SOu@tbjAeI8w7Q|A(+Jab${{j8;gxd4`Ntyrv002ovPDHLkV1l?k3{3z4 literal 0 HcmV?d00001 diff --git a/inherit_graph_10.map b/inherit_graph_10.map new file mode 100644 index 00000000..53c6eebd --- /dev/null +++ b/inherit_graph_10.map @@ -0,0 +1,4 @@ + + + + diff --git a/inherit_graph_10.md5 b/inherit_graph_10.md5 new file mode 100644 index 00000000..336298b0 --- /dev/null +++ b/inherit_graph_10.md5 @@ -0,0 +1 @@ +8ff9a2e7d4e15417cbee4abc34a2cfb2 \ No newline at end of file diff --git a/inherit_graph_10.png b/inherit_graph_10.png new file mode 100644 index 0000000000000000000000000000000000000000..7a7a47cc1cf94be9700589477aa217282cfc0581 GIT binary patch literal 3541 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 + + + diff --git a/inherit_graph_11.md5 b/inherit_graph_11.md5 new file mode 100644 index 00000000..e7045e40 --- /dev/null +++ b/inherit_graph_11.md5 @@ -0,0 +1 @@ +c58f15a981013f4babf7e51ec7d19397 \ No newline at end of file diff --git a/inherit_graph_11.png b/inherit_graph_11.png new file mode 100644 index 0000000000000000000000000000000000000000..5ca09971d575ce3b862972166158c95d97c1ed27 GIT binary patch literal 3528 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 + + + diff --git a/inherit_graph_12.md5 b/inherit_graph_12.md5 new file mode 100644 index 00000000..706ae7f2 --- /dev/null +++ b/inherit_graph_12.md5 @@ -0,0 +1 @@ +3a5cb4a02aa998f48e980cef6faf2de6 \ No newline at end of file diff --git a/inherit_graph_12.png b/inherit_graph_12.png new file mode 100644 index 0000000000000000000000000000000000000000..87d237b38fbbb9a7a2775c51dc5951f762342b2e GIT binary patch literal 3816 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 literal 0 HcmV?d00001 diff --git a/inherit_graph_13.map b/inherit_graph_13.map new file mode 100644 index 00000000..bf6813df --- /dev/null +++ b/inherit_graph_13.map @@ -0,0 +1,4 @@ + + + + diff --git a/inherit_graph_13.md5 b/inherit_graph_13.md5 new file mode 100644 index 00000000..86738a0a --- /dev/null +++ b/inherit_graph_13.md5 @@ -0,0 +1 @@ +c6458c8d3c3dbb8032f1a67c0f6c60df \ No newline at end of file diff --git a/inherit_graph_13.png b/inherit_graph_13.png new file mode 100644 index 0000000000000000000000000000000000000000..897de49712efd0174acffbdd2e4237304e8998a3 GIT binary patch literal 3899 zcmY*cXH*ki*NuW8QHpe_O6Z74?|}zGuObg1ASFS1Xo5jnEL16qNRtu~>AhJ&>0OZC zQEHHuK&S!Xy?oz#f4q}fGqdKdxjFZoefQoc#?)Ac7RmvIKp?bwx(G7}jTx+|`7W87xPPtMUCk<> zCkKMbzh4YMDV={Zmog)Dyi1~B+OK$|h{K2Msf4J6JmeKXAROW(+k-09 z-3b@jQE`fD*@obDH(rRTogHPd&=oG(o;G4ji(zJAaopdW*^7>ljQZEq)PcYd6hTVg zy?{FWxzU9vvsfU`wftpdKqVOG4k!e`ec;kIQpxl)*@jArYu{VhYx0hdLt5L~CX_Fi z_=2%p$@KNk&FrXNca`*8?d&xiCW0W0Qn_n_Nk4y@hU|`5s`Aj&(EMX;Y^FS57uk?85kHK7z`#nB4TcJq@>|_$2e*$o>QKIm6a;pFtX@Q!F+SXrRJ)Q zsgE#W;lhrM)m3+dwzh^~l4El?&A~CL|9YaXsl7ct#1)Nh12fFw@zf?JCI~I9oa$;b zS9=?qSWEj*mf6`^c4_C!jEsywfBtkBIY?iXhQoO*%Wa!Dz3b1#AfAGxF`Ec4ukx~HO=oAp z4_-6Sc>&vd_$L}@sC1RoD1;*ys=39s&2!{A~|5t8tF?69l zUenXF)Tidg-D*lBBO_rEk*1}d)EtYFD$fb2h6h$kVfkbg{}qOOqm0P)bx(#X&tqdF z9^UIXKG<3)EG`~2Xe}+haTa%2SQzUINlpa?oFYzKn`(P|yR*|P>FKj)ZUBYNd!HZR zb@>uaJv>S(33X$3xwM>eD|Hhe&>59wW<{MdGgjmi9(C5Qx}40dt@S^8&G13| zkM_`W2NK_pH6Sbdzp!lcHBQH^WPZLka%hhGE-q{LV&~GBuH@zC53W^wH%1`ndExH| za&?9hVLFJ8`;{w3a0SLbm(a}qQAuC5r72LR7@=&2laq1O3&#WEoDT*wHZ?XoTRzr4 zHfDJctga66d+=au^D6;K-ua`euisqfG3Lp_^IHG@M|8Y4Y_j~z7Y-gCp1|X+j`-{~ zP)rEqvn^c=;ygIn*w|#`<#XS?JMUh{QC?n7+}~%L^oLs)kGMPH1Qvuw3qWHBA%n_&Ie^*%Ja~izM!r<9X-av?qU$_7?z% zbqx($UtZS?VqxQ)R=`nX;L5!PpN(>Q@gB1rHSe3F(iC{ zZeHF6T*x+!3mdFp@IX%k)h|$ zo^D%PKTk-Y8z7b0er8mDxZVi%Q{ny%K>e(T;{8vmNjZY}3Z+T5CAP|VgsVUA9i!u!)k}r~$Q?PcQNNil}N|HoR z%5*OIaVhvT7O!1dBQ@;LwqSmRQp?NB&kgaa#>B@*n2WY$Dn1CTu54}yF6->O+4}Ut z)iga$(wBB7@T51{@ zVUhTDz-KPXGFoB(;@}`KIO;wVA{@Ls@8#uXRqLAA(Bcclo=iL;;l1Yx*wd>*#*jIMQ*kJq_*n3@i!<+;M7iV6$W)zu#lpa8%BHA6bg)<4oUGHT24{zd~R`-bf& zhN+L<1X9>h3(%&yKYwCEkM_2jztSji&uuSF9dxLb&k^SgT-_dBWMdOiQu1&16-*#~ z_MVW&afeB5?e9}3hB5^J{3`gbyu6265sTy{IGt)D3JYB$4COeJgs{<(k#d)>&Og<8 zQ46_d$gk?=jSYYO+M5g;=5dp8-(uT^_2IwW?+7Pm4e4gZj9 z`|-168`i8_GoHNSbXNWYH$j2xwl|$p6^L)EVEe=;+Q{<_Lf|_;hT(%s-RtW zN=nMco}No0A|kFH9zZ|xyIytXPja9>r8sy^t<nS|VwQB$B3|pVXqCV#I>gSTXFweN?E6o)0i&p5)NpN0*GFFyS5{)h;cHqRUa8E`7dJPE7P*|6r z5s(Y`JBO(c=%CnqUFY6M}W|!!9Y7-N4s;7;u%OhiXH4EM{2YJMAt zs6LO0$pJA9?yimfIr)3^IyqUZBY`_NC581&Bdn~1>mP1R*6nQfNW^{+V65PAFWvxU z7KXu|Eli;IuXi;lhs2pOal0qU41awq?#MF~qoN`}1mAmGx%%F363FTtjX27)idMNdbU zFN6zub<_5fIyX0W5L#JDX$3eGW@cst;31jdkjo2f%Jx1!w+_kV!M0eoqO!9159ldv z;8ora{Xr}c^mKHnvs50vN)flwhH1yW1z9q)ut*{Dq?LTMC*LXITxooAiS=WRtjo#Z zyh8(qJH1Fk+*&o=+`@tpA}S^(9W-sO=T!9}Uy!Nl1K7iqj~SVmit_T>*4IQNB!nRT z`xoZccetOb&5DMPiiF4)@IGO)9| z?tChG)rmxx{gGEy<^GBxXzS_G93LMOM{T@wDl1KQq&GR@sWvw^iFEDp8gWhv$9n#kSHxJy{pd` zTUVF=OA^)Y@Z*i_!66>!dvg4!(@CneqeHXEeEu0dd}WKeN+UEw?eMuZ;Cd;KF_Ry61cje(7TtfeBLh5sOeu)Tk=P+$Rkw-@znzxdNU z!1rkd1}gBV1YYAJShtfmXTDl}@fVTvo{a;dxZ5m5oOn+UNF1=C4r1$O?nt!*3- z-kOe%K~hYW%t^)f6ON6I4F$i&i)RjYK!-OV80ysLSUK~xuTK!S+}+jH^jhIib_W5Vmy)Tq%>3rZ@gv*q=qN)R4So71fB z?D!9ljcMLYg@L!1*lw)hv2o-fx(UEv0q((U7oWB4SRR0Wr~swdv2Bg@D*$x-=0 zDaSZTXW9R0{MLNWg>B8Z{k=+!qU*A1ka1}}?DcFihx-RhZEbBeiB;4O7Mzn@zQGKQ zxPzy_OV + + + diff --git a/inherit_graph_14.md5 b/inherit_graph_14.md5 new file mode 100644 index 00000000..5e3486b1 --- /dev/null +++ b/inherit_graph_14.md5 @@ -0,0 +1 @@ +4355414a5c7160b285ca6e63621b5a36 \ No newline at end of file diff --git a/inherit_graph_14.png b/inherit_graph_14.png new file mode 100644 index 0000000000000000000000000000000000000000..e41f18b180dff61dd615c4baddfb03ac85b743ae GIT binary patch literal 3902 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 literal 0 HcmV?d00001 diff --git a/inherit_graph_15.map b/inherit_graph_15.map new file mode 100644 index 00000000..3874689c --- /dev/null +++ b/inherit_graph_15.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_15.md5 b/inherit_graph_15.md5 new file mode 100644 index 00000000..69c87dd7 --- /dev/null +++ b/inherit_graph_15.md5 @@ -0,0 +1 @@ +59762c9735b0dbc187f274c369d6c72a \ No newline at end of file diff --git a/inherit_graph_15.png b/inherit_graph_15.png new file mode 100644 index 0000000000000000000000000000000000000000..b2d83ffc57233fc5b181a8efac6e46976e2202e3 GIT binary patch literal 2900 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 literal 0 HcmV?d00001 diff --git a/inherit_graph_16.map b/inherit_graph_16.map new file mode 100644 index 00000000..0af5c047 --- /dev/null +++ b/inherit_graph_16.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_16.md5 b/inherit_graph_16.md5 new file mode 100644 index 00000000..fac0f659 --- /dev/null +++ b/inherit_graph_16.md5 @@ -0,0 +1 @@ +54211a121173cb8504aa4968b94a390c \ No newline at end of file diff --git a/inherit_graph_16.png b/inherit_graph_16.png new file mode 100644 index 0000000000000000000000000000000000000000..1bbe7b7c16e180b437c48a3a822a1a1de010326f GIT binary patch literal 2366 zcmV-E3BmS>P)Oxni^8MR%)As zkY+)2(WFm>SYC=EQYsZO@8SoQq6_JV%*vvSj8fOju4&%TGBr}?{m|>--Bov8T|KtW z4}>!_XJ-Cqe4IIR&a*Cu5JEtqEI!2=Y)3#@zEJT|Sc8g>!WvY36xQI%X1sXu0%>V! zY{WuQV~UH5r{qnU`NU!|N=ix=B_N9WBaujE)YFuiZ<6VhN}(uAQBe^D0>QLp^q!Bx z8dQ7~)}Z2}u!dTQ&%?t5ckkYvvE13&8M(Q+ix?4QHmHU8WKkqW%F;kB#aCNfi(|)* zu^k4hxVgC@J3E{0Fyx|^;-mZ>s6>3u&dxY}`ZPQ}J;CSm;o#tamoHx;H8mBcrl!!< z)kRcP6ecDnr0OIjB*5F-8>?5ZMnORVZrr#5D=RB#Yiq;P(-UvszMWG%(=EFV4Gr-0 z^n{L%4qRMZ@cj96rYtEb3AVPjGp0K_I^gf`4;>vHI5;@q=FOYna5(7g?F9e~4GrPc zsZ+49uz;SP9s&Xa(AL(*)bH-@#-T%pU}R*3b?esQ$dM!H@9&@2_{r-tG&B@%-n_xl zqesEvaNyzLG3}UpdwXNcmMv1_)Y#YvE|-h8wl;<1GGA0S^OcpA;rjLK=<4c%hldAz zeSPuy^Jmo8*Q2hk4&~+LC@n3Os*{FJqOU4cLVU0q!?H#eiAqGHPCB_bjMjg5_{s;WYJ zdpqpx><}Cr%!nlu$ z)-v_}Kjsw`6=-j7m-<7@$jE@NuP-btER-H&r6DpD78a6evgP9BkdW{Vs>6{&3ITf25GbF8VU2_BCJZEbC-ypfR+sXFH7=FG8`l@;>y^Ktg< zS-82mAu=)&@87>yRd}$rww{ufNF)mDb#!!q&*#I?&~VzeT3T8F0463T;BYwLa5z}8 zVg`930^8?vCv2Y?PIiK`0br<;sLz(;G^ zjg3W5PY*;Q5#r%T`UPuiYj}BiAtojU zot>Q!i^Vv3@+AEH{9tTsJf~|>)F%KK8ylm(z8+&^V+z}gj*iCFt5;D|QzP|=>aW>w z%$M!kw?j`)4}N}r(AU?;wQJW(}G{{rjk_tdv^nEo$FOX4##I*49>LM<@Fu6bct5hMhZiqPVyi78Vu=2nc|W zj}KB)Qx~Q0g@(uDAvrl2ckbL-w2j6jOMd3Fw6p|a`E%_C1_mf7C}1^)g+li6*J85d zXFj%2wKJxxt4r#Y9EFN+)=-<4>QP(qy?XTud-v{zp`jsoJRTe!9dYH#l{qgn)TX6+ z)KYv8A3lVamlrl{*npav8ua$|A}=owgM))8FE3|1Jj#Elo%jeLIDY&%A|oS_l9Gar z8#jW-<6-mW%}7j4L`X;o($mxBT8XAZcG-1ycE-hv7vbaM105Y5Y}&L5j~+c@$~!wd z5fBi-*sx?BJ&J5t(^<~c4Yd>Br%#{I+S-bUh=>`_2@4BTiIpfPCkIJMN$Be8LPSIa z!o$Ovow-0DfTpGJb5x}8`fm|vi7IHkwvjoEfpr;*LHMt z$URRLRw5%KBj#93OAElC=VlU#1lro#Qsp)_Hq7yCEm5-eCv{`VKV()GdwY9WT3RAE zH&^Zp^@X$&nVOp7=g*($?(Sv;sEiG35?T9`x}kP6ABV%i?c29;@7_Jc#l@kqu@S?= z!}$2|BN7r4P*haJoI8`1XujCk*kIeXZ8&k_#GGtc%LTO)9{}v$y&Kil)o5sFfQN?% z3=Iu&@Zdq{>gq}@tqW--Dl9C-(9jTUY-|t^5HMu}q{tGrEKuSGQSDerD-q=n%WA_h zTL_C*BFZ1sZo@HKcsw5T^z@LKnYrjzBFZ0@t@zlq5>fuJY?oaM`%v*wSc8g>!WvY3 z6xNt=!!h~UR0?H2$orQhQ)WIhGc)YpzkfjkqAVXwO-*Oi6NeD`m8TR|pkH}PVGk-k k3TsgDQCNeDkHQ-N0>Kx0lJr&gGynhq07*qoM6N<$g3k+jivR!s literal 0 HcmV?d00001 diff --git a/inherit_graph_17.map b/inherit_graph_17.map new file mode 100644 index 00000000..03fc21cf --- /dev/null +++ b/inherit_graph_17.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_17.md5 b/inherit_graph_17.md5 new file mode 100644 index 00000000..a0060176 --- /dev/null +++ b/inherit_graph_17.md5 @@ -0,0 +1 @@ +1cd25db510966414ae5635af63c37194 \ No newline at end of file diff --git a/inherit_graph_17.png b/inherit_graph_17.png new file mode 100644 index 0000000000000000000000000000000000000000..8f0209573bc2e24adeb7685bf87a904fcbe3f0f7 GIT binary patch literal 2097 zcmV-12+sG3P)NWlha8Z0gi}U_vP>xE^R08qJ(Ax=gyR z2nof6s7!rWL}=QLKv7c6(m7=hQhHEPJ*bQ}E%>iIqR|NYW*7w6W# z>dp%WJLl|k&gc8td*^%3cc1UZ5JCtj6vv}-;o1X=^FqZ(;S4H13TII9Q8&`@}Jc_ASo0q@?uTa-V>PP?Bz zeL_M)0t5m9Vq#+O;>8QL?aGxa2oDc8SsoY|Kx%3#1OfpfBO`I^)-5m$gOQOD0KoY8 zIC67yArgt;~jbz}vTP zas2pkFbo5+SZp-rNl8iAvSo`woH{!@!Q=7J*Vkt;F1BK~nNO`&mbcXv0Mo15otUXC6;iq6hXJbU&G z{r&xjh=_npCS%2N;J^WV|Nb5A?d@o5YlBXw!;vFL4EnG(e&)ukudhdJY%Hp(sz3-q zYilcO_jk;jo14+!-*50iEH5udN=gbuB9YZGwi+@ArBX?ZRGTF#DvFerma^riPoENo zVaWLSI9qq<&>?c+!UY4HOP4OOWvy0Ayu7@KMx(K6Y(fZ$kB=u66%{7SQBhGOKR@5V zX7lFFq`bV`V&9#eodf_G9v)`vo;-QN*6DOQ0)Pw*46yCf)6+yC5D<+{a5 z)5ErZ`0#-MAYZ7^pyu1wRCMG5fY=VP>+2^65p{T2?!?|V`C#mM@OMjslem$ zAeBlj#>F0({BG9~Fbrc*mP)0NN~M^YnZf=0_mP;Gh{3@@czSx;Jl5aC$3(-3cX$rnM?-2{DvbuJRIA$Z9`5@4u*$^ zq19@UpP$dZHaIvK>FMcEC=}@E=)kXEzwqYG8^~lb{QmtLVPRoNOiV;}b~XkF2cgsH zaQgIVNF)*j1OzPVSS*bR00993&}cN6nwqlMUshHYii(Qx^5si|OH|8d!(l7iw{M4! zj}Igg34DEhaqZeQG&D4T&*$5v|IExx6c!d@>hil^7cv!=_D} zuxHO6?BBm10O0241^}q3sX;_U1SAp({Qdorlam95LV?w*SF`qfJ|A1RZbfWtEQCTK zYHDh1Ivz`7oc?tPovaB#ZjTP`S-O7M6*?Ao;pTCEm&d3ngl$l%&7yFduR?c2BE z;o*V3d-pnY>?L#BHAQc4FT10g`%owp4)Gy5IT+3o7;a@TL@|Po7@-v^KnERC+&5Zf? zQ1LAgDn|R`G~(O6d$-YbP=P9?q@H*U;Z^UWrNE{0R5 zP9Z5N2?Butd3kvd3WZRs)o^ung`1lj1Ofrv-Q6J;i&0!$4B&rv@T=8oR903ZG&B?f zfdEBCMdbBz?RBWj0;dw6u{Gb{sZ!QrDox8=dYCQgP%Dikf0219V=hh0RC?G# z(xIFMr<(cfjj1#(bLn9VNr!S4oJxGg)_k_yUT7*!%TjunrF1B#!HN_Z%3nl9MUlIA z?{e+NlE)$Ua8M}LLd8en47%H0B<=0(T)VLBp)((aGpP6|oI%A$;S4H13TK$yaLnGD zN}a0V40 bg){yGse=@WYjFZ?00000NkvXXu0mjf8pQTB literal 0 HcmV?d00001 diff --git a/inherit_graph_18.map b/inherit_graph_18.map new file mode 100644 index 00000000..5a118331 --- /dev/null +++ b/inherit_graph_18.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_18.md5 b/inherit_graph_18.md5 new file mode 100644 index 00000000..addd4cf5 --- /dev/null +++ b/inherit_graph_18.md5 @@ -0,0 +1 @@ +ae4fc37d94cf18424afcd61ee9f82b4d \ No newline at end of file diff --git a/inherit_graph_18.png b/inherit_graph_18.png new file mode 100644 index 0000000000000000000000000000000000000000..c021e92897fd8db5bb05dae3e79d34b8eaa396b3 GIT binary patch literal 1890 zcmV-o2c7tdP)%wxp(=$uXCM0H`h4_5fnuM1Tq_>g-!tS-vAl~LI`LS2qBqDLrB<#@Z^;WCZdxq>Aq|@m_l@BCLK@eox z4D3-Lgn&kY5CR$nLWpoQia;P}Zf^FS&&bGVZ*LEMJ`fO|M)4+)X&@mc+>O%H)3bm7 z{)NuskKpt9t*x!|BDHz*W&}YH1fftUX=!O49Ub!`ON4MY3S=5er4mI^r_*`hz=6`z z(s%FPg=XDgjFOR&QB_qX6bflH8jr_&_UzgD^XC&15*Q3dd3pKN)D#|8TU(o#m$!83 zQjJD)>Cz=GmrJEmg+k%0SFZ@JHSMeC{rmSqp^#3eXJ%$Te*74lJagtuN=l0F*lxEM z6co_ubRLg)`SN81L7Yw}0KnyPDV0h#o6Tf03kwSe2M4kE;o;$3yLQFJ#jRMeqO7d! z+qZ9XI$yuCMMXs~U%uSCcQ1k<0)b#!S@QDo)~;QPpPk8MB9qC3gM)$22!}$U$mMbb zLEgT7i_H`k79t2jB9XXU?#YuUv0smR09xbWr67lA;KpP&EX z!v~|$*xTEC>(;HVt}Z<6+O=z^PoEwg9nH+ltgfzZZ*LzN8996QtXi!OZe5j1b>hSc zo6RPbN(%}K91h0}!BVM|!C>_F_Ztib?=HBswA5rWJ$(4kVzH#Arb;9d>|*cSx%2z? z@2_9K?(OZhTCIEb?3vT~`jypaG+9|$EiEl5iuUyMOe>4QV6a#$xZ|6en)37W*=+W# zb#S}gjg5^6g7Eo#Y{p&L@jqBI1V-+qbDG5&B52zPft#;asU((al>+9>W z@q-5s5Cn0#T-f36-Mfz*If92_)<#j(Y&KJ=RHM;2t2m0H+1c4wu3YgQr>Cda)YRZ% zYu2o3YHA83VltTk01k%(JG_7YK6Z#bnYP>Q*u2N%q0{L`qp`og9{?~gFo4ZtpVZHv zKNCFPK(Z)`;zsc;3yPw0xxA#L1Vz#D@$s0Ln69p_87i}B(#fws@ zGzfhh0DxAj^_~fGM~RJ%#Rid)krWDrN~Pk5V`F1@SW;3FHsEr(YPI^{!GnB0f8V}+ zZ{EBKZr$YMWbd)fW(yQ)x7%qn+VbVgr~To;zyJV%#bRMy;i5&0e*F0H>C-2x)k-Fl zIUEiahVAzF`;J-9H;}B~-0-ph04gdf^m_fs$cRp-Ba_Kuv3TYRU_Hw4@UU1cK7RbT z$K%1~bvj*UW+shBLl8u%RN|GHt9~H)YMc%L&N0cv!sGFbjg8?w;G9sYRF57# z`uX$cxpU`iHk(8u0RfuXl$4a5oE(Kh;cz(2W^+wV4Hl4;l(cp0R+&up@#9Cg+x_Cj z3yDPX>({U3}c z^5hBrAYj&J768CxGOMerPn|mT`}c3Go(u*fA|j%vr>CKzVP^dx2$50Nty{-rGDRX$ zbaZq>Lqlh0Cyho6LZ`gEytcM>)v8q;9Ua}>-S{_xU$k27=;-L`)vLE`*|KBD4gf$z zL<9h!t*tFJHB}@M#l^)b6bhM4wq(f?ES^TArKP21Wo5BgthTncIpr2e_Ryh2ckbMY zii*PSdVG;cBqS1P{rdHO4KV`>g~IK2x3siyIGnn=y5izuI-OosRkdx~wt3P27v5VX z!DjZqNOyO4baeDWXW^gm@$qHLmZ{b1@X-f8&8(l_qx^5sYPDoCdE>^7X0!S5;lo8m zMGKvgA5au+Y;25*irT(?dsypxyC#%7ig#OzQ&v_sk4re6PN`HH9UYyJkWg7!>2|y4 zQGC9LjEr2la^>yYx5G*wgwKw`;c(Eu{J&>0F)3 c1wx2_0DTOKIOi>;L;wH)07*qoM6N<$f&qZ9EC2ui literal 0 HcmV?d00001 diff --git a/inherit_graph_19.map b/inherit_graph_19.map new file mode 100644 index 00000000..197a4ab1 --- /dev/null +++ b/inherit_graph_19.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_19.md5 b/inherit_graph_19.md5 new file mode 100644 index 00000000..0bfc362c --- /dev/null +++ b/inherit_graph_19.md5 @@ -0,0 +1 @@ +0154f7002a8e3234fb151e7e41a57368 \ No newline at end of file diff --git a/inherit_graph_19.png b/inherit_graph_19.png new file mode 100644 index 0000000000000000000000000000000000000000..1c835551d4e82f3fcd6c20d245f683970edf4c10 GIT binary patch literal 2495 zcmV;w2|)IVP)bk6a4u^wd$Bqq3KoalA>2&s}r!FgBC*3JkBJq^6 zvNF=r(z;+qNAhv;fEhk z6orsz`#IKQc|d^t5f?oH8rt(`Eo)+LU`+~w^+4m75DGo?^phM zn{(;XrChpniPfuDqbLfAiHY6jeCEuVOr1K_B~MjVRTvBg>gwt=^U_}iY~?$7@+9AW z`z?3w+#xYBkvVhbaO>7BDl03wc<~}X|NJw@j~{pG^V3g1@%7hV^Web);^N}iv}qGX zMMd1ZcaJ@L_E210JW%1WfB$~I{PIhjPA6$;Y0R59kLKp)KJ`sYOCum4fa>aMY&Kh$ z!%Id+231v6{Px>#)YsQDdGcgZQ&Uy3ELpOIhYufe<;oQCxOm2r+&7 zbdjH*-(xu@CPr-8vc;v(lqplhfddCL$F8cX5`buKZdU7l{qD>ifvZNQ#S#`SjCINk~Xw&6+h_y?S+^!Xqjws!Q4FbZYi%XlTG>GBIY%m~O|a zsi^@VG&B@NQBV|x5hF(M=+Pr;Yin^h92g7+A|fKxKApENhr^-Pd6GY^IeX*9oCB<1 zzn){qj&bkaJ*-wM27>{M#iE&)fuP6V?G6TtqPUbT77G@Og^rF6jvhVAj2Sa%Y;446 zH1>P0&Tm*JcDtSV^XF^!3k?mWwY8O&mKIfjcDr3|4-XH=$H#}JrY3@egS+&%+wDAm z{+#;ydi5KB`}S=BCQO*{QrDt2CxDMn_v?y#&ZDEFnLd3whYlU$Fz{rBH|^UXInola6y zQ-R(O9FrzZ;@x-OB|AHt=H_PXb~{_PY*D{9EG&%q^XHS9naQ7j{z+R~8y7BIAT>3W zr%#^}6&1yd88gVr%A&Ec5r@OUh7B7?PEKarxN$FaEn0H|j2kzO%F0TfKYy+{-um_H z*}Z!=XV0E>c|CuqpYk9lgTt7LO3_;^A?Ln$mQ?AP^Z&H349pKK@Q&G%{`4G>#lOGGOBm2W!%B zW!Q@kASWjWAp|WgEv#L;mW+%Hu3x{dcUTe)yh41P7>!1(- zk&}}{WMm{kK|y@-$tV2t&p$m{lTuPrP!t6pA0HwkBiXrgr^}%zHa3>++qW}&_H4{% zGw;0f4yR9_R@=2KTJC7YKV0!D@wK(Jv2Wi#6h$E+AwjLzvOJ}yr*rx8Wy;ITsi~=`FcoZ#@`!(HrOg@uLe+O>;2ckYmpkwJQTx++jDiSYPZ@LzzLbROw0Qp0BB?35&(T7hilqdwV;eZ9l55 zt!2cB5loyovCs2atybdV;xL&^D2hT(PEHqlR!B&Q`rgma5BTphH7$#lJN>aw4RyRi ze4UIPJC=h74^mxS&5u9+2>joE)Y8&|5W?kUu~>+Rh@ic_o$Bi9ZpU=DCf&Vzmu1VA zv17*$8XFtw=;$CXFRxGT5pcC=b@HM`%N?!whcjL!K7hc$KsIgK#8+Q^#lQdlt7$(9 z3kxG9C51I>)^PLYO&&gcNPd1kHk%FTYEA02c?ARn;Opy4MMVX9d3k+~Ps^g^PG9U( z!xgU+A3%0?Hf?Qf6ciKy+V-QOq9UeFoyy#~bBT(I;?ku{%$hX|=xR-hh=^eK?%ga~ zwhXh`%*KryS+HP%NAYP{wA|5(f7s%|22t{g@HUIqi%3h=5W|}-TAtvQx80$RH(Rtk zL9To{;LR2-Pmn90L^q`PB)TERC(#WlK8bGhc;M)K@F|h>hu;1rNtcyx!h{JdTD0hu z1|)fX7(ae|k9tyskRN#}(FOUDrxN{;;*;ox6rV&lr1&Jd@gLb-^jl3HCsP0b002ov JPDHLkV1m3C-gW>0 literal 0 HcmV?d00001 diff --git a/inherit_graph_2.map b/inherit_graph_2.map new file mode 100644 index 00000000..7cdf192e --- /dev/null +++ b/inherit_graph_2.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_2.md5 b/inherit_graph_2.md5 new file mode 100644 index 00000000..7af8bd76 --- /dev/null +++ b/inherit_graph_2.md5 @@ -0,0 +1 @@ +e6d55d2ffc452aa2a60641610f869858 \ No newline at end of file diff --git a/inherit_graph_2.png b/inherit_graph_2.png new file mode 100644 index 0000000000000000000000000000000000000000..fc49a9ac2f2c273c880e8c249b6980b1c80a92f1 GIT binary patch literal 2029 zcmVzQ*Ru{pR>%{+)U7+PUmzLtruQWa*<8+MKmvowK550 zvkamXx_gOU4N@?p3zVfOrVUs0rkk*m+@Al72M(ugF0(v} z|L61S`Td^D@Ao_Bd#*bpAcO#eS!5VXodD*40oECY4zSKJbbxh+p#u-9q0wlns;ZVM z70gOv%a$$2j~^$^U(RO+gW>MoyR@f-S!r~1bZ9ghs>j25(49MX=*kDPGTF0dkAnx_ zpJC_#>kLB&SZ5eISdKaqi9|IuHO~In*x1I#M*8#lQ@(xsMi7MAY+mX_mJ!QQXH@3W z+{z2OvRUpr>*(k>c<|ugte{XR2!d#6XrMY15)$g`>*q45K^?mOA)TF_Sy@?ufq}lh zzR}Uq6%`d$t93B~xo7bTq_W&~_Ltc0_S)Lo0|yRNS644}F2B&y(jpd%*R5Ok^5sjj z*?jx5K>F(}E&YYYavi!uvL5d3hrvBV_q!&z?<5Nnx>A>({S;^5hAG z@XD1dv9Yn_T)ke;U@&@nd*=%6uwST3Kn2ccmQty7v-==~QmIrbl~O$m)ES@8fAi+e z#KeSLE@!b=1qB5oBO^UMJ;A}jDwT>H791S>;>C;E+1ZaDKdxTAy1l*KYPD)Knv*9_ zx>?_i&H@4gT3cJk$H&Xd%h_!9(9jTctFx@EtXsEkK?oHJMPXqf>5q?(udAz@%cKT% z=$cDs+qP}ny?giI;Gj;YOGro{b(Wo-Es;p{dj0tL_=yuI;^N|LHk($f1psI?8kglK zCnu++rI}2o{{H@yl$5lzG_rgikN4`;tEs6eg+jsMaO`&b=;)}Im)E;@@6ecY=gy_3 zrlPjX&<^{>xxjhOa?d~0SyfdPYPYtw5(F_hIf=~u`}Y?Y7n8#j3I%HG^?D|g+11tc z+r{DU&S&H>p-@;|UF~KalgShw9zHWO10gh<&7q;87K;US{ac;sbUFaQ;NT$gKYjWX z=?o1pnM}xUv)R~ec2`%|^XJb20R8>_&N+Yn{22g%PDl{K?(S{?z`(!&D*wWT3&=k@ zItleQ)(goOP3{P*wQFD!0UR1~#sG#cFuuC1*#7!01C zo&-Sz1_llc44?z)pJOx{nM@{!!$GD%AV7`Y-d+Fzm&+vxf*^=ht5*H^@uRP=4{be@ z$>hA0!C>(4@Zj_L$XvU2Epj504B_MB0{}pqS}vD2H8su5%shMcY;0_7*REY|LZj*A zesN%7v*yF%J_is4LAEn9Gh13(Iy*a4Q&YuavBhFpz=CK)AoO~DSXkIxBkgv3O-+qf zt0fO9wOW1S#tqcVVEj_JgXyNr$H#{}kcNhaP$MiXY-(zXH1&EtYD7dtFc=K8*-SmM zGcz-VLLr~ecljeA9uolf`j=TDo>X0=-FcKZU>xqkh6TU*=2#6)FfrO{~2 z&dvq^l$V#I+0&p z#>T#U`EusW8RQfQ1Y5UmJ$m%$@bIu+uP-SnL4F>Ow{z!CnM~Hx(_^t%UcY{wot-^B zJxvhAwQJXEYio;(i$8t(WU*MZT5VZbnM$RKii#48#Yc`D`TF&%!C)vVDw0SfAt51d zwh4p5$ji&SeEIUdd-wA5^WBGbU*P;_{V6o*EIB!O&6+h5i6kH(;Nr!LDwWFNVP~Ek zI&`S4tSmG%w5h4-;lqdI<=dI+>S~EZLiKohdZwnPq8A*ePoIAL__2?Vk4PkPHmNvt zRa8`%&1No_n~{-$u26{P=H|)CNr6C+k&%&?mq+>=8X7ii*dUQeI2=x4VWCVW^YZcn z0PNVYqphv&!-o$dkti@QFgG{X-`^jdIhvcB{rvo*qod>Fs$mR03wzkN~ z$jzHK|2DMy0_QpFPaz=X|4u5EDkmog;(tJ4{tonA5cLDI75<(UvrJero%Qwg5l+Zt zvZcxgv#7ZEo|Yc?d_KNF|9`;OO$;4ionhzz>kLB&SZ5eIaPb_VQmN?A1GADa8jTJ= z3A)f3^`k2cW?@LBQmRSdmkSsg!1reuI>0)^&;iyNh7PdKFm&)AtuQr$v;qaB00000 LNkvXXu0mjfj7 + + diff --git a/inherit_graph_20.md5 b/inherit_graph_20.md5 new file mode 100644 index 00000000..6fed5f76 --- /dev/null +++ b/inherit_graph_20.md5 @@ -0,0 +1 @@ +9b0e7d4de7e2797b9f2a0b78b2eedcc5 \ No newline at end of file diff --git a/inherit_graph_20.png b/inherit_graph_20.png new file mode 100644 index 0000000000000000000000000000000000000000..8b3bcbb0dc6f787fba32dd2d9a623fdc15dfc4c8 GIT binary patch literal 2298 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 literal 0 HcmV?d00001 diff --git a/inherit_graph_21.map b/inherit_graph_21.map new file mode 100644 index 00000000..fb2315b6 --- /dev/null +++ b/inherit_graph_21.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_21.md5 b/inherit_graph_21.md5 new file mode 100644 index 00000000..75db4972 --- /dev/null +++ b/inherit_graph_21.md5 @@ -0,0 +1 @@ +d91dde2b5c68391de150ef84fee298bd \ No newline at end of file diff --git a/inherit_graph_21.png b/inherit_graph_21.png new file mode 100644 index 0000000000000000000000000000000000000000..d6ffd49e29ae6b1a36bd2b57cdf6a5edd18bedf0 GIT binary patch literal 1271 zcmV=XH z?|aVo?2KhLo6R5yM?)U2u7Ge~Bpd`S5)OhE2?s&zANvLK^YdtLZ+As4gbNJ~4LK}x z=sAv$k1;$v{38Vsu18T6?dR>#b6C8VB;xlm7!1hI&wq6tIp-i~k#G>SNH_>uzaktG zi3B}8J+$i+6BD7;YJaez&v~zYSNRp;u=m|>wzKWKYZ&a&j#mE978Vv5ZBHhXK`0cW zv$ONV?aO2`OifMMEX&Ny#N_1UyW1xvC84ym6iTJ?%QZ9MSN0t4LakQAY&Kh`$;nAq zm-H!&gd;IA5fv2`kV>WCa=A!INWkLaBHG&85E&VXfPes~R4P0_Kih0mUtf>3v^4np z`$MnSqr1Bs0)YU2etwWjrC42E{Zc)zb=w;o8<0w+;PH46iA0#2o3pNKYHC7UTpaEE zd+oorFQ2W?qM)DvD=RA~Dk=ht#ezg40RY_G+(4~XBRV=7d_Eu9+1WTeJp6JEAHi79 zVKf@i+1ZKH(^E(!5@cj#U~_X5CX)%v%gY!W8^g%Rh|M;=y}f8`Y{cc|B}5_-Dl03Y z)oO8ZaeE-24}c*w8CPsZ02)va*&gggXiaG3=R$=B_#zXCnw-=I8MKo z^z?+gyE~g>sxvei4Q6L&aeaM_*49=~6a|Gs0pRl|q~9$pEDR=-36GDD0RHU}a&vQ` zR4TExwT0W;TP!UtL7`CK{{H^k>TsKIq^72V&*wufmm@GR5FH&IFc=Kra=DDOuTrT{ zUtf>#@Nf(a3}AeG+~!c|PO7V`F)=X#UteGAXr;fuA3~uJa=9F#p`j=%D}z$0gtxc% zx7ES2zx&+s6E3+a{qOL`=S}WDC+N9-I1UaDY=(m`Cs$uy{_WiUx0RTf7;=bn5x4I- z2-hLuAZU?r5VS}*2wJo!qy~fGC+i?wWPX00b{%av=>E$<{5>45kP^gy$Q4q89tj6Q hi-d!qMZ!VQ`U8=zwA>;wIUN81002ovPDHLkV1iE0SReoZ literal 0 HcmV?d00001 diff --git a/inherit_graph_22.map b/inherit_graph_22.map new file mode 100644 index 00000000..7178f74c --- /dev/null +++ b/inherit_graph_22.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_22.md5 b/inherit_graph_22.md5 new file mode 100644 index 00000000..9957585f --- /dev/null +++ b/inherit_graph_22.md5 @@ -0,0 +1 @@ +d6b204009b39cd863d499716b8ceb8d3 \ No newline at end of file diff --git a/inherit_graph_22.png b/inherit_graph_22.png new file mode 100644 index 0000000000000000000000000000000000000000..da02f256d6fd095df03740246288c3aedb3769d8 GIT binary patch literal 1851 zcmV-B2gLY^P)!Q(qj%?^&{1dop@LH=Hvm^NnK)ZNVx=4{B3bET$;3 zB7CqVg7zZVtfje?wN*2R5=-y@#o>S3e-GEW z{O|g3KCjL>_uO;7=XbvM-gEA~0LO6*fuIN))dCR98st9&l_38is08^BK_yAS8H>fz z*w{#w6vT2sDwXQ>dLsLu``_s3=&f6~5-tg`T(DZL7KntE;K73- zC20MJpc3Ri1eGBFA*f^_`cEQ}T)TEHyj&y_wYRq?UQYsuHneD=STZa`{{^$;Cm?o~ zWGEK8|EyN)kt0XqJ2yW+|Jbo(^Q$NJt^oi505+Swef#$Q{{Fvj^KU{CQ5%E7$jHbj zFE1Y)9Gvy6yu7>{H*WlW?;$L7|1Dm0IvtMVZnrx(H@CRB`0LlNR4e)e)HXgo-rL)o zl9D2oO1rzeDNz!S|3o5@UayzQWGogdJ3D(|V4$I)fzRi2x!lUi%9)uNqFQZj?XF$B z*lc!JS66d$vrs5xGMO@&?Dgx{G4>Vm(0TjztxP84a5!SI`1$kau<-o(^O>2M;psRu zD-;R<0F6cy3WaCSo+W-xbGzMzg@qgrCp$a)^5x3_0I%1JVVK|V*XeWufgm|KS)ovj zjEscz%i(b9>gpyYCg6KlKA->S(Ia@s<#GW4d_Et^(4vJRVlbnL37H6@K{}njWy_ZO z`ud8B3awTP2OBX0B_$=VUcEYW=nw!vB9V{;YOch2|LgAVzI5r**w~mvBH6QNkKJy! z*=&P@gZJ*;yM6mMQSJKm>*vm$^Z9&YvH1A$ zF11=+SXk)sc;;7gPfrhyMa9t2(9@?+ zKYsj}m6fGbDhVt9e?xOP91(*_B8HfVl9H0}2FuFI+-|qsZjTm$uCA`!+}zgIRvgEz zRx3%M<_sQ$(P#`QiAYXPPGe&uOh0+@1OVXo`(d`MtnB2;lSDOmW#BmObUK+#rp;!X zwQ(HBw{6>Y_3G8|bWToAO-&6^ZR^&pSFT(kX=mTQeegjOyXIh;nwr#VHICy$Lqiyb zc|0Ci{`m1@m>nG*#W2k6cEj@N>1hs!1II{oJw85u^ypDGn>{u*hT}Mo$Ls6sgZ1I* zKYsim8Ct|pL<}a0nBa*B2@AyGa9|kr?Afzu5x{Yr@E=K_W<{k^sZ^@qk~r^w>({S` ziB+pstzNyF$z&4Qsi`TVT3T8fObCU-&d$ygCr;$$TNc76A;yXtY08A*nW3614yA>+3sp>eRb;?*f6q^z`)9)Kq-yq?VSJ z{{H@niHVCBFS=YVrBaE-w*QC)sEW(w(&==o)oL&pV0mU{rc^4`YPBAZ$LVy|)YQQ8 zw6wJ1;$n?P<8U}8CnsONe5q6_fBpJJ(uGJQYHe-x`FtZIBh}T_vkomH5rY|rm_Q(4 zx7(|#s@mGxnwy&e0MR0VVOUB^ip^$&J|n3%R}$pEojZ3XCnpya6s%dZ#$Yg*OePkK z6-PUjm6f%%wW+D89UUF_@82gLsq;d5disS67fMS@IUJ5&uRn0$0CC7@H2QqLO`A6D z-@hOJ#6hRiF$`;KYs<>YDkvz}uwjE%tJP>UD_5>0>7uT#&g=E^cszwd5#0Wqh88WD zv5SFg12&tTpP&Ef( + + diff --git a/inherit_graph_23.md5 b/inherit_graph_23.md5 new file mode 100644 index 00000000..4b9588df --- /dev/null +++ b/inherit_graph_23.md5 @@ -0,0 +1 @@ +c9ac2e740f8fa22b8ad5983f51417e84 \ No newline at end of file diff --git a/inherit_graph_23.png b/inherit_graph_23.png new file mode 100644 index 0000000000000000000000000000000000000000..559fbd850a5fcdde039fc4ed8c1da0bc76d7f377 GIT binary patch literal 1676 zcmV;726Op|P)F@7v zX=zE86hbOfQc_~ESlH@+_M7qX@jG|!BwP|9)p5C8{r&x1OZxmqPNy?bdI*byef#!> zSxA0Ez=6aK0S6K{1RPQ^Ziy=rIyyQMuO|USnpz}R@ap7mkcx4`g_q-& zHYw$bRF4~%%XQ?)5xn2--o5+Sv19So6Z_B*LI|N)EG{iA?d$9N^FIH?6>%rk<7V+< zHk%oS@pwENH*Tz~to-ujOR^Qk6P&nFsZp zsi~=;pkRI(L$gk&gAfV?0);|x=FA!PBNLCuQ(j(9QB+Y;(dEmRA%uRv9{>;x2F+%( zTrSVb%F^j{V`F1s<5CpW+}u1hHHDs=$z-x8PoAJdG)+SY1A#!4sYP-{Bxeo{4QaJn zilWx9U;p^=V`PjZGHiil?v14dxXmD`w_3PL7@89q0 z>SCK+zkdDf*|UK_K&@8S)zx)$bWBc8o-BhQ~d|McloVPT z?@euZcsP`Z*_I`p+kpI+(!|~F3|q{`}xUbIN0s>Fw24{mCBZu7F2%r z>=}eG7!0E7fddCloH)TYL#HgmFmAV7C=?D34*s@thG8~u-hB1y)%j(mQrXbZz&6{k zVZ)UxSEBT@Yu7Gxv4~wWm)6!+qtVDP%*eMzd>jDa@pzDZc6OGc zC^ScQ=P{-Cg$emY&P4kU%vnVQmHf;45EYvjf)C$xm+L+`2BwFiC9rlfsUg6CKwF5TrRCv zi;S6>nQV-PWy-v!7P~W}i{vg4FA{V=)!W;9^5n_)@88eN%*@WthC(5{JfN+ut*@_d zYHI4jg$p!I>-BmNTV5OsNR>n)$;ilXxm-4z4cQ9{3Q9^!YHMqKKA+p|ZfIyg_Po5j z%F0TU$uvAXJUu=A>eVZ~UjOsw&nQEvRH_>{ZUh2>v9YoG`ug8aZ9#ZB6GLPyBq(mS zZrz%dl~q<&wsPf4o6Y8MI7A{5Mn5$*HI0ppxw*NwZrytD-~oH-i3|Dp`RC4^tE#G^ zD9U27?A^PUJ!H4r1A)N0b?f%**@IpVXJljm0NUHz3kwU&%F42{vukT>O(xT_Wy_)r z(cIkZ_xq(%sZOWk_Rni-e4WWxWGq02^M3}1!+|ovKkRgA^YG!rg9i_y#PfdwI#swI z*evk<4PicZyFEQUedo@dZnwL>zMl78>yjgB&x=P#N8vn7CR4KXL}&Z!cX8>7*fC_RKlgTY|nR^cML878C-B)=ixK;njg1Bn{~4kT^}IQ#>_ WU6&x26Ih7=0000 + + diff --git a/inherit_graph_24.md5 b/inherit_graph_24.md5 new file mode 100644 index 00000000..b7ade448 --- /dev/null +++ b/inherit_graph_24.md5 @@ -0,0 +1 @@ +2f494b4d9e51e1ab10d1273623ce2fd4 \ No newline at end of file diff --git a/inherit_graph_24.png b/inherit_graph_24.png new file mode 100644 index 0000000000000000000000000000000000000000..76e60959825b32f187d65106491fd8c99ec1e7bf GIT binary patch literal 1493 zcmV;`1uFW9P)TK~#90?V4XmT5lM~-&2iMnoGt`wVMAL)PnUNaxiOkV}=QWqgWSN ztacG)w2J=FU62>mU{{L<8&PdpcNIZh#9(333Nk7(GpDBlp@sdEn0kH}2mGBh&1_k8 z-p|$ZKD^KSJkR-__{T(AMzJ2RoY<_-z zZEdahIhmQ6U%!6!Z~d#_lJ_cYUW(hUH{{>qkKU=NsdaUA0)c=|rza&P&CShqb#=wX z#XWfNpt7>k;cz&owYIjtdi5$IBI5h^?;k&YWo2a%5fK#?6?=PoTCFxZI$EVt zIj2QON6*a6*lf1-_4RxA?*07v(`vP<)$02CdN1o|Wo7mD_PX0CDJe`Qb9#E(VzDTd zN(O^rHk)xA@95}=kB=wjkZqw*s8A@Ju`CvAZf@@Q__)2j9Ys-x!-3;?Mn=Y$FJGLg zrBbO#B+~2k7K`Qm`}b*SX?DBa$6h?eN+gn(FJG>#tnBaa_w@9Pj*hzLCAXQAlT%Po zu)V!)G#Ybra|;Rzytm*5nM@{=$;ci*_3rNOChY0yX#_!zj*f_7Nl8glQ-BmXji%9PE?gYd+`)YJmni38!okZ(tC4r69BNawMF=smzMzmJ3BjGTJVCq-hS@ij~+cD zjL^`~@bGXNjpiI$tybqW7K=p~TrT(9w{Hy%4Vjsl<>lo|OH2OcQ#9~>MQ3X~>`lbYP*9NBY<~Fgq5Dkly?BZ>8jW_leRFfuV42+MDJGT|TX>4qqn3xC)3nR|SeSLk2iHRbS z2u0EA>T0=Me*gY`AA9i>+uz^+{P}aCP{`x)78VwAb93GEk{KErqSNWg$;lZR8L_dk zeSLjb?2!zDlm4HoQmKlHig5Uk)w=@mdnow_Zuq{1THKi427>`{LoS!!R6P{ode7%x z;BYu_;|M(P^PE~hy{QG%n_57 + + + + + + + + + + + + diff --git a/inherit_graph_25.md5 b/inherit_graph_25.md5 new file mode 100644 index 00000000..1f5d83ea --- /dev/null +++ b/inherit_graph_25.md5 @@ -0,0 +1 @@ +de98fea7c1229081ffd6db7eae896a75 \ No newline at end of file diff --git a/inherit_graph_25.png b/inherit_graph_25.png new file mode 100644 index 0000000000000000000000000000000000000000..f076f245bf850e75e8215e068263007270475c13 GIT binary patch literal 38366 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 literal 0 HcmV?d00001 diff --git a/inherit_graph_26.map b/inherit_graph_26.map new file mode 100644 index 00000000..12397cbb --- /dev/null +++ b/inherit_graph_26.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_26.md5 b/inherit_graph_26.md5 new file mode 100644 index 00000000..0232ab8d --- /dev/null +++ b/inherit_graph_26.md5 @@ -0,0 +1 @@ +394b3cd6ca392805d1269f9ba550a065 \ No newline at end of file diff --git a/inherit_graph_26.png b/inherit_graph_26.png new file mode 100644 index 0000000000000000000000000000000000000000..b250b7359140307d439b3e57c832e16bb9d4633c GIT binary patch literal 3879 zcmZ8kc{G%78=fdz!`RnCW5h3#L4=fLWMp5Wvd+jd)*<^EvdquEMz)xQk|kTlmJEtQ z_QsZ-EZM@S^gX`6zVp3v-g(b?&v~Ece(vkKulu?QhWc8}O#Dm`2!vT1jWPz$ZE$Na z(1CxwkMn-uL5J1RLP7qX{GPRxq(LAoliDaXQ~%tJydXoX^IEi3BMsc=Fx%?omrc1_$fw3@Aaf^PV~v47a0oZ75&2^UMz-SM|*O@`69=0}!h zMx0U7rKj^}gqVNX`F&Ms!gKp>|M|53DZe*p`p0hmZtg*@U%y|{qgVzgU567g+xZlf z&JJ6JaFC8amq~_3r*x!dwM%;m8s{6Co5$oS`{_q<(?zz2CndpB)6%$>%J#_T&!4}B z|Mu=V0V~Z*F|x5qB9W9bsFzf>8Gar77<(m57g;E9rDbn0Yxk=PG7_`!Ka0y=P92|^ z5YW`rbbiv*)I_YU^=9WPdtdxzKw7>9CNl&lWMJr@ZC1(4TEDPo9~&E+uN$+TcMEE7 zZy&G1L9 z)tfi(2a9z)mp)~CuJWx7R+W`8o-Bn%M3j_>>E~X%V3V1VamL)-ylzOuvL%qKwY3%R zv$jWj&walN#$yO*$PEBne|N3D^-C1NMp#0|u zV)($;nAIIQaT$np4d!EvFy{n^PL#T)DZqwsv-rRaMfpb#?!&7)^IW zk7r+tRg{;LE3BIE^IgpTK|%A4%lRFhaXeqf$76>|42UmZGSR~XO~rSq%LVhqq#No6 z2C(ZYDk-U{5rc!q-hO^|zxFr8uUuKy5!~6`t@c?n`|v;prKKezC&$^~J~c@CP2F9d zou7}4jb%vB%zXdplP)H}$LDG+!@-Z4?m~^2D#w07{XeAoY!RuHT>W+C$Yhj%K!BP!CtOO3X2W)tqYhblFtdGC^(z3i3!HhF{Y>IHbnLQef|o|M!1c6 z06#=OPbup7I5fcHIg5#jiNC+U?VqEchf6sga?bn)Ii4da>FJL_Hai9f**#jR7fB=% z{?CyQb*H)cdQ{L{W!v$6;w>MLF;g?MqS8_Zz!-q$c)gpz)0`a7+4pCtfy4u(#?7rv z^26o6j4%ZSg_z=E(emK!DUNO3JcZjsmFhQ&91I878){yt3G=E9MQM2Msc7FV_aM$ z{<>o@ryxudhOJ_uvr#;?uBS9BtXr5MRW&tf1+2PydfUqdVMTRycUq@cLOu<^Oq8mM zCy7xpF~k=y=-Q5tBr>nqu!Mz$?HwHK8jpQYQ&88@IlI2G;WJ2b8IvlvXkY=^XF3>G z@R&xqx=Pl&evRns(}%)fA_@vTk&%(jP6g#kau{rpf9W+v#db3Jbc4r?*|mRI+1___ zEUw{5&X}#p_IQ0EMX%GVtE+Fl7MV6@+L8(jFF-*;CT;W{|Nb33JUUubSqW42U4Nu| zQRBe_1Z0E09wH3t2ZzJmt;U{76jWh?c;(eNe2&P@=KH?3mXedx8@I`Jk;tM4q(CSk zAz>#inn)CZ!{Ndiw>?(}MZtmQhs#W23-r(K0eKi}q;yV>at$#xpoLn4FOjwY7yey>mxRlG|>g z-YqsE0SJP+mzRun@V2J4cak)pkJH?g-%RJhOc?C!*|XFYZ*6TxZYj&yUi8sc`p};IZ>cMXd{%x|yKOuy(qL|M)GR~m zjMfd~GVhm*NM4gfO4zv)ux6+&%!+!HPuPqvsRRoj?dC`SfM2`vy;3 zZj^peA22Xr!48AL=2yND!Nwo@`bN#KLg^yYOG`_iAst*kgChUu>eUQ@v$iC+NnoH- zU2Sctl?^;)VCi$tKho04Ko(cGyM;=GLJ!qmk#=@=(30F~fXY-V)ks5wmW@qQON#?S zb^MqribB2;H-=NQ;S~KYugSvURerFER0)BD`R8Wknd`eXwa& z=O&vn&PU?l;?guSGP<-Ipgkv`;BE*+BEa8&AXo9>%Fi*Il7g_~d-=jolhKHUl@+v@ zLH={V@HiP+*^i^6nKkR6vT;B>O7TNrIizjSrWztzBwh zwzaG_aP$|-3;kYJlAM>9u)pui$;}N2Ps_!{6>Q#tvofvk!`UqkjktFgtECltUK)7N z4Z4$-rzbKnFmPaWGXq+jX+?`581!B{y9q+|OW2$jO7lFdrj=a3H zwY{C~tQh}A9A>_|%`t?URAeVS2KhyYhK4?{x7R!Y(8k69sGqR1vNAgXRqODXA6%(V zX1(}vURT&~zVmn$6G^}t6_q?18XB}Xr!i@Uvs0mp;j zj$7SZ9U2}R)7swNe&FV&=Q3Je2)-wIud;v6QAh%|P3#KsBTnvV^`wra`#HB%|LNuc z?>RCf|G9I+x07yQ7n~oqTB1QKF*PyKcxCn)?&9JCya_QPf+iq{6{n8{p#!}^p^|}0 zSiQxEZ%()9oH=s_2r_sH6rGcw|Mpmg6%mk(2?~8aFklEj>c1=Va7kAwXurI<;<82k z05Bkm6NwTxq%Nuuy4Ox3uYI_zPu&A`ixy`6(4UGzRW|Q16&Dw?u{8`iN#1ID@^x!7@S?{{FK~}d#5`xMBg%Vi^fD6+CI(4QNh!R;2STf>t7C(Zf~jwM>T_~(7$2!u z9{u{!#sMLP{!wCMYXSU9&&oohP#ql|3kwSnuvs<$rcUuClT3TA-fnF>uFN=tZM%AqQuPsi5 zj8Z5}z{p76tx_#^)zYFD3|zSo+li$%r#QY-R#F0k%l5XoghWT%-{Ux;u-|MdDk^D5 z@+|i8p|&n$-0;XqRE$vQU3+S5(CWKzS_USj2t#p{wRQgcvy~uTHbKEe;FW`aj+le$ z(gH?Z^73WHDV0ZaIvsEKRzz;O87`|E^EAll>FJ4Ix}**``B?peb;!>=}q%F)r$1Cx{G*g-rV|L)s2VamkBqS$iE*rd|6YY<3&*l|Es zP7aYo;?Ky)h$RqG3gjAjU2f`f68{niy*Tos^_1xz`jwEF$bz_d5spBd-d*me-?D*sb#`Ka2fgOK!phFhUQ403!!6Ph4X~;;L$SRr z|Z^)omA{oRK@cW$$N_?sE|Jr zsh2&BaM(Q8rZp>7-TAE&pAM*si- literal 0 HcmV?d00001 diff --git a/inherit_graph_27.map b/inherit_graph_27.map new file mode 100644 index 00000000..9deab16a --- /dev/null +++ b/inherit_graph_27.map @@ -0,0 +1,4 @@ + + + + diff --git a/inherit_graph_27.md5 b/inherit_graph_27.md5 new file mode 100644 index 00000000..cbea0247 --- /dev/null +++ b/inherit_graph_27.md5 @@ -0,0 +1 @@ +88c6e44d1cf08262c0ce67acc35434a8 \ No newline at end of file diff --git a/inherit_graph_27.png b/inherit_graph_27.png new file mode 100644 index 0000000000000000000000000000000000000000..16a435d487d0452934cde3317ce2e6c34d5e6545 GIT binary patch literal 5829 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 + + diff --git a/inherit_graph_28.md5 b/inherit_graph_28.md5 new file mode 100644 index 00000000..7e20f240 --- /dev/null +++ b/inherit_graph_28.md5 @@ -0,0 +1 @@ +4f33985b5f49c5395b126fbc42e4e449 \ No newline at end of file diff --git a/inherit_graph_28.png b/inherit_graph_28.png new file mode 100644 index 0000000000000000000000000000000000000000..b8a38908603679ad216ae919c9cfcfc738ac5666 GIT binary patch literal 4242 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 + + diff --git a/inherit_graph_29.md5 b/inherit_graph_29.md5 new file mode 100644 index 00000000..4bf45501 --- /dev/null +++ b/inherit_graph_29.md5 @@ -0,0 +1 @@ +93a0d9605aa39fb60b47cdfc3f79662b \ No newline at end of file diff --git a/inherit_graph_29.png b/inherit_graph_29.png new file mode 100644 index 0000000000000000000000000000000000000000..e5aae231f748938d8c83e6fc10e4d734b9262bca GIT binary patch literal 1630 zcmV-k2BGL2TVWMrhPt1Ib}Fv-B>at#g+a$A-}cIxcxOqL!@^4PU&S6B<) z@A(V%p1)x4`O9MTUZqksH#bMND-?>>*4E_f@%elZ!eB7C&=W-qe1TYu-g8NEI{wN( z*OS5k7rXZ^muvt2{fS*$Qc?mTr0^$keK%hg~DR7P!uH;3iI>xpFDX|Utceg zNJJu$$z+0)GMmlW+1Z(ynHr7e z!-o&3eROnGqtTEgnV+BE-Q7K_9*sr=AruG%QmORJnKSI$aD_r~^5n_l;$o5{*RNmS z-`^j9fQYK9s^`z2@7=o>La0)yV(1J@avT}`O@iybr>E!Q#fv_lPo+|A-@g6Ln>TK^ z``NQ+PN$Qbsq5FTpFMl_>({SJrLv}`rnR+oY;5fO`SW(WJ+XP4nwn0ZK26iKUav1L zEe!+$vHJ@I0+Y#f<;oQR!0p?&DT>O<%Hnn~7!2>;y?glZ;m403^YZevS}pqS>h=2c z^mLEM<8(Ts-Fxrey~{An)YR0SJ9lo~y2TBurKP2=uFmK484QL!d-lxrPZI6z?S+Mf zH*VZu7{=vt#n1^jNv^7@n$s+R;n3015!Ny*1qB5S4GpOL;K2h3VJH+r)!n;yA3uJa z?S@tZ!!Ta2mmmnY+x^$U8HU-oapSdX*CNXW1qHRWwQRQy8#Y|MdNsy4J9g}_TCIM+ zUnCNZjg86W^4{KFr_)Ig1nMv{G6Dej^yw3-PESvhB>-DV8`uciQ{_^Du0Dz`xq=%dNo}QiInv~S21Hpvc)ebUL=w+chYlU;?(RN#@E}(Y03bU%TObewgF)_UC@U+I zNF?Lqy>FLSINp`!M6HQG`j~+ex{{8!f3m0gb)@rpN=2;IxQ53^4 zH8nM1?O9n_<>lo@qw($Aw-XZ+PoF;3YPCOp{E*3Hn>TMheE4u65b%1vwY9a8N>B(Q zk!b1Cr7oAtX0s&_P7GGBUhQ_f(f28u&UsFeB=5Iw-I|%1saC63u3Txe*&Gf>Vh`CS zlgVneu359Dt*!0ey?gA|lQ1nUEqQr)YPDJ{79Tls#Aq}wTeb`U(9zKm3Wa1cnMR{A z7z~jY=H%p@J9nQ8Ixq_jP19jNfzRT-UawD<9!yfv>2%yG#1C4$1@HI#1$)n5u=o50 cd(U5f0e;lq6Y0}ljsO4v07*qoM6N<$f-Jf;x&QzG literal 0 HcmV?d00001 diff --git a/inherit_graph_3.map b/inherit_graph_3.map new file mode 100644 index 00000000..a345db71 --- /dev/null +++ b/inherit_graph_3.map @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/inherit_graph_3.md5 b/inherit_graph_3.md5 new file mode 100644 index 00000000..f3ad3037 --- /dev/null +++ b/inherit_graph_3.md5 @@ -0,0 +1 @@ +13cfc96b706c2eea36ba4744a6830799 \ No newline at end of file diff --git a/inherit_graph_3.png b/inherit_graph_3.png new file mode 100644 index 0000000000000000000000000000000000000000..84717fd537627a1caa3ea9adf228cd5add27d7c8 GIT binary patch literal 77520 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 z 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 G-~R&q@V$iq literal 0 HcmV?d00001 diff --git a/inherit_graph_30.map b/inherit_graph_30.map new file mode 100644 index 00000000..15d51350 --- /dev/null +++ b/inherit_graph_30.map @@ -0,0 +1,5 @@ + + + + + diff --git a/inherit_graph_30.md5 b/inherit_graph_30.md5 new file mode 100644 index 00000000..6bd131d4 --- /dev/null +++ b/inherit_graph_30.md5 @@ -0,0 +1 @@ +d47627af1977ac67869b23fb15e85312 \ No newline at end of file diff --git a/inherit_graph_30.png b/inherit_graph_30.png new file mode 100644 index 0000000000000000000000000000000000000000..4ef015cc4eababa61ddb3ab85bbd62d504c968fa GIT binary patch literal 4061 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 literal 0 HcmV?d00001 diff --git a/inherit_graph_31.map b/inherit_graph_31.map new file mode 100644 index 00000000..2d3470a1 --- /dev/null +++ b/inherit_graph_31.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_31.md5 b/inherit_graph_31.md5 new file mode 100644 index 00000000..25009f55 --- /dev/null +++ b/inherit_graph_31.md5 @@ -0,0 +1 @@ +4f7e27387b36cd05377f2a8dee9f789c \ No newline at end of file diff --git a/inherit_graph_31.png b/inherit_graph_31.png new file mode 100644 index 0000000000000000000000000000000000000000..6f0962a47a9f2a3bfef4ac3b89e820372c2921a4 GIT binary patch literal 1595 zcmV-B2E_S^P)001Qj0ssI2O3-x?00006VoOIv0RI60 z0RN!9r;`8x1@K8kK~#90?V4{$Q(qXzpQ}RJ)>6WWX}T>T3rumN7Bnj%+(M(hNl~Ut z!icbeWK_dfg%~=EUKvKlSh$(ti;}Efs4qnGA2p%y@0NF_*v%3)#MFEDp1Z{T!n5_j1%yF>590v=`aYC4t&d$#2>gw$Z z1>+Y=N=iK|HKS_0$;e)|oh>eZiyLWF~Ehxe^w|I0)ZekHMOIo0~sqS zDiRVB*ku6FYPC+Mv#zd=J@WVO-*a!x^#&k2)SGi z08XbM^Pfr&J1cweCdiU;~_ftTy9l2aColX}YA0Hkb zo|&2X_3PJF)97X1Xnb73O-)S?A3mI#nv%=qXV0D;92~S-t-ZayuU@@+`SK;*?CH~| z<>lq`^Yf{xsW)!iFqurVv$K_zmG$-YzWJ@GskwXiuEXKT&dxq}?%eeB^xEx1Lqp5U z%gf5jTrQW#ql*_WE-Wm3{P?lAx0fVIjYb0iX0ur;mDbhOQ54nH)dc_=ji$f9zqz^D zX0u79($>~i)ZJ(_R#a3>O-<$J=W8^YjsC38c9fr=KRi6#*48#YKAxDEs8*}#r9!7M zCnsk^UH||n1{RCO!?G&L$;s8#)u`Os+DZ_F%jH7Vyu7?yw{FqR?%lhG%41_=JRZ+# zwXQojMN!9(AFr*gWtWqalW*U?O*cDy`0(S$kJlI{BO^nv*RQOs96NTbtgMWpD5+Fh zSy@R@)ad9a0N89c)N){8006#y`-a+}yi*i~meKI=FgpVVg8`M%(swu<$RjhiO-)T} zOo!$@78e(N7!V}_F*Y_98yo9QuahTF zDwRsTUQb&N95}GNygWWWj;bRgBghB^ICC@Uq!3z2p7+_jm5x85tS*{rk7u?Os}1q7Rr2QBzaX-roM>$B(M2Du=_N zR;yvnOBT)j`}fUeGyVCHNF-@#Y1gh@o1B~^N%H#j>nfEhIyxEvqNAg&R_pTeG62NI z#bst@78VwM`SN99VWGCR_Vw%6zGZ-ohokf7&ug{Xp`oG0#l@bU9<^Hi>({T%dkK)h zr%s&;4-Z$VR1pyo4<0;dXlUT``96$OR8*wb>-X>9|NQy$=H_Plq*#}PgoLYCucGr3 zVX;{FeE!j+N2O9}OiYZ?Xhim#H*daq^Cm1T3|($bCR0*UQbtCGL?Y?y>pOGij1OV2 ziiabk(U_Q+s8XqfLSb=nu~w_ywQH9j+%We9FE3e`9SivDl7;!dux$d{?RJ8NR;%5v zc(}?c|L6z|B9Vx~|GD3K@D|N+u)rJ#3(Rq_z#M0lOIAZeL*V1UY!RynoSmH=_&6|I t1cAS+a2tFEa~v!%$H4+~94s)$`2%>bUJ6>VD>MKA002ovPDHLkV1l_19j5>Q literal 0 HcmV?d00001 diff --git a/inherit_graph_32.map b/inherit_graph_32.map new file mode 100644 index 00000000..e95de130 --- /dev/null +++ b/inherit_graph_32.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_32.md5 b/inherit_graph_32.md5 new file mode 100644 index 00000000..b97998c7 --- /dev/null +++ b/inherit_graph_32.md5 @@ -0,0 +1 @@ +9665b516e066a820bab1a9a7d34660f5 \ No newline at end of file diff --git a/inherit_graph_32.png b/inherit_graph_32.png new file mode 100644 index 0000000000000000000000000000000000000000..bd9946cddc1ecaec0ed389d9a370855a7547f9ee GIT binary patch literal 1614 zcmV-U2C?~xP))?DlB6~Zya|E=5t7Xkp%fvRM{`?q(}K0>5I0X3?~lXz?a%qm zS=;#aey*PP*|Ya~-gCa^yw7$Hq$mnt{(3lxE&!7hU>#rpz&gMnunsT)0Fc5Qm`tYO z;o(G;f{7gOZXGolYl{$#^_oQBl#%%*=xa4}?NtdU|?CN5|gY9v#-- z-+%V(Sw5ft;>C-H4?p4VzGE|aFBlN9#kz$STt)7i_7I|ZEY0@1X)>G?d|P9 ze*8fGNVyyiheDws2%@N{=+&!N^gLd#SF6<)6cl7+WGEDhuV250T|$&c_#Y?+27@8U z6PDuQVv$HRJ3H&~crIVQ%;)p3UAy-E`}d`#rR?l%qtQr*WoKtkPfz>({x4s?96o&b z{rmSmpU-46_4M?x%zygy=_gN~gxbZ$#hICzlarHfw|i)4h#&};%SBPtojZ3V5($c7 z+UL)oNB0AYqPDiSAcPYW6KLr7`{(B7q*CeF*jQ+_bR}WKqFFmLHBD`8ZGC;c-ELo7 zTRV5|Tz!2#^V85=GMTKYsmbYdS}c}|iV6V0#>NIkQA(v!E|-%e>2|xjySqzEO9O#G zq$Pw!rBbO>DyAn!9Sjc-BYSdk5<=+pdeN}0t?kyWTXYywH$_n-NpiW|&!0d4=j0Tt z4*L4~=&+L~Pdc4hRtQO*|=P;Kp;Tz5{U#ED=RAifZW_%)B+zmbm-^LpR22@p-b2of3{DA z5Yl!-L&KXlZ$5nZP*+!1Q&Y3Oy&c1Z=qMmak`xMs?D6QL^m@H!v$?LW&gpcj)#`zP z0f)n}x3{O)>-~OzXtnHNv5}XT=lA>9*4EGvUG8~#d69Ang~F|^ExNHKNfH?a1qB=q zXLECtc{MjQGz2YSzr^YH!rQlRZ{NOcu~>F@cLRZd&*x)rsUq>{(W9xUDUZi<|NecO z&8Ac;K@@!=4a%FIo_^%W5wqE>*Xs`wwl4|`3u|g>u3x|Ia5$`1YiDPtTrNL;{CK2X z5{cx@nKL(T+}POIAW5>XuMhe2^Ya@U8#Nlu($doQ_V&k*AC*ew&d$yO%Zrl^YHMpV zGBV_Hd1hv&UavPAjXWMNhIu+VI{N$jb8>RV#>QU1eofz^qeLVU-Me>BtyU8Rq0{Lu zUc7jaFm}+EM6=;-K) z6DQAY&05ClXAdGF-Z=3?#z6_;D7!<5++I#ri0bh zRTzRsqe)afe>q{^M~V+3kqB=<$phXOFaTg3U=Uab7yz&iFo-aHqS0uKe;t^3Vzb$T z{*n))gO-+-c-4bR7%G*DIfVGf8wTM10E56fzyN@CfI(m#U;qH%7yA+pR{bDb-T(jq M07*qoM6N<$g2)6CqyPW_ literal 0 HcmV?d00001 diff --git a/inherit_graph_33.map b/inherit_graph_33.map new file mode 100644 index 00000000..98cc1ff7 --- /dev/null +++ b/inherit_graph_33.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_33.md5 b/inherit_graph_33.md5 new file mode 100644 index 00000000..21ea88d3 --- /dev/null +++ b/inherit_graph_33.md5 @@ -0,0 +1 @@ +bc2a6107b8cc5983dfeb7c5fdf050eae \ No newline at end of file diff --git a/inherit_graph_33.png b/inherit_graph_33.png new file mode 100644 index 0000000000000000000000000000000000000000..42033d8635b1d55cbdfde875fedba9a6fe71666c GIT binary patch literal 1736 zcmV;(1~>VMP)KRQS0 zB!%?r{an4z<8$8Ud0)QgJr8&Qgpj~segT~?pm3A#}Ul zRaI3D4Glh@?_Ws$Cs>Y9%FE03dc900X z6eLMrxNsp52w1IFrBVq1;BYt+iR9e5bJSZFv})sov03|~shL@PKHtHE2L%E_Zf@@3 z!-wbQ<_Lnga^*@zMFlm(#Kc5eTH55~ByBf59*B9SON zJ6ow#zJLFI(FL;H|Nnq7m`o;`XHm+^%EV&v^XJb4fq+J%;q&=Nj~@N_@#FaTcwSzf z*=(l5^78UVMn=Nn@Y}acLDwRT^a5x-(zyIXPlNA*ekw|2z1ug|a5GIr92T!cQ zUMSt&-Do^KJPZH`27|~vbm-8TGiRtUbT2{(9S#SV%YF6g)lVmfafQ;}-cE&W+_>@D zwQF(ap*}6Y->=nb`F#HL^mJ@MPft%%QxmgV8niGrYhNmLY?gQL-k}2nnXg~JCJ5rg zhYt|K#>PgiRtq7FMx!E;sK39Twi|Z4ogfIW*Ngm*9z8-rLBG4Z-EQQML?R?fqHT|} zKqgF~EVD;hw{9I8WM*crUAvacb?fx$)7910t*xyuU%p&k z-s0lo*s;syiXY$8(*pp=&(9wn9UU4P%FWFk7#OImtmN@{005m%7dr!0EkO`*!dR}I znVOcx>2#*2r;Ej6WTGb~`lK})jnQcQ`t|GM$B#dK`m}G~KH9omE*F=}6$k{#luD&& zFflPf5JW*i0cxew($YSE{)`@5v<3buf3}&8{g**~ef@(651u}KDwoS^YHAi17M3v~ z+6aWh;SdUi@#E2L9SjC-Hk({7_j(86qoX4~Ki_CH-oJmJ zdJ3>aEEZq9c(J*;nIuWQUe7$ze<>_+OePbL$J?}NQ&m+}K|w)ZUmx`+jYea!SR@k3 z=FOXzx;7XLN~KbzQrXhdLizjp`ZjFXpin3T0>OzBC)8?nMn*>Br2-i97QWeRMqOLt z^J4yL001VFsj;z<^8C+#aKrpAR!k_9laqjfTCHBGdNA=>W0t*Gh3M>>1D;8;H&1Q4*>%gQqiwLEusVVt&U{V}_zoTN + + diff --git a/inherit_graph_34.md5 b/inherit_graph_34.md5 new file mode 100644 index 00000000..b9351588 --- /dev/null +++ b/inherit_graph_34.md5 @@ -0,0 +1 @@ +889ac9c0c4782e654e10370790733666 \ No newline at end of file diff --git a/inherit_graph_34.png b/inherit_graph_34.png new file mode 100644 index 0000000000000000000000000000000000000000..a259f8cb79a0632ce47221af3e31ecbf095e9791 GIT binary patch literal 1530 zcmVck9KotObk9!yP5wYIjN zRw*oGQd3iFYHEn#zt$6iApQOQZZC<2ie9gunwlbeV8ck9KotS|q>Xed_^7idpN54oU>gnlm|Gb`nC+bATlkc57@pPT^dVOhWDZOj6v$G)x zf*^>;Kkx2C9 z$rFi0!sqkjh6lkue_wV1odiBa`wWg$`WM*d0&(F`y%ovTvj~_n{3=9xq z@7}$8{`~p&_I6@o;=_jzdwO~{H#b{aTGVPay?IqC)zha>Q52QSqa_7#S zot>TO>1m_Uh#-hUp`Zj578b6otPtOWj*gDZ%*@EhNC1FbF8B5IU0hro92_J!HBNGN zcXu~7Hd?LLqM{;&LP7HfKa7M{tEG63MJN=uwzlH-`1m*kL3Xg-WFo_v4EUMbTg00hvrDlgY>)n(HYjClwow#y9{>9FYY2iuLqiP)!-o$aLPA0i z1c6~VDk=&Oz#ozbf>16jFE8)!@88_q)ai6E4Cm(N0st%)3zy3c3=E_c<2+|@a4>Fo zdwT-_$oI!}{%jusK@ef*=H?C$4}bprSt607r>F1j?a@fMw6sLnX0tgwJluIazMkxM zyI!xCNF)G&h=_=zqob9T6+B>JVF7niE))m^$;ruGU0o`bs<^oL%$YL)fUvMIyWNg& zNO%Fb;bP9;!An--QC?6FJ7Q1nwOUc zT<9an#Kgp;r>9p`RIIJ7AqY}cRh5&IbK$}T$H?;X^5*8|PoF*!F9vaOajB`Pm6eq? zo6T%C*VWaXG$(D`q|?=_SI?h6pOcg0=jZqG<;%XlJ}#F_BTrdbSwllZXlQ6}Z|~61 z5b^ju5n8R5%jI6ad^ss8DJ(3kySw|?u)MrHFE6j_*RPX>*J`!f+uO0Ru{Uqt#80)) zo;~Y&PWq5HD;N8S{|N^N2mb#4YPI@j0YgJWetv#`Vrs`e;+Wr`SO5SRhPAi1dwYB5 z=jW6CTCEm_;Ttz@n9b(Lk00N?d)GbnoZ5NBw{PDd2a1b}PpcjZK0ZDzEiIj$op=X9 zkdcw0)9E53BX8ZhC6P#!N~L@1Ikoi^6%~bf@LxQC);$LV1ZXrGHx~o``t!ZN2399# z!0N;dSe=-`F?~c|U!VKyU?GE|DCJ1(7@g#Dxx4CN`6)7)j68%qxjAMbVD~3x!0N;d gSe=*ws}nQ$2ZjyDWc3uzIsgCw07*qoM6N<$f~`00XaE2J literal 0 HcmV?d00001 diff --git a/inherit_graph_35.map b/inherit_graph_35.map new file mode 100644 index 00000000..7baa471a --- /dev/null +++ b/inherit_graph_35.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_35.md5 b/inherit_graph_35.md5 new file mode 100644 index 00000000..23294624 --- /dev/null +++ b/inherit_graph_35.md5 @@ -0,0 +1 @@ +59f3c1872d1765b359113a59c59a2e64 \ No newline at end of file diff --git a/inherit_graph_35.png b/inherit_graph_35.png new file mode 100644 index 0000000000000000000000000000000000000000..c9148861b00eeff9545a740a767f5e5679879a38 GIT binary patch literal 1509 zcmVsP=Z-EQ41aHCZniE zg5|DI>5|DI>53a);qiE=t*wnk zEK&^Jym@m%-Gr4xRaI`?x-};ONwMem`*n}^gq34dq)d_)9=F>~MMXu#HhIn=>5|DI z>5|DI=~@uUQBqREl`B_t+w=4DX=-Yk!-%F93WeCWZy!dZk+o~rPH3NMPIF;FB*%F3 z;e(w@YilbWkB2}Yz{{5}@%eltBqYQ-tS}2QIi5Uu!v6jHqc+}_En83&1w~OXnM|x- zzn-?Xwpoqo^Z6()E+#1{34o%aB7Xe%5sh%8WD#?+bpU=UA2eDWz7>!2OtXV^QdpqaOonys{6(l7kQCV5Z$jC@o zpPHH)Hg4RA$zCNc#-VvYzzhi7K??aPoMr#Jdw7QSFc`Su~;yh%@hC+4j4&w26bmtNb2HCM=2Pr8jq^72_XU`r!fBpsE zE?uIbp+Q@b6h)bITNxS}!sT+2nVCs)ax!IQWxRj?UTcpO!)!%u<+yX_4s~^P^!N8u zQc}XEO`CZA`ZXOL9r%1c?%lh`?c2A*`dqzwm6In=^7ZRi3JMB1bm$OGO-+3I^ocWP z&d}W49If!EudnC$@#FaYekv*|*t&HqA3uJK+W2GVvVHq@wr$(Sz`y{{o;}0o^P#FL zyLRmY;QsylIGs+as;Uq|AcVl{^-ene?%lh2`}Qr59zCMBx0l@9Tnhq z8NIgz4EK^2E`jN5lH8UcFj0G&D?W{LPy;3zy3!gb-q2U_ew?R|}KL zB>MaNBhKaByLSQ*-QC?<-HR751Ry?q_#lK3!s&F1s;Vlj-Rt#=`1tsUb5K=P03r|w zXzig;NSMuL?eiKR!*oq@yxmb-IhHM3roB!`NFXsW5re@HRyRC69M&fzBSU+got;f{ zb2EnzAEv0Nh`oFF^8ESpXoW{kPR@j~-|wGx{|gr`pePDyX=${#w{!RIT~bq1wf3=d zQB{?=xHz)1vb4Ir`db+j+End8sZ{NPr)6)|%hG@|JZe=bgiV{{X zFE6LOyquAd5w2gqPHAZ=eSLi-CMM4My+%LaQC(eK*lf0G_jkEm)YaALwvV05%9Shm z{rfk)y}jB2>+I~*+GZ*7=i(4^>sEuCB&v zwX%Hq@)?hpk&%JTX2aod@aD}MzJLFY*XzY@xAXJo&p(cHD)S~eHf-2Ha&j_OtCb~7 zmT><3dE9O{Mx!w*<5yNzQd3hyT3Q;{u3e+GwKZ%jjJB4R7K}zC>(;HKu&|Ky^mG~< z8~=E`#>Pf+b91p;t)!%+aNxiJ91h1{y&P7A2!Hx~^ebE;A4>lxOme*C)8~@Dd7m6T zJw0JJipKsq9FACrx1h!JYGpdIva;kB7bEk2<&a`WCWoX;CWoX;CWoX;_k`5#cF$!T zQjCl~b`Xhfa_Ie*LHc)0xI-#Q|C4t}C4DkEBwaE&BwaE&Bwhajm(zV8^|dqw00000 LNkvXXu0mjf# + + diff --git a/inherit_graph_36.md5 b/inherit_graph_36.md5 new file mode 100644 index 00000000..b2ae2d84 --- /dev/null +++ b/inherit_graph_36.md5 @@ -0,0 +1 @@ +03ce98642c8f65f7115a35ff82788469 \ No newline at end of file diff --git a/inherit_graph_36.png b/inherit_graph_36.png new file mode 100644 index 0000000000000000000000000000000000000000..6dea9680180e192e478ca40c5ce29ee12517de4a GIT binary patch literal 2678 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 Q7$mu@&f~CE=5D0F0bM9FB>(^b literal 0 HcmV?d00001 diff --git a/inherit_graph_37.map b/inherit_graph_37.map new file mode 100644 index 00000000..62a91f9a --- /dev/null +++ b/inherit_graph_37.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_37.md5 b/inherit_graph_37.md5 new file mode 100644 index 00000000..275a8667 --- /dev/null +++ b/inherit_graph_37.md5 @@ -0,0 +1 @@ +39929e33a61b397655f0fe800dc91cca \ No newline at end of file diff --git a/inherit_graph_37.png b/inherit_graph_37.png new file mode 100644 index 0000000000000000000000000000000000000000..06e2216d37054c8a19f022b904a8518590e911f4 GIT binary patch literal 2686 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 Uz0=uQ1ZXHB2D--BYHcUtKdssp8~^|S literal 0 HcmV?d00001 diff --git a/inherit_graph_38.map b/inherit_graph_38.map new file mode 100644 index 00000000..a025ede3 --- /dev/null +++ b/inherit_graph_38.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_38.md5 b/inherit_graph_38.md5 new file mode 100644 index 00000000..362b58ca --- /dev/null +++ b/inherit_graph_38.md5 @@ -0,0 +1 @@ +403975f9fff2ac4726a78e10644ece5b \ No newline at end of file diff --git a/inherit_graph_38.png b/inherit_graph_38.png new file mode 100644 index 0000000000000000000000000000000000000000..0faa5b1b5c4875f99778036e6fb927f82d33d87d GIT binary patch literal 2640 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 literal 0 HcmV?d00001 diff --git a/inherit_graph_39.map b/inherit_graph_39.map new file mode 100644 index 00000000..69c86f8c --- /dev/null +++ b/inherit_graph_39.map @@ -0,0 +1,4 @@ + + + + diff --git a/inherit_graph_39.md5 b/inherit_graph_39.md5 new file mode 100644 index 00000000..f1730b85 --- /dev/null +++ b/inherit_graph_39.md5 @@ -0,0 +1 @@ +5432811fd61eeaaa0721afffa137daee \ No newline at end of file diff --git a/inherit_graph_39.png b/inherit_graph_39.png new file mode 100644 index 0000000000000000000000000000000000000000..1556e32bd87ad38b770670d7174c4b9a9eacc60d GIT binary patch literal 3604 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 + + diff --git a/inherit_graph_4.md5 b/inherit_graph_4.md5 new file mode 100644 index 00000000..cd77ea8d --- /dev/null +++ b/inherit_graph_4.md5 @@ -0,0 +1 @@ +2807343d80cad7493eae7d564f8b3630 \ No newline at end of file diff --git a/inherit_graph_4.png b/inherit_graph_4.png new file mode 100644 index 0000000000000000000000000000000000000000..0d8c5c7c7a16e809c2ccf8748899774132845c33 GIT binary patch literal 1962 zcmV;b2UYlqP)cwyz2MEMGp)7U+h`$n~8w44UZV+TZxUh!G z+M1V_w^*qlmNL=N(ORvRxctX{)7RHmQ&Z#fln_fDv)SC*+Un?`&JL=suJ%I2BaGV8IW!eWLS#25sSq)Z{D2k7Yc>t<>kK5X9=d^u0%d#DeA_NMK93* zg$13(qLgT<>&9$0XJ%%SYnzaefMFPhVN@zLG&J~nN;dZlJM~Gyu3VU zn@lDQ!$wC(;bmG{+R2kAi7J$;S zVZ(+SH*R?7Cq6#jai(c$X_J$av%~W9^OKX4p-t!p$8mUHc6WEro_=m_F0{XX{R#lE z+wC}x_xJZxsZ_JsjN`b$U|_LWV`F1Zvv5}j4u{j++zjo$zCHlJw{PD(gsBdNW@?;FbvaZG%owGTCIM5erwmRo&6J=&4vbzMgsuADF+7!@7}#zuh#Azf;5c*1?-RooH%m%F4=m@ZiDf)vEyjy}i8v01k%(pIm-^ej_6zR;v{T6ALt7 z7WQ0>VHja2B_%aBHa>gyEG{l?+qP}vi=?C^_^aar%?lsBPc=6; zpFVy1-Me>_latfa(-RXDbG{P0q_D8CrKRP^j~`dBUbWlpGMNl`aW2Mj+-kKN42JOV zZ~y=tJs==p*|KG3vstIp5s_=wtg%=uaCt&PLZniuQmK6V_U-rY-;0Wh>g(%0rxza| zziQR0{rmSvM@Mhkw8{HA2!+Dp;^N`qVVljCm6Zj9J>=;Uo6RPbO0QqP9upHoI7320 z_Uze{k&)5W)ipjo-qzM8lgWPl`sKN+Iq{Khwr}6gVzCkv69WSSbvm8VXk;)LB>GXQ zRN2|t!NI|I@7`@_XdoV!?#R#2hnsU$R1}-duBfO00PuLc%a<>wrlvBPOs!VCZ{I#5 z{=|tB4! + + diff --git a/inherit_graph_40.md5 b/inherit_graph_40.md5 new file mode 100644 index 00000000..84e0f824 --- /dev/null +++ b/inherit_graph_40.md5 @@ -0,0 +1 @@ +e96f98c092a2d7ec0e2d92d43d93d8c2 \ No newline at end of file diff --git a/inherit_graph_40.png b/inherit_graph_40.png new file mode 100644 index 0000000000000000000000000000000000000000..0dd124b45efb6eab2ed4e4b0189fc5b1fd2be6b7 GIT binary patch literal 3205 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 Q0h}v9C_7gq#l{!^FYFXS)&Kwi literal 0 HcmV?d00001 diff --git a/inherit_graph_41.map b/inherit_graph_41.map new file mode 100644 index 00000000..5d5242dd --- /dev/null +++ b/inherit_graph_41.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_41.md5 b/inherit_graph_41.md5 new file mode 100644 index 00000000..06a1b396 --- /dev/null +++ b/inherit_graph_41.md5 @@ -0,0 +1 @@ +5617995742b895162dfe812eeb77ef35 \ No newline at end of file diff --git a/inherit_graph_41.png b/inherit_graph_41.png new file mode 100644 index 0000000000000000000000000000000000000000..57060f9a9c61caab1e392384ec99d8bf0f9fff9d GIT binary patch literal 2760 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 t=wMx+js>kL#M9Lq+2|aa@jn4}S;_za literal 0 HcmV?d00001 diff --git a/inherit_graph_42.map b/inherit_graph_42.map new file mode 100644 index 00000000..8eacf884 --- /dev/null +++ b/inherit_graph_42.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_42.md5 b/inherit_graph_42.md5 new file mode 100644 index 00000000..8c620f67 --- /dev/null +++ b/inherit_graph_42.md5 @@ -0,0 +1 @@ +4eaa7019a6967595a00a6e56beda1ece \ No newline at end of file diff --git a/inherit_graph_42.png b/inherit_graph_42.png new file mode 100644 index 0000000000000000000000000000000000000000..1b780e5bfe74501e20aaf216c089a2887e415a36 GIT binary patch literal 1653 zcmV-*28#KKP)+18?-mG5TX_?ST8aP z*NXCum=N|?dJ+A>C@q4($XX0VokcGyiVUh3p_N6=2rB>ITgh6sN;WFj`Mro8yz1;u z_tRzP0~hXjo_n7AoO{0a+_QVnI6?>kgYjpY5~e!?#@_=I3qvwYEDXsou`nc)IMUG4 z(t@h0s_Dpu5l1vNHI1^38d-Rr$CWErrX(Ro{2>TJ#Qq;OvV<8+S&W&F+wDd{LBW_l zHfLc-hKYqC873BnWM+g|OePa*YHA|-^?E&OYip-4qnXK!5X(sZB%Z&8cx%Uu6iaJs zD|YPI5wmz}*RBP}ao{)(GMNn7+1aS8tBYBD05BSjxP1At$QJ8%OqLlbmj8p&(ozsY z;Pd&gbLURj?RLC;`Et6`no?pS7QJ4N-Me?gY&JuoP+lpAwQ3dS&6|gYh6bEHdlnfP8Ia56Fq_SI_Uze&@)>LRe)Z}V%w{u` zN+oh~a`5osL+Y!jsKAmXOCpwsBa_KcTwDx}5Cm`>2fyEsO`A61>C>m!wrv|Yj)Tc$8nYdGy&i`S9YS7S9+XNY zmM&e2J9q9-|KQ*tN=r+TmX-#UN`?IVeDwDAMtk`p60?!z+O=yqbLI^C`}<)snXr2G zYP^2^8Xk`aZEbD1e*HSGUcD-+bLrA096x>>e!m|%IXNgRD?@E zZQywxg@uKZVm351z+f=I>2!h+g4Wj7h{w8IE>u)hpufK#cDo&gg@p(&NwVARc>DG( z?%%(UzP>(WWo5x;vx#ofNkK-?*w{$MFprB)rz2HWRkVEX-aW!`92p!Oq_!b2IhxJWl|S&!0aN zLI^P!48-Ylj@vGsPDd&$D`|OPV1NK1f*{a%@7}$m{!l1HluBh(*L0lzcgJjGNls3t z`*Y{cg-j-cTrL;cg2AAuPHJi@-OtF#Kz)5Z_UzdMqtS@%+qdJzix;s<51E;nqsoFH zNUk5Avv|E;SglqZK71IVPzb>9?`esNiAYaRr^kmMV?57KKKWs&)oQw*l#~Pj2nK`b z?(PNvXfzr+8J{(47QTM{ik_aHn4EiBC%7EPiON>16}NBS#^cA2k(ZZ;+}vCQ0)d#E zD||7-baiz>tJOvwCpkG8H8nNp?CiwFix&X^ix)4((9jV2`ugZ`9UUFi2mJ2X;Wvxd z>lMXKNSIt#q@|@HAt3=ipAUo((Pp(;Cl#CK7?UV5pt-pj2M-=ZM@I*K{``qhD1=}z z7_;YXb#*l!Ja~X_-@f70sZ$UH0XCZrKy(va08pt^C@U+&v17;ZPpq0(kP|32ZhSzJLEdp_n6y8?mfhxe_Xs3Kok63l=QE>C>m-cDtca zC}I-7sHh0#<>gqkXc6k_>TvVsP0^z>T1rYv5C{a|bUFb5jg5^^C=|%f&W6EYfJUQ% z%jKfSpEz*>KA#U7jRyJo`Pi^wgDBqKy?b%%)-5C@CDC6)(c*Hskd>7Mi^T%9T8)yD z5;z-H+TH4##w-_fHXV zrChv_o}SJgiE%>Qk1UM%fr*77873BnWSCeOl8HFMb-UeDnFk|IXlZGQ=!+ + + diff --git a/inherit_graph_43.md5 b/inherit_graph_43.md5 new file mode 100644 index 00000000..428bdae0 --- /dev/null +++ b/inherit_graph_43.md5 @@ -0,0 +1 @@ +8bba6df488c21d9472556f439d29b22f \ No newline at end of file diff --git a/inherit_graph_43.png b/inherit_graph_43.png new file mode 100644 index 0000000000000000000000000000000000000000..004d8e8256fce610d312093875d960c406384cf8 GIT binary patch literal 1894 zcmV-s2buVZP)vaGD2md)YrvSKUN(iv{MJsh~)oK6#+ z((dQ!cYglv@BEJ6bMHClUPi$%3?hjPs0&>HN%$bejvz>}BM4IL2qK!;=;`UHuC89F zQb^{U($Z3iM1nW}y0h(edwY9(*h?ar7uws~?RGoS6CE66GMU0v56L`2p-?7x$Td5H zAjOU#NUX_>!%$H&L_@88d6vy+mN=C79pWHE|OWGdn3 zgIl+5_4f9nDEjv8+wk-lW){2HX0!Rwp+mE~)?%@!R4N{i$K`Sr3dQ5ck3+}5di6>y z7IQe9&|zt5X-!Q{p<^CActDwqckkZ)(-7vCNseCs4Ov-P5{aa*uaCpwn9XLrUcYtg z))4V-w|nW*rE}7CW@aYwbK=Ozh)gCE2n0f*a8B~i5{!V+Xq@1gl;q^(^44D)zAB_$;Sfq=u|D3wZ^&4yuEUS1v^CKijYUcH)>l!RxtSS(Rd zQ6Lh>@AvQAxl<$({rdF_c)ou9nxCH^6BEPZ@%HW8=W@C50iHQ?CL<$*&1P@du;Jdl zd%!kaP3=kxXT^(7`Iwzjqck4B?8a^wgepi-$63We2bb-UeKtu`ek1{NKNShad<=(GZn{CRprQZqQ<4Vt}!1*)j%$!DKS=rq}Dm!vq2WFxIVG zXD}E}oH&t|mUi&q!Pl=}&#vG2_;{j?qG*Uc)+03=@0~Yz22EuGA;AF8z;V= z&Cbrgd-v|MXV126+a{CAMn^|ykr0d=V6|FTuUU27ZcLorWO8x7fwrSHQu~^*H)Kphjr&g z?%g__E+;347{6xC8lTTMG&BU70|NuVIaTo?D*0E!bo9D^|9*LS`M|)y`1rWr@ArDW zfk0pudFtxw9zA;G@p!7Ls!$YFsZGgVWe-Lel!;zhx-ON=g(8MO<9mR6`C? z$-fdNvE_34^5x4F3I&(Tt*NPLYinb%ShL7;`0(M1ii%aMR<*Xa-oAYsUrmDH^Z7@Q z9=&kkLPA1C7!1b6ix(Rj8t|>zqGiEemm&y){TIJaARaXr zIpkwJf*{3?AV{$z2vY0_Vv-G7TU%TB>mUgOlZZ|HWJ~ftLHR$ + + diff --git a/inherit_graph_44.md5 b/inherit_graph_44.md5 new file mode 100644 index 00000000..dbb13725 --- /dev/null +++ b/inherit_graph_44.md5 @@ -0,0 +1 @@ +e7842aabc8c41d2106f846d37d401156 \ No newline at end of file diff --git a/inherit_graph_44.png b/inherit_graph_44.png new file mode 100644 index 0000000000000000000000000000000000000000..a2c7f10d20c2ad3085c315261ac95e1667fd0cf6 GIT binary patch literal 1579 zcmV+`2Gse9P)i|UK~#90?VD{#Q(qj%&vi=H=F%5UYIAN=L4%s8;CwMtNo3-L(R@JB zhJgtqg;iMkDiTpFmFR^sDbR`egfD6kh^Q}y^J(}1MNZw^y_Tgt%uEfp_J48tU+#ap zIhWh?fA8njIcL9}@9+G+oO91E46@m5fP^sk`8oj-uR{7wEJ(kJ1?e}j@W*$?#>N^O z8-0}ui6=-(N>V5kSoc5s8;0S&zCN#~MB*v5TJ6}_7=FZme^764ueb6c@hmwxId&uD z^P5dzZyx1qB7Ar>CpcYBXkZbF-qN zg3INGgoNC_ef!t1UjTqFU%nI+6fhW!(9qDEH*bFX_6=JFdNA0DZf$K;r7&HX(vFworGytcL`5D3!K(?5LpFgG_hH8u76_3Qrr zek|<8ix;)EwLgCRh>MH6ckiA`rTY5yYePdrS67#Nx-Bg&j~_oq5F{@zFEcZ9eSO_g zB!j_-ii&#l=#f^d-QC^Ae^gXdq|@otYPG>&h>wpS9v%h&0|A zikyoU7Z>aG`jL?llgShv9W9YaFrQq(l>$1EzzUn6pYOUT007u{*ZEd05!otD_4<2A)H8nM8dwF@8N~O-t%^fjpe?K81p`@f_c6Qc1T^^5zZzBleB$&x$K7amP zuh(yEY!nt2=H%pzjEoqKMhb-z5fOopgkjj<-=D+bpk4HdfL8oKQG>yN&JRHl1VI!E zWpi`WXf(RMkV6aTTmmcXQSt134T2!7Ef$O4zI{6}F_D&*mYkfty}j+mglH8|mY0`V zES4+ZqSNVextzn{XfzrQhhw!`(G86e78Yi)SWG4p+Fe{+LZY~Z(! zSS)s9MUHSTfiLWl@Y4N!aB#4ys%mj@ac^(WYPIg{>>TN7htbl~GCDf?^XJbePo5wM zB9TadgZtX*>Z({Q9vT|@{{6ezY;J9BH5!eHiHU4BJ1Z-zq@?8i`}bzES*cXMdGm(H z<0U62%jNPBoc*$gfulZ_4M@6Xf!wGDJ?CnuCBgx=~8EBr&_JXPR0E&nar}X zvikb^h=>R_o2^tTU%q^K{rYtPfJ&vha^*@!Mh1_^o1UIdO-%&=ba!{tXtb+Wug1s6 zGnvfx_IBr@?d|Q+(a|E2h{0goxpPM*lbtzp#*Gy@!6Op*7Np + + diff --git a/inherit_graph_45.md5 b/inherit_graph_45.md5 new file mode 100644 index 00000000..dc8f4a18 --- /dev/null +++ b/inherit_graph_45.md5 @@ -0,0 +1 @@ +1105797aedf6a20223ec8c14d2054ce0 \ No newline at end of file diff --git a/inherit_graph_45.png b/inherit_graph_45.png new file mode 100644 index 0000000000000000000000000000000000000000..69bb86a3d5e18cc00e2b1761e5c90351a1d8a74c GIT binary patch literal 1926 zcmV;12YL93P)auHmGOh2?S> zS+h1)ZuDQ*gH~&_(pu|*j+TvRYUO%RtX6B<116O+qpg;x5MWu^AI#LIbbk--es}i^ z7ewUG)q7u$&N&|L=ikn`hx@(=!7vOcNJCPh9iWISRK3XsRc~@Z)tg)-V>>-PJxxtb ziE@P^7Dyx#tyYV6|Fgc`ZukBB_v7voMXaz`EImCv*pcMGN%!vEi(bsi}eEG#YJoc6K3wL=mE|?}boSR>oj3 ztX8Yb<(~DB<;&2}(9xquIUG(}T3TsosmWwQ=8TVz*VWbW z`TUHGjDrUc{`vC<0Pywe*FAgouvo0st5@&cyZ6VBA7~WF#^7gkVq&7Mt}Z(}J3T$U zyuAG5$B*F$5@rH}nea<&n3+U~aD6{`@ZjpztD~c%VzIciwDiM=4>p^vx3~AC)hQmIr{tJP#OIUEj=NYvHU1pwH!YnRvS?eFjJ?d^5D z-71wTw9)G7YP;Ru-QDeSx$^Sz6bc1er*H@-fgwzwiLI=x4BsdK0KgbJIy(GDa1jcH zO-)TmyQ`}Uf}n|s38Y(9RdwprDRkQT^XHNF@bEC5PPf@?b6y;V;i94cgGXS&_)f|N=k~0izg>1Be)=v z1%%<@VGf5A&Zn46rbeUT@pxvlnaAV#d_H7Bqhw`e&CbrcTrQ+LI5>z51~ZzSot>1F zG&VMdT{?2PJc5XV5!wVcvGXEM=ksUJp4Hda4-O8_%*^FMB*5g+c*>oYzK1M&xq&^XJch{`~3ndRtmroK9y^Q4yEREiW&xsi}GY{=L`h z)$8?-9z7BW1jWV08ja@j=g)4p`^b?aGMOwhGc%Y`E|I<;vZ=cNq*u1lOspt!-#%ShHr$ojZ3- zCKI|V2Et~u4;?ym@#4jtoE$EftJmvWTU)nn+XetI8jTw_Zrr|oyFei5>+9RPbt?d% zqoaetU~Jm7NhA`n*=&Qs5Zb80V93kMlgVT(7VGfg!)mp9`SRrvL==LUn80oqVV>7W zg-|HGefxHzy@-&go!2N9DG95$)9Hi)P^;C6@`ofO?D;v5$AcHcPaXRE`xEU#G@Dg=qeS1EK3(SXg-L)-AMau~-fqIFLAZ{0YY&zYr1*q3cZ%bqG;!+y`Wp zm6d&cef#$9gCIyO7K5ltins)mK7&c6e*T;}bEc%Egvn&CTet4%)2Fy0BpgE28<+O> zc9BTb+S&@kFz(AC3zQUb!IeHkNTpZ|27^wg8yy|3uC7+8R4@$B8A1ZUK71kC^EEVC z2vL+2alw^7LrA55{xmi=B5h;?@OV6dA;g&_^?YrCk|HjF(r0L?6bp;RLK?_hY*<~G zI1swtNl6QGF9OvvQ2GolmCnfmLx?(r@CNt11^~#+%(U5T5x?&jfutBHeTJ4w=VXB) zL>)rZI~XTUoOt~BacXL6#E0AYN{YDBX9%e@4k1Jt>|RH-^IDu))Y2y|OX|Ev5doyD zH_3HaqW_*K>V(i?mzea43+dK3$)V~^E~t8w3##7a0_VII_)mQ(7AY2s#qT-Kf7W+a zR+dt!jIT=+F+?mDOC%EP2o&tg3B{6xx_^@ks@~*+syDfy>P;^G2mSG@D5ZtfNB{r; M07*qoM6N<$f?SEp)c^nh literal 0 HcmV?d00001 diff --git a/inherit_graph_46.map b/inherit_graph_46.map new file mode 100644 index 00000000..7c71865f --- /dev/null +++ b/inherit_graph_46.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_46.md5 b/inherit_graph_46.md5 new file mode 100644 index 00000000..055fbe4e --- /dev/null +++ b/inherit_graph_46.md5 @@ -0,0 +1 @@ +413db63486b61425e9c76063b772418d \ No newline at end of file diff --git a/inherit_graph_46.png b/inherit_graph_46.png new file mode 100644 index 0000000000000000000000000000000000000000..e08ccdf8489a302ad3489343bd45ffdbcb3edef8 GIT binary patch literal 1843 zcmV-32h8}1P)%Qg0l`4@%_%QC86k;@)O%h0`|W1y)Wo2-;W}EoU)n z*2auRwNhWTTC}g-emv(q=O7^z3PAt>j-<_Y0D!*^&~pI10X+x68_;tAydfed0|Nui z&CRnF3Sglk6biLkZFu^hea_`_-MxDk_mBV!8I#F0Fff2rh|xx!ot=2a16cS}R8&ML z;C>E(H=ySLcmsM4fH!lo=ZcDou3x_%t>@+C>GgX2;{nVpbFt@;p!MIpW5FbnJafJ0 zOeWKT0|yfO?8wN7TrQ{4XjCdyEEYe0{CH+#i(qPMiVzDTkq9N12sYccZ98)0NGeuN z5p%ugl0hPokjZ4T+3a*WwOVasV`EC)Wn^T8{$=ORo%{FihsV>?(<${k??|NQ^78Vu zTCGSVB9qCvxw%iCJZWlbVlWt4Sy?qTHNSuV4x2SJG;H3yIWsf!&Ye3~u3X`8I3yBD zBodj;<~V&tT#{bDek~G-C=^P5etv&{KP)yjHuCxWi1DXSpR88v(W6Hh3`S;VW?5O8 z(P)Hi#>dAs8V!fTp;D;_4<7vS;|BympFe-zvu6*DMq9aZ<-UFUzJC20&Z54)KH6y@ z5YT8eEEX#}J6kH1zI*pB{zT#|AexJa!p3xmmX62ckw_#I3MDr;_v+QF1Omb5^I_=8 z#DGSE``o>I_by$!^zq}zqN1X*va+{t-wqEC4-O9Azkk20t1E1F+5qm zojEx^6H}XJ+rY92vDj@_0gCRnR zi9jG|Zf=Ihy}i8z0wE9xz|+dg%9AHghRx2LIRlSvHXDgV8Xg}0wOi4>krPELl+m`o-- z;BYwY?d`{pAK$ofV|8`)ix)2v^ULLOkz=>pjbTiu)305-X0cd&K3`>JWkp3rUtgcY z;Yd$U=ka(*OP9+B3#&* zprzySc*tb(^5x4T@p1Yy>!Su;I7?Q}Zf>FDSvETTDOu~=zoX+ED1 z`Sq2_WC>)12DS@iVWUAyhfb#l0s;6&4bBA~py|oPfB{bD)`t%t*4NjMj*kBN^(z<* zPEJn#ue+ZxEiEmN9zFX0{riOr7u;^QTrP)D&JZ4tM<$c?^z?lD_Ra72x3;!A9FD@m zLMD?bl}f9ttKYnN;a>eVZ>bPNW=*w`44 z$J@SrJN%1}#fukX=qX7PxoyUIhWM)x2n4ro-J0zvQi9QFq*AHz>xmJ4hKTX|IluzO zU@#Dg#I0Mm+HAHHCr*SPbD-&|VAkG4I2?}X*F-9nYPRC}ODHWZ?d + + diff --git a/inherit_graph_47.md5 b/inherit_graph_47.md5 new file mode 100644 index 00000000..703e7564 --- /dev/null +++ b/inherit_graph_47.md5 @@ -0,0 +1 @@ +b7aa8bc35cd8a15215fa7bbe3754801f \ No newline at end of file diff --git a/inherit_graph_47.png b/inherit_graph_47.png new file mode 100644 index 0000000000000000000000000000000000000000..321e2a2f1f9ffc8d2fe0ab30e120af30953c00bb GIT binary patch literal 3147 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 literal 0 HcmV?d00001 diff --git a/inherit_graph_48.map b/inherit_graph_48.map new file mode 100644 index 00000000..838a115d --- /dev/null +++ b/inherit_graph_48.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_48.md5 b/inherit_graph_48.md5 new file mode 100644 index 00000000..e73783c2 --- /dev/null +++ b/inherit_graph_48.md5 @@ -0,0 +1 @@ +420610f30a8c198ef368fe0a77e09dc0 \ No newline at end of file diff --git a/inherit_graph_48.png b/inherit_graph_48.png new file mode 100644 index 0000000000000000000000000000000000000000..ff1aeed86be85a349aea6358f6137d7a8e7ee490 GIT binary patch literal 3177 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 P00000NkvXXu0mjff#W6p literal 0 HcmV?d00001 diff --git a/inherit_graph_49.map b/inherit_graph_49.map new file mode 100644 index 00000000..280aeaa7 --- /dev/null +++ b/inherit_graph_49.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_49.md5 b/inherit_graph_49.md5 new file mode 100644 index 00000000..6aace65c --- /dev/null +++ b/inherit_graph_49.md5 @@ -0,0 +1 @@ +91a10fae25bb81e706d4bf317256b1db \ No newline at end of file diff --git a/inherit_graph_49.png b/inherit_graph_49.png new file mode 100644 index 0000000000000000000000000000000000000000..72f4c676157c3b8479e7899f727cb589e08add3a GIT binary patch literal 3391 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 Kh)OlP;Qs;3x0cBO literal 0 HcmV?d00001 diff --git a/inherit_graph_5.map b/inherit_graph_5.map new file mode 100644 index 00000000..ae995c37 --- /dev/null +++ b/inherit_graph_5.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_5.md5 b/inherit_graph_5.md5 new file mode 100644 index 00000000..452cd808 --- /dev/null +++ b/inherit_graph_5.md5 @@ -0,0 +1 @@ +c19219901a925d0912375822cd8c2f88 \ No newline at end of file diff --git a/inherit_graph_5.png b/inherit_graph_5.png new file mode 100644 index 0000000000000000000000000000000000000000..f93d3af9ac1c0851a69f48ab123e0ccce696f0ee GIT binary patch literal 2101 zcmV-52+H?~P)gK~#90?cHlglV2PM@b9B$P2JQkMmp44qzR&EpaoV6qQ(?fFHF2J zBn%82NO!3>Nq9+3A($9lM6tYNkWyq|LZy}o`J$MX*I8Ct-crN#{9pXpgU>EHpRHVW zJ|OJ5oU`Bgo#(e_J2GVmAp{gftyHzuYDYj(e=Ax%6vY!Q9*W|L77s=7WTU;KrKJT0 z1qG`S3q@J1>gsBpeL8oZ!NEb))YSZufGEn+snu$O^`LX-(a=|E6!ovEs;WXa%ndem(FMMXt{VHhwB1A#yQFE1}7CMKf2z1?ij@w==f z7mLR!6bi9-?_M-FH(Nw(mS{~D&+nj6C_o6o`1m*;K75F6+qPlPo;|3mt6S~R%t|xP zp`jrJ1qC5CHWpvLd|BU2s z%Ck1@*p{1rl}cqWcT-bSP$(4e@bG|>lM|#;DVujq?zFErQgLcz75g zAt8u}h=59^LT6_u+S}Xl;K2jb*4A>`+_-TAmoHz&*w`2X0|RmL}(7V4Mw--S{L1=1fGAR#>@y&BrSJ$%hzf|s$latZi-HoSDpJHHO06soGkjZ46 z7m~%-+mRzjOdl-Ka`*0CqG$J#{Qdn&K|uk#-PF`X7=|HJQ&a4|goFfg_Uu_so2;xX zcDtvihuGWOlg`f06+Jg0gaii%lhV>sgWLZ8{^Z=bbDTE2cI_f1B_&4n9~l`*6bgmT z{;sYr0)RYw_KXlh$noRHNn&CmA%u|G*;%q_(szadDjXE6wxbT=e(%69A;UyL;Jjj*pL%6DLj(p-@PMhldFvgt)o6k;cYG_WZ%Y zK>~n$|NfngZ>c;lHBZaU|5CZr#4$89#2%lYpC=-bi0x1NdNbA%^-yKDJI|IaTiC}N zHf(^MogM7$?K%5qW@b2T+}+*T#}bJIm6eq^b?Ov$@7|4+loY&q^Tu4^!OP1_XIrgS zo7Csv;2;2C^XAO}fV8wU)YQ~qbaWKe)zz@Eu|Z5s45y8YiwpZ$AP@imo0sb9Y6J!b z!ok4-48uU7Q0TV*8xPSjXwr<_JY%VnT z=GmC}HD*GT$%)H^z`&VEEb#8XGKK?#9}da?%W9g@b&dYaBwhg-MR&(QVF?S zj&&pqQ1V~sP+K?0l0bdCdS6b(BI#WGiT1|oU>G(mtxBNySuw1HZ~S= zxg1?xU6`Jp#;aGaAd|`P^XE^a#>R)m6wm(s`{Cr|gy`sKI6FI|u&@wSRaJ0sa4<{% zsi~>R%*=$Vt1BuhD$vl-zK!C%C53hDO)Nf|-#nac<$F87g|H$R?)eeut z&dv^bd3h);Ej4Lc_@l6T09iR6D=N! f;)xayMe+0>mU864{=+an00000NkvXXu0mjfvrGW< literal 0 HcmV?d00001 diff --git a/inherit_graph_50.map b/inherit_graph_50.map new file mode 100644 index 00000000..c85322c1 --- /dev/null +++ b/inherit_graph_50.map @@ -0,0 +1,4 @@ + + + + diff --git a/inherit_graph_50.md5 b/inherit_graph_50.md5 new file mode 100644 index 00000000..a3121312 --- /dev/null +++ b/inherit_graph_50.md5 @@ -0,0 +1 @@ +d7dec8ea0c3809ebc1fa2b4a653d2817 \ No newline at end of file diff --git a/inherit_graph_50.png b/inherit_graph_50.png new file mode 100644 index 0000000000000000000000000000000000000000..8f4559f5cf33b32269c0e3dcc9fd83d39b3503bb GIT binary patch literal 5328 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 BvuXeU literal 0 HcmV?d00001 diff --git a/inherit_graph_51.map b/inherit_graph_51.map new file mode 100644 index 00000000..9b9f2bb3 --- /dev/null +++ b/inherit_graph_51.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_51.md5 b/inherit_graph_51.md5 new file mode 100644 index 00000000..f6c1b4e3 --- /dev/null +++ b/inherit_graph_51.md5 @@ -0,0 +1 @@ +840761a9c1ca2de900fbc28b52d09f5c \ No newline at end of file diff --git a/inherit_graph_51.png b/inherit_graph_51.png new file mode 100644 index 0000000000000000000000000000000000000000..98f97da2283f3bee7d00d818900e4370878d646c GIT binary patch literal 2864 zcmZ8jc{o&m7avPZ%$UaB*tZh0wGjHXkhRc|?2$EFA&eL_vP=_-!eklBB&0D2Etbi? zha?GUvX5=7S;qT)-{*baKi=m)_nznb+{s|0yi->Km*$e z?vqe1@RUE-wGRx}O*10{$o{{tyxPJv2!v#1Yx`n)tc~`9M%0otP|oP@{#IKaUIO$lVy*ki4sgH z_^KG%7NsFIj`kR8Cd{QTt70b#!*4xWthu+Yw6QRvg{)E+mDKm}AYUPM6Px``)2B(% zQ8HW_qPg+XP`;GttP`Ek4NU?qlVNRbeV#Hj@{AhszkSNwUDf3^kELEJ8T`GoR3E08 zg2!LDb!(QlvMqScqH?L%)X0ciJ6Yet0ue)vri;)DjMMut7hR4%EMn|nP8>@kzkSQ+ zJM=bWxGoSd5AX};6`KRCh8zka#MD=6d_ z7n_Pxtd#;;yW!O1P<8;o?b{Ujy`J5uwHYLgi$hjc_7FcmZgVUG!NI}7=QdNkw70jX zE((Jp5Up#o1Nj59U;6uh+c&Vy+|{`w&aI}VW?*0-t)_;sSYjpO@ib64s^75YvR=yd z8(5*~o*aS6g@uJLvv+@mOM+arLm8P?Shrz+wbQ+Xksg)S6scC$-VS)fR%$~iD3JeI zhZTdv;ahu~NDyvE}8OVZ;Re z1U}cHw@!yR+3wX!0_bNJ7bSyp9aUQy!xhxvY4fjxgA=4^R$vLMrNyu?isD?0T3=s( zU0nQm^kW!OL?q$)bJSJVUD!Bw(t4C9--^G!lw%eyRl~q*@qoV%N(b0KKB;p54t`iQDhvp}imQtpsJhQa}+0U`I zURq(%jC6jnjJ&H)GcwY00t&rPqJC80CVhWfR3wv3e_daHgW>SbM+nPoKWY=qWHOto z`n(H3seQb?@0e&IuSQ1d2?-19`1ykWK7^DEX1@=f?w@E(P$*S{vU_-W4ZN|dXd4>J z5LR_GZcUaDnB*U?dbdWPV~g=Rw@^W=S=>Kr@Iu1uMz&CN|C7Z+(94)b14fN`!#{ zXGcfJa-WfuD-CzRw!#z6+Fi8(#cOLb&Z?4zrcNmd@EK^6XS58+~%;%l` zrws%YTDC1WGdCAxQZH9O=yOU%n0N8#d-|8$K8?x*xzUM5Tx~Gm7&Y)fN;t~K$tlU= z+@4@}cQ=Ol=OFL^aCNE+4Q6TR#{ZbFQqcbm>e#o(h`7fsDRTIN;j-{8UZIyzut+ zwxz9YV%kxQ56xlEOyh)R8(XqrdI;nOPjIf8TM+pF366O)h-NWNb zW%#3G4;ph)b8+^io*55dDGl^q6LuzxQi^4`OuUWcRK~iTsNB(k}=`RdiHPX&T!6`nqSZtCyv|MkZYQ{WS< zlsZnK;6>I-AHZ~k!(f)q&XVnuK`2SdS0mN8(}WG6=pS2Ni}z8`RjHT zbsxmX%c`irxDk>~MOKAh#>P~WPl&=Wd+S3;QPITB@n|V0C#RaQCCNxEc4B&(J9io= zJOWItvk@D5UYxH~RqPzy3tknMmUbI@Qf-N2`jbakFbIRz%;`a9Umklj9{79Y;3p)%{VXssl9f$>M}A`mlNXRT)n-arKP1e zZv+QdD5ibJ1Vm)|l(`2Ylj+OdTH|?TWruV_88O3tEwS7POEek>7dtJjr6mF+=Qqa7 zfy1*W8y_Ffm9X=VtehMbvvSkj%j;!rt%PUAVX4SvHgJ?t51#7M@R#^+JiX_EVt}!6 z)xm)#oJXLG5wCr7umMMpVhe~X?HxV?6Zlaup&$>5K{YtGJm#LMwR&Jpmy zz(Bx4MOD>w_i4=Sh|Hjx<&!ZJvY?MlO-+ydfW`Bc6}rOW#a!AyyBIgo&DQoicUM}a z1pL_>lgdu;#>ybm0YMCG%hg5sUH|jV1f13JO!-EE1T5a@*PDResV;tD;rOtza4$#r xO?5pXpv22t)#2@uv9vPY2w-G{{%?yv(LTF{_4y%4DmVf|OfH!lyuIjx`xnZVjB@}0 literal 0 HcmV?d00001 diff --git a/inherit_graph_52.map b/inherit_graph_52.map new file mode 100644 index 00000000..e1f0359e --- /dev/null +++ b/inherit_graph_52.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_52.md5 b/inherit_graph_52.md5 new file mode 100644 index 00000000..2e383471 --- /dev/null +++ b/inherit_graph_52.md5 @@ -0,0 +1 @@ +b57d81213cfabfcb536d60b55ce1dc09 \ No newline at end of file diff --git a/inherit_graph_52.png b/inherit_graph_52.png new file mode 100644 index 0000000000000000000000000000000000000000..12a172c7f1ad0d9fa4dc7bbbee0bb16368e9cebf GIT binary patch literal 1919 zcmV-_2Y~pAP)h$v)|nf z5rwa)x$}B-&gXvk+|TFS_dWOAdlbWQ93T)g4P~wqKrBp+KOQqgTa`C0)arSR*S`A z27{51knsBTYpqtx<#JgpmP(}>A0H>&G#br@4I7p&U0PLDb@l4in3xzkoh}xO-@SV` z&2xD?wmyFRC>D#EOr}sMeEISvG!_>Z$Hm1>Y)>cVG;49Y-TC?XJRUDBEKDYob$53| z`@q1!u3fv>Z1&2PEBEZ#^Y!ajXy-7f@9wcWglgTg)qfjU@F)?S)o+bXwNgxoMI(14SkuaIeHEY&9 ze*De``o#6E|*Iv6c!W|R903F4h~+tcu}v{2X@}Fva&O0 z&e&`=g+h^@p6+ls0*m8sExEb5ZEbDOpFi*E>4}ezm&@f)b31qL{Qmv>`}gl#T3W1D zYfes%j}ui@RV5`Qm6w;}IBqhTppinMs8p)!*RKNr?%lg57K@{zqR79hudl~(d}L(g z!Gi~P@7^U3T}4GjadB~9Utex+Zca`P)X-%93Wb8jVs&(M)YsRO-+?A84UjHhR#ukZ z!-|tI7z`d3uOucWmXwsh_OoZtFbs3M-LSiR_wExXP7rSJj=^!t~n-`~$-u?7bR`Fwt3 zV`E)i9i2}1TFaFyR}=~bk-1i@g>5)f+HAJT{M*{v000h$1KOWHeG0pim4^R)`KAN_ zU@#cSmH=n06)RT2Mrdg0k|j&%bUM);9v&v#h?_4aCPuHEDo6|Yw7Il1ORY29QX#XXwjk{KYny|by=-eDwP@?9S!~ABiLihY&x*n zY^hYLQmKCZ`jwWJ=5f?$Gzx`627`fNSbly!xnwq*4I4BX4FCYM_3Cf8+ZhbT^5x5+ zKQWAxl?IP`%$-%jM2MmQ%sw z@hB9E)9EDNk(rs9k&%(3qoX}NJE7Pn@$qq;PUrjmV={jZhvRm;;i3uvV6j+ymj;hc+yR_E zv-DQj)YNqH3H2n2%i z@^Y8U)!p4)SXfAeiin6Xo6Qr&Ar^~q94{y+@UX*yVzF2uAt5G{NvG5KPIWT>xVX5K zl$5-@Jcq+!u~>?VihP&$Uxo`ZOTt>eetlS2m{cka4-ePrbk)_>fqkk`sZ<(`X4R@y z_wV0tXlNjwV!@`Oq9Q&%UMiKc+3dW$Jf%{(c=2KYfWcs3Fc^G3KPf4R!{Jm^R6zgp z=g&KxP7a47lgYMi+eXAWe*Ac2V})2JsaC7Wq5SnX7z{3# zYxU~Y85tQncI*HEgoK3nDDA&Oo&%@3ct`x}G&D4XhlkH#KrmtP?&a^X5DOB6!9b-_ zH*el-u~-TV3j_Ir;16^5<-Mz`YvPuRQmLG)d=@+#H*Pc-O15fr>E-m9ytXFm_b0>g{2 z6bi-c=Yd#YVCbD65e(283lS8Mun<832@4SvkgyOz;eRhE7&{cB#HIiM002ovPDHLk FV1l$tq|X2V literal 0 HcmV?d00001 diff --git a/inherit_graph_53.map b/inherit_graph_53.map new file mode 100644 index 00000000..9f5db9b9 --- /dev/null +++ b/inherit_graph_53.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_53.md5 b/inherit_graph_53.md5 new file mode 100644 index 00000000..9ba91750 --- /dev/null +++ b/inherit_graph_53.md5 @@ -0,0 +1 @@ +a05dc455b4d92dc0e07b801355d66942 \ No newline at end of file diff --git a/inherit_graph_53.png b/inherit_graph_53.png new file mode 100644 index 0000000000000000000000000000000000000000..ba2db1aa352813af89a43a50bd535ffee0d387c1 GIT binary patch literal 2053 zcmV+g2>SPlP)<^jQBO!@YlpZuJ3Q=>L5m8Z8AVH#LO4&cMIhUKQO)I9(8QZ+y2Z!JN-rVk- z%hY{;=k@4wj^}>W ztE*e7R3H#9l$V$9-n|(|}qMIup4OUv@-;~j^?QBY98U@*3A+qTlV z_{q0#-%u2tn3!1UL>9qn6fO}m5w9NZ-MiP<*Jm^u-@SXc(z*N}vD$^()6;YG=+VVq zH9I?tdV)&z@D$|_dHwozVqzkT#aeRD2!ia}w-3*p%jH&8Rn5)K{f$6Nh*&JXb?esO zjmR|v!Px)E$;ml#S!g0>iM`+1a+Xw#LTB8#iwJ zy;uQ+Kf)D>MCIk>5{ZOPr^m*|_V)JH*49QvMX^|{l9Cd9OAv`fm6ery_wHpd813!t zjg5_bKA%RTNhFeifdL<5%{wZ5`0zm@kuaIe`1ts)t}ZZHQ&STY6XR}s%$%5#TrNjZ zltQ8K`TXkYYWy!eMIupERaJU=I+MxVym|AJCr`k>&=7N=;5q-nDBNeju6WkSs1)jV6;xE|)Wz%-Go2 zJ9qBjfhH#>6$%BP&kqX=D=jUx*=$~%xHshB!Grz%{Y6DZD2gT}B_RkhJw2^ZD7aj1 zXlSThF8}i7i^u$Z5yNj_1XL>3ycv(g#l`V>yjQPYO-)S|6%{cUjAO@+egFP_XlN)r zJY20-3%lLk-Q9iq^l2~t6B84gnws40xVX5mu&~a~ zPOH^gQ&YoaGA$MhhGCa3T@ng~U=7iB-*Jg4;R~Ej=fJ=~OiWB`Yb(Bt!{PMy_S$T= z>gsAXn>{x-M^-{vSy^dmDef&bH8mq6V{B|}baXT=EiEG>!((V4dnlDk!H(;2IJ&#L zSuB=Dqw(mFEG}7%5{V=yC&z3yYqeUjSd1XZ`1m-6VOd#Od-m*k|Ni~YpFfpK<^B8j z$()ciBq1T;=FOYRYt+_}@`a*=%&WFQElQmKBMAr5>OZe3j+ zusb_DQ52n?o(9AG{QPt0&f&|zZzqOfI-QP2qYVxYF6bQdD%^^S3Vhktty`5!<$~Vk z2^UXk9t{l*xw*OcvfA2OV1up8Xf%?QKosuq@GycPBO@bV`1b8v1VO%j{pudt#~wpeDPQT*MTGvX`e%*@Qkj~~B$ z`7%8{JtZY&W@g3@hoBJvolX}O73FtIX0tgjFYn^Tizbt4Zf>r=zJ9@5w*^axj*fOZ zoui|pU46|`Sa(sTCKz3aJgJ|yWPLX zI@hjUd;a|S)YR0KD_4w0V|I2nvY4AQA|MAAi?w#`+Mb@C`uh4mFF_y>q@<*jm6e%H zCWFCn^5jXGOcoIlvG_vggJGCnuWxT}kBf_Q|0!8qvKoa#VRCZv@#DwG$H#R#T}4F& znCEafa=E;?xcKA8k5;R-sj2C~g9l_z$Qlw65ivM82*l0daI&(p3JVK|hK6QlX8QX2 zva_>){rdIi4Ou4PrlzKbhK9;yvaqnQ`ucjcT1}_Z{qR##Qc_u2xoOj;*4EaC4Ef^X=&NMeY;dD6$k|V{rzcaX=F~w z8glmR*+-8ag@lBFrwYx@&0Dr?k;!CiHv7bh6NQC^OY-y(#R&i9t5&PQx%cD{m_{@Lv1q9?j&x#3Guh+Z3k}WJOT&a8@fyL6lyY~?uj|a~r5Wj&(1xP>w zg$oHtpl~4p2^20QAn|Z>rdF$$KMx3GQFst;Zf@@K=K+B%3KTw*f&?P)j0*`!pl~4p j2^20QAc4Y#1SJ0eTWSS?_B~n%00000NkvXXu0mjfmKE@V literal 0 HcmV?d00001 diff --git a/inherit_graph_54.map b/inherit_graph_54.map new file mode 100644 index 00000000..748287e1 --- /dev/null +++ b/inherit_graph_54.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_54.md5 b/inherit_graph_54.md5 new file mode 100644 index 00000000..e1a22fc0 --- /dev/null +++ b/inherit_graph_54.md5 @@ -0,0 +1 @@ +2f5727f8cf90c01d1432009ca26eb31e \ No newline at end of file diff --git a/inherit_graph_54.png b/inherit_graph_54.png new file mode 100644 index 0000000000000000000000000000000000000000..3213fcf687e0f2827d701ee81946d641a4acaf2e GIT binary patch literal 1663 zcmV-_27vjAP)FVm5H#YCi>G62*=+UF3B*b6{f*`54d3Vkb(Ui)3 z$&f8foDA8*#L18?|AaUX95{e`_wGr~8;wTXzkff88LbSnv$LqFsexLp#_rv_Q=QI= z^G}E~l7+8v=C-TL25Z*Olx&hz{CZ>(RxUUEJyEe(FZ zKOwOe!<#p6P+VLLjYgBSn5pESymKasjEoErk@%^stVC^Xt!O7xm;m7Qda-WZx}?TT zB?%Fy(P%_tV)Rw6q{MHy0X>26c6H2nK^;K21$cIC$_N)M_;z zK75EAEOePa}o<~tp5qf%h#JT3?W)u_@NZPU1 z9k~XJ#R87wpin4aFc@IB+cEc7iAJLlSFT(^Sy>r)p2zm>+wtt#GjU$31{RA2w{PD@ zTU#4Aj>F~4mjM716B9Uk^eD7iEjDf1gqoTfOioV5%yB8#YkGPb4Gj&*%gaM%W+p5a z3%-2$5;M-Sp$IxVJ1NR=ObQDNNw3$_>({SoYHEs(A3siNwVFvJ49t=CDqo}O0Hope!rgv1_r30 zpny6$I>LN(Ivw@(_0g|izsPR4lUA#xU@*8~4eIOb>C~xHVR1@JOR2oPoW{n+XmoUx z4jno~<>loub6m>xvRbWVHk--qc9YlZrL$+x(%!v$DG&%OSc_Q1(3>-1;%seg747cs zZsItOrl+UHv17-M(S-{a!hGy@yJ)-JZc-|h^zPlexMCA6PMjAnUJUcuxpODAwY9|+ zCz?3tt|1yXZ{DP;s;V%bmX;RLo}8Q{03-;)f;ET~=jYF#2>=Zb4~t{(-@hjS^!4jk z$sFUoULKE!0MOXjm^dE@1c>K(G1tY^A{w#8nXoFMdv>-FMTXglKZcqDTK;=5kM!@~f8oSYnR z90!i$kd~H)pFe+MWMm{}oaKQ#)7k0Tfi!r^el)i}jdgRNV)!teKEbaYf48yXrC z=c47f6!P-&pin6A{rmT@29bzRQBjewIFZPvTYvuiIWAqggrT7!%+Agt5D38M^M!57 zm&2VqcktrH3rtN-;l_;{5Cj2Ms};b~8=^=;`D!#8tX;bny}i9~I2?=ikGBT-`S~a* zDM5XGJ;uk!;qiEI=FAzG&1P)gygBatrO@egIDGgpY&IJP2L~}TGlTyAepszm{Q2`I zVR0gnjW|n7OOctG3A5RZtgI|J91b|0PN-C>gq**wt`1F2P1v$!3pzSF@Z`ypu&=g6 zpx5hh{rYuOS674Qc{DaQ;>eLBi}qhi4LUnJp;D=^XU`t&+qVxnIXP%=Z%@Q>!f0=A z$BrF4U^bhf)oOA2^l8{^wiW%?7Dp8R_GRcNOvGNwWF&zYdSh>2GUSWw#W^xEB6f(8 zADhjV>hu^Zi0q%O>-BoJ#aN}t{?5r*y)bbyWD64~L$)w+GGvQnL*#TilbHu&mEv-_ zBDfKQfgOM!eJt1N+WCD9a#E>scoDA8*#L18?Oq>ka@*m?12dex4XFC7@002ov JPDHLkV1k=VJsbc4 literal 0 HcmV?d00001 diff --git a/inherit_graph_55.map b/inherit_graph_55.map new file mode 100644 index 00000000..8a6b667a --- /dev/null +++ b/inherit_graph_55.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_55.md5 b/inherit_graph_55.md5 new file mode 100644 index 00000000..fa041342 --- /dev/null +++ b/inherit_graph_55.md5 @@ -0,0 +1 @@ +617296c31571838867e276ad83076967 \ No newline at end of file diff --git a/inherit_graph_55.png b/inherit_graph_55.png new file mode 100644 index 0000000000000000000000000000000000000000..18bc024f0b169834c9a472b928668821557d8aa7 GIT binary patch literal 2102 zcmY+GcTm$?7RP^}NKsZ~F*H{|S_C2?AWCQwK&m_pNR0vF0|LkcA@sHeP$^kTC<=sP zKuSbZ7BhJw z003m29PQAc9R!cIlsI^Yp7NuC<`B-s!4BB}xoclEk^w-H?__7=nOL<}nday*ul8#6 zLEXr5H1l?a_nOmyZVADpMC4$4sqga>_XqW-rfQ$UNklmWTyuvxi8{u{ELy85+e8FL z`r?!!jI)ii`6#vs-u`Z6qu{{K+=l7&*B#3CRth$Q@C5q@w+>;TCc_{Bk@ElsNltQ8KvGO7M z>P3z(aYkmiC?s#3>cGEpG=yJRR1~DpyYs)1-sE#~b8;978`WVJ78acy9dUd7-iIVM z4~Ebe9cdTMta6GSwRC@}#xP$_PEK}qT2R$*GtJVrzqWj~v$sEc?p&LYhq$-;UBD$E zDQ=CS!NJW_;mm^VogEJkj~AVtcoRQ7o<~wW2T@e?uH4^fH@!;3wWma|6%-W{;^Rk# zhm}sDn?1GUj~_qY${go^`h-9r>d`AbJw3a-sqyiqx!;7s{{H@T&WoKXnm3tDK6=t( z3~w?wH^+B>eF$(O5C}^4!}1VFyl~amv~q2A^~8x221Sl7G}_+o?z?yIWDXyWLsEi# zl9G}zn5w)ymz0#9wOP6}v34AP-83aIum|;n$K&<)Uz~{d@p;qWQvT-pGa4nePopz#-2an?LBRoBD6@`RzM{#k5D!@qnQ{6#;pPE;NSpj()4yT1zrcU z4K%M_tZ)3e$eIyfAvSVR^Ieq6O4jITLR=ioz@Vz4LPc3wAQVER4&Dmla5#nmT^KC( z$FAthv&h-)?QKw&KHQD4u;%PtNaxbZ%4r3evnrRaTq&)roc*>jzaYaQ%3+_!!?d&x zc9fTu@d(Kt9)Hh*!(b%V($G>2>0&Gx>&_i1f@OVu{o|R{g@pw*>-5R#>4by?TPaOV z&2a-e3P(J4% z>igz`?a`wJ+1U~eXlcNmHigf3YmAMJRaH?@QB^$vI5wcES|8?n%MAkn0H5?vx%BUw zVgTI8C`b!3J~^2MxivQCUg|8Nkt$e}00L7}-~HQ@buWt3nX@=CF#!N2Fk@r#=(4TU zR`QGP?u>{C{j6y1xCh6J<9w}I;tx1}-1I!RM(QmpRTFF_h&y4>+(U<)qar3IwzjsW zcm{JPH&+h|P2B&n_x4|^N=lBu(LD7IXQrj4k&BDLBEcahE6ZRoOjIHX1O?#z^0Gsn zJ5(W;LYZ4#eTe$$$H&Lp*w{ei^-7&nQc{TO?g`V6u0ruzkY29fYx3U9mj^4^R*9Rn zUNn1MQfC_-VVv1}K~`5+7XXkD}GdR#sM~re3tEM;aQ)!%_@P*R@xFV{!BH^30LQLz0r&D2=y$JK%6= zo*W!>`h2{ss>)R^%dOFtFR84zwcm&bQD?DOTrRgspFHS3=J`-#k<0bKV!^07Kh|SUPs1$IslLd zU7eg31c@NXeyu`w<+-r1Fc%jWSDh~dMVb;45;az7ukj`%63Noi5&+cHYCzhSmV$u` zfq{Y7udg;N&cle&M#mUj$UNK*Onc4dKIzIccPWv&CtW!l$b@lf>HxFcZhGrF=(GP8vkGukZ3i^+8cZPNNAaSehz?Ue82DI{?^hiE^Kn)fI|C3x@?Y55I%meaCJ^%L_{(N9_ a_r+HJFzl$Ezgh!+1OO*{H@iouK;mC$(-;c? literal 0 HcmV?d00001 diff --git a/inherit_graph_56.map b/inherit_graph_56.map new file mode 100644 index 00000000..7f4c8299 --- /dev/null +++ b/inherit_graph_56.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_56.md5 b/inherit_graph_56.md5 new file mode 100644 index 00000000..14952d47 --- /dev/null +++ b/inherit_graph_56.md5 @@ -0,0 +1 @@ +327f35617f82a8bf967bb2a3cee2de6b \ No newline at end of file diff --git a/inherit_graph_56.png b/inherit_graph_56.png new file mode 100644 index 0000000000000000000000000000000000000000..710d3f492e74fa4efb38aaf6fb0c178ab3f3fa56 GIT binary patch literal 2043 zcmY*adpy(YA0O3RH`l|;!XhDsB}}ek%w3};+mtn#a3o>wmz8a%RI`+pnoAsn)k#(x zId0X@^Y zjBLf(4ty8b9})& z*DfD{UQMW3a)*eOe;}~T(9&{1M-XIc!R2x}u^c>J99~pgTid3oeg&yPZ$E?2=HMj> zEyezP+54Ih^UkiWgtejce_g~=uLInF8uPYyO<~tA{_nr9SbDDfM3P!RHmy7KDhUE8 z591$-`=aB{r9%^O^?R;@&CJa3yJIGr6;?!^8nVFgCZ<~rxsHeO8j)|15m1v98t-L4V=wTBYjpi3trL3ZY;Q9#CR?qjN zs^4G?)u)FlykaNLSmi{(*7B~urksI+9re}70+>)Jv|9HLKr5~-PB4m#wJA|i?xx!0 z<=HMEPo3O@C$Doj^#1+;_Gc?=Mti&4s}C2M9{XB^LN^o6ox;)g@707vs324|B_*Y@ zsw#p?ReX`Wh(3GPXl-G9M}CAM*9Ud>C#k;q@sv1ScXM;|)7)Hch&hHrF`jD8RC$DF z>sp3S17|In-lB17bZ&k`Sta^VKe*(4?rjs z$_l2+WV1Uy_T62c8?KK2L37l{;cyQ^%uh`e8Mp)yiLuEi;-aHBD~Ppqb#997pFWv> znH17zXUR{t`}+C@=PqHf*xMtz1_o;SMG8;D`u@tQhO$^JDo|MxY4229wwjBJOJ{fY zV|D-CqS_?l+qW zsH&>5*EP8H^78unfs>8lPpPtohQrACDaZ05sv_cYaY>1mot+)h#-{dkkQ-Nn}RCKBONVp3AlPSDW&Dz6pIzs_?^y{V4O+`E133(b#2A}t6# zD{d@pW|WVf_l}A>Am40M70OC;$U!7KG;BS<$xk-Cvtv`PR`rot@J&9Sqvq!fxBx zu^d1X$TZrRdE!;wY~I>hvf@s8_K)E|{|q{QJh#O1ba``g@?Td+LxlDY4yD8v1D7mH zkxRx#&c+4}ek@t_-Me=%Jv};_|8n5I3rY%9f`K)jo!l(pa@zq7L?UlKJr$;K1G`hd zh%q%4u8#H#x3;!kT3*f_qIwVrdQn8jvel}iF=gPI(erSpH0`fb;tl|Og`P&9o}PZT zk=bZBH@VOA^VU{YIp3rM9cQczZEba4j_B1Vl$Vz`QC@2TU&$U<1BXuRM7fgsqp!8^0sVqkZKcTs(nsMhJk^=@^Qa;Bq!Uhq&c-_Z06m( zsaaWFZFKOU%Dx+~${l37{2=Bd!n1v5W=e++9fIlWcLR@W=;^V)zHbBgjyB;SP^jGi zGd9*1^@@G=1FVq)`Ia2Mg0DN8exvX5DI-bJyrjLa4>B|~bRi{$f#&D=WIA z{{9$1xkMt-g?Y)Lk&%(xlh6GWih4Q#S_9VBi?t4W25CBJv|K#4LOiKZOKsIkp}Ye@~U%! zG`#_{k#^Ssl()2uJ+zi_Av#^Hb6>uA5(pEOkg-^@gngoVSny(q)mT|+Okmg@pvg9@ z@%5p(ixba`EG&8@Gq<}I>~@_~advh-_cPsH0F8)Z2W9eo^f z%cpAVZbFbLDC@_o0#t9o=w!+>Gi^e<`WBH%HW+*#RW+s-Qm_3Yw}4Bw3liWK^0PsC XHBEd9$ae+!%|YIn0FMUrnY{l4-!8<} literal 0 HcmV?d00001 diff --git a/inherit_graph_57.map b/inherit_graph_57.map new file mode 100644 index 00000000..2b895500 --- /dev/null +++ b/inherit_graph_57.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_57.md5 b/inherit_graph_57.md5 new file mode 100644 index 00000000..b15d12f0 --- /dev/null +++ b/inherit_graph_57.md5 @@ -0,0 +1 @@ +87de09fce2bf5a33e043ff5aa78fe481 \ No newline at end of file diff --git a/inherit_graph_57.png b/inherit_graph_57.png new file mode 100644 index 0000000000000000000000000000000000000000..3b5722069ca8744e11859156cd6e9507e60f79d6 GIT binary patch literal 1021 zcmV%}XJk7ln?wgi%ZdnsAPJ1x0)>JoiGpbRAhHig zgN+h81Rc5;K~!K`L@jnOQ^-?6HxJB_B|}fzP{pXYih9mPCoNI zGxPs5JF}xghGBq!5v5x|n#uSVHbVE0a08#uH#awzE-9&@rlw|md^{Zfwf;0syWQ@T zOG+ISMfrR_ZVU2nk;~;um7Y}7(a{mnBJ};A@h@yL{(mg>#@bY&J6tb8~Z}(P&y*TLXarKMg+uPyfx$&5w_dhlhs%fVa0dhr=;EJRHv2Y_{_9 z@^E;5evTl>)zuYu1gTUyGc)u0`pRBN0)aqJPmfF{lgs7({r$mUkS*gr{}mM#Q&Us* z_4QJzw6wHzZ*LC((B0jAe0)4OI0zxcFzmZVc={KKL?)AIX=w=nu(7eB)oKe03c}gm z-d?}ozrVlFhReGj&2g@rK&?Ck7(etteVIXOByqG{S-Fhni0+wIfS)A#rHeSLif zgMnd~&CN}XMzg-Y&M*u`QQtQ5-40=lMx)2$2?m2Un~fj{ZVE+FgTY|4*#H1vUtc6i z8jZ$??k_JdlarGuieeacd3ovedMy@N)04~PLJ*{-r6rtNSXh7%DwWEE zg9DGpBbUo*nnn<$sHli7C@Coc0MIlYbyD_&SS$tre0+TH*3S~<{vSUCLFjb4+1XhL zVMMB|tgO1ank32X?d^eqfvl{oaLQ~p&(F_ui&ZLBC=~Mh{p=>XxVT^&5%LStiNdc9tuP{b)ip-`Njo`ymp z1o^g|B;J48+S)`SQC(df`#i_S>2#tfs#dEt8ckkap51Pbf1-(riQU~@u~^LG{09sN zr_&kHk_exlpSiiY4u|8X2230r$8j9zwj^u)8HTY~EMl>^y}dn2Q~U@C?f)1^B$Aw* zoVB$z?#cHHNtXY_-%P3Dw}1ajHW~lIM(F;doPS$eTdCKP8m_Oe^Yin$Em8b;b# + + diff --git a/inherit_graph_58.md5 b/inherit_graph_58.md5 new file mode 100644 index 00000000..a1a63fcf --- /dev/null +++ b/inherit_graph_58.md5 @@ -0,0 +1 @@ +549bd3049e640920c7aa64fcfdc94576 \ No newline at end of file diff --git a/inherit_graph_58.png b/inherit_graph_58.png new file mode 100644 index 0000000000000000000000000000000000000000..31431f2194ac18b10f0e072b8754416920b52c77 GIT binary patch literal 738 zcmV<80v-K{P)V1e%jK0zk_Sam zBuP$ZG_y?)4-c!-ql7>p@GkQc*2CI^I#{F!yWM_!d%M7a5?RH0KvDGi`g(cuSK)!8 zsCYd7L4(WX%IEWn=l|CAFc=KN;jqDA*xufbL?WZnNGvs*&Hep-olfU)IBK<;ko@>s z3WY+iudlIK3;+NWMHT2#;vpCej>qGAz5ep@Leuo|@v&IKas2G;jA0lI!@OSaa5(&Q z+TGoq)9K9Ray-vd6s16qY!97IhaiZnt1AeC%x3fD<>mA9Gt060$=VzCHGAw&>F>_iZRVVDJI{0!M1%w{vkas7T@2wSa| zkQBmhw<~sbI-Q-J9Z4cKzI1Dm{b2+_JRVOfm10?zrs@f_j)~GhG;bU^>0yfElJ1ic26b~;TVSDCH)`w zTlY(9W9>m5%vsa-_xG#UAsvQc-fdy#c)&1hReBWS_xq + + diff --git a/inherit_graph_59.md5 b/inherit_graph_59.md5 new file mode 100644 index 00000000..381c461f --- /dev/null +++ b/inherit_graph_59.md5 @@ -0,0 +1 @@ +d6be8c06131ef958fa1a7b1eb750758c \ No newline at end of file diff --git a/inherit_graph_59.png b/inherit_graph_59.png new file mode 100644 index 0000000000000000000000000000000000000000..c32505e958bbfc048347f0da57358c1431f90f07 GIT binary patch literal 3596 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 + + diff --git a/inherit_graph_6.md5 b/inherit_graph_6.md5 new file mode 100644 index 00000000..2ec90b44 --- /dev/null +++ b/inherit_graph_6.md5 @@ -0,0 +1 @@ +f4219a13349e70f05b1c4f8257847d39 \ No newline at end of file diff --git a/inherit_graph_6.png b/inherit_graph_6.png new file mode 100644 index 0000000000000000000000000000000000000000..5d604af627634ed79447c68a0ec0bf105fe3d17e GIT binary patch literal 3558 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 + + diff --git a/inherit_graph_60.md5 b/inherit_graph_60.md5 new file mode 100644 index 00000000..566447cb --- /dev/null +++ b/inherit_graph_60.md5 @@ -0,0 +1 @@ +a965d3f71560c996494bc4481ae72da5 \ No newline at end of file diff --git a/inherit_graph_60.png b/inherit_graph_60.png new file mode 100644 index 0000000000000000000000000000000000000000..26609484b64d51b2481e572611d09723c66a05b6 GIT binary patch literal 3458 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 + + diff --git a/inherit_graph_61.md5 b/inherit_graph_61.md5 new file mode 100644 index 00000000..1a3ce1cc --- /dev/null +++ b/inherit_graph_61.md5 @@ -0,0 +1 @@ +94f27ed0bfdd9eefe88e3a92761a0dfa \ No newline at end of file diff --git a/inherit_graph_61.png b/inherit_graph_61.png new file mode 100644 index 0000000000000000000000000000000000000000..3bfbf34ba61a5f0e6d10ab3845dac4d427e45580 GIT binary patch literal 3558 zcmZXXc{r47AIHa%b%Ys}%65O3f;W0KsUI)j0@Kxhr z1HY!-W)yH>!~A84gdF{Tzb5A=gF7>gkyp{!taZX86#9VxrRlG{4yUVn%r=fpszd{w zH0O9q2U>#T$^>^7togbjj|mZ7mSJFU2c~wrn&BrjB2~;C+j<xu&p`oGl*r;Yl!Pw2l{rlG^a`6sQ$+P>LO`$SO zDuU2f@zk#2k(RwodCr?4%Q#)1=EVZpw?CMPsKE{%$Ff+1c3% z{D##G2ny=8h9VG%OTl~etjs6Pf=)LDG$NbRLf(+a$YiqbVt2aDW-<}lwKW-8{M)i- zv9?z!DQwcx(rFnPExoeA!3@ELRO`>^wDSmtfmMKhl4=8yu3I#IhnG1V=^<( z_GD|9eo>N@;3j8ow#NwhW;XARkxOz)OL}aW!NC`aR=<3R*uC8uh z7r-eiE6c~hT2@x}VP}1Uh?1dyXKYbKC6txK>b#!(z^Aq2`<$~~?Jjv$d!(15OOSIA=P)jod+cLb0=O-Mn(p8#bb3&RYT*fv9Yncx3?h@$$HUy z8Y-S~{psln!3>>Sw?s(pH=iKI|G07E##<7}VtjL9LEpy4X0qB^UJ5eQ-``w?fBBLR zvbwrD;L#I@h>QLD^=m;*P1-~X)tNQy@Yn8badE$(pnMkg<1*tlb#>Pb4A}Vji)|{R z%?MZWoF@hbS`vkYh0h_fO9Qo~dkU#HXKE*>rey#86ThaUpm0v)nPFsPr2T}QH(7sw zcXPDM&BTOjbY^1WFNl$1D*XAXkgBWpnN{`BPPzKzWVoNd|JH1bXv@UJS-bc5+q91k zasnId6=O&w*`ng&+KZ=7rIMnF@SdKY?TxOkt}Y;vnmal;!uAV)K2d6n-JO2K>)_y!WF&dX=X2N# z^K0tMXa?)Xj8A80r|#|Bq8XW)<=!)m#^rDF^K*)dpe!sbmmbn(zW7~6iuVKWj~^c^ zyTc+bA<^I07e*xhaj-pln=cMo^JurE9k=YMfv<(0h&+#8_-|qJa&Uy@<(-R&h$zEu zVT3dSp$rB?SyhzEE)t+Cvj$XWghQcj=hl=N!5o6SaBI&0_2?-c!ZDsNG^~LV5zjwPLz~)5j zLp6OJbvd2DV3rHi^0<3vJiI(Am zVG-!H?cD_7VQA~KzvOtn>SeRXkhv3`GFSYBS<(akN! zp+0aHKtWY_gyn{%WmM2i@aX3dI2;ZTltdtCk<9TzmX;GA$6QU?A2PnX+?%Z7zj^bf zvWiOcTg$?vtSrsK?CDJI7c(Amfl<2QGoeSq&!0axGBdlWp{Sz5UtV6GM0J)qe_r?R zzc2rjlanu3WC#QIb$6RK{OHl>=;%mW@p*&1bLWqPU%$5KgXZ%9ILM$N^&Wyo%;8}O zKudQ3mX|O#X8n~`#f`_~2es2hcn8)#Zm*4c%rpi|@^Ki+2wVq{G?s)B)}M)Ln}OGr zXF;H$wI1yxm6j@{XJou6ER?gfwCwNCF{JkNJpGA7cuiC%8W+o{+#26aYZ>}FuIM6jRD)MmV`x7rMnhYT2ddjwztpu`}=>V({tnFxk`>Yo=be0 zoBJm)Gj=)kb_j8}&}wk1K8QLpl5*G6v$nCUOquxud8EiD=babk-fFu$T%fADdSGvR zjXF7*W$)my(xuddhNjEsy3@bh2Q($X@ytcCq1R_sup(*5a^M_c>}`h<5AKYxE5T)LyRRgant zm+9hD=6fFyqlPqh$FJi2?PQ%*RI@qvgUasWAUuGxQVH0?((vGUWg^v zpO#*5r$>C-ud}m7$vZSpK>Dkg^0Wpr86WQ;39~?<_&`alZf@p-;`!}Ff4{}s!a@lM z+Qx=-F&l|wVqy{y5;9d#P>{r%c&yW^z**7D8|>`tbpb1|sapRS7#vQe(J}+0I;1nd2(R!Q|9jkPt)?m3xoBi-Mq>oh3oCmt8boRaUCmzH{b`Yr_z{==jj5Vf1sj02@kZhVIDont*NeC6?r7cla<(!CCC zijR-a=fe@JH-$=dCZ3kh)6+TAO{0%-pA4hSH+Ob&6&DwGbakm(ql7kS`tlLI|8-US8feI$aHEWIMZsHJKn1i8Au?9~Zh(`2__zLPJBLJUpkJ z6)gvB!*yN{n-Ni;=_`W;g@r8qzNJ9XaNEOHlb0<0&<>Js_e`QFUCETqES!iK!qZXI0!{*y?=IzuD=U-}3qX#n{=^6?1g>%l+QHk9~c7U|>p0N(wtT zz+KYNXq}l6tqc(~_@r}=$8d?qdeGIX6J zAa}Fqvtmp_Vq&ezr%#{0?e1omC^NaIu9%$&&aIlKc68{VP<^>OpwPsWm6P_*m;re@ z6}K8`6jen{t}^xf4Glp0 z^1m~fuOapIiD0q-nt?rJEN#dCwp=$O>&1(RWNGucs8hH4JdZ>k+bH=y@b}ldbBEZI z9W0o@NRWzKD>~Hz{-rm71KOVD*e;q%_@sPU&Ph>a&1xt8G1ca@KWFtjRly&u|F?G; zntuIgK2cr7RS3$~3UME>H?e7jfwDP01he|xwV(lb05~ygIW%UCRJr}% heUEkd|CXE$y=pi6b6c2xA8gzp#`#6_% literal 0 HcmV?d00001 diff --git a/inherit_graph_62.map b/inherit_graph_62.map new file mode 100644 index 00000000..3d04a1a9 --- /dev/null +++ b/inherit_graph_62.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_62.md5 b/inherit_graph_62.md5 new file mode 100644 index 00000000..30d2e4bb --- /dev/null +++ b/inherit_graph_62.md5 @@ -0,0 +1 @@ +3f05696f770922918071ae94115fe53e \ No newline at end of file diff --git a/inherit_graph_62.png b/inherit_graph_62.png new file mode 100644 index 0000000000000000000000000000000000000000..e2d2e0d2b319417d5382159f11b3e90f008d535a GIT binary patch literal 3139 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 C + + diff --git a/inherit_graph_63.md5 b/inherit_graph_63.md5 new file mode 100644 index 00000000..8e2e2b95 --- /dev/null +++ b/inherit_graph_63.md5 @@ -0,0 +1 @@ +afa2744f0dca2c84fa39cf862a185dac \ No newline at end of file diff --git a/inherit_graph_63.png b/inherit_graph_63.png new file mode 100644 index 0000000000000000000000000000000000000000..d8aa0db213b713396e428237325a7f6c4d9c15b6 GIT binary patch literal 1425 zcmV;C1#bF@P)6cB3rRRF(T|L z3>q1V7kX1v2!ha6g#7_4gK8E;|85LgHF0!d5R%xKp0*>2TCQm%#Qb*Ud0%(7cUH5V zUe5>4#W~M&zR&OZefN8wGq$56Noc5n9(|@G(D(<<3>Bf7p&~RhRD>b^LVtfhE?l^f ziC9(?Jv}{&Yl_MUhr_sc@7^B?XeA;^Qque?Dr12}&T0HU9*+kumn&hLwr8ja%?uTx znV}+7VMbY58E)OWr5c?~p$aqp6uWlq!nJGHG95-z(qhK@_wV6!I$<`Ok(ZZ;y?giK z)vH(Oke2D|>%*Qsdtfq|ke!_kK@ia0-ThMgobX`2GH0nzMqRa4sp5B+>15bIX=3T(xQyD=I2@|NecseW{i4Z%Ru`dHM2X zdc9r(U^pC3ICf!SA=}#8QtFV4D`O#sv9U3^Z!8w0$zgrlbdKR&)l>q<+1qHZx@gf3&0H&svTHkbUI{ZWg!}kLKH=aqKK@lENtGqdC7D5UDEz& zYciSOcDrG*SkTwk2LQ;<&c?TI-{d|M6BCO27Lv2T$jAsbZrq5{(oz%^6(xLfx_$dL zVzC%%YHCvI#8XsM1ifC5si`TDTy*T;zaJKh1+iER!C)}qJoWlz_*U=}Wt0#}l4!Tv z`Rv&eW1R<_trj5I=qT#G5y7GB-Dur%#`jV@ahGzkxd(4%+Q@4i69W z>({S*{rWW>4hQGv=17uuyPZ{4RebmE9V3wluUxspM~@znBo7=oz{bW#e*gY`$+=3A zUr$>0jK_~3v!nM@P}fj4g4klTa7AgijXxOVMYZr{G0mo8mWn9aMPwu%+Jr~@#DuiJ3C8~^!a=&DJh}BU`X53R9ejVTZsRVWP)Yi z!2bq5e*B1FFsRtz)x?T0!{_s1+qP|RI2^FqY?%%xDM^3n`#)i`*)TIRlj$&0vLY(u zZ$UFdMQCQI2+a%?k#qz1cszeHjuk_He}B@pq-G@hZ;!_Ep(C~TGgN~1eukRR%uo@U f87e|ELq+@m_kLPuWsw|N00000NkvXXu0mjf`Fy?u literal 0 HcmV?d00001 diff --git a/inherit_graph_64.map b/inherit_graph_64.map new file mode 100644 index 00000000..569f2ea5 --- /dev/null +++ b/inherit_graph_64.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_64.md5 b/inherit_graph_64.md5 new file mode 100644 index 00000000..ee1ce742 --- /dev/null +++ b/inherit_graph_64.md5 @@ -0,0 +1 @@ +c2648869ab89a83c4c6e13eb11915b6a \ No newline at end of file diff --git a/inherit_graph_64.png b/inherit_graph_64.png new file mode 100644 index 0000000000000000000000000000000000000000..e6de654707d060a1cbb0af39c8701376c9b3f65d GIT binary patch literal 1271 zcmV^npq* zB@)T__&9|FzQyHop(yJ0dcSp+A4DdT4Gs=|?N}PF%SgVC|26N_u_1VTe2k5aeVb=8 znJ+Id6iND&3=~B_l3}%4qoxEps=tI!?3KZtku<3kd#OyCX=b4pdcY3VQOm1=kw|HdOn|@n3yP+%g@fv zKsUKuj-n`o!AMU}Z)_X z+3D));&Qnh4o9cc`Tc&-?ITG+%FSkTW@aY%h#Zsok~0*q%jD!_5P%Zt;o$)^c|0BnPEJk` z1W8RzMNt$*Q6`glb8~ZgdWs;(?Ch*mDrK|TD2nR!dK|~W)es*a9~f335QHl!DJcmA zEEX#+E-pSkKF|d6LP#Pjr*K9*(lEtJN5W84QNX%F00h>FH^o&nFNFznVK0q(&!yiI&A*rf2JaPa4002ovPDHLkV1ku$TQUFu literal 0 HcmV?d00001 diff --git a/inherit_graph_65.map b/inherit_graph_65.map new file mode 100644 index 00000000..5a9afe58 --- /dev/null +++ b/inherit_graph_65.map @@ -0,0 +1,4 @@ + + + + diff --git a/inherit_graph_65.md5 b/inherit_graph_65.md5 new file mode 100644 index 00000000..0d49fe73 --- /dev/null +++ b/inherit_graph_65.md5 @@ -0,0 +1 @@ +ec322e9d7679440100f96f7d5330ad5f \ No newline at end of file diff --git a/inherit_graph_65.png b/inherit_graph_65.png new file mode 100644 index 0000000000000000000000000000000000000000..6eea481be95aa7ad03c3be66ede8797293a9e357 GIT binary patch literal 2562 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 + + diff --git a/inherit_graph_7.md5 b/inherit_graph_7.md5 new file mode 100644 index 00000000..50be1ac7 --- /dev/null +++ b/inherit_graph_7.md5 @@ -0,0 +1 @@ +5a180c027b537c07d76206131cab1ad1 \ No newline at end of file diff --git a/inherit_graph_7.png b/inherit_graph_7.png new file mode 100644 index 0000000000000000000000000000000000000000..7ad871672435ddeda9701c02f5c00a6cbea3dcc3 GIT binary patch literal 1588 zcmV-42Fv-0P)-=v2RABL+QLS#5~>J-OA z&Ibelq5}ek=zstaojQ=qO*|U1Re$yup8=>exCX?0F)F>2+xVSi}RQlq@i|f~~ zi^bxdJ9n0qm3h5hCatlt@$lipJ9g~o?d`pF>sCfahCm=tC=_qrya{qG&i?t~!v}>z zAruO;v$LN+e~z73u3Xu-Z=dgYEyQ9mvoTN7Z>Gn`O%|CCnhG$X7lUUuZM<)*d^Y(cklA$%PyBI zJ3IUQ`Sab~-Jd^yzIyd)Pft&1>$bJEUAlCMqA0Cad*Z|ihr?Chjz+GH|uO!h(n zLL9VOEuYV~TCGDvL+tBFfKoRAd)w^m>*IL*l9iR!($a#*Po6wM2)W&EY@R-S`r^fl zOj=V@6CT@aHi1B3Hk;R-oTljm2M*l5d)IfIm6cUrU(clN-@jk4*9VyA*s)`rW*rU( zP17Qg$Y?a;9J}2P0AId*VXuXq^YimKXLWT|C=}x2*-gVE69bc);iL zw{PDr5C|A^Wo3m)OHED1gN%%fo}QlC+S=UQ+%sp+ynXvNv~~CH-OCFH?z5Q#+ibh%~AmakvG&dki#A4snzQ5-@kLx zMn*;eKq{3op1iy~i^XEGSO6e7IoWJB|N8X{hd3r1PRMV05{cx{p+glF6%L2PX0z4T z*KerQbqSLW^7HfKX3d5AgA-xw+Ztbc#eGl}dH;u%*<3Ol}SlSm6eq`oo?HK;9M6dN0h?*cd`8%}7g^7{Jv+-|o-B2lSSB_$;rDs^2D&3a$i zU@&O4TAIAU{HKF|cV@p}@P|J~A_PgqbTBhBgM85Gbdjp(FUQaONZ}zpJ)K;Dq6cza zAOH{@5HLgs1OTD~0>;ld(O@uyzYan;p(u*;NZyYQv|4Sr>LEl7jYh*Z5xIFI068BJ mFhmCg0HOl|hUkC*0Pqh6i76dO&n#U40000 + + diff --git a/inherit_graph_8.md5 b/inherit_graph_8.md5 new file mode 100644 index 00000000..a4cab890 --- /dev/null +++ b/inherit_graph_8.md5 @@ -0,0 +1 @@ +1a01d2fbb833cc6d373f78d74729a49a \ No newline at end of file diff --git a/inherit_graph_8.png b/inherit_graph_8.png new file mode 100644 index 0000000000000000000000000000000000000000..1f982fcbe1989c98d0ff855924dfef945b9cbd8e GIT binary patch literal 1879 zcmV-d2dMaoP)TS`00006VoOIv0RI60 z0RN!9r;`8x2MkF>K~#90?VEc@Q{fxO-!s=`H{oEzz z%;}H!^VfTx^Xxg_=k>eyyxW-whG75#Stx{93xKR_pn)J!0SyF+3TPlmR1p0SUcY`_ zUtb?9DUcPxnKNf{a&ml!|FZ(wY&L_zu;h{;D+YtXV6)l$BgDWYyY4=KA&$i8f$B7*=%-v zeEf+MCp;dHFRik&QX-L1sZ@qE60szozwf>O>u0S0f z9XD^@9334M3Wa%jd0)SNHJMEP{r#Pto$c-IzO)Aq9$dL{Wqf>m$BrFm&z@~*X>qw+ zH8nLFjb>rjZD?q?bm@}aZdWK2d-v{jI-OyX6$%BNP9GW?>gww9-+e2UO0(JA)6-+M zTGP|h<#M^#>jeNDI&^4aV&eV#_x=6-Hk+-es3@X-gO+V;Ys<>Ydid}mhG9mdan7`K zb#+;-)>p4y;qk`C#=N{dE|(j$oiAU$SS%K$QW^AY81ZVgy1Kf0baYgyR2CH#;XVj8 z2@&J(runZx_4W1m_{EDC2!c#aP2q<}jvOg3FZZQgzI+)UqbN$DP)sJ%d~6+0(8 z_|Km|0RVQpJ&fA$fW=yY5)%{g!P>QJ$z(ExLh&8?@98)k4nEkpaid0~Id|?{c6Ro$ zW5+&x_^`0+rlh3!kL`AQs7!~$L8VfeOy-;y4i66l0N89cf*=Tj#Kpz^`t{3VvDj=j zB9X}B@$j^?v@`&K@43%k`wdk#s5alU004@Miwy>Y%jMGR^+Y03CXGb8|;Whf1YdwQ5zUOYr%89*@`3(jpWJ=bTDTPL4=? z7`2hIM4!T*J$qJJSvfd3_~*|bkH_P7yBBuHZD?rd?d_eMoUE;_wcG7-xf}pcU0sd8 z=lsWMX=yn*Ii;ngPNx$^(Ta)+Jb}aE6ciMwRH}i2f$8b#w{PFd2y>o zbpdrwo;+DqRkdNmhDVPcb$56B?kqvkYPI9z(X zQYnkYDlIKlsZ?v$tikiCRBA>>Mpjl9o6T0M)e&h6RrdV(^N$}tCXq;iD+i8TE+-HO zxw*MM(}ZHro;|(2y`MjS77B$-CbO`xkWQ!LcfCl(hf*6c{u`osZlYHr-QC>@2??=Q z5uBNsnf2?}Yc!fz3;8=BU=#gs_du~ltJM;T#NE4hqbPde!iB?!564 + + diff --git a/inherit_graph_9.md5 b/inherit_graph_9.md5 new file mode 100644 index 00000000..c3e2396e --- /dev/null +++ b/inherit_graph_9.md5 @@ -0,0 +1 @@ +fc444da1659898ca99b33fc776d0a5d3 \ No newline at end of file diff --git a/inherit_graph_9.png b/inherit_graph_9.png new file mode 100644 index 0000000000000000000000000000000000000000..b7439e016c0ef26901ec4557fdea10dc555ce6fc GIT binary patch literal 2373 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 literal 0 HcmV?d00001 diff --git a/inherits.html b/inherits.html new file mode 100644 index 00000000..91e07949 --- /dev/null +++ b/inherits.html @@ -0,0 +1,470 @@ + + + + + + + +mrs_lib: Class Hierarchy + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Class Hierarchy
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + + + + + + + + + + + +
+ + + +
+ + + + +
+ + + +
+ + + +
+ + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + + +
+
+
+ + + + diff --git a/jlkf_8h_source.html b/jlkf_8h_source.html new file mode 100644 index 00000000..8384c485 --- /dev/null +++ b/jlkf_8h_source.html @@ -0,0 +1,389 @@ + + + + + + + +mrs_lib: include/mrs_lib/jlkf.h Source File + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
jlkf.h
+
+
+
1 // clang: MatousFormat
+
6 #ifndef JLKF_H
+
7 #define JLKF_H
+
8 
+ +
10 /* #include <mrs_lib/lkf.h> */
+
11 #include <iostream>
+
12 
+
13 #include <vector>
+
14 
+
15 // for debug
+
16 #include <ros/ros.h>
+
17 #include <mrs_msgs/Float64ArrayStamped.h>
+
18 #include <mrs_msgs/Float64Stamped.h>
+
19 #include <mrs_msgs/BoolStamped.h>
+
20 
+
21 namespace mrs_lib
+
22 {
+
23 
+
24  /* class JLKF */ /*//{*/
+
25  template <int n_states, int n_inputs, int n_measurements, int n_biases>
+
26  class JLKF : public KalmanFilterAloamGarm<n_states, n_inputs, n_measurements>
+
27  {
+
28  public:
+
29  /* LKF definitions (typedefs, constants etc) //{ */
+
30  static const int n = n_states;
+
31  static const int m = n_inputs;
+
32  static const int p = n_measurements;
+ +
34 
+
35  using x_t = typename Base_class::x_t;
+
36  using u_t = typename Base_class::u_t;
+
37  using z_t = typename Base_class::z_t;
+
38  using P_t = typename Base_class::P_t;
+
39  using R_t = typename Base_class::R_t;
+
40  using statecov_t = typename Base_class::statecov_t;
+
41  /* using A_t = typename Base_class::A_t; // measurement mapping p*n */
+
42  /* using B_t = typename Base_class::B_t; // process covariance n*n */
+
43  /* using H_t = typename Base_class::H_t; // measurement mapping p*n */
+
44  using Q_t = typename Base_class::Q_t; // process covariance n*n
+
45  /* using K_t = typename Base_class::K_t; // Kalman gain */
+
46 
+
47  typedef Eigen::Matrix<double, n, n> A_t;
+
48  typedef Eigen::Matrix<double, n, m> B_t;
+
49  typedef Eigen::Matrix<double, p, n> H_t;
+
50  typedef Eigen::Matrix<double, n, p> K_t;
+
52  typedef Eigen::Matrix<double, p, p> C_t;
+
53  typedef Eigen::Matrix<double, n, n> D_t;
+
55  using generateA_t = std::function<A_t(double)>;
+
56  using generateB_t = std::function<B_t(double)>;
+
57  //}
+
58 
+
65  struct inverse_exception : public std::exception
+
66  {
+
72  const char* what() const throw()
+
73  {
+
74  return "LKF: could not compute matrix inversion!!! Fix your covariances (the measurement's is probably too low...)";
+
75  }
+
76  };
+
77  //}
+
78 
+
79  public:
+
87  JLKF(const generateA_t& generateA, const generateB_t& generateB, const H_t& H, const ros::NodeHandle& nh, const double& nis_thr,
+
88  const double& nis_avg_thr)
+
89  : m_generateA(generateA),
+
90  m_generateB(generateB),
+
91  H(H),
+
92  m_nh(nh),
+
93  m_nis_thr(nis_thr),
+
94  m_nis_avg_thr(nis_avg_thr)
+
95  {
+
96  debug_nis_pub = m_nh.advertise<mrs_msgs::Float64ArrayStamped>("debug_nis", 1);
+
97  };
+
98 
+
99  /* predict() method //{ */
+
117  virtual statecov_t predict(const statecov_t& sc, const u_t& u, const Q_t& Q, double dt) const override
+
118  {
+
119  /* std::cout << "prediction, sc.x: " << sc.x << std::endl; */
+
120  statecov_t ret;
+
121  A_t A = m_generateA(dt);
+
122  B_t B = m_generateB(dt);
+
123  ret.x = state_predict(A, sc.x, B, u);
+
124  ret.P = covariance_predict(A, sc.P, Q, dt);
+
125  ret.nis_buffer = sc.nis_buffer;
+
126  return ret;
+
127  };
+
128  //}
+
129 
+
130  /* correct() method //{ */
+
143  virtual statecov_t correct(const statecov_t& sc, const z_t& z, const R_t& R) const override
+
144  {
+
145  /* return correct_optimized(sc, z, R, H); */
+
146  return correction_impl(sc, z, R, H);
+
147  };
+
148  //}
+
149 
+
150  protected:
+
151  /* invert_W() method //{ */
+
152  static R_t invert_W(R_t W)
+
153  {
+
154  Eigen::ColPivHouseholderQR<R_t> qr(W);
+
155  if (!qr.isInvertible())
+
156  {
+
157  // add some stuff to the tmp matrix diagonal to make it invertible
+
158  R_t ident = R_t::Identity(W.rows(), W.cols());
+
159  W += 1e-9 * ident;
+
160  qr.compute(W);
+
161  if (!qr.isInvertible())
+
162  {
+
163  // never managed to make this happen except for explicitly putting NaNs in the input
+
164  throw inverse_exception();
+
165  }
+
166  }
+
167  const R_t W_inv = qr.inverse();
+
168  return W_inv;
+
169  }
+
170  //}
+
171 
+
172 
+
173  /* computeKalmanGain() method //{ */
+
174  virtual K_t computeKalmanGain(const statecov_t& sc, [[maybe_unused]] const z_t& z, const R_t& R, const H_t& H, double& nis, H_t& H_out,
+
175  const double& nis_thr, const double& nis_avg_thr) const
+
176  {
+
177  H_out = H;
+
178 
+
179  R_t W = H * sc.P * H.transpose() + R;
+
180  R_t W_inv = invert_W(W);
+
181  K_t K = sc.P * H.transpose() * W_inv;
+
182  z_t y = z - (H * sc.x);
+
183 
+
184  /* const double nis = (y.transpose() * W_inv * y)(0, 0); */
+
185  nis = (y.transpose() * W_inv * y)(0, 0);
+
186  double nis_avg = 0;
+
187  int count = 0;
+
188  bool nis_over_thr = false;
+
189 
+
190  double nis_thr_tmp = nis_thr;
+
191 
+
192  if (H(0, 0) > 0 && H(0, 3) != 0)
+
193  /* if (H(0, 0) > 0) */
+
194  {
+
195  mrs_msgs::Float64ArrayStamped msg;
+
196  msg.header.stamp = sc.stamp;
+
197 
+
198  msg.values.push_back(nis);
+
199 
+
200  if (sc.nis_buffer != nullptr)
+
201  {
+
202 
+
203  sc.nis_buffer->push_back(nis);
+
204  for (auto it = sc.nis_buffer->begin(); it != sc.nis_buffer->end(); it++)
+
205  {
+
206  nis_avg += *it;
+
207  count++;
+
208  if (*it > nis_thr_tmp)
+
209  {
+
210  nis_thr_tmp /= 10;
+
211  }
+
212  }
+
213  if (count > 0)
+
214  {
+
215  nis_avg /= count;
+
216  }
+
217  msg.values.push_back(nis_avg);
+
218  msg.values.push_back(nis_thr_tmp);
+
219  }
+
220  if (nis > nis_thr_tmp)
+
221  {
+
222  // old jump correction
+
223  K = K.Zero();
+
224  A_t mask = mask.Zero();
+
225  for (int i = n_states - n_biases; i < n_states; i++)
+
226  {
+
227  mask(i, i) = 1;
+
228  }
+
229  const H_t H_bias_only = H * mask;
+
230  K = H_bias_only.transpose() * invert_W(H_bias_only * H_bias_only.transpose());
+
231  H_out = H_bias_only;
+
232  }
+
233 
+
234  debug_nis_pub.publish(msg);
+
235  }
+
236 
+
237  K_t test = H.transpose() * invert_W(H * H.transpose());
+
238 
+
239  return K;
+
240  }
+
241  //}
+
242 
+
243  /* correction_impl() method //{ */
+
244  template <int check = n>
+
245  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
+
246  {
+
247  // the correction phase
+
248  statecov_t ret;
+
249  double nis = -1;
+
250  H_t H_out;
+
251  const K_t K = computeKalmanGain(sc, z, R, H, nis, H_out, m_nis_thr, m_nis_avg_thr);
+
252  ret.x = sc.x + K * (z - (H * sc.x));
+
253  ret.P = (P_t::Identity() - (K * H_out)) * sc.P;
+
254  ret.nis_buffer = sc.nis_buffer;
+
255  return ret;
+
256  }
+
257 
+
258  template <int check = n>
+
259  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
+
260  {
+
261  // the correction phase
+
262  statecov_t ret;
+
263  double nis = -1;
+
264  H_t H_out;
+
265  const K_t K = computeKalmanGain(sc, z, R, H, nis, H_out, m_nis_thr, m_nis_avg_thr);
+
266  ret.x = sc.x + K * (z - (H * sc.x));
+
267  ret.P = (P_t::Identity(sc.P.rows(), sc.P.cols()) - (K * H_out)) * sc.P;
+
268  ret.nis_buffer = sc.nis_buffer;
+
269  return ret;
+
270  }
+
271  //}
+
272 
+
273  private:
+
274  ros::NodeHandle m_nh;
+
275  ros::Publisher debug_nis_pub;
+
276  std::vector<double> m_nis_window;
+
277  double m_nis_thr;
+
278  double m_nis_avg_thr;
+
279 
+
280 
+
281  private:
+
282  generateA_t m_generateA;
+
283  generateB_t m_generateB;
+
284 
+
285  public:
+
286  A_t A;
+
287  B_t B;
+
288  H_t H;
+
290  protected:
+
291  /* covariance_predict() method //{ */
+
292  static P_t covariance_predict(const A_t& A, const P_t& P, const Q_t& Q, const double dt)
+
293  {
+
294  return A * P * A.transpose() + dt*Q;
+
295  }
+
296  //}
+
297 
+
298  /* state_predict() method //{ */
+
299  template <int check = n_inputs>
+
300  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,
+
301  [[maybe_unused]] const u_t& u)
+
302  {
+
303  return A * x;
+
304  }
+
305 
+
306  template <int check = n_inputs>
+
307  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)
+
308  {
+
309  return A * x + B * u;
+
310  }
+
311  //}
+
312 
+
313  }; // namespace mrs_lib
+
314  /*//}*/
+
315 
+
316 
+
317 } // namespace mrs_lib
+
318 
+
319 #endif // JLKF_H
+
+
+
This exception is thrown when taking the inverse of a matrix fails.
Definition: jlkf.h:65
+
Eigen::Matrix< double, n, p > K_t
Kalman gain matrix type .
Definition: jlkf.h:50
+
Eigen::Matrix< double, p, p > R_t
Measurement noise covariance matrix type .
Definition: kalman_filter_aloamgarm.h:40
+
Eigen::Matrix< double, n, n > A_t
System transition matrix type .
Definition: jlkf.h:47
+
Eigen::Matrix< double, n, n > Q_t
Process noise covariance matrix type .
Definition: kalman_filter_aloamgarm.h:41
+
virtual statecov_t predict(const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const override
Applies the prediction (time) step of the Kalman filter.
Definition: jlkf.h:117
+
Helper struct for passing around the state and its covariance in one variable.
Definition: kalman_filter_aloamgarm.h:48
+
This abstract class defines common interfaces and types for a generic Kalman filter.
Definition: kalman_filter_aloamgarm.h:27
+
Eigen::Matrix< double, m, 1 > u_t
Input vector type .
Definition: kalman_filter_aloamgarm.h:36
+
Eigen::Matrix< double, n, m > B_t
Input to state mapping matrix type .
Definition: jlkf.h:48
+
Definition: jlkf.h:26
+
JLKF(const generateA_t &generateA, const generateB_t &generateB, const H_t &H, const ros::NodeHandle &nh, const double &nis_thr, const double &nis_avg_thr)
The main constructor.
Definition: jlkf.h:87
+
Eigen::Matrix< double, p, n > H_t
State to measurement mapping matrix type .
Definition: jlkf.h:49
+
const char * what() const
Returns the error message, describing what caused the exception.
Definition: jlkf.h:72
+
virtual statecov_t correct(const statecov_t &sc, const z_t &z, const R_t &R) const override
Applies the correction (update, measurement, data) step of the Kalman filter.
Definition: jlkf.h:143
+
All mrs_lib functions, classes, variables and definitions are contained in this namespace.
Definition: attitude_converter.h:29
+
Eigen::Matrix< double, n, n > D_t
D .
Definition: jlkf.h:53
+
Defines KalmanFilter - an abstract class, defining common interfaces and types for a generic Kalman f...
+
Eigen::Matrix< double, p, 1 > z_t
Measurement vector type .
Definition: kalman_filter_aloamgarm.h:37
+
Eigen::Matrix< double, p, p > C_t
correntropy gain
Definition: jlkf.h:52
+
Eigen::Matrix< double, n, n > P_t
State uncertainty covariance matrix type .
Definition: kalman_filter_aloamgarm.h:39
+
Eigen::Matrix< double, n, 1 > x_t
State vector type .
Definition: kalman_filter_aloamgarm.h:35
+ + + + diff --git a/jquery.js b/jquery.js new file mode 100644 index 00000000..103c32d7 --- /dev/null +++ b/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
"),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
"),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element +},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/kalman__filter_8h.html b/kalman__filter_8h.html new file mode 100644 index 00000000..6ce960d4 --- /dev/null +++ b/kalman__filter_8h.html @@ -0,0 +1,162 @@ + + + + + + + +mrs_lib: include/mrs_lib/kalman_filter.h File Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
kalman_filter.h File Reference
+
+
+ +

Defines KalmanFilter - an abstract class, defining common interfaces and types for a generic Kalman filter. +More...

+
#include <Eigen/Dense>
+#include <ros/ros.h>
+
+ + Include dependency graph for kalman_filter.h:
+
+
+ +
+ + This graph shows which files directly or indirectly include this file:
+
+
+ +
+

Go to the source code of this file.

+ + + + + + + + +

+Classes

class  mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >
 This abstract class defines common interfaces and types for a generic Kalman filter. More...
 
struct  mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >::statecov_t
 Helper struct for passing around the state and its covariance in one variable. More...
 
+ + + + +

+Namespaces

 mrs_lib
 All mrs_lib functions, classes, variables and definitions are contained in this namespace.
 
+

Detailed Description

+

Defines KalmanFilter - an abstract class, defining common interfaces and types for a generic Kalman filter.

+
Author
Matouš Vrba - vrbam.nosp@m.ato@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz
+
+
+ + + + diff --git a/kalman__filter_8h__dep__incl.map b/kalman__filter_8h__dep__incl.map new file mode 100644 index 00000000..7bd5bf95 --- /dev/null +++ b/kalman__filter_8h__dep__incl.map @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/kalman__filter_8h__dep__incl.md5 b/kalman__filter_8h__dep__incl.md5 new file mode 100644 index 00000000..a75e3f96 --- /dev/null +++ b/kalman__filter_8h__dep__incl.md5 @@ -0,0 +1 @@ +4d689e60458d113b9ccdf3a42d542ccd \ No newline at end of file diff --git a/kalman__filter_8h__dep__incl.png b/kalman__filter_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..57e77b3cb4969dece2a7ccf30de7c28e1289439d GIT binary patch literal 27411 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 BDyRSe literal 0 HcmV?d00001 diff --git a/kalman__filter_8h__incl.map b/kalman__filter_8h__incl.map new file mode 100644 index 00000000..11dcbb41 --- /dev/null +++ b/kalman__filter_8h__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/kalman__filter_8h__incl.md5 b/kalman__filter_8h__incl.md5 new file mode 100644 index 00000000..b65910a3 --- /dev/null +++ b/kalman__filter_8h__incl.md5 @@ -0,0 +1 @@ +d75ccff5dab323bae41df3bdf91521c3 \ No newline at end of file diff --git a/kalman__filter_8h__incl.png b/kalman__filter_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..ede4a26cc37faec49da109ddd6418a012949d835 GIT binary patch literal 6396 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 c{;?g + + + + + + +mrs_lib: include/mrs_lib/kalman_filter.h Source File + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
kalman_filter.h
+
+
+Go to the documentation of this file.
1 // clang: MatousFormat
+
7 #ifndef SYSTEMMODEL_H
+
8 #define SYSTEMMODEL_H
+
9 
+
10 #include <Eigen/Dense>
+
11 
+
12 #include <ros/ros.h>
+
13 
+
14 namespace mrs_lib
+
15 {
+
16  /* KalmanFilter virtual class //{ */
+
25  template <int n_states, int n_inputs, int n_measurements>
+ +
27  {
+
28  public:
+
29  /* states, inputs etc. definitions (typedefs, constants etc) //{ */
+
30  static const int n = n_states;
+
31  static const int m = n_inputs;
+
32  static const int p = n_measurements;
+
34  typedef Eigen::Matrix<double, n, 1> x_t;
+
35  typedef Eigen::Matrix<double, m, 1> u_t;
+
36  typedef Eigen::Matrix<double, p, 1> z_t;
+
38  typedef Eigen::Matrix<double, n, n> P_t;
+
39  typedef Eigen::Matrix<double, p, p> R_t;
+
40  typedef Eigen::Matrix<double, n, n> Q_t;
+
41  //}
+
42 
+
43  /* statecov_t struct //{ */
+
47  struct statecov_t
+
48  {
+
49  x_t x;
+
50  P_t P;
+
51  ros::Time stamp = ros::Time(0);
+
52  };
+
53  //}
+
54 
+
55  public:
+
68  virtual statecov_t correct(const statecov_t& sc, const z_t& z, const R_t& R) const = 0;
+
69 
+
84  virtual statecov_t predict(const statecov_t& sc, const u_t& u, const Q_t& Q, double dt) const = 0;
+
85  };
+
86  //}
+
87 }
+
88 
+
89 #endif // SYSTEMMODEL_H
+
+
+
virtual statecov_t predict(const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const =0
Applies the prediction (time) step of the Kalman filter.
+
Eigen::Matrix< double, p, p > R_t
Measurement noise covariance matrix type .
Definition: kalman_filter.h:39
+
static const int m
Length of the input vector of the system.
Definition: kalman_filter.h:31
+
Eigen::Matrix< double, n, n > P_t
State uncertainty covariance matrix type .
Definition: kalman_filter.h:38
+
virtual statecov_t correct(const statecov_t &sc, const z_t &z, const R_t &R) const =0
Applies the correction (update, measurement, data) step of the Kalman filter.
+
Eigen::Matrix< double, m, 1 > u_t
Input vector type .
Definition: kalman_filter.h:35
+
static const int p
Length of the measurement vector of the system.
Definition: kalman_filter.h:32
+
P_t P
State covariance matrix.
Definition: kalman_filter.h:50
+
Eigen::Matrix< double, n, 1 > x_t
State vector type .
Definition: kalman_filter.h:34
+
x_t x
State vector.
Definition: kalman_filter.h:49
+
All mrs_lib functions, classes, variables and definitions are contained in this namespace.
Definition: attitude_converter.h:29
+
ros::Time stamp
ROS time stamp.
Definition: kalman_filter.h:51
+
Eigen::Matrix< double, n, n > Q_t
Process noise covariance matrix type .
Definition: kalman_filter.h:40
+
Eigen::Matrix< double, p, 1 > z_t
Measurement vector type .
Definition: kalman_filter.h:36
+
Helper struct for passing around the state and its covariance in one variable.
Definition: kalman_filter.h:47
+
static const int n
Length of the state vector of the system.
Definition: kalman_filter.h:30
+
This abstract class defines common interfaces and types for a generic Kalman filter.
Definition: kalman_filter.h:26
+ + + + diff --git a/kalman__filter__aloamgarm_8h.html b/kalman__filter__aloamgarm_8h.html new file mode 100644 index 00000000..90f64b45 --- /dev/null +++ b/kalman__filter__aloamgarm_8h.html @@ -0,0 +1,156 @@ + + + + + + + +mrs_lib: include/mrs_lib/kalman_filter_aloamgarm.h File Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
kalman_filter_aloamgarm.h File Reference
+
+
+ +

Defines KalmanFilter - an abstract class, defining common interfaces and types for a generic Kalman filter. +More...

+
#include <Eigen/Dense>
+#include <boost/circular_buffer.hpp>
+#include <ros/ros.h>
+
+ + Include dependency graph for kalman_filter_aloamgarm.h:
+
+
+ +
+ + This graph shows which files directly or indirectly include this file:
+
+
+ +
+

Go to the source code of this file.

+ + + + + + + + +

+Classes

class  mrs_lib::KalmanFilterAloamGarm< n_states, n_inputs, n_measurements >
 This abstract class defines common interfaces and types for a generic Kalman filter. More...
 
struct  mrs_lib::KalmanFilterAloamGarm< n_states, n_inputs, n_measurements >::statecov_t
 Helper struct for passing around the state and its covariance in one variable. More...
 
+ + + + +

+Namespaces

 mrs_lib
 All mrs_lib functions, classes, variables and definitions are contained in this namespace.
 
+

Detailed Description

+

Defines KalmanFilter - an abstract class, defining common interfaces and types for a generic Kalman filter.

+
Author
Matouš Vrba - vrbam.nosp@m.ato@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz
+
+
+ + + + diff --git a/kalman__filter__aloamgarm_8h__dep__incl.map b/kalman__filter__aloamgarm_8h__dep__incl.map new file mode 100644 index 00000000..7f1e9f3f --- /dev/null +++ b/kalman__filter__aloamgarm_8h__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/kalman__filter__aloamgarm_8h__dep__incl.md5 b/kalman__filter__aloamgarm_8h__dep__incl.md5 new file mode 100644 index 00000000..82c7b716 --- /dev/null +++ b/kalman__filter__aloamgarm_8h__dep__incl.md5 @@ -0,0 +1 @@ +668c143539eddd322f09ce7856956983 \ No newline at end of file diff --git a/kalman__filter__aloamgarm_8h__dep__incl.png b/kalman__filter__aloamgarm_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..feb7557567e441d719df541e2f9f562589348999 GIT binary patch literal 5399 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 literal 0 HcmV?d00001 diff --git a/kalman__filter__aloamgarm_8h__incl.map b/kalman__filter__aloamgarm_8h__incl.map new file mode 100644 index 00000000..3ebdb3ac --- /dev/null +++ b/kalman__filter__aloamgarm_8h__incl.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/kalman__filter__aloamgarm_8h__incl.md5 b/kalman__filter__aloamgarm_8h__incl.md5 new file mode 100644 index 00000000..f2f3ef2d --- /dev/null +++ b/kalman__filter__aloamgarm_8h__incl.md5 @@ -0,0 +1 @@ +d07c1eb7348e39860c44c3743b64db8e \ No newline at end of file diff --git a/kalman__filter__aloamgarm_8h__incl.png b/kalman__filter__aloamgarm_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..cae170ee7fac96b39c4bf438faadd257ba2877cc GIT binary patch literal 9666 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 H(~$oKZI*hA literal 0 HcmV?d00001 diff --git a/kalman__filter__aloamgarm_8h_source.html b/kalman__filter__aloamgarm_8h_source.html new file mode 100644 index 00000000..9a3932b9 --- /dev/null +++ b/kalman__filter__aloamgarm_8h_source.html @@ -0,0 +1,182 @@ + + + + + + + +mrs_lib: include/mrs_lib/kalman_filter_aloamgarm.h Source File + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
kalman_filter_aloamgarm.h
+
+
+Go to the documentation of this file.
1 // clang: MatousFormat
+
7 #ifndef SYSTEMMODELALOAMGARM_H
+
8 #define SYSTEMMODELALOAMGARM_H
+
9 
+
10 #include <Eigen/Dense>
+
11 
+
12 #include <boost/circular_buffer.hpp>
+
13 #include <ros/ros.h>
+
14 
+
15 namespace mrs_lib
+
16 {
+
17  /* KalmanFilter virtual class //{ */
+
26  template <int n_states, int n_inputs, int n_measurements>
+ +
28  {
+
29  public:
+
30  /* states, inputs etc. definitions (typedefs, constants etc) //{ */
+
31  static const int n = n_states;
+
32  static const int m = n_inputs;
+
33  static const int p = n_measurements;
+
35  typedef Eigen::Matrix<double, n, 1> x_t;
+
36  typedef Eigen::Matrix<double, m, 1> u_t;
+
37  typedef Eigen::Matrix<double, p, 1> z_t;
+
39  typedef Eigen::Matrix<double, n, n> P_t;
+
40  typedef Eigen::Matrix<double, p, p> R_t;
+
41  typedef Eigen::Matrix<double, n, n> Q_t;
+
42  //}
+
43 
+
44  /* statecov_t struct //{ */
+
48  struct statecov_t
+
49  {
+
50  x_t x;
+
51  P_t P;
+
52  std::shared_ptr<boost::circular_buffer<double>> nis_buffer = nullptr;
+
53  ros::Time stamp = ros::Time(0);
+
54  bool measurement_jumped = false;
+
55 
+
56  statecov_t& operator=(statecov_t other)
+
57  {
+
58  if (this != &other) // not a self-assignment
+
59  {
+
60  x = other.x;
+
61  P = other.P;
+
62  stamp = other.stamp;
+
63  if (other.nis_buffer != nullptr){
+
64  nis_buffer = std::make_shared<boost::circular_buffer<double>>(*other.nis_buffer);
+
65  }
+
66  measurement_jumped = other.measurement_jumped;
+
67  }
+
68  return *this;
+
69  }
+
70 
+
71  };
+
72  //}
+
73 
+
74  public:
+
87  virtual statecov_t correct(const statecov_t& sc, const z_t& z, const R_t& R) const = 0;
+
88 
+
103  virtual statecov_t predict(const statecov_t& sc, const u_t& u, const Q_t& Q, double dt) const = 0;
+
104  };
+
105  //}
+
106 }
+
107 
+
108 #endif // SYSTEMMODELALOAMGARM_H
+
+
+
static const int n
Length of the state vector of the system.
Definition: kalman_filter_aloamgarm.h:31
+
static const int p
Length of the measurement vector of the system.
Definition: kalman_filter_aloamgarm.h:33
+
x_t x
State vector.
Definition: kalman_filter_aloamgarm.h:50
+
virtual statecov_t predict(const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const =0
Applies the prediction (time) step of the Kalman filter.
+
Eigen::Matrix< double, p, p > R_t
Measurement noise covariance matrix type .
Definition: kalman_filter_aloamgarm.h:40
+
Eigen::Matrix< double, n, n > Q_t
Process noise covariance matrix type .
Definition: kalman_filter_aloamgarm.h:41
+
Helper struct for passing around the state and its covariance in one variable.
Definition: kalman_filter_aloamgarm.h:48
+
This abstract class defines common interfaces and types for a generic Kalman filter.
Definition: kalman_filter_aloamgarm.h:27
+
Eigen::Matrix< double, m, 1 > u_t
Input vector type .
Definition: kalman_filter_aloamgarm.h:36
+
virtual statecov_t correct(const statecov_t &sc, const z_t &z, const R_t &R) const =0
Applies the correction (update, measurement, data) step of the Kalman filter.
+
All mrs_lib functions, classes, variables and definitions are contained in this namespace.
Definition: attitude_converter.h:29
+
Eigen::Matrix< double, p, 1 > z_t
Measurement vector type .
Definition: kalman_filter_aloamgarm.h:37
+
P_t P
State covariance matrix.
Definition: kalman_filter_aloamgarm.h:51
+
Eigen::Matrix< double, n, n > P_t
State uncertainty covariance matrix type .
Definition: kalman_filter_aloamgarm.h:39
+
static const int m
Length of the input vector of the system.
Definition: kalman_filter_aloamgarm.h:32
+
Eigen::Matrix< double, n, 1 > x_t
State vector type .
Definition: kalman_filter_aloamgarm.h:35
+ + + + diff --git a/line__operations_8h_source.html b/line__operations_8h_source.html new file mode 100644 index 00000000..bce54ce4 --- /dev/null +++ b/line__operations_8h_source.html @@ -0,0 +1,126 @@ + + + + + + + +mrs_lib: include/mrs_lib/safety_zone/line_operations.h Source File + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
line_operations.h
+
+
+
1 // clang: TomasFormat
+
2 #ifndef MRS_LIB_LINE_OPERATIONS_H
+
3 #define MRS_LIB_LINE_OPERATIONS_H
+
4 
+
5 #include <eigen3/Eigen/Eigen>
+
6 
+
7 namespace mrs_lib
+
8 {
+ +
10 {
+
11  Eigen::RowVector2d point;
+
12  bool parallel;
+
13  bool intersect;
+
14 
+
15  explicit Intersection(bool intersect, bool parallel = false, Eigen::RowVector2d point = Eigen::RowVector2d{});
+
16 };
+
17 
+
18 Intersection sectionIntersect(Eigen::RowVector2d start1, Eigen::RowVector2d end1, Eigen::RowVector2d start2, Eigen::RowVector2d end2);
+
19 
+
20 } // namespace mrs_lib
+
21 
+
22 #endif
+
+
+
All mrs_lib functions, classes, variables and definitions are contained in this namespace.
Definition: attitude_converter.h:29
+
Definition: line_operations.h:9
+ + + + diff --git a/lkf_2example_8cpp-example.html b/lkf_2example_8cpp-example.html new file mode 100644 index 00000000..322286bf --- /dev/null +++ b/lkf_2example_8cpp-example.html @@ -0,0 +1,281 @@ + + + + + + + +mrs_lib: lkf/example.cpp + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
lkf/example.cpp
+
+
+

This example may be run after building mrs_lib by executing rosrun mrs_lib lkf_example.

+
// clang: MatousFormat
+
// Include the LKF header
+
#include <mrs_lib/lkf.h>
+
#include <random>
+
#include <ros/ros.h>
+
+
// Define the LKF we will be using
+
namespace mrs_lib
+
{
+
const int n_states = 4;
+
const int n_inputs = 2;
+
const int n_measurements = 2;
+
+
using lkf_t = LKF<n_states, n_inputs, n_measurements>;
+
}
+
+
// Some helpful aliases to make writing of types shorter
+
using namespace mrs_lib;
+
using A_t = lkf_t::A_t;
+
using B_t = lkf_t::B_t;
+
using H_t = lkf_t::H_t;
+
using Q_t = lkf_t::Q_t;
+
using x_t = lkf_t::x_t;
+
using P_t = lkf_t::P_t;
+
using u_t = lkf_t::u_t;
+
using z_t = lkf_t::z_t;
+
using R_t = lkf_t::R_t;
+
using statecov_t = lkf_t::statecov_t;
+
+
// Some helper enums to make the code more readable
+
enum x_pos
+
{
+
x_x = 0,
+
x_y = 1,
+
x_dx = 2,
+
x_dy = 3,
+
};
+
enum u_pos
+
{
+
u_dx = 0,
+
u_dy = 0,
+
};
+
enum z_pos
+
{
+
z_x = 0,
+
z_y = 1,
+
};
+
+
A_t A;
+
B_t B;
+
H_t H;
+
+
// This function implements the state transition
+
const double speed = 0.3;
+
x_t tra_model_f(const x_t& x, const u_t& u, [[maybe_unused]] const double dt)
+
{
+
return A*x + B*u;
+
}
+
+
// This function implements the observation generation from a state
+
z_t obs_model_f(const x_t& x)
+
{
+
return H*x;
+
}
+
+
// Helper function to generate a random Eigen matrix with normal distribution
+
template <int rows>
+
Eigen::Matrix<double, rows, 1> normal_randmat(const Eigen::Matrix<double, rows, rows>& cov)
+
{
+
static std::random_device rd{};
+
static std::mt19937 gen{rd()};
+
static std::normal_distribution<> d{0,1};
+
Eigen::Matrix<double, rows, 1> ret;
+
for (int row = 0; row < rows; row++)
+
ret(row, 0) = d(gen);
+
return cov*ret;
+
}
+
+
int main()
+
{
+
// dt will be constant in this example
+
const double dt = 1.0;
+
+
// Initialize the state transition matrix
+
A <<
+
1, 0, dt, 0,
+
0, 1, 0, dt,
+
0, 0, 1, 0,
+
0, 0, 0, 1;
+
+
// Initialize the input to state mapping matrix
+
B <<
+
0, 0,
+
0, 0,
+
1, 0,
+
0, 1;
+
+
// Initialize the state to measurement mapping matrix
+
H <<
+
1, 0, 0, 0,
+
0, 1, 0, 0;
+
+
// Initialize the process noise matrix
+
Q_t Q; Q <<
+
1e-3, 0, 0, 0,
+
0, 1e-3, 0, 0,
+
0, 0, 1e-2, 0,
+
0, 0, 0, 1e-2;
+
+
// Initialize the measurement noise matrix
+
R_t R; R <<
+
1e-2, 0,
+
0, 1e-2;
+
+
// Generate initial state and covariance
+
const x_t x0 = 100.0*x_t::Random();
+
P_t P_tmp = P_t::Random();
+
const P_t P0 = 10.0*P_tmp*P_tmp.transpose();
+
const statecov_t sc0({x0, P0});
+
+
// Instantiate the LKF itself
+
lkf_t lkf(A, B, H);
+
+
const int n_its = 1e4;
+
// Prepare the ground-truth state and the estimated state and covariance
+
x_t x_gt = sc0.x;
+
statecov_t sc_est = sc0;
+
+
for (int it = 0; it < n_its; it++)
+
{
+
std::cout << "step: " << it << std::endl;
+
+
// Generate a new input vector
+
const u_t u = u_t::Random();
+
+
// Generate a new state according to the model and noise parameters
+
x_gt = tra_model_f(x_gt, u, dt) + normal_randmat(Q);
+
+
// Generate a new observation according to the model and noise parameters
+
const z_t z = obs_model_f(x_gt) + normal_randmat(R);
+
+
// There should be a try-catch here to prevent program crashes
+
// in case of numerical instabilities (which are possible with UKF)
+
try
+
{
+
// Apply the prediction step
+
sc_est = lkf.predict(sc_est, u, Q, dt);
+
+
// Apply the correction step
+
sc_est = lkf.correct(sc_est, z, R);
+
}
+
catch (const std::exception& e)
+
{
+
// In case of error, alert the user
+
ROS_ERROR("LKF failed: %s", e.what());
+
}
+
+
const auto error = (x_gt-sc_est.x).norm();
+
std::cout << "Current LKF estimation error is: " << error << std::endl;
+
std::cout << "Current ground-truth state is: " << x_gt.transpose() << std::endl;
+
std::cout << "Current LKF estimated state is: " << sc_est.x.transpose() << std::endl;
+
std::cout << "Current LKF state covariance is:" << std::endl << sc_est.P << std::endl;
+
}
+
+
return 0;
+
}
+
+
+
+
typename Base_class::Q_t Q_t
Process noise covariance matrix type .
Definition: lkf.h:52
+
Eigen::Matrix< double, p, n > H_t
State to measurement mapping matrix type .
Definition: lkf.h:57
+
typename Base_class::P_t P_t
State uncertainty covariance matrix type .
Definition: lkf.h:50
+
typename Base_class::statecov_t statecov_t
Helper struct for passing around the state and its covariance in one variable.
Definition: lkf.h:53
+
typename Base_class::R_t R_t
Measurement noise covariance matrix type .
Definition: lkf.h:51
+
Eigen::Matrix< double, n, m > B_t
Input to state mapping matrix type .
Definition: lkf.h:56
+
typename Base_class::x_t x_t
State vector type .
Definition: lkf.h:47
+
All mrs_lib functions, classes, variables and definitions are contained in this namespace.
Definition: attitude_converter.h:29
+
Eigen::Matrix< double, n, n > A_t
System transition matrix type .
Definition: lkf.h:55
+
Implementation of the Linear Kalman filter .
Definition: lkf.h:38
+
typename Base_class::z_t z_t
Measurement vector type .
Definition: lkf.h:49
+
typename Base_class::u_t u_t
Input vector type .
Definition: lkf.h:48
+ + + + diff --git a/lkf_2example_8cpp.html b/lkf_2example_8cpp.html new file mode 100644 index 00000000..d5cb5643 --- /dev/null +++ b/lkf_2example_8cpp.html @@ -0,0 +1,255 @@ + + + + + + + +mrs_lib: src/lkf/example.cpp File Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
example.cpp File Reference
+
+
+ +

Example file for the LKF implementation. +More...

+
#include <mrs_lib/lkf.h>
+#include <random>
+#include <ros/ros.h>
+
+ + Include dependency graph for example.cpp:
+
+
+ +
+ + + + +

+Namespaces

 mrs_lib
 All mrs_lib functions, classes, variables and definitions are contained in this namespace.
 
+ + + + + + + + + + + + + + + + + + + + + + + +

+Typedefs

+using mrs_lib::lkf_t = LKF< n_states, n_inputs, n_measurements >
 
+using A_t = lkf_t::A_t
 
+using B_t = lkf_t::B_t
 
+using H_t = lkf_t::H_t
 
+using Q_t = lkf_t::Q_t
 
+using x_t = lkf_t::x_t
 
+using P_t = lkf_t::P_t
 
+using u_t = lkf_t::u_t
 
+using z_t = lkf_t::z_t
 
+using R_t = lkf_t::R_t
 
+using statecov_t = lkf_t::statecov_t
 
+ + + + + + + +

+Enumerations

enum  x_pos {
+  x_x = 0, +x_y = 1, +x_dx = 2, +x_dy = 3, +
+  x_x = 0, +x_y = 1, +x_alpha = 2, +x_x = 0, +
+  x_y, +x_alpha, +x_speed +
+ }
 
enum  u_pos { u_dx = 0, +u_dy = 0, +u_alpha = 0, +u_alpha = 0 + }
 
enum  z_pos {
+  z_x = 0, +z_y = 1, +z_x = 0, +z_y = 1, +
+  z_x = 0, +z_y +
+ }
 
+ + + + + + + + + + +

+Functions

+x_t tra_model_f (const x_t &x, const u_t &u, [[maybe_unused]] const double dt)
 
+z_t obs_model_f (const x_t &x)
 
+template<int rows>
Eigen::Matrix< double, rows, 1 > normal_randmat (const Eigen::Matrix< double, rows, rows > &cov)
 
+int main ()
 
+ + + + + + + + + + + + + + + +

+Variables

+const int mrs_lib::n_states = 4
 
+const int mrs_lib::n_inputs = 2
 
+const int mrs_lib::n_measurements = 2
 
+A_t A
 
+B_t B
 
+H_t H
 
+const double speed = 0.3
 
+

Detailed Description

+

Example file for the LKF implementation.

+
Author
Matouš Vrba - vrbam.nosp@m.ato@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz
+

This example may be run after building mrs_lib by executing rosrun mrs_lib lkf_example.

+

See lkf/example.cpp.

+
+
+ + + + diff --git a/lkf_2example_8cpp.js b/lkf_2example_8cpp.js new file mode 100644 index 00000000..a5830f19 --- /dev/null +++ b/lkf_2example_8cpp.js @@ -0,0 +1,52 @@ +var lkf_2example_8cpp = +[ + [ "A_t", "lkf_2example_8cpp.html#ae8fded1ffb13cfff36afc1eedabf215f", null ], + [ "B_t", "lkf_2example_8cpp.html#a5c39f7a461054863b37ddf9186eeb366", null ], + [ "H_t", "lkf_2example_8cpp.html#aa4437350efd30cd9ab6dbea2a2621faa", null ], + [ "lkf_t", "lkf_2example_8cpp.html#a9aa5d9fb8b0e3429a52f81435a1ba2d5", null ], + [ "P_t", "lkf_2example_8cpp.html#a8519b4182b449bbd63c34794c1b03312", null ], + [ "Q_t", "lkf_2example_8cpp.html#afb367b4e310274e83ea453f1d9329df0", null ], + [ "R_t", "lkf_2example_8cpp.html#a0571298449e0cf2aee255bf7e06e7b86", null ], + [ "statecov_t", "lkf_2example_8cpp.html#adf612d30d3a77fa99ff157ce72be6383", null ], + [ "u_t", "lkf_2example_8cpp.html#a846481e2173f20986bcee056e29a5b4c", null ], + [ "x_t", "lkf_2example_8cpp.html#a1db3b17743d9d81ac2aa852a6ed2e4c6", null ], + [ "z_t", "lkf_2example_8cpp.html#a3dd466ca19241875ff72a627b1f86a25", null ], + [ "u_pos", "lkf_2example_8cpp.html#af4cfed65720084d0bd14a3d413e1dcf5", [ + [ "u_dx", "lkf_2example_8cpp.html#af4cfed65720084d0bd14a3d413e1dcf5a7d974952f0e878cbc8d0576f49892b04", null ], + [ "u_dy", "lkf_2example_8cpp.html#af4cfed65720084d0bd14a3d413e1dcf5a9882f4765a1cde48a725304736906a59", null ], + [ "u_alpha", "ukf_2example_8cpp.html#af4cfed65720084d0bd14a3d413e1dcf5ab11d48e78f42e7cbf42ab7d09dd53403", null ], + [ "u_alpha", "ukf_2test_8cpp.html#af4cfed65720084d0bd14a3d413e1dcf5ab11d48e78f42e7cbf42ab7d09dd53403", null ] + ] ], + [ "x_pos", "lkf_2example_8cpp.html#af66fc452d7243bb3be3e0dec10c684b3", [ + [ "x_x", "lkf_2example_8cpp.html#af66fc452d7243bb3be3e0dec10c684b3a73f2def2a7f99112d90954c4343b9341", null ], + [ "x_y", "lkf_2example_8cpp.html#af66fc452d7243bb3be3e0dec10c684b3a19830385ee6cb72a377bbb2680bb48f8", null ], + [ "x_dx", "lkf_2example_8cpp.html#af66fc452d7243bb3be3e0dec10c684b3a51fd194b0acf678a00fd40d662dec461", null ], + [ "x_dy", "lkf_2example_8cpp.html#af66fc452d7243bb3be3e0dec10c684b3ae7ae62baad83c4d51fd304977c5bb5fa", null ], + [ "x_x", "ukf_2example_8cpp.html#af66fc452d7243bb3be3e0dec10c684b3a73f2def2a7f99112d90954c4343b9341", null ], + [ "x_y", "ukf_2example_8cpp.html#af66fc452d7243bb3be3e0dec10c684b3a19830385ee6cb72a377bbb2680bb48f8", null ], + [ "x_alpha", "ukf_2example_8cpp.html#af66fc452d7243bb3be3e0dec10c684b3a3e43122a748ab55aaf12a0ab4acc33ce", null ], + [ "x_x", "ukf_2test_8cpp.html#af66fc452d7243bb3be3e0dec10c684b3a73f2def2a7f99112d90954c4343b9341", null ], + [ "x_y", "ukf_2test_8cpp.html#af66fc452d7243bb3be3e0dec10c684b3a19830385ee6cb72a377bbb2680bb48f8", null ], + [ "x_alpha", "ukf_2test_8cpp.html#af66fc452d7243bb3be3e0dec10c684b3a3e43122a748ab55aaf12a0ab4acc33ce", null ], + [ "x_speed", "ukf_2test_8cpp.html#af66fc452d7243bb3be3e0dec10c684b3aa7e2945a84168a1e2f80c386acbeaae4", null ] + ] ], + [ "z_pos", "lkf_2example_8cpp.html#a333f210bb9cc2047487bc6ea732e6084", [ + [ "z_x", "lkf_2example_8cpp.html#a333f210bb9cc2047487bc6ea732e6084aab5757870b95e7a22683c18efee6ca83", null ], + [ "z_y", "lkf_2example_8cpp.html#a333f210bb9cc2047487bc6ea732e6084a53109a343e0ef48e39be85965b69f609", null ], + [ "z_x", "ukf_2example_8cpp.html#a333f210bb9cc2047487bc6ea732e6084aab5757870b95e7a22683c18efee6ca83", null ], + [ "z_y", "ukf_2example_8cpp.html#a333f210bb9cc2047487bc6ea732e6084a53109a343e0ef48e39be85965b69f609", null ], + [ "z_x", "ukf_2test_8cpp.html#a333f210bb9cc2047487bc6ea732e6084aab5757870b95e7a22683c18efee6ca83", null ], + [ "z_y", "ukf_2test_8cpp.html#a333f210bb9cc2047487bc6ea732e6084a53109a343e0ef48e39be85965b69f609", null ] + ] ], + [ "main", "lkf_2example_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4", null ], + [ "normal_randmat", "lkf_2example_8cpp.html#a1aa37976011a3b2fb4c2af6d82853687", null ], + [ "obs_model_f", "lkf_2example_8cpp.html#a4ea961b6252e3dbe39f69775796091ee", null ], + [ "tra_model_f", "lkf_2example_8cpp.html#a8688a140d7d6993d6f2c1844c9359f4f", null ], + [ "A", "lkf_2example_8cpp.html#af1040ffeface88f6c9d4e56db0af4e8f", null ], + [ "B", "lkf_2example_8cpp.html#aaaf68e4cd1134a9f26b41018c8ebbb6a", null ], + [ "H", "lkf_2example_8cpp.html#a354ab4a2f81b229ea9b469d06b672c88", null ], + [ "n_inputs", "lkf_2example_8cpp.html#aad6f7031fab6870460e48019d0ac9bc1", null ], + [ "n_measurements", "lkf_2example_8cpp.html#af754ee73d8ace41fc7c548876dbc85c0", null ], + [ "n_states", "lkf_2example_8cpp.html#af0b5a638f6885ae6c848cc8ba6633ab8", null ], + [ "speed", "lkf_2example_8cpp.html#a71fd37308050cd439537c5c6c2cb4614", null ] +]; \ No newline at end of file diff --git a/lkf_2example_8cpp__incl.map b/lkf_2example_8cpp__incl.map new file mode 100644 index 00000000..601d648a --- /dev/null +++ b/lkf_2example_8cpp__incl.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/lkf_2example_8cpp__incl.md5 b/lkf_2example_8cpp__incl.md5 new file mode 100644 index 00000000..83f58705 --- /dev/null +++ b/lkf_2example_8cpp__incl.md5 @@ -0,0 +1 @@ +64cea9e6fedabf41ae0275263a793e29 \ No newline at end of file diff --git a/lkf_2example_8cpp__incl.png b/lkf_2example_8cpp__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..8f041a9a3e48de3f7cc2c8ac938fba550e009128 GIT binary patch literal 16142 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 + + + + + + +mrs_lib: include/mrs_lib/lkf.h Source File + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
lkf.h
+
+
+
1 // clang: MatousFormat
+
6 #ifndef LKFSYSTEMMODELS_H
+
7 #define LKFSYSTEMMODELS_H
+
8 
+ +
10 #include <iostream>
+
11 
+
12 namespace mrs_lib
+
13 {
+
14 
+
15  /* class LKF //{ */
+
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;
+
43  static constexpr int m = n_inputs;
+
44  static constexpr int p = n_measurements;
+ +
47  using x_t = typename Base_class::x_t;
+
48  using u_t = typename Base_class::u_t;
+
49  using z_t = typename Base_class::z_t;
+
50  using P_t = typename Base_class::P_t;
+
51  using R_t = typename Base_class::R_t;
+
52  using Q_t = typename Base_class::Q_t;
+ +
55  typedef Eigen::Matrix<double, n, n> A_t;
+
56  typedef Eigen::Matrix<double, n, m> B_t;
+
57  typedef Eigen::Matrix<double, p, n> H_t;
+
58  typedef Eigen::Matrix<double, n, p> K_t;
+
66  struct inverse_exception : public std::exception
+
67  {
+
73  const char* what() const throw()
+
74  {
+
75  return "LKF: could not compute matrix inversion!!! Fix your covariances (the measurement's is probably too low...)";
+
76  }
+
77  };
+
78  //}
+
79 
+
80  public:
+
87  LKF(){};
+
88 
+
96  LKF(const A_t& A, const B_t& B, const H_t& H) : A(A), B(B), H(H){};
+
97 
+
98  /* correct() method //{ */
+
111  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  return correction_impl(sc, z, R, H);
+
115  };
+
116  //}
+
117 
+
118  /* predict() method //{ */
+
138  virtual statecov_t predict(const statecov_t& sc, const u_t& u, const Q_t& Q, [[maybe_unused]] double dt) const override
+
139  {
+
140  statecov_t ret;
+
141  ret.x = state_predict(A, sc.x, B, u);
+
142  ret.P = covariance_predict(A, sc.P, Q, dt);
+
143  return ret;
+
144  };
+
145  //}
+
146 
+
147  public:
+
148  A_t A;
+
149  B_t B;
+
150  H_t H;
+
152  protected:
+
153  /* covariance_predict() method //{ */
+
154  static P_t covariance_predict(const A_t& A, const P_t& P, const Q_t& Q, const double dt)
+
155  {
+
156  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  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  return A * x + B * u;
+
172  }
+
173  //}
+
174 
+
175  protected:
+
176  /* invert_W() method //{ */
+
177  static R_t invert_W(R_t W)
+
178  {
+
179  Eigen::ColPivHouseholderQR<R_t> qr(W);
+
180  if (!qr.isInvertible())
+
181  {
+
182  // add some stuff to the tmp matrix diagonal to make it invertible
+
183  R_t ident = R_t::Identity(W.rows(), W.cols());
+
184  W += 1e-9 * ident;
+
185  qr.compute(W);
+
186  if (!qr.isInvertible())
+
187  {
+
188  // never managed to make this happen except for explicitly putting NaNs in the input
+
189  throw inverse_exception();
+
190  }
+
191  }
+
192  const R_t W_inv = qr.inverse();
+
193  return W_inv;
+
194  }
+
195  //}
+
196 
+
197  /* computeKalmanGain() method //{ */
+
198  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  const R_t W = H * sc.P * H.transpose() + R;
+
202  const R_t W_inv = invert_W(W);
+
203  const K_t K = sc.P * H.transpose() * W_inv;
+
204  return K;
+
205  }
+
206  //}
+
207 
+
208  /* correction_impl() method //{ */
+
209  template<int check=n>
+
210  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  statecov_t ret;
+
214  const K_t K = computeKalmanGain(sc, z, R, H);
+
215  ret.x = sc.x + K * (z - (H * sc.x));
+
216  ret.P = (P_t::Identity() - (K * H)) * sc.P;
+
217  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  static statecov_t correction_optimized(const statecov_t& sc, const z_t& z, const R_t& R, const H_t& H)
+
236  {
+
237  statecov_t ret = sc;
+
238  const H_t B(H*sc.P.transpose());
+
239  const K_t K((B*H.transpose() + R).ldlt().solve(B).transpose());
+
240  ret.x.noalias() += K*(z - H*sc.x);
+
241  ret.P.noalias() -= K*H*sc.P;
+
242  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 
+
293  varstepLKF(const generateA_t& generateA, const generateB_t& generateB, const H_t& H)
+
294  : m_generateA(generateA), m_generateB(generateB)
+
295  {
+
296  Base_class::H = H;
+
297  };
+
298 
+
299  /* predict() method //{ */
+
316  virtual statecov_t predict(const statecov_t& sc, const u_t& u, const Q_t& Q, double dt) const override
+
317  {
+
318  statecov_t ret;
+
319  A_t A = m_generateA(dt);
+
320  B_t B = m_generateB(dt);
+
321  ret.x = Base_class::state_predict(A, sc.x, B, u);
+
322  ret.P = Base_class::covariance_predict(A, sc.P, Q, dt);
+
323  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
+
+
+
typename Base_class::Q_t Q_t
Process noise covariance matrix type .
Definition: lkf.h:52
+
static constexpr int p
Length of the measurement vector of the system.
Definition: lkf.h:44
+
Eigen::Matrix< double, p, n > H_t
State to measurement mapping matrix type .
Definition: lkf.h:57
+
typename Base_class::P_t P_t
State uncertainty covariance matrix type .
Definition: lkf.h:50
+
H_t H
The state to measurement mapping matrix .
Definition: lkf.h:150
+
typename Base_class::statecov_t statecov_t
Helper struct for passing around the state and its covariance in one variable.
Definition: lkf.h:53
+
typename Base_class::R_t R_t
Measurement noise covariance matrix type .
Definition: lkf.h:51
+
Eigen::Matrix< double, p, p > R_t
Measurement noise covariance matrix type .
Definition: kalman_filter.h:39
+
virtual statecov_t predict(const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const override
Applies the prediction (time) step of the Kalman filter.
Definition: lkf.h:316
+
Eigen::Matrix< double, n, n > P_t
State uncertainty covariance matrix type .
Definition: kalman_filter.h:38
+
This exception is thrown when taking the inverse of a matrix fails.
Definition: lkf.h:66
+
Definition: lkf.h:260
+
Eigen::Matrix< double, m, 1 > u_t
Input vector type .
Definition: kalman_filter.h:35
+
Eigen::Matrix< double, n, m > B_t
Input to state mapping matrix type .
Definition: lkf.h:56
+
typename Base_class::x_t x_t
State vector type .
Definition: lkf.h:47
+
virtual statecov_t correct(const statecov_t &sc, const z_t &z, const R_t &R) const override
Applies the correction (update, measurement, data) step of the Kalman filter.
Definition: lkf.h:111
+
virtual statecov_t predict(const statecov_t &sc, const u_t &u, const Q_t &Q, [[maybe_unused]] double dt) const override
Applies the prediction (time) step of the Kalman filter.
Definition: lkf.h:138
+
Eigen::Matrix< double, n, 1 > x_t
State vector type .
Definition: kalman_filter.h:34
+
All mrs_lib functions, classes, variables and definitions are contained in this namespace.
Definition: attitude_converter.h:29
+
static constexpr int n
Length of the state vector of the system.
Definition: lkf.h:42
+
Defines KalmanFilter - an abstract class, defining common interfaces and types for a generic Kalman f...
+
Eigen::Matrix< double, n, n > A_t
System transition matrix type .
Definition: lkf.h:55
+
const char * what() const
Returns the error message, describing what caused the exception.
Definition: lkf.h:73
+
B_t B
The input to state mapping matrix .
Definition: lkf.h:149
+
Implementation of the Linear Kalman filter .
Definition: lkf.h:38
+
Eigen::Matrix< double, n, p > K_t
Kalman gain matrix type .
Definition: lkf.h:58
+
varstepLKF(const generateA_t &generateA, const generateB_t &generateB, const H_t &H)
The main constructor.
Definition: lkf.h:293
+
Definition: lkf.h:334
+
LKF(const A_t &A, const B_t &B, const H_t &H)
The main constructor.
Definition: lkf.h:96
+
Eigen::Matrix< double, n, n > Q_t
Process noise covariance matrix type .
Definition: kalman_filter.h:40
+
typename Base_class::z_t z_t
Measurement vector type .
Definition: lkf.h:49
+
Eigen::Matrix< double, p, 1 > z_t
Measurement vector type .
Definition: kalman_filter.h:36
+
LKF()
Convenience default constructor.
Definition: lkf.h:87
+
static constexpr int m
Length of the input vector of the system.
Definition: lkf.h:43
+
A_t A
The system transition matrix .
Definition: lkf.h:144
+
typename Base_class::u_t u_t
Input vector type .
Definition: lkf.h:48
+
Helper struct for passing around the state and its covariance in one variable.
Definition: kalman_filter.h:47
+
This abstract class defines common interfaces and types for a generic Kalman filter.
Definition: kalman_filter.h:26
+ + + + diff --git a/math_8h.html b/math_8h.html new file mode 100644 index 00000000..42cd705a --- /dev/null +++ b/math_8h.html @@ -0,0 +1,138 @@ + + + + + + + +mrs_lib: include/mrs_lib/math.h File Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
math.h File Reference
+
+
+ +

Defines useful math functions that are not part of the cmath STD library. +More...

+
#include <cmath>
+
+ + Include dependency graph for math.h:
+
+
+ +
+

Go to the source code of this file.

+ + + + + +

+Namespaces

 mrs_lib
 All mrs_lib functions, classes, variables and definitions are contained in this namespace.
 
+ + + + +

+Functions

double mrs_lib::probit (const double quantile)
 Inverse cumulative distribution function of the standard normal probability distribution. More...
 
+

Detailed Description

+

Defines useful math functions that are not part of the cmath STD library.

+
Author
Matouš Vrba - vrbam.nosp@m.ato@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz
+
+
+ + + + diff --git a/math_8h.js b/math_8h.js new file mode 100644 index 00000000..c91bc223 --- /dev/null +++ b/math_8h.js @@ -0,0 +1,4 @@ +var math_8h = +[ + [ "probit", "math_8h.html#a8b597ab1c70f0f92933e24e13f390bf5", null ] +]; \ No newline at end of file diff --git a/math_8h__incl.map b/math_8h__incl.map new file mode 100644 index 00000000..928768fb --- /dev/null +++ b/math_8h__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/math_8h__incl.md5 b/math_8h__incl.md5 new file mode 100644 index 00000000..12bc760d --- /dev/null +++ b/math_8h__incl.md5 @@ -0,0 +1 @@ +28758a77af00e195259c97ee0bedf95a \ No newline at end of file diff --git a/math_8h__incl.png b/math_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..a79b4ab3d16b05aa7a43c40703a8504c05111973 GIT binary patch literal 3098 zcmchZi96K)7RQM)sqADQl93_1F}4XQX_&I_OUag9_BBh&F7rbgOp@&UCR>vzJCP+M z#*(aK5XLr!alhSrpL?JC58Ti9`F_vye4p><`<(MR@AEn*@h(d50y94|9Ua{T{ad=m zfUO5^U(hMwInMQ#0+=)Rk$SpxCx5P2%_V3$x^sj2y4t28dF#{R1}4h_Oq=_4L*IHg?reoTs_XSLM>*mczkH}l|-Bn}Ef1mdA^W#X2|3J}2{B?V=aW;zj4Jm8& zQOc21O4FoVfq{sK_{5JRP^fA&!^z17u19B{S9$( z@zk`mmo>$qxm725d3o5V!`{sN{zdkSZ=_7N-yV6lhXs!hiD#8%aq?QK{5xN1N@Flh)DEC-2@VtfHlupInlWNwaMUAb!L6 zv{+eKT;$pqZ2C1?$Y6oy?(Qyy zLb-NwRO_x@*wPY3-CI}4m6nv$hh~+JJsb(EsI2^}Z_&`uaB*?*qKxgqVvYlw4xk`z z5TkLKsZ0)fPOEk;NbC_`Tq7NYEm3z6L6t`LPJIlmwXOnE(h|O3ty7qBySOh$cG(v$ zDJeOMXcOS&b@T8b)O+M$Fqri8JKo+hc>7{wyAJ`x>EPMjy*-!O3Bal2aXcijHX_iqg2Zujn<4Dv^ zi2FT-=j7rF*j*jl-1LQEyhhK*wK^)~j=t$~l!Hh}lu?1qW}cgwnQ?Y@EgbGd~$U{PxWlsH|VVe(mh+q$3X9=DPq= zrUBgexfK$Dm|Z}KiHWHSrkO&4n#k&X0PJ_dSwcqj4GpWx%GeWi|Gdu1^7i(I>~t-Y z$=lmdC^Qp|t|%|JkJ!5L5N#>#?e5Ob{N(iM(~vq>g|^MShK2^1y1I=_j?KHc5+gIS zPDeR^fB%1jbYgAx6SjMvPq=Z7dW>6IS}Mu4?f;S;j#018!&>*}I7H!pDgz1><4I06 zXMWO_nVA_nCa>p{?K(@5V?tnk^b{-c6Z=P}`Y-&eq5SD9F7Rv3AzQCI33M>+V&kn4 zjdo?lg?T^$*{j`4L&R#e>3I8-p2<|p)M33`&;gD0Is(yz$`2E}diC36>JMi42^~Cx z^)UnG|7eiM)Ho<~m3nxy6jN2z7#AC|u`w|Ea(g>KR@TC!&V@7ka9?7CSeKAM0v%J4 z3UaUBW=BR&=lH|f`epg}j1uPL7FKQz4$!bqs5oV$CRobikdY~z-_~%|Azj#gE_pRO z48f*jWi>cL+#!;#U#FakAzBDq3yOfRC@NZ4D7U10Z_OlNW?Ql#QmXN5yxm<@aY;Rebf1j^-1;h}~*!s>{khJF{CIU_um#8TmaR-U! zqdqw!Q|bvg?u_(qTiZPQDAn_#KuDa-?N!rhRgWW%q!bnTMeFWehd*tv3zBVU8=xVA z_cx{o22hIJt_p$D*>PH* z{~R~^%?u3sFFHirTbGgkqdFc}#K!C=2UAlnUfz|BjRK$s5r{N4VB24}E(079WRZ}T zt}HHI{DE_dii)bPuEyi>YSZ)Syl>yUVPn)T8a~Cqz$&b9ixxcu@Nsf-@`D!v7Atb! z$*K1_&>4VUzU+@LEG)c6J1D9zs0<~pe;FFeu$4I(yyx!jPWoO&T3O-c<14GK_I7g{ zBJHxXv(wYlk5}7;Z~km;@FLjS+6Jxtkk`GIoE)Po4a$)7nnJq(6*!D_%IB% z^S)?&DRXk~rG7mvt;gmS&4Hxsv-?8){2a-hK+hHu6dWZ6NTBjwynJ~{W!Np**WtM2 z#zEd6_!=8G_{`FlvC#nR3J{SWa5%rT{V_Kswfupxv8+}{TfF~bMT> zvg1-elg>(iuHxL>oKB(Kl`Ez7^~#cx?rFj2K_Gb8PN}8zl0Tj!@v@>KdeYR^HezE+ zl_&W|bCebH+8R};XOKx80;4XYyhu SKLNu&o&F7!ZnchM>^}gG9toEK literal 0 HcmV?d00001 diff --git a/math_8h_source.html b/math_8h_source.html new file mode 100644 index 00000000..a1383532 --- /dev/null +++ b/math_8h_source.html @@ -0,0 +1,122 @@ + + + + + + + +mrs_lib: include/mrs_lib/math.h Source File + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
math.h
+
+
+Go to the documentation of this file.
1 // clang: MatousFormat
+
7 #ifndef MATH_H
+
8 #define MATH_H
+
9 
+
10 #include <cmath>
+
11 
+
12 namespace mrs_lib
+
13 {
+
14  /* probit() function //{ */
+
15  //
+
16  //
+
17 
+
30  double probit(const double quantile);
+
31 
+
32  //}
+
33 }
+
34 
+
35 #endif
+
+
+
double probit(const double quantile)
Inverse cumulative distribution function of the standard normal probability distribution.
Definition: math.cpp:6
+
All mrs_lib functions, classes, variables and definitions are contained in this namespace.
Definition: attitude_converter.h:29
+ + + + diff --git a/median__filter_8h.html b/median__filter_8h.html new file mode 100644 index 00000000..faab8710 --- /dev/null +++ b/median__filter_8h.html @@ -0,0 +1,148 @@ + + + + + + + +mrs_lib: include/mrs_lib/median_filter.h File Reference + + + + + + + + + + + + + +
+
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
median_filter.h File Reference
+
+
+ +

Defines the MedianFilter class. +More...

+
#include <boost/circular_buffer.hpp>
+#include <mutex>
+#include <cmath>
+#include <vector>
+#include <optional>
+
+ + Include dependency graph for median_filter.h:
+
+
+ +
+

Go to the source code of this file.

+ + + + + +

+Classes

class  mrs_lib::MedianFilter
 Implementation of a median filter with a fixed-length buffer. More...
 
+ + + + +

+Namespaces

 mrs_lib
 All mrs_lib functions, classes, variables and definitions are contained in this namespace.
 
+

Detailed Description

+

Defines the MedianFilter class.

+
Author
Daniel Hert
+
+Matouš Vrba - matou.nosp@m.s.vr.nosp@m.ba@fe.nosp@m.l.cv.nosp@m.ut.cz
+
+
+ + + + diff --git a/median__filter_8h__incl.map b/median__filter_8h__incl.map new file mode 100644 index 00000000..ba829bc0 --- /dev/null +++ b/median__filter_8h__incl.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/median__filter_8h__incl.md5 b/median__filter_8h__incl.md5 new file mode 100644 index 00000000..fa8b8e3c --- /dev/null +++ b/median__filter_8h__incl.md5 @@ -0,0 +1 @@ +6588f4c1d14158118c2c409d91182ee7 \ No newline at end of file diff --git a/median__filter_8h__incl.png b/median__filter_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..9a5c7c1645afaf3490e6c68bd4012ec198c17551 GIT binary patch literal 11904 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 +
+ + + + + + + +
+
mrs_lib +
+
Various reusable classes, functions and utilities for use in MRS projects
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
median_filter.h
+
+
+Go to the documentation of this file.
1 #ifndef MEDIAN_FILTER
+
2 #define MEDIAN_FILTER
+
3 
+
10 #include <boost/circular_buffer.hpp>
+
11 #include <mutex>
+
12 #include <cmath>
+
13 #include <vector>
+
14 #include <optional>
+
15 
+
16 namespace mrs_lib
+
17 {
+ +
23  {
+
24  public:
+
33  MedianFilter(const size_t buffer_length, const double min_value = -std::numeric_limits<double>::infinity(), const double max_value = std::numeric_limits<double>::infinity(), const double max_diff = std::numeric_limits<double>::infinity());
+
34 
+
43  MedianFilter();
+
44 
+
53  MedianFilter(const MedianFilter& other);
+
54 
+
63  MedianFilter(MedianFilter&& other);
+
64 
+
73  MedianFilter& operator=(const MedianFilter& other);
+
74 
+ +
84 
+
92  void add(const double value);
+
93 
+
103  bool check(const double value);
+
104 
+
116  bool addCheck(const double value);
+
117 
+
123  void clear();
+
124 
+
132  bool full() const;
+
133 
+
142  double median() const;
+
143 
+
149  bool initialized() const;
+
150 
+
158  void setBufferLength(const size_t buffer_length);
+
159 
+
167  void setMinValue(const double min_value);
+
168 
+
176  void setMaxValue(const double max_value);
+
177 
+
185  void setMaxDifference(const double max_diff);
+
186 
+
187  private:
+
188  // for thread-safety
+
189  mutable std::recursive_mutex m_mtx;
+
190  // the input buffer
+
191  boost::circular_buffer<double> m_buffer;
+
192  // a helper buffer for sorting the input buffer
+
193  mutable std::vector<double> m_buffer_sorted;
+
194  // the last median value for lazy evaluation
+
195  mutable std::optional<double> m_median;
+
196 
+
197  // parameters specified by the user
+
198  double m_min_valid;
+
199  double m_max_valid;
+
200  double m_max_diff;
+
201  };
+
202 
+
203 } // namespace mrs_lib
+
204 
+
205 #endif
+
+
+
void setBufferLength(const size_t buffer_length)
Set a new size of the buffer.
Definition: median_filter.cpp:166
+
bool full() const
Check whether the buffer is filled with values.
Definition: median_filter.cpp:112
+
bool addCheck(const double value)
Add a new value to the buffer and check if it complies with the constraints.
Definition: median_filter.cpp:94
+
void add(const double value)
Add a new value to the buffer.
Definition: median_filter.cpp:73
+
void setMaxValue(const double max_value)
Set a new maximal threshold for new values.
Definition: median_filter.cpp:187
+
All mrs_lib functions, classes, variables and definitions are contained in this namespace.
Definition: attitude_converter.h:29
+
void setMaxDifference(const double max_diff)
Set a new maximal difference from median for new values.
Definition: median_filter.cpp:195
+
bool check(const double value)
Check whether a value complies with the constraints.
Definition: median_filter.cpp:84
+
bool initialized() const
Check whether the filter was initialized with a valid buffer length.
Definition: median_filter.cpp:158
+
double median() const
Obtain the median.
Definition: median_filter.cpp:120
+
MedianFilter & operator=(const MedianFilter &other)
A convenience copy assignment operator.
Definition: median_filter.cpp:39
+
Implementation of a median filter with a fixed-length buffer.
Definition: median_filter.h:22
+
MedianFilter()
A convenience empty constructor that will construct an invalid filter.
Definition: median_filter.cpp:17
+
void setMinValue(const double min_value)
Set a new minimal threshold for new values.
Definition: median_filter.cpp:179
+
void clear()
Clear the buffer of all values.
Definition: median_filter.cpp:103
+ + + + diff --git a/menu.js b/menu.js new file mode 100644 index 00000000..433c15b8 --- /dev/null +++ b/menu.js @@ -0,0 +1,50 @@ +/* + @licstart The following is the entire license notice for the + JavaScript code in this file. + + Copyright (C) 1997-2017 by Dimitri van Heesch + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + @licend The above is the entire license notice + for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/menudata.js b/menudata.js new file mode 100644 index 00000000..14d603bb --- /dev/null +++ b/menudata.js @@ -0,0 +1,139 @@ +/* +@licstart The following is the entire license notice for the +JavaScript code in this file. + +Copyright (C) 1997-2019 by Dimitri van Heesch + +This program is free software; you can redistribute it and/or modify +it under the terms of version 2 of the GNU General Public License as published by +the Free Software Foundation + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +@licend The above is the entire license notice +for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Related Pages",url:"pages.html"}, +{text:"Namespaces",url:"namespaces.html",children:[ +{text:"Namespace List",url:"namespaces.html"}, +{text:"Namespace Members",url:"namespacemembers.html",children:[ +{text:"All",url:"namespacemembers.html",children:[ +{text:"c",url:"namespacemembers.html#index_c"}, +{text:"g",url:"namespacemembers.html#index_g"}, +{text:"m",url:"namespacemembers.html#index_m"}, +{text:"p",url:"namespacemembers.html#index_p"}, +{text:"r",url:"namespacemembers.html#index_r"}, +{text:"s",url:"namespacemembers.html#index_s"}]}, +{text:"Functions",url:"namespacemembers_func.html",children:[ +{text:"c",url:"namespacemembers_func.html#index_c"}, +{text:"g",url:"namespacemembers_func.html#index_g"}, +{text:"p",url:"namespacemembers_func.html#index_p"}, +{text:"r",url:"namespacemembers_func.html#index_r"}, +{text:"s",url:"namespacemembers_func.html#index_s"}]}, +{text:"Typedefs",url:"namespacemembers_type.html"}]}]}, +{text:"Classes",url:"annotated.html",children:[ +{text:"Class List",url:"annotated.html"}, +{text:"Class Index",url:"classes.html"}, +{text:"Class Hierarchy",url:"inherits.html"}, +{text:"Class Members",url:"functions.html",children:[ +{text:"All",url:"functions.html",children:[ +{text:"a",url:"functions.html#index_a"}, +{text:"b",url:"functions_b.html#index_b"}, +{text:"c",url:"functions_c.html#index_c"}, +{text:"d",url:"functions_d.html#index_d"}, +{text:"e",url:"functions_e.html#index_e"}, +{text:"f",url:"functions_f.html#index_f"}, +{text:"g",url:"functions_g.html#index_g"}, +{text:"h",url:"functions_h.html#index_h"}, +{text:"i",url:"functions_i.html#index_i"}, +{text:"j",url:"functions_j.html#index_j"}, +{text:"k",url:"functions_k.html#index_k"}, +{text:"l",url:"functions_l.html#index_l"}, +{text:"m",url:"functions_m.html#index_m"}, +{text:"n",url:"functions_n.html#index_n"}, +{text:"o",url:"functions_o.html#index_o"}, +{text:"p",url:"functions_p.html#index_p"}, +{text:"q",url:"functions_q.html#index_q"}, +{text:"r",url:"functions_r.html#index_r"}, +{text:"s",url:"functions_s.html#index_s"}, +{text:"t",url:"functions_t.html#index_t"}, +{text:"u",url:"functions_u.html#index_u"}, +{text:"v",url:"functions_v.html#index_v"}, +{text:"w",url:"functions_w.html#index_w"}, +{text:"x",url:"functions_x.html#index_x"}, +{text:"y",url:"functions_y.html#index_y"}, +{text:"z",url:"functions_z.html#index_z"}, +{text:"~",url:"functions_~.html#index__7E"}]}, +{text:"Functions",url:"functions_func.html",children:[ +{text:"a",url:"functions_func.html#index_a"}, +{text:"b",url:"functions_func_b.html#index_b"}, +{text:"c",url:"functions_func_c.html#index_c"}, +{text:"d",url:"functions_func_d.html#index_d"}, +{text:"e",url:"functions_func_e.html#index_e"}, +{text:"f",url:"functions_func_f.html#index_f"}, +{text:"g",url:"functions_func_g.html#index_g"}, +{text:"h",url:"functions_func_h.html#index_h"}, +{text:"i",url:"functions_func_i.html#index_i"}, +{text:"j",url:"functions_func_j.html#index_j"}, +{text:"l",url:"functions_func_l.html#index_l"}, +{text:"m",url:"functions_func_m.html#index_m"}, +{text:"n",url:"functions_func_n.html#index_n"}, +{text:"o",url:"functions_func_o.html#index_o"}, +{text:"p",url:"functions_func_p.html#index_p"}, +{text:"r",url:"functions_func_r.html#index_r"}, +{text:"s",url:"functions_func_s.html#index_s"}, +{text:"t",url:"functions_func_t.html#index_t"}, +{text:"u",url:"functions_func_u.html#index_u"}, +{text:"v",url:"functions_func_v.html#index_v"}, +{text:"w",url:"functions_func_w.html#index_w"}, +{text:"y",url:"functions_func_y.html#index_y"}, +{text:"~",url:"functions_func_~.html#index__7E"}]}, +{text:"Variables",url:"functions_vars.html",children:[ +{text:"a",url:"functions_vars.html#index_a"}, +{text:"b",url:"functions_vars.html#index_b"}, +{text:"h",url:"functions_vars.html#index_h"}, +{text:"k",url:"functions_vars.html#index_k"}, +{text:"l",url:"functions_vars.html#index_l"}, +{text:"m",url:"functions_vars.html#index_m"}, +{text:"n",url:"functions_vars.html#index_n"}, +{text:"p",url:"functions_vars.html#index_p"}, +{text:"q",url:"functions_vars.html#index_q"}, +{text:"r",url:"functions_vars.html#index_r"}, +{text:"s",url:"functions_vars.html#index_s"}, +{text:"t",url:"functions_vars.html#index_t"}, +{text:"w",url:"functions_vars.html#index_w"}, +{text:"x",url:"functions_vars.html#index_x"}]}, +{text:"Typedefs",url:"functions_type.html",children:[ +{text:"a",url:"functions_type.html#index_a"}, +{text:"b",url:"functions_type.html#index_b"}, +{text:"c",url:"functions_type.html#index_c"}, +{text:"d",url:"functions_type.html#index_d"}, +{text:"e",url:"functions_type.html#index_e"}, +{text:"f",url:"functions_type.html#index_f"}, +{text:"h",url:"functions_type.html#index_h"}, +{text:"i",url:"functions_type.html#index_i"}, +{text:"k",url:"functions_type.html#index_k"}, +{text:"m",url:"functions_type.html#index_m"}, +{text:"o",url:"functions_type.html#index_o"}, +{text:"p",url:"functions_type.html#index_p"}, +{text:"q",url:"functions_type.html#index_q"}, +{text:"r",url:"functions_type.html#index_r"}, +{text:"s",url:"functions_type.html#index_s"}, +{text:"t",url:"functions_type.html#index_t"}, +{text:"u",url:"functions_type.html#index_u"}, +{text:"w",url:"functions_type.html#index_w"}, +{text:"x",url:"functions_type.html#index_x"}, +{text:"z",url:"functions_type.html#index_z"}]}, +{text:"Related Functions",url:"functions_rela.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}]}, +{text:"Examples",url:"examples.html"}]} diff --git a/misc_8h.html b/misc_8h.html new file mode 100644 index 00000000..3d14ed25 --- /dev/null +++ b/misc_8h.html @@ -0,0 +1,937 @@ + + + + + + + +mrs_lib: include/mrs_lib/geometry/misc.h File Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    misc.h File Reference
    +
    +
    + +

    Defines useful geometry utilities and functions. +More...

    +
    #include <cmath>
    +#include <Eigen/Dense>
    +#include <geometry_msgs/Point.h>
    +#include <geometry_msgs/Quaternion.h>
    +
    + + Include dependency graph for misc.h:
    +
    +
    + +
    + + This graph shows which files directly or indirectly include this file:
    +
    +
    + +
    +

    Go to the source code of this file.

    + + + + + +

    +Namespaces

     mrs_lib
     All mrs_lib functions, classes, variables and definitions are contained in this namespace.
     
    + + + + + + + + + + + + + + + + + + +

    +Typedefs

    +template<int dims>
    using mrs_lib::geometry::vec_t = Eigen::Matrix< double, dims, 1 >
     
    +using mrs_lib::geometry::pt2_t = vec_t< 2 >
     
    +using mrs_lib::geometry::vec2_t = vec_t< 2 >
     
    +using mrs_lib::geometry::pt3_t = vec_t< 3 >
     
    +using mrs_lib::geometry::vec3_t = vec_t< 3 >
     
    +using mrs_lib::geometry::mat3_t = Eigen::Matrix3d
     
    +using mrs_lib::geometry::quat_t = Eigen::Quaterniond
     
    +using mrs_lib::geometry::anax_t = Eigen::AngleAxisd
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    +template<int dims>
    vec_t< dims+1 > mrs_lib::geometry::toHomogenous (const vec_t< dims > &vec)
     
    template<typename T >
    double mrs_lib::geometry::headingFromRot (const T &rot)
     Returns the heading angle from the rotation. More...
     
    double mrs_lib::geometry::angleBetween (const vec2_t &a, const vec2_t &b)
     Returns the angle between two vectors, taking orientation into account. More...
     
    double mrs_lib::geometry::angleBetween (const vec3_t &a, const vec3_t &b)
     Returns the angle between two vectors, taking orientation into account. More...
     
    anax_t mrs_lib::geometry::angleaxisBetween (const vec3_t &a, const vec3_t &b, const double tolerance=1e-9)
     Returns the rotation between two vectors, represented as angle-axis. More...
     
    quat_t mrs_lib::geometry::quaternionBetween (const vec3_t &a, const vec3_t &b, const double tolerance=1e-9)
     Returns the rotation between two vectors, represented as a quaternion. More...
     
    Eigen::Matrix3d mrs_lib::geometry::rotationBetween (const vec3_t &a, const vec3_t &b, const double tolerance=1e-9)
     Returns the rotation between two vectors, represented as a rotation matrix. More...
     
    double mrs_lib::geometry::haversin (const double angle)
     computes the haversine (half of versine) for a given angle More...
     
    double mrs_lib::geometry::invHaversin (const double value)
     computes the inverse haversine angle for a given value More...
     
    double mrs_lib::geometry::solidAngle (double a, double b, double c)
     computes the solid angle for a spherical surface corresponding to a 'triangle' with edge lengths a, b, c More...
     
    quat_t mrs_lib::geometry::quaternionFromEuler (double x, double y, double z)
     create a quaternion from 3 provided Euler angles More...
     
    quat_t mrs_lib::geometry::quaternionFromEuler (const Eigen::Vector3d &euler)
     create a quaternion from Euler angles provided as a vector More...
     
    quat_t mrs_lib::geometry::quaternionFromHeading (const double heading)
     create a quaternion from heading More...
     
    double mrs_lib::geometry::cross (const vec2_t &a, const vec2_t b)
     Implementation of cross product for 2D vectors. More...
     
    double mrs_lib::geometry::dist (const vec2_t &a, const vec2_t &b)
     distnace between two 2D Eigen vectors More...
     
    double mrs_lib::geometry::dist (const vec3_t &a, const vec3_t &b)
     distnace between two 3D Eigen vectors More...
     
    double mrs_lib::geometry::triangleArea (const double a, const double b, const double c)
     uses Heron's formula to compute area of a given triangle using side lengths More...
     
    double mrs_lib::geometry::sphericalTriangleArea (Eigen::Vector3d a, Eigen::Vector3d b, Eigen::Vector3d c)
     compute the area of a 'triangle' drawn on a spherical surface More...
     
    template<typename T >
    mat3_t mrs_lib::geometry::rotateCovariance (const mat3_t &cov, const T &rot)
     Returns the covariance rotated using the specified rotation. More...
     
    +

    Detailed Description

    +

    Defines useful geometry utilities and functions.

    +
    Author
    Matouš Vrba - vrbam.nosp@m.ato@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz
    +
    +Petr Štibinger - stibi.nosp@m.pet@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz
    +

    Function Documentation

    + +

    ◆ angleaxisBetween()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    anax_t mrs_lib::geometry::angleaxisBetween (const vec3_t & a,
    const vec3_t & b,
    const double tolerance = 1e-9 
    )
    +
    + +

    Returns the rotation between two vectors, represented as angle-axis.

    +

    To avoid singularities, a tolerance parameter is used:

      +
    • If the absolute angle between the two vectors is less than tolerance, a zero rotation is returned.
    • +
    • If the angle between the two vectors is closer to $ \pi $ than tolerance, a $ \pi $ rotation is returned.
    • +
    +
    Parameters
    + + + +
    avector from which the rotation starts.
    bvector at which the rotation ends.
    +
    +
    +
    Returns
    rotation from a to b.
    + +
    +
    + +

    ◆ angleBetween() [1/2]

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    double mrs_lib::geometry::angleBetween (const vec2_t & a,
    const vec2_t & b 
    )
    +
    + +

    Returns the angle between two vectors, taking orientation into account.

    +

    This implementation uses atan2 instead of just acos and thus it properly takes into account orientation of the vectors, returning angle in all four quadrants.

    +
    Parameters
    + + + +
    avector from which the angle will be measured.
    bvector to which the angle will be measured.
    +
    +
    +
    Returns
    angle from a to b.
    + +
    +
    + +

    ◆ angleBetween() [2/2]

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    double mrs_lib::geometry::angleBetween (const vec3_t & a,
    const vec3_t & b 
    )
    +
    + +

    Returns the angle between two vectors, taking orientation into account.

    +

    This implementation uses atan2 instead of just acos and thus it properly takes into account orientation of the vectors, returning angle in all four quadrants.

    +
    Parameters
    + + + +
    avector from which the angle will be measured.
    bvector to which the angle will be measured.
    +
    +
    +
    Returns
    angle from a to b.
    + +
    +
    + +

    ◆ cross()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    double mrs_lib::geometry::cross (const vec2_t & a,
    const vec2_t b 
    )
    +
    + +

    Implementation of cross product for 2D vectors.

    +

    Useful e.g. for finding the sine of an angle between two 2D vectors.

    +
    Parameters
    + + + +
    afirst vector of the cross product.
    bsecond vector of the cross product.
    +
    +
    +
    Returns
    $ a \times b $ (sine of the angle from a to b).
    + +
    +
    + +

    ◆ dist() [1/2]

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    double mrs_lib::geometry::dist (const vec2_t & a,
    const vec2_t & b 
    )
    +
    + +

    distnace between two 2D Eigen vectors

    +
    Parameters
    + + + +
    a
    b
    +
    +
    +
    Returns
    Euclidean distance
    + +
    +
    + +

    ◆ dist() [2/2]

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    double mrs_lib::geometry::dist (const vec3_t & a,
    const vec3_t & b 
    )
    +
    + +

    distnace between two 3D Eigen vectors

    +
    Parameters
    + + + +
    a
    b
    +
    +
    +
    Returns
    Euclidean distance
    + +
    +
    + +

    ◆ haversin()

    + +
    +
    + + + + + + + + +
    double mrs_lib::geometry::haversin (const double angle)
    +
    + +

    computes the haversine (half of versine) for a given angle

    +
    Parameters
    + + +
    angleangle in radians
    +
    +
    +
    Returns
    + +
    +
    + +

    ◆ headingFromRot()

    + +
    +
    +
    +template<typename T >
    + + + + + + + + +
    double mrs_lib::geometry::headingFromRot (const T & rot)
    +
    + +

    Returns the heading angle from the rotation.

    +

    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.

    +
    Parameters
    + + +
    rotthe rotation to extract the heading angle from.
    +
    +
    +
    Returns
    the heading angle.
    + +
    +
    + +

    ◆ invHaversin()

    + +
    +
    + + + + + + + + +
    double mrs_lib::geometry::invHaversin (const double value)
    +
    + +

    computes the inverse haversine angle for a given value

    +
    Parameters
    + + +
    value
    +
    +
    +
    Returns
    angle in radians
    + +
    +
    + +

    ◆ quaternionBetween()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    quat_t mrs_lib::geometry::quaternionBetween (const vec3_t & a,
    const vec3_t & b,
    const double tolerance = 1e-9 
    )
    +
    + +

    Returns the rotation between two vectors, represented as a quaternion.

    +

    Works the same as the angleaxisBetween() function (in fact it is used in the implementation).

    +
    Parameters
    + + + +
    avector from which the rotation starts.
    bvector at which the rotation ends.
    +
    +
    +
    Returns
    rotation from a to b.
    + +
    +
    + +

    ◆ quaternionFromEuler() [1/2]

    + +
    +
    + + + + + + + + +
    quat_t mrs_lib::geometry::quaternionFromEuler (const Eigen::Vector3d & euler)
    +
    + +

    create a quaternion from Euler angles provided as a vector

    +
    Parameters
    + + +
    eulercomponents of the rotation provided as vector of Euler angles
    +
    +
    +
    Returns
    quaternion
    + +
    +
    + +

    ◆ quaternionFromEuler() [2/2]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    quat_t mrs_lib::geometry::quaternionFromEuler (double x,
    double y,
    double z 
    )
    +
    + +

    create a quaternion from 3 provided Euler angles

    +
    Parameters
    + + + + +
    xEuler angle in radians
    yEuler angle in radians
    zEuler angle in radians
    +
    +
    +
    Returns
    quaternion
    + +
    +
    + +

    ◆ quaternionFromHeading()

    + +
    +
    + + + + + + + + +
    quat_t mrs_lib::geometry::quaternionFromHeading (const double heading)
    +
    + +

    create a quaternion from heading

    +

    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.

    +
    Parameters
    + + +
    headingthe heading angle.
    +
    +
    +
    Returns
    the quaternion corresponding to the heading rotation.
    + +
    +
    + +

    ◆ rotateCovariance()

    + +
    +
    +
    +template<typename T >
    + + + + + + + + + + + + + + + + + + +
    mat3_t mrs_lib::geometry::rotateCovariance (const mat3_t & cov,
    const T & rot 
    )
    +
    + +

    Returns the covariance rotated using the specified rotation.

    +
    Parameters
    + + + +
    covthe covariance to be rotated.
    rotthe rotation use.
    +
    +
    +
    Returns
    a new matrix object containing the rotated covariance.
    + +
    +
    + +

    ◆ rotationBetween()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    Eigen::Matrix3d mrs_lib::geometry::rotationBetween (const vec3_t & a,
    const vec3_t & b,
    const double tolerance = 1e-9 
    )
    +
    + +

    Returns the rotation between two vectors, represented as a rotation matrix.

    +

    Works the same as the angleaxisBetween() function (in fact it is used in the implementation).

    +
    Parameters
    + + + +
    avector from which the rotation starts.
    bvector at which the rotation ends.
    +
    +
    +
    Returns
    rotation from a to b.
    + +
    +
    + +

    ◆ solidAngle()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    double mrs_lib::geometry::solidAngle (double a,
    double b,
    double c 
    )
    +
    + +

    computes the solid angle for a spherical surface corresponding to a 'triangle' with edge lengths a, b, c

    +
    Parameters
    + + + + +
    a
    b
    c
    +
    +
    +
    Returns
    solid angle in steradians
    + +
    +
    + +

    ◆ sphericalTriangleArea()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    double mrs_lib::geometry::sphericalTriangleArea (Eigen::Vector3d a,
    Eigen::Vector3d b,
    Eigen::Vector3d c 
    )
    +
    + +

    compute the area of a 'triangle' drawn on a spherical surface

    +
    Parameters
    + + + + +
    alength of side1
    blength of side2
    clength of side3
    +
    +
    +
    Returns
    area in units squared
    + +
    +
    + +

    ◆ triangleArea()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    double mrs_lib::geometry::triangleArea (const double a,
    const double b,
    const double c 
    )
    +
    + +

    uses Heron's formula to compute area of a given triangle using side lengths

    +
    Parameters
    + + + + +
    alength of side1
    blength of side2
    clength of side3
    +
    +
    +
    Returns
    area in units squared
    + +
    +
    +
    +
    + + + + diff --git a/misc_8h.js b/misc_8h.js new file mode 100644 index 00000000..8a919a18 --- /dev/null +++ b/misc_8h.js @@ -0,0 +1,30 @@ +var misc_8h = +[ + [ "anax_t", "misc_8h.html#aa4ec3f978118cd073716e1396d9e635a", null ], + [ "mat3_t", "misc_8h.html#ad6488d0485413382423e228ce3ac6200", null ], + [ "pt2_t", "misc_8h.html#ace2351e9f7e9aa2a9e8a92587e9a7d21", null ], + [ "pt3_t", "misc_8h.html#a609605ca59353b702a45724c13019734", null ], + [ "quat_t", "misc_8h.html#a59e4a9fe55cea367ebdea8a13a6288eb", null ], + [ "vec2_t", "misc_8h.html#abcb24c1db5a04026018643bf7d1cdee6", null ], + [ "vec3_t", "misc_8h.html#ad73b1d7b4c47269a6d6a08e6adcd0e69", null ], + [ "vec_t", "misc_8h.html#a24ac45e66dd506f39699c4c2f8e04a26", null ], + [ "angleaxisBetween", "misc_8h.html#a3c40238e3620a619ddadf518321ccaae", null ], + [ "angleBetween", "misc_8h.html#a926f171b122a39c63ccb860666a7e254", null ], + [ "angleBetween", "misc_8h.html#a277dbfe7688635c28c5a1b34f32ed81e", null ], + [ "cross", "misc_8h.html#aedd0e70cfd555703b53c469312d56293", null ], + [ "dist", "misc_8h.html#a53aed2b4889c7574f51b590d0a602722", null ], + [ "dist", "misc_8h.html#ae00d8eaf9c43e838e245454ef7c290f4", null ], + [ "haversin", "misc_8h.html#a61d1dcf236aac255d384e35efd67370e", null ], + [ "headingFromRot", "misc_8h.html#ac5072a0343d0cfe703ddce456e7c5756", null ], + [ "invHaversin", "misc_8h.html#a600a2f5b7f1e654339f7177f9a64934c", null ], + [ "quaternionBetween", "misc_8h.html#afc7674301c81fd347f26a2bc0bb96979", null ], + [ "quaternionFromEuler", "misc_8h.html#a105c80e76bac24eb3e2a16bed6609a80", null ], + [ "quaternionFromEuler", "misc_8h.html#acbd2f281f58752d98b9482f3a9697363", null ], + [ "quaternionFromHeading", "misc_8h.html#aac041627690bc6f377e60b99344b8b3a", null ], + [ "rotateCovariance", "misc_8h.html#acfda874d1843fd8c03fb309b5024818f", null ], + [ "rotationBetween", "misc_8h.html#a59d7c7ddea21a014b2c831a0fc65fbb1", null ], + [ "solidAngle", "misc_8h.html#a3f9294141cc559ae94b4c026ac47d05a", null ], + [ "sphericalTriangleArea", "misc_8h.html#a8605d3a799002897f1d260cc4be95682", null ], + [ "toHomogenous", "misc_8h.html#a37eced130f5d204f8b08416e535858f0", null ], + [ "triangleArea", "misc_8h.html#a62f7d942a2445dc2c362678523966241", null ] +]; \ No newline at end of file diff --git a/misc_8h__dep__incl.map b/misc_8h__dep__incl.map new file mode 100644 index 00000000..a79fbec0 --- /dev/null +++ b/misc_8h__dep__incl.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/misc_8h__dep__incl.md5 b/misc_8h__dep__incl.md5 new file mode 100644 index 00000000..1691c6ba --- /dev/null +++ b/misc_8h__dep__incl.md5 @@ -0,0 +1 @@ +78abfbdafc5143467822dd4ae330c935 \ No newline at end of file diff --git a/misc_8h__dep__incl.png b/misc_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..a8cf7d0fdb0edf0ea808c89e77ac5a7282b1eb24 GIT binary patch literal 14656 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 + + + + + + diff --git a/misc_8h__incl.md5 b/misc_8h__incl.md5 new file mode 100644 index 00000000..d8e5ebdc --- /dev/null +++ b/misc_8h__incl.md5 @@ -0,0 +1 @@ +d454117ee4664cfc8104da1a5ba521b3 \ No newline at end of file diff --git a/misc_8h__incl.png b/misc_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..962e9eb9ca70ebfc8b98c6d7186d3e5c4f7fd5be GIT binary patch literal 12610 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 Gum2Y*2EEh( literal 0 HcmV?d00001 diff --git a/misc_8h_source.html b/misc_8h_source.html new file mode 100644 index 00000000..8efbd291 --- /dev/null +++ b/misc_8h_source.html @@ -0,0 +1,252 @@ + + + + + + + +mrs_lib: include/mrs_lib/geometry/misc.h Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    misc.h
    +
    +
    +Go to the documentation of this file.
    1 // clang: MatousFormat
    +
    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  vec_t<dims + 1> toHomogenous(const vec_t<dims>& vec)
    +
    35  {
    +
    36  const Eigen::Matrix<double, dims + 1, 1> ret((Eigen::Matrix<double, dims + 1, 1>() << vec, 1).finished());
    +
    37  return ret;
    +
    38  }
    +
    39 
    +
    40  // | ----------------- Angle-related functions ---------------- |
    +
    41 
    +
    42  /* angle-related functions //{ */
    +
    43 
    +
    44  /* headingFromRot() //{ */
    +
    45 
    +
    56  template <typename T>
    +
    57  double headingFromRot(const T& rot)
    +
    58  {
    +
    59  const vec3_t rot_vec = rot*vec3_t::UnitX();
    +
    60  return std::atan2(rot_vec.y(), rot_vec.x());
    +
    61  }
    +
    62 
    +
    63  //}
    +
    64 
    +
    65  /* angleBetween() //{ */
    +
    66 
    +
    79  double angleBetween(const vec2_t& a, const vec2_t& b);
    +
    80 
    +
    93  double angleBetween(const vec3_t& a, const vec3_t& b);
    +
    94 
    +
    95  //}
    +
    96 
    +
    97  /* angleaxisBetween() //{ */
    +
    98 
    +
    112  anax_t angleaxisBetween(const vec3_t& a, const vec3_t& b, const double tolerance = 1e-9);
    +
    113 
    +
    114  //}
    +
    115 
    +
    116  /* quaternionBetween() //{ */
    +
    117 
    +
    129  quat_t quaternionBetween(const vec3_t& a, const vec3_t& b, const double tolerance = 1e-9);
    +
    130 
    +
    131  //}
    +
    132 
    +
    133  /* rotationBetween() //{ */
    +
    134 
    +
    146  Eigen::Matrix3d rotationBetween(const vec3_t& a, const vec3_t& b, const double tolerance = 1e-9);
    +
    147 
    +
    148  //}
    +
    149 
    +
    150  /* haversin() //{ */
    +
    151 
    +
    159  double haversin(const double angle);
    +
    160 
    +
    161  //}
    +
    162 
    +
    163  /* invHaversin() //{ */
    +
    164 
    +
    172  double invHaversin(const double value);
    +
    173 
    +
    174  //}
    +
    175 
    +
    176  /* solidAngle //{ */
    +
    177 
    +
    187  double solidAngle(double a, double b, double c);
    +
    188 
    +
    189  //}
    +
    190 
    +
    191  /* quaternionFromEuler() //{ */
    +
    192 
    +
    202  quat_t quaternionFromEuler(double x, double y, double z);
    +
    203 
    +
    211  quat_t quaternionFromEuler(const Eigen::Vector3d& euler);
    +
    212 
    +
    213  //}
    +
    214 
    +
    224  quat_t quaternionFromHeading(const double heading);
    +
    225 
    +
    226  //}
    +
    227 
    +
    228  // | ----------------- Miscellaneous functions ---------------- |
    +
    229 
    +
    230  /* 2D cross() //{ */
    +
    231 
    +
    243  double cross(const vec2_t& a, const vec2_t b);
    +
    244 
    +
    245  //}
    +
    246 
    +
    247  /* vector distance //{ */
    +
    248 
    +
    257  double dist(const vec2_t& a, const vec2_t& b);
    +
    258 
    +
    267  double dist(const vec3_t& a, const vec3_t& b);
    +
    268 
    +
    269  //}
    +
    270 
    +
    271  /* triangleArea() //{ */
    +
    272 
    +
    282  double triangleArea(const double a, const double b, const double c);
    +
    283 
    +
    284  //}
    +
    285 
    +
    286  /* sphericalTriangleArea //{ */
    +
    287 
    +
    297  double sphericalTriangleArea(Eigen::Vector3d a, Eigen::Vector3d b, Eigen::Vector3d c);
    +
    298 
    +
    299  //}
    +
    300 
    +
    301  /* rotateCovariance() //{ */
    +
    302 
    +
    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
    +
    +
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    +
    double headingFromRot(const T &rot)
    Returns the heading angle from the rotation.
    Definition: misc.h:57
    +
    mat3_t rotateCovariance(const mat3_t &cov, const T &rot)
    Returns the covariance rotated using the specified rotation.
    Definition: misc.h:313
    + + + + diff --git a/mrs__lib_8h_source.html b/mrs__lib_8h_source.html new file mode 100644 index 00000000..edee54d5 --- /dev/null +++ b/mrs__lib_8h_source.html @@ -0,0 +1,106 @@ + + + + + + + +mrs_lib: include/mrs_lib/mrs_lib.h Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    mrs_lib.h
    +
    +
    +
    1 // this file is just for documentation purposes and contains no actual code
    +
    2 
    +
    7 namespace mrs_lib {}
    +
    +
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    + + + + diff --git a/mrs_logo.png b/mrs_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b44514448cbae41bafd67d982211e4729dc4ebaf GIT binary patch literal 2656 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 + + + + + + +mrs_lib: include/mrs_lib/msg_extractor.h File Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    msg_extractor.h File Reference
    +
    +
    + +

    utility functions for getting stuff from ROS msgs +More...

    +
    #include <mrs_msgs/TrackerCommand.h>
    +#include <mrs_msgs/Reference.h>
    +#include <mrs_msgs/ReferenceStamped.h>
    +#include <nav_msgs/Odometry.h>
    +#include <mrs_lib/attitude_converter.h>
    +
    + + Include dependency graph for msg_extractor.h:
    +
    +
    + +
    +

    Go to the source code of this file.

    + + + + + +

    +Namespaces

     mrs_lib
     All mrs_lib functions, classes, variables and definitions are contained in this namespace.
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    std::tuple< double, double, double > mrs_lib::getXYZ (const geometry_msgs::Point &data)
     get XYZ from geometry_msgs::Point More...
     
    std::tuple< double, double, double > mrs_lib::getXYZ (const geometry_msgs::PointConstPtr &data)
     get XYZ from geometry_msgs::PointConstPtr More...
     
    std::tuple< double, double, double > mrs_lib::getXYZ (const geometry_msgs::Vector3 &data)
     get XYZ from geometry_msgs::Vector3 More...
     
    std::tuple< double, double, double > mrs_lib::getXYZ (const geometry_msgs::Vector3ConstPtr &data)
     get XYZ from geometry_msgs::Vector3ConstPtr More...
     
    std::tuple< double, double, double > mrs_lib::getPosition (const geometry_msgs::Pose &data)
     get position from geometry_msgs::Pose More...
     
    std::tuple< double, double, double > mrs_lib::getPosition (const geometry_msgs::PoseConstPtr &data)
     get position from geometry_msgs::PoseConstPtr More...
     
    double mrs_lib::getHeading (const geometry_msgs::Pose &data)
     get heading from geometry_msgs::Pose More...
     
    double mrs_lib::getHeading (const geometry_msgs::PoseConstPtr &data)
     get heading from geometry_msgs::PoseConstPtr More...
     
    double mrs_lib::getYaw (const geometry_msgs::Pose &data)
     get yaw from geometry_msgs::Pose More...
     
    double mrs_lib::getYaw (const geometry_msgs::PoseConstPtr &data)
     get yaw from geometry_msgs::PoseConstPtr More...
     
    std::tuple< double, double, double > mrs_lib::getPosition (const geometry_msgs::PoseWithCovariance &data)
     get position from geometry_msgs::PoseWithCovariance More...
     
    std::tuple< double, double, double > mrs_lib::getPosition (const geometry_msgs::PoseWithCovarianceConstPtr &data)
     get position from geometry_msgs::PoseWithCovarianceConstPtr More...
     
    double mrs_lib::getHeading (const geometry_msgs::PoseWithCovariance &data)
     get heading from geometry_msgs::PoseWithCovariance More...
     
    double mrs_lib::getHeading (const geometry_msgs::PoseWithCovarianceConstPtr &data)
     get heading from geometry_msgs::PoseWithCovarianceConstPtr More...
     
    double mrs_lib::getYaw (const geometry_msgs::PoseWithCovariance &data)
     get yaw from geometry_msgs::PoseWithCovariance More...
     
    double mrs_lib::getYaw (const geometry_msgs::PoseWithCovarianceConstPtr &data)
     get yaw from geometry_msgs::PoseWithCovarianceConstPtr More...
     
    std::tuple< double, double, double > mrs_lib::getVelocity (const geometry_msgs::Twist &data)
     get velocity from geometry_msgs::Twist More...
     
    std::tuple< double, double, double > mrs_lib::getPosition (const geometry_msgs::TwistConstPtr &data)
     get position from geometry_msgs::TwistConstPtr More...
     
    std::tuple< double, double, double > mrs_lib::getVelocity (const geometry_msgs::TwistWithCovariance &data)
     get velocity from geometry_msgs::TwistWithCovariance More...
     
    std::tuple< double, double, double > mrs_lib::getPosition (const geometry_msgs::TwistWithCovarianceConstPtr &data)
     get position from geometry_msgs::TwistWithCovarianceConstPtr More...
     
    std::tuple< double, double, double > mrs_lib::getPosition (const nav_msgs::Odometry &data)
     get position from nav_msgs::Odometry More...
     
    std::tuple< double, double, double > mrs_lib::getPosition (const nav_msgs::OdometryConstPtr &data)
     get position from nav_msgs::OdometryConstPtr More...
     
    std::tuple< double, double, double > mrs_lib::getVelocity (const nav_msgs::Odometry &data)
     get position from nav_msgs::Odometry More...
     
    std::tuple< double, double, double > mrs_lib::getVelocity (const nav_msgs::OdometryConstPtr &data)
     get velocity from nav_msgs::OdometryConstPtr More...
     
    double mrs_lib::getHeading (const nav_msgs::Odometry &data)
     get heading from nav_msgs::Odometry More...
     
    double mrs_lib::getHeading (const nav_msgs::OdometryConstPtr &data)
     get heading from nav_msgs::OdometryConstPtr More...
     
    double mrs_lib::getYaw (const nav_msgs::Odometry &data)
     get yaw from nav_msgs::Odometry More...
     
    double mrs_lib::getYaw (const nav_msgs::OdometryConstPtr &data)
     get yaw from nav_msgs::OdometryConstPtr More...
     
    geometry_msgs::Pose mrs_lib::getPose (const nav_msgs::Odometry &data)
     returns the Pose part of the nav_msgs::Odometry message More...
     
    geometry_msgs::Pose mrs_lib::getPose (const nav_msgs::OdometryConstPtr &data)
     returns the Pose part of the nav_msgs::OdometryConstPtr message More...
     
    std::tuple< double, double, double > mrs_lib::getPosition (const mrs_msgs::TrackerCommand &data)
     get position data from mrs_msgs::TrackerCommand More...
     
    std::tuple< double, double, double > mrs_lib::getPosition (const mrs_msgs::TrackerCommandConstPtr &data)
     get position data from mrs_msgs::TrackerCommandConstPtr More...
     
    std::tuple< double, double, double > mrs_lib::getVelocity (const mrs_msgs::TrackerCommand &data)
     get velocity data from mrs_msgs::TrackerCommand More...
     
    std::tuple< double, double, double > mrs_lib::getVelocity (const mrs_msgs::TrackerCommandConstPtr &data)
     get velocity data from mrs_msgs::TrackerCommandConstPtr More...
     
    double mrs_lib::getHeading (const mrs_msgs::TrackerCommand &data)
     get heading from mrs_msgs::TrackerCommand More...
     
    double mrs_lib::getHeading (const mrs_msgs::TrackerCommandConstPtr &data)
     get heading from mrs_msgs::TrackerCommandConstPtr More...
     
    std::tuple< double, double, double > mrs_lib::getPosition (const mrs_msgs::Reference &data)
     get position from mrs_msgs::Reference More...
     
    std::tuple< double, double, double > mrs_lib::getPosition (const mrs_msgs::ReferenceConstPtr &data)
     get position from mrs_msgs::ReferenceConstPtr More...
     
    double mrs_lib::getHeading (const mrs_msgs::Reference &data)
     get heading from mrs_msgs::Reference More...
     
    double mrs_lib::getHeading (const mrs_msgs::ReferenceConstPtr &data)
     get heading from mrs_msgs::ReferenceConstPtr More...
     
    std::tuple< double, double, double > mrs_lib::getPosition (const mrs_msgs::ReferenceStamped &data)
     get position from mrs_msgs::ReferenceStamped More...
     
    std::tuple< double, double, double > mrs_lib::getPosition (const mrs_msgs::ReferenceStampedConstPtr &data)
     get position from mrs_msgs::ReferenceStampedConstPtr More...
     
    double mrs_lib::getHeading (const mrs_msgs::ReferenceStamped &data)
     get heading from mrs_msgs::ReferenceStamped More...
     
    double mrs_lib::getHeading (const mrs_msgs::ReferenceStampedConstPtr &data)
     get heading from mrs_msgs::ReferenceStampedConstPtr More...
     
    +

    Detailed Description

    +

    utility functions for getting stuff from ROS msgs

    +
    Author
    Tomas Baca - tomas.nosp@m..bac.nosp@m.a@fel.nosp@m..cvu.nosp@m.t.cz
    +
    +
    + + + + diff --git a/msg__extractor_8h.js b/msg__extractor_8h.js new file mode 100644 index 00000000..a842c3a9 --- /dev/null +++ b/msg__extractor_8h.js @@ -0,0 +1,47 @@ +var msg__extractor_8h = +[ + [ "getHeading", "msg__extractor_8h.html#a193b468ac0f1b874af53c64ea0400236", null ], + [ "getHeading", "msg__extractor_8h.html#a4c4a63d0de925cfa92316f6b5be78169", null ], + [ "getHeading", "msg__extractor_8h.html#ab57f24ac15517d030da375dfd6b27f2a", null ], + [ "getHeading", "msg__extractor_8h.html#a0006b1926f70e598a4f22d0a4d0fd177", null ], + [ "getHeading", "msg__extractor_8h.html#af4481d1d612b63a2c63f9e2dac6aaa3c", null ], + [ "getHeading", "msg__extractor_8h.html#a0285b59825283d220c6b3501853a2b28", null ], + [ "getHeading", "msg__extractor_8h.html#a58888855de6c5e0e9c0e9d9340299e54", null ], + [ "getHeading", "msg__extractor_8h.html#acfd8813200df68fad24ad3051f6b4a3d", null ], + [ "getHeading", "msg__extractor_8h.html#ad3594a3b11dd4b67c42c25e3caba896e", null ], + [ "getHeading", "msg__extractor_8h.html#adfa03f341e40b1999bc66cdf066b714e", null ], + [ "getHeading", "msg__extractor_8h.html#a482e880bcf945677389dcab02597e90f", null ], + [ "getHeading", "msg__extractor_8h.html#aba8b3d81b8855577fbe90fc9a2f84fb6", null ], + [ "getPose", "msg__extractor_8h.html#a1cd3887061c0b071a29dbbfe1b8a11dd", null ], + [ "getPose", "msg__extractor_8h.html#acb6bfcfa0d9432d2184852b4f4d2694b", null ], + [ "getPosition", "msg__extractor_8h.html#aafe68a11e627c33f976dac00f49edb03", null ], + [ "getPosition", "msg__extractor_8h.html#a6ee4630b5dd76e9c67f00e7f4ce35806", null ], + [ "getPosition", "msg__extractor_8h.html#a4a813c8d2b7a92090ef94ed0ccc1f2d7", null ], + [ "getPosition", "msg__extractor_8h.html#a2f32a3fa1e335cf1c33833ef33838f36", null ], + [ "getPosition", "msg__extractor_8h.html#af2a47eec589a6a62199f9fa2b4879d5b", null ], + [ "getPosition", "msg__extractor_8h.html#addf482f99d48899ccf29a9e89eb5771e", null ], + [ "getPosition", "msg__extractor_8h.html#a8f78d985e8d87688482e5e30c948b067", null ], + [ "getPosition", "msg__extractor_8h.html#aa767373d0d66e633d754d5fa4db1afca", null ], + [ "getPosition", "msg__extractor_8h.html#aa1c31d89c94806084e8da6fecd4ff575", null ], + [ "getPosition", "msg__extractor_8h.html#ae4a1dc71e3e48fa26fa8d2fed9211c8c", null ], + [ "getPosition", "msg__extractor_8h.html#a4c51dc5a87098b8ecd7d7e78599be7b8", null ], + [ "getPosition", "msg__extractor_8h.html#af85023d127c2383e6825ab7e4f7da1fb", null ], + [ "getPosition", "msg__extractor_8h.html#a6beef9718623cdac64b8b5ea35c8be4a", null ], + [ "getPosition", "msg__extractor_8h.html#a52981dc7eab7573aedf1d447cb40b1fb", null ], + [ "getVelocity", "msg__extractor_8h.html#a6e64da46123dd4cc793419585a66e54c", null ], + [ "getVelocity", "msg__extractor_8h.html#a0669aa00311586cf9882f1bccff07d16", null ], + [ "getVelocity", "msg__extractor_8h.html#ade26d077c3e43c9f201a2e8d73dba2b7", null ], + [ "getVelocity", "msg__extractor_8h.html#ad278e1089b273b3e0216977ee8df8ac5", null ], + [ "getVelocity", "msg__extractor_8h.html#aab2704bf692a6cfc5674272fc6ff06ca", null ], + [ "getVelocity", "msg__extractor_8h.html#af8c731a97cd737d35d9524ec60f4ee2f", null ], + [ "getXYZ", "msg__extractor_8h.html#a9ad821408d076d95467fc662b1dac1ab", null ], + [ "getXYZ", "msg__extractor_8h.html#a8fc9b477f93c9b8694fb8f90956ae830", null ], + [ "getXYZ", "msg__extractor_8h.html#af79ccb18192e6ff1f1fc7fdafdee0a0b", null ], + [ "getXYZ", "msg__extractor_8h.html#a32ae31e9589cb55806ec32edcf79f928", null ], + [ "getYaw", "msg__extractor_8h.html#af1993419f7b19d38bdbfe3ceb5b7350f", null ], + [ "getYaw", "msg__extractor_8h.html#acc3f167cadca01d5e92be7dc43078feb", null ], + [ "getYaw", "msg__extractor_8h.html#a13152460c1973b54f71f230340b20494", null ], + [ "getYaw", "msg__extractor_8h.html#a2aa307f37eb6f60fc4d360adb8559946", null ], + [ "getYaw", "msg__extractor_8h.html#af17cc11983807fb3d6bd17092fa30fc4", null ], + [ "getYaw", "msg__extractor_8h.html#af62f21eed6f44954b6aefbf0afbbf2e0", null ] +]; \ No newline at end of file diff --git a/msg__extractor_8h__incl.map b/msg__extractor_8h__incl.map new file mode 100644 index 00000000..f413913f --- /dev/null +++ b/msg__extractor_8h__incl.map @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/msg__extractor_8h__incl.md5 b/msg__extractor_8h__incl.md5 new file mode 100644 index 00000000..f6b35c1d --- /dev/null +++ b/msg__extractor_8h__incl.md5 @@ -0,0 +1 @@ +822d31ce4f7ea55bf224abc13d0c07ba \ No newline at end of file diff --git a/msg__extractor_8h__incl.png b/msg__extractor_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..f994d1a3b4173fbafb1b960577f60e0e739339ce GIT binary patch literal 63802 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�GW3J7*VD6`6lGN9RxaX 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 + + + + + + +mrs_lib: include/mrs_lib/msg_extractor.h Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    msg_extractor.h
    +
    +
    +Go to the documentation of this file.
    1 // clang: TomasFormat
    +
    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 
    + +
    16 
    +
    17 namespace mrs_lib
    +
    18 {
    +
    19 
    +
    20 /* geometry_msgs::Point //{ */
    +
    21 
    +
    29 std::tuple<double, double, double> getXYZ(const geometry_msgs::Point& data) {
    +
    30 
    +
    31  double x = data.x;
    +
    32  double y = data.y;
    +
    33  double z = data.z;
    +
    34 
    +
    35  return std::tuple(x, y, z);
    +
    36 }
    +
    37 
    +
    45 std::tuple<double, double, double> getXYZ(const geometry_msgs::PointConstPtr& data) {
    +
    46 
    +
    47  return getXYZ(*data);
    +
    48 }
    +
    49 
    +
    50 //}
    +
    51 
    +
    52 /* geometry_msgs::Vector3 //{ */
    +
    53 
    +
    61 std::tuple<double, double, double> getXYZ(const geometry_msgs::Vector3& data) {
    +
    62 
    +
    63  double x = data.x;
    +
    64  double y = data.y;
    +
    65  double z = data.z;
    +
    66 
    +
    67  return std::tuple(x, y, z);
    +
    68 }
    +
    69 
    +
    77 std::tuple<double, double, double> getXYZ(const geometry_msgs::Vector3ConstPtr& data) {
    +
    78 
    +
    79  return getXYZ(*data);
    +
    80 }
    +
    81 
    +
    82 //}
    +
    83 
    +
    84 /* geometry_msgs::Pose //{ */
    +
    85 
    +
    86 /* getPosition() //{ */
    +
    87 
    +
    95 std::tuple<double, double, double> getPosition(const geometry_msgs::Pose& data) {
    +
    96 
    +
    97  return getXYZ(data.position);
    +
    98 }
    +
    99 
    +
    107 std::tuple<double, double, double> getPosition(const geometry_msgs::PoseConstPtr& data) {
    +
    108 
    +
    109  return getPosition(*data);
    +
    110 }
    +
    111 
    +
    112 //}
    +
    113 
    +
    114 /* getHeading() //{ */
    +
    115 
    +
    123 double getHeading(const geometry_msgs::Pose& data) {
    +
    124 
    +
    125  return mrs_lib::AttitudeConverter(data.orientation).getHeading();
    +
    126 }
    +
    127 
    +
    135 double getHeading(const geometry_msgs::PoseConstPtr& data) {
    +
    136 
    +
    137  return getHeading(*data);
    +
    138 }
    +
    139 
    +
    140 //}
    +
    141 
    +
    142 /* getYaw() //{ */
    +
    143 
    +
    151 double getYaw(const geometry_msgs::Pose& data) {
    +
    152 
    +
    153  return mrs_lib::AttitudeConverter(data.orientation).getYaw();
    +
    154 }
    +
    155 
    +
    163 double getYaw(const geometry_msgs::PoseConstPtr& data) {
    +
    164 
    +
    165  return getYaw(*data);
    +
    166 }
    +
    167 
    +
    168 //}
    +
    169 
    +
    170 //}
    +
    171 
    +
    172 /* geometry_msgs::PoseWithCovariance //{ */
    +
    173 
    +
    174 /* getPosition() //{ */
    +
    175 
    +
    183 std::tuple<double, double, double> getPosition(const geometry_msgs::PoseWithCovariance& data) {
    +
    184 
    +
    185  return getPosition(data.pose);
    +
    186 }
    +
    187 
    +
    195 std::tuple<double, double, double> getPosition(const geometry_msgs::PoseWithCovarianceConstPtr& data) {
    +
    196 
    +
    197  return getPosition(*data);
    +
    198 }
    +
    199 
    +
    200 //}
    +
    201 
    +
    202 /* getHeading() //{ */
    +
    203 
    +
    211 double getHeading(const geometry_msgs::PoseWithCovariance& data) {
    +
    212 
    +
    213  return getHeading(data.pose);
    +
    214 }
    +
    215 
    +
    223 double getHeading(const geometry_msgs::PoseWithCovarianceConstPtr& data) {
    +
    224 
    +
    225  return getHeading(*data);
    +
    226 }
    +
    227 
    +
    228 //}
    +
    229 
    +
    230 /* getYaw() //{ */
    +
    231 
    +
    239 double getYaw(const geometry_msgs::PoseWithCovariance& data) {
    +
    240 
    +
    241  return getYaw(data.pose);
    +
    242 }
    +
    243 
    +
    251 double getYaw(const geometry_msgs::PoseWithCovarianceConstPtr& data) {
    +
    252 
    +
    253  return getYaw(*data);
    +
    254 }
    +
    255 
    +
    256 //}
    +
    257 
    +
    258 //}
    +
    259 
    +
    260 /* geometry_msgs::Twist //{ */
    +
    261 
    +
    262 /* getVelocity() //{ */
    +
    263 
    +
    271 std::tuple<double, double, double> getVelocity(const geometry_msgs::Twist& data) {
    +
    272 
    +
    273  return getXYZ(data.linear);
    +
    274 }
    +
    275 
    +
    283 std::tuple<double, double, double> getPosition(const geometry_msgs::TwistConstPtr& data) {
    +
    284 
    +
    285  return getVelocity(*data);
    +
    286 }
    +
    287 
    +
    288 //}
    +
    289 
    +
    290 //}
    +
    291 
    +
    292 /* geometry_msgs::TwistWithCovariance //{ */
    +
    293 
    +
    294 /* getVelocity() //{ */
    +
    295 
    +
    303 std::tuple<double, double, double> getVelocity(const geometry_msgs::TwistWithCovariance& data) {
    +
    304 
    +
    305  return getVelocity(data.twist);
    +
    306 }
    +
    307 
    +
    315 std::tuple<double, double, double> getPosition(const geometry_msgs::TwistWithCovarianceConstPtr& data) {
    +
    316 
    +
    317  return getVelocity(*data);
    +
    318 }
    +
    319 
    +
    320 //}
    +
    321 
    +
    322 //}
    +
    323 
    +
    324 /* nav_msgs::Odometry //{ */
    +
    325 
    +
    326 /* getPosition() //{ */
    +
    327 
    +
    335 std::tuple<double, double, double> getPosition(const nav_msgs::Odometry& data) {
    +
    336 
    +
    337  return getPosition(data.pose);
    +
    338 }
    +
    339 
    +
    347 std::tuple<double, double, double> getPosition(const nav_msgs::OdometryConstPtr& data) {
    +
    348 
    +
    349  return getPosition(*data);
    +
    350 }
    +
    351 
    +
    352 //}
    +
    353 
    +
    354 /* getVelocity() //{ */
    +
    355 
    +
    363 std::tuple<double, double, double> getVelocity(const nav_msgs::Odometry& data) {
    +
    364 
    +
    365  return getVelocity(data.twist);
    +
    366 }
    +
    367 
    +
    375 std::tuple<double, double, double> getVelocity(const nav_msgs::OdometryConstPtr& data) {
    +
    376 
    +
    377  return getVelocity(*data);
    +
    378 }
    +
    379 
    +
    380 //}
    +
    381 
    +
    382 /* getHeading() //{ */
    +
    383 
    +
    391 double getHeading(const nav_msgs::Odometry& data) {
    +
    392 
    +
    393  return getHeading(data.pose);
    +
    394 }
    +
    395 
    +
    403 double getHeading(const nav_msgs::OdometryConstPtr& data) {
    +
    404 
    +
    405  return getHeading(*data);
    +
    406 }
    +
    407 
    +
    408 //}
    +
    409 
    +
    410 /* getYaw() //{ */
    +
    411 
    +
    419 double getYaw(const nav_msgs::Odometry& data) {
    +
    420 
    +
    421  return getYaw(data.pose);
    +
    422 }
    +
    423 
    +
    431 double getYaw(const nav_msgs::OdometryConstPtr& data) {
    +
    432 
    +
    433  return getYaw(*data);
    +
    434 }
    +
    435 
    +
    436 //}
    +
    437 
    +
    438 /* getPose() //{ */
    +
    439 
    +
    447 geometry_msgs::Pose getPose(const nav_msgs::Odometry& data) {
    +
    448 
    +
    449  return data.pose.pose;
    +
    450 }
    +
    451 
    +
    459 geometry_msgs::Pose getPose(const nav_msgs::OdometryConstPtr& data) {
    +
    460 
    +
    461  return getPose(*data);
    +
    462 }
    +
    463 
    +
    464 //}
    +
    465 
    +
    466 //}
    +
    467 
    +
    468 /* mrs_msgs::TrackerCommand //{ */
    +
    469 
    +
    470 /* getPosition() //{ */
    +
    471 
    +
    479 std::tuple<double, double, double> getPosition(const mrs_msgs::TrackerCommand& data) {
    +
    480 
    +
    481  return getXYZ(data.position);
    +
    482 }
    +
    483 
    +
    491 std::tuple<double, double, double> getPosition(const mrs_msgs::TrackerCommandConstPtr& data) {
    +
    492 
    +
    493  return getPosition(*data);
    +
    494 }
    +
    495 
    +
    496 //}
    +
    497 
    +
    498 /* getVelocity() //{ */
    +
    499 
    +
    507 std::tuple<double, double, double> getVelocity(const mrs_msgs::TrackerCommand& data) {
    +
    508 
    +
    509  return getXYZ(data.velocity);
    +
    510 }
    +
    511 
    +
    519 std::tuple<double, double, double> getVelocity(const mrs_msgs::TrackerCommandConstPtr& data) {
    +
    520 
    +
    521  return getVelocity(*data);
    +
    522 }
    +
    523 
    +
    524 //}
    +
    525 
    +
    526 /* getHeading() //{ */
    +
    527 
    +
    535 double getHeading(const mrs_msgs::TrackerCommand& data) {
    +
    536 
    +
    537  double heading = 0;
    +
    538 
    +
    539  if (data.use_heading) {
    +
    540 
    +
    541  heading = data.heading;
    +
    542 
    +
    543  } else if (data.use_orientation) {
    +
    544 
    +
    545  heading = mrs_lib::AttitudeConverter(data.orientation).getHeading();
    +
    546  }
    +
    547 
    +
    548  return heading;
    +
    549 }
    +
    550 
    +
    558 double getHeading(const mrs_msgs::TrackerCommandConstPtr& data) {
    +
    559 
    +
    560  return getHeading(*data);
    +
    561 }
    +
    562 
    +
    563 //}
    +
    564 
    +
    565 //}
    +
    566 
    +
    567 /* mrs_msgs::Reference //{ */
    +
    568 
    +
    569 /* getPosition() //{ */
    +
    570 
    +
    578 std::tuple<double, double, double> getPosition(const mrs_msgs::Reference& data) {
    +
    579 
    +
    580  return getXYZ(data.position);
    +
    581 }
    +
    582 
    +
    590 std::tuple<double, double, double> getPosition(const mrs_msgs::ReferenceConstPtr& data) {
    +
    591 
    +
    592  return getPosition(*data);
    +
    593 }
    +
    594 
    +
    595 //}
    +
    596 
    +
    597 /* getHeading() //{ */
    +
    598 
    +
    606 double getHeading(const mrs_msgs::Reference& data) {
    +
    607 
    +
    608  return data.heading;
    +
    609 }
    +
    610 
    +
    618 double getHeading(const mrs_msgs::ReferenceConstPtr& data) {
    +
    619 
    +
    620  return getHeading(*data);
    +
    621 }
    +
    622 
    +
    623 //}
    +
    624 
    +
    625 //}
    +
    626 
    +
    627 /* mrs_msgs::ReferenceStamped //{ */
    +
    628 
    +
    629 /* getPosition() //{ */
    +
    630 
    +
    638 std::tuple<double, double, double> getPosition(const mrs_msgs::ReferenceStamped& data) {
    +
    639 
    +
    640  return getPosition(data.reference);
    +
    641 }
    +
    642 
    +
    650 std::tuple<double, double, double> getPosition(const mrs_msgs::ReferenceStampedConstPtr& data) {
    +
    651 
    +
    652  return getPosition(*data);
    +
    653 }
    +
    654 
    +
    655 //}
    +
    656 
    +
    657 /* getHeading() //{ */
    +
    658 
    +
    666 double getHeading(const mrs_msgs::ReferenceStamped& data) {
    +
    667 
    +
    668  return getHeading(data.reference);
    +
    669 }
    +
    670 
    +
    678 double getHeading(const mrs_msgs::ReferenceStampedConstPtr& data) {
    +
    679 
    +
    680  return getHeading(*data);
    +
    681 }
    +
    682 
    +
    683 //}
    +
    684 
    +
    685 //}
    +
    686 
    +
    687 } // namespace mrs_lib
    +
    688 
    +
    689 //}
    +
    690 
    +
    691 #endif // MRS_LIB_MSG_EXTRACTOR_H
    +
    +
    +
    double getHeading(void)
    get the angle of the rotated x-axis in the original XY plane, a.k.a
    Definition: attitude_converter.cpp:254
    +
    std::tuple< double, double, double > getXYZ(const geometry_msgs::Point &data)
    get XYZ from geometry_msgs::Point
    Definition: msg_extractor.h:29
    +
    Conversions between various representations of object attitude in 3D. Supports Quaternions,...
    +
    std::tuple< double, double, double > getPosition(const geometry_msgs::Pose &data)
    get position from geometry_msgs::Pose
    Definition: msg_extractor.h:95
    +
    double getYaw(void)
    get the yaw angle
    Definition: attitude_converter.cpp:233
    +
    std::tuple< double, double, double > getVelocity(const geometry_msgs::Twist &data)
    get velocity from geometry_msgs::Twist
    Definition: msg_extractor.h:271
    +
    The main convertor class. Instantiate with any type in constructor and get the value in any other typ...
    Definition: attitude_converter.h:153
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    +
    double getHeading(const geometry_msgs::Pose &data)
    get heading from geometry_msgs::Pose
    Definition: msg_extractor.h:123
    +
    double getYaw(const geometry_msgs::Pose &data)
    get yaw from geometry_msgs::Pose
    Definition: msg_extractor.h:151
    +
    geometry_msgs::Pose getPose(const nav_msgs::Odometry &data)
    returns the Pose part of the nav_msgs::Odometry message
    Definition: msg_extractor.h:447
    + + + + diff --git a/mutex_8h.html b/mutex_8h.html new file mode 100644 index 00000000..5a6b6782 --- /dev/null +++ b/mutex_8h.html @@ -0,0 +1,182 @@ + + + + + + + +mrs_lib: include/mrs_lib/mutex.h File Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    mutex.h File Reference
    +
    +
    + +

    Defines helper routines for getting and setting variables under mutex locks. +More...

    +
    #include <iostream>
    +#include <mutex>
    +#include <tuple>
    +
    + + Include dependency graph for mutex.h:
    +
    +
    + +
    + + This graph shows which files directly or indirectly include this file:
    +
    +
    + +
    +

    Go to the source code of this file.

    + + + + + +

    +Namespaces

     mrs_lib
     All mrs_lib functions, classes, variables and definitions are contained in this namespace.
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    template<class... GetArgs, class... SetArgs>
    std::tuple< GetArgs... > mrs_lib::get_set_mutexed (std::mutex &mut, std::tuple< GetArgs &... > get, std::tuple< SetArgs... > from_set, std::tuple< SetArgs &... > to_set)
     thread-safe getter and setter for values of variables (args) More...
     
    template<class... Args>
    std::tuple< Args... > mrs_lib::get_mutexed (std::mutex &mut, Args &... args)
     thread-safe getter for values of variables (args) More...
     
    template<class T >
    mrs_lib::get_mutexed (std::mutex &mut, T &arg)
     thread-safe getter a value from a variable More...
     
    template<class T >
    void mrs_lib::set_mutexed_impl (const T what, T &where)
     base case of the variadic template for set_mutexed() More...
     
    template<class T , class... Args>
    void mrs_lib::set_mutexed_impl (const T what, T &where, Args... args)
     general case of the variadic template for set_mutexed() More...
     
    template<class T >
    auto mrs_lib::set_mutexed (std::mutex &mut, const T what, T &where)
     thread-safe setter for a variable More...
     
    template<class... Args>
    auto mrs_lib::set_mutexed (std::mutex &mut, Args &... args)
     thread-safe setter for multiple variables More...
     
    template<class... Args>
    auto mrs_lib::set_mutexed (std::mutex &mut, const std::tuple< Args... > from, std::tuple< Args &... > to)
     thread-safe setter for multiple variables More...
     
    +

    Detailed Description

    +

    Defines helper routines for getting and setting variables under mutex locks.

    +
    Author
    Tomas Baca - tomas.nosp@m..bac.nosp@m.a@fel.nosp@m..cvu.nosp@m.t.cz
    +
    +
    + + + + diff --git a/mutex_8h.js b/mutex_8h.js new file mode 100644 index 00000000..178f6c4e --- /dev/null +++ b/mutex_8h.js @@ -0,0 +1,11 @@ +var mutex_8h = +[ + [ "get_mutexed", "mutex_8h.html#aaf62529e79b5d131ea5c0fedee10b9ca", null ], + [ "get_mutexed", "mutex_8h.html#aa3a541823230c37a69e51d4e90aa54e0", null ], + [ "get_set_mutexed", "mutex_8h.html#ae41b720a78b36db5ac51d8213972d001", null ], + [ "set_mutexed", "mutex_8h.html#aa09cacb136795c2831ed0499518a2b17", null ], + [ "set_mutexed", "mutex_8h.html#a953c3bb11623623e1daef402272e6833", null ], + [ "set_mutexed", "mutex_8h.html#afae3eb66a47b80bd8bae3b4a0c6a9368", null ], + [ "set_mutexed_impl", "mutex_8h.html#acc32702fff28a4a1515a586a94f51e79", null ], + [ "set_mutexed_impl", "mutex_8h.html#ad43e8bfd91df3dae404738c355b136e9", null ] +]; \ No newline at end of file diff --git a/mutex_8h__dep__incl.map b/mutex_8h__dep__incl.map new file mode 100644 index 00000000..a71f3542 --- /dev/null +++ b/mutex_8h__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/mutex_8h__dep__incl.md5 b/mutex_8h__dep__incl.md5 new file mode 100644 index 00000000..eefc72f0 --- /dev/null +++ b/mutex_8h__dep__incl.md5 @@ -0,0 +1 @@ +4843c53167df421caac8bf38d3eb6700 \ No newline at end of file diff --git a/mutex_8h__dep__incl.png b/mutex_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..a155a7e4690753ee848f6c5b9982c7e10cb4c5cc GIT binary patch literal 4739 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 BA%Oq@ literal 0 HcmV?d00001 diff --git a/mutex_8h__incl.map b/mutex_8h__incl.map new file mode 100644 index 00000000..f32be61a --- /dev/null +++ b/mutex_8h__incl.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/mutex_8h__incl.md5 b/mutex_8h__incl.md5 new file mode 100644 index 00000000..df5ab5cc --- /dev/null +++ b/mutex_8h__incl.md5 @@ -0,0 +1 @@ +5d2d25333eabfe8c37e7f100e74652bb \ No newline at end of file diff --git a/mutex_8h__incl.png b/mutex_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..0a64657708fbc65dd3a64aa38591cc69300f1a83 GIT binary patch literal 5337 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

    $AsOMZVPFvbD1_Dw_bAWM;X zR&H)J1|#pgWdYvWNJ)Lj&b|h`1Tzj?Kxygku2_1|Gh$C#iZGa~Kum0Gv-dhUGt*;s zJQqK|-SR*t8jS|U2OK~5(Se>i`kkb0Un;j2DH++0Uy!l!#M&gLTfp@EHmDV|jmW`) zfws0b+3tQuP!fbhMU?{f?7^4-bq|y=UEKsM_Ttm0mm7D!AgXG&5t0ChtgNh(5||v) zVq$-m2j6W}q)`pa#)!oHb>`|UOH&{8dYjm;r{~%X&xN_ literal 0 HcmV?d00001 diff --git a/mutex_8h_source.html b/mutex_8h_source.html new file mode 100644 index 00000000..d83ac055 --- /dev/null +++ b/mutex_8h_source.html @@ -0,0 +1,195 @@ + + + + + + + +mrs_lib: include/mrs_lib/mutex.h Source File + + + + + + + + + + + + + +

    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    mutex.h
    +
    +
    +Go to the documentation of this file.
    1 
    +
    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 
    +
    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 
    +
    47 template <class... Args>
    +
    48 std::tuple<Args...> get_mutexed(std::mutex& mut, Args&... args) {
    +
    49 
    +
    50  std::scoped_lock lock(mut);
    +
    51 
    +
    52  std::tuple result = std::tuple(args...);
    +
    53 
    +
    54  return result;
    +
    55 }
    +
    56 
    +
    57 
    +
    67 template <class T>
    +
    68 T get_mutexed(std::mutex& mut, T& arg) {
    +
    69 
    +
    70  std::scoped_lock lock(mut);
    +
    71 
    +
    72  return arg;
    +
    73 }
    +
    74 
    +
    82 template <class T>
    +
    83 void set_mutexed_impl(const T what, T& where) {
    +
    84 
    +
    85  where = what;
    +
    86 }
    +
    87 
    +
    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 
    +
    115 template <class T>
    +
    116 auto set_mutexed(std::mutex& mut, const T what, T& where) {
    +
    117 
    +
    118  std::scoped_lock lock(mut);
    +
    119 
    +
    120  where = what;
    +
    121 
    +
    122  return where;
    +
    123 }
    +
    124 
    +
    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 
    +
    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
    +
    +
    +
    std::tuple< Args... > get_mutexed(std::mutex &mut, Args &... args)
    thread-safe getter for values of variables (args)
    Definition: mutex.h:48
    +
    void set_mutexed_impl(const T what, T &where)
    base case of the variadic template for set_mutexed()
    Definition: mutex.h:83
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    +
    std::tuple< GetArgs... > get_set_mutexed(std::mutex &mut, std::tuple< GetArgs &... > get, std::tuple< SetArgs... > from_set, std::tuple< SetArgs &... > to_set)
    thread-safe getter and setter for values of variables (args)
    Definition: mutex.h:28
    +
    auto set_mutexed(std::mutex &mut, const T what, T &where)
    thread-safe setter for a variable
    Definition: mutex.h:116
    + + + + diff --git a/namespacemembers.html b/namespacemembers.html new file mode 100644 index 00000000..a241c98a --- /dev/null +++ b/namespacemembers.html @@ -0,0 +1,172 @@ + + + + + + + +mrs_lib: Namespace Members + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all documented namespace members with links to the namespaces they belong to:
    + +

    - c -

    + + +

    - g -

    + + +

    - m -

    + + +

    - p -

      +
    • ParamLoader::loadParam2< ros::Duration >() +: mrs_lib +
    • +
    • probit() +: mrs_lib +
    • +
    + + +

    - r -

    + + +

    - s -

    +
    +
    + + + + diff --git a/namespacemembers_func.html b/namespacemembers_func.html new file mode 100644 index 00000000..5d3b12f3 --- /dev/null +++ b/namespacemembers_func.html @@ -0,0 +1,165 @@ + + + + + + + +mrs_lib: Namespace Members + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - c -

    + + +

    - g -

    + + +

    - p -

      +
    • ParamLoader::loadParam2< ros::Duration >() +: mrs_lib +
    • +
    • probit() +: mrs_lib +
    • +
    + + +

    - r -

    + + +

    - s -

    +
    +
    + + + + diff --git a/namespacemembers_type.html b/namespacemembers_type.html new file mode 100644 index 00000000..b70510bf --- /dev/null +++ b/namespacemembers_type.html @@ -0,0 +1,102 @@ + + + + + + + +mrs_lib: Namespace Members + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    + + + + diff --git a/namespacemrs__lib.html b/namespacemrs__lib.html new file mode 100644 index 00000000..6a105cbe --- /dev/null +++ b/namespacemrs__lib.html @@ -0,0 +1,2589 @@ + + + + + + + +mrs_lib: mrs_lib Namespace Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    mrs_lib Namespace Reference
    +
    +
    + +

    All mrs_lib functions, classes, variables and definitions are contained in this namespace. +More...

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Classes

    class  AtomicScopeFlag
     Convenience class for automatically setting and unsetting an atomic boolean based on the object's scope. Useful e.g. for indicating whether a thread is running or not. More...
     
    class  AttitudeConverter
     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, as: tf::Quaternion tf1_quaternion = AttitudeConverter(roll, pitch, yaw); All the default Euler angles are in the extrinsic RPY notation. More...
     
    class  BatchVisualizer
     library for drawing large amounts of geometric objects in RVIZ at the same time More...
     
    class  DKF
     Implementation of the Degenerate measurement Linear Kalman filter. More...
     
    class  DynamicPublisher
     A helper class for easy publishing of ROS messages for debugging purposes. More...
     
    class  DynamicReconfigureMgr
     
    struct  eigenvector_exception
     This exception may be thrown when solving the generalized eigenvalue problem with the M and N matrices. More...
     
    class  EulerAttitude
     A small class for storing the Euler angles. More...
     
    class  IirFilter
     
    struct  ImagePubliserData
     
    class  ImagePublisher
     
    struct  Intersection
     
    class  JLKF
     
    class  KalmanFilter
     This abstract class defines common interfaces and types for a generic Kalman filter. More...
     
    class  KalmanFilterAloamGarm
     This abstract class defines common interfaces and types for a generic Kalman filter. More...
     
    class  LKF
     Implementation of the Linear Kalman filter [3]. More...
     
    class  LKF_MRS_odom
     
    class  MedianFilter
     Implementation of a median filter with a fixed-length buffer. More...
     
    class  MRSTimer
     Common wrapper representing the functionality of the ros::Timer. More...
     
    class  NCLKF
     This class implements the norm-constrained linear Kalman filter [5]. More...
     
    class  NCLKF_partial
     This class implements the partially norm-constrained linear Kalman filter [5]. More...
     
    class  NCUKF
     
    class  NotchFilter
     
    class  ParamLoader
     Convenience class for loading parameters from rosparam server. More...
     
    class  ParamProvider
     Helper class for ParamLoader. More...
     
    class  Polygon
     
    class  Profiler
     
    class  PublisherHandler
     user wrapper of the publisher handler implementation More...
     
    class  PublisherHandler_impl
     implementation of the publisher handler More...
     
    class  Repredictor
     Implementation of the Repredictor for fusing measurements with variable delays. More...
     
    class  RepredictorAloamgarm
     Implementation of the RepredictorAloamgarm for fusing measurements with variable delays. More...
     
    class  RHEIV
     Implementation of the Reduced Heteroscedastic Errors In Variables surface fitting algorithm [2]. More...
     
    class  ROSTimer
     ros::Timer wrapper. The interface is the same as with ros::Timer, except for the initialization method. More...
     
    class  Routine
     
    class  SafetyZone
     
    class  ScopeTimer
     Simple timer which will time a duration of a scope and checkpoints inside the scope in ros time and std::chrono time. More...
     
    class  ScopeTimerLogger
     Simple file logger of scope timer and its checkpoints. More...
     
    class  ServiceClientHandler
     user wrapper of the service client handler implementation More...
     
    class  ServiceClientHandler_impl
     implementation of the service client handler More...
     
    class  SubscribeHandler
     The main class for ROS topic subscription, message timeout handling etc. More...
     
    struct  SubscribeHandlerOptions
     A helper class to simplify setup of SubscribeHandler construction. This class is passed to the SubscribeHandler constructor and specifies its common options. More...
     
    class  ThreadTimer
     Custom thread-based Timers with the same interface as mrs_lib::ROSTimer. More...
     
    class  TimeoutManager
     TODO. More...
     
    class  TransformBroadcaster
     Wrapper for the tf2_ros::TransformBroadcaster. With each sendTransform() command, the message is checked against the last message with the same frame IDs. If the transform was already published in this ros::Time step, then the transform is skipped. Prevents endless stream of warnings from spamming the console output. More...
     
    class  Transformer
     A convenience wrapper class for ROS's native TF2 API to simplify transforming of various messages. More...
     
    class  UKF
     Implementation of the Unscented Kalman filter [4]. More...
     
    class  varstepLKF
     
    class  Vector3Converter
     Converter of Vector3 representations. Instantiate it with any type of vector3 in constructor and convert it by assigning it to any other type of vector3 variable. More...
     
    class  VisualObject
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Typedefs

    +template<typename SubscribeHandler >
    using message_type = typename SubscribeHandler::message_type
     Helper alias for convenient extraction of handled message type from a SubscribeHandlerPtr.
     
    +using lkf_t = LKF< n_states, n_inputs, n_measurements >
     
    +using rep_t = Repredictor< lkf_t >
     
    +using rheiv_t = RHEIV< n_states, n_params >
     
    +using theta_t = rheiv_t::theta_t
     
    +using xs_t = rheiv_t::xs_t
     
    +using zs_t = rheiv_t::zs_t
     
    +using P_t = rheiv_t::P_t
     
    +using Ps_t = rheiv_t::Ps_t
     
    +using f_z_t = rheiv_t::f_z_t
     
    +using dzdx_t = rheiv_t::dzdx_t
     
    +using ukf_t = UKF< n_states, n_inputs, n_measurements >
     
    +using dumbrep_t = Repredictor< lkf_t, true >
     
    + + + + + +

    +Enumerations

    enum  RPY_convention_t { RPY_INTRINSIC = 1, +RPY_EXTRINSIC = 2 + }
     
    enum  MarkerType { POINT = 0, +LINE = 1, +TRIANGLE = 2 + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    double probit (const double quantile)
     Inverse cumulative distribution function of the standard normal probability distribution. More...
     
    std::tuple< double, double, double > getXYZ (const geometry_msgs::Point &data)
     get XYZ from geometry_msgs::Point More...
     
    std::tuple< double, double, double > getXYZ (const geometry_msgs::PointConstPtr &data)
     get XYZ from geometry_msgs::PointConstPtr More...
     
    std::tuple< double, double, double > getXYZ (const geometry_msgs::Vector3 &data)
     get XYZ from geometry_msgs::Vector3 More...
     
    std::tuple< double, double, double > getXYZ (const geometry_msgs::Vector3ConstPtr &data)
     get XYZ from geometry_msgs::Vector3ConstPtr More...
     
    std::tuple< double, double, double > getPosition (const geometry_msgs::Pose &data)
     get position from geometry_msgs::Pose More...
     
    std::tuple< double, double, double > getPosition (const geometry_msgs::PoseConstPtr &data)
     get position from geometry_msgs::PoseConstPtr More...
     
    double getHeading (const geometry_msgs::Pose &data)
     get heading from geometry_msgs::Pose More...
     
    double getHeading (const geometry_msgs::PoseConstPtr &data)
     get heading from geometry_msgs::PoseConstPtr More...
     
    double getYaw (const geometry_msgs::Pose &data)
     get yaw from geometry_msgs::Pose More...
     
    double getYaw (const geometry_msgs::PoseConstPtr &data)
     get yaw from geometry_msgs::PoseConstPtr More...
     
    std::tuple< double, double, double > getPosition (const geometry_msgs::PoseWithCovariance &data)
     get position from geometry_msgs::PoseWithCovariance More...
     
    std::tuple< double, double, double > getPosition (const geometry_msgs::PoseWithCovarianceConstPtr &data)
     get position from geometry_msgs::PoseWithCovarianceConstPtr More...
     
    double getHeading (const geometry_msgs::PoseWithCovariance &data)
     get heading from geometry_msgs::PoseWithCovariance More...
     
    double getHeading (const geometry_msgs::PoseWithCovarianceConstPtr &data)
     get heading from geometry_msgs::PoseWithCovarianceConstPtr More...
     
    double getYaw (const geometry_msgs::PoseWithCovariance &data)
     get yaw from geometry_msgs::PoseWithCovariance More...
     
    double getYaw (const geometry_msgs::PoseWithCovarianceConstPtr &data)
     get yaw from geometry_msgs::PoseWithCovarianceConstPtr More...
     
    std::tuple< double, double, double > getVelocity (const geometry_msgs::Twist &data)
     get velocity from geometry_msgs::Twist More...
     
    std::tuple< double, double, double > getPosition (const geometry_msgs::TwistConstPtr &data)
     get position from geometry_msgs::TwistConstPtr More...
     
    std::tuple< double, double, double > getVelocity (const geometry_msgs::TwistWithCovariance &data)
     get velocity from geometry_msgs::TwistWithCovariance More...
     
    std::tuple< double, double, double > getPosition (const geometry_msgs::TwistWithCovarianceConstPtr &data)
     get position from geometry_msgs::TwistWithCovarianceConstPtr More...
     
    std::tuple< double, double, double > getPosition (const nav_msgs::Odometry &data)
     get position from nav_msgs::Odometry More...
     
    std::tuple< double, double, double > getPosition (const nav_msgs::OdometryConstPtr &data)
     get position from nav_msgs::OdometryConstPtr More...
     
    std::tuple< double, double, double > getVelocity (const nav_msgs::Odometry &data)
     get position from nav_msgs::Odometry More...
     
    std::tuple< double, double, double > getVelocity (const nav_msgs::OdometryConstPtr &data)
     get velocity from nav_msgs::OdometryConstPtr More...
     
    double getHeading (const nav_msgs::Odometry &data)
     get heading from nav_msgs::Odometry More...
     
    double getHeading (const nav_msgs::OdometryConstPtr &data)
     get heading from nav_msgs::OdometryConstPtr More...
     
    double getYaw (const nav_msgs::Odometry &data)
     get yaw from nav_msgs::Odometry More...
     
    double getYaw (const nav_msgs::OdometryConstPtr &data)
     get yaw from nav_msgs::OdometryConstPtr More...
     
    geometry_msgs::Pose getPose (const nav_msgs::Odometry &data)
     returns the Pose part of the nav_msgs::Odometry message More...
     
    geometry_msgs::Pose getPose (const nav_msgs::OdometryConstPtr &data)
     returns the Pose part of the nav_msgs::OdometryConstPtr message More...
     
    std::tuple< double, double, double > getPosition (const mrs_msgs::TrackerCommand &data)
     get position data from mrs_msgs::TrackerCommand More...
     
    std::tuple< double, double, double > getPosition (const mrs_msgs::TrackerCommandConstPtr &data)
     get position data from mrs_msgs::TrackerCommandConstPtr More...
     
    std::tuple< double, double, double > getVelocity (const mrs_msgs::TrackerCommand &data)
     get velocity data from mrs_msgs::TrackerCommand More...
     
    std::tuple< double, double, double > getVelocity (const mrs_msgs::TrackerCommandConstPtr &data)
     get velocity data from mrs_msgs::TrackerCommandConstPtr More...
     
    double getHeading (const mrs_msgs::TrackerCommand &data)
     get heading from mrs_msgs::TrackerCommand More...
     
    double getHeading (const mrs_msgs::TrackerCommandConstPtr &data)
     get heading from mrs_msgs::TrackerCommandConstPtr More...
     
    std::tuple< double, double, double > getPosition (const mrs_msgs::Reference &data)
     get position from mrs_msgs::Reference More...
     
    std::tuple< double, double, double > getPosition (const mrs_msgs::ReferenceConstPtr &data)
     get position from mrs_msgs::ReferenceConstPtr More...
     
    double getHeading (const mrs_msgs::Reference &data)
     get heading from mrs_msgs::Reference More...
     
    double getHeading (const mrs_msgs::ReferenceConstPtr &data)
     get heading from mrs_msgs::ReferenceConstPtr More...
     
    std::tuple< double, double, double > getPosition (const mrs_msgs::ReferenceStamped &data)
     get position from mrs_msgs::ReferenceStamped More...
     
    std::tuple< double, double, double > getPosition (const mrs_msgs::ReferenceStampedConstPtr &data)
     get position from mrs_msgs::ReferenceStampedConstPtr More...
     
    double getHeading (const mrs_msgs::ReferenceStamped &data)
     get heading from mrs_msgs::ReferenceStamped More...
     
    double getHeading (const mrs_msgs::ReferenceStampedConstPtr &data)
     get heading from mrs_msgs::ReferenceStampedConstPtr More...
     
    template<class... GetArgs, class... SetArgs>
    std::tuple< GetArgs... > get_set_mutexed (std::mutex &mut, std::tuple< GetArgs &... > get, std::tuple< SetArgs... > from_set, std::tuple< SetArgs &... > to_set)
     thread-safe getter and setter for values of variables (args) More...
     
    template<class... Args>
    std::tuple< Args... > get_mutexed (std::mutex &mut, Args &... args)
     thread-safe getter for values of variables (args) More...
     
    template<class T >
    get_mutexed (std::mutex &mut, T &arg)
     thread-safe getter a value from a variable More...
     
    template<class T >
    void set_mutexed_impl (const T what, T &where)
     base case of the variadic template for set_mutexed() More...
     
    template<class T , class... Args>
    void set_mutexed_impl (const T what, T &where, Args... args)
     general case of the variadic template for set_mutexed() More...
     
    template<class T >
    auto set_mutexed (std::mutex &mut, const T what, T &where)
     thread-safe setter for a variable More...
     
    template<class... Args>
    auto set_mutexed (std::mutex &mut, Args &... args)
     thread-safe setter for multiple variables More...
     
    template<class... Args>
    auto set_mutexed (std::mutex &mut, const std::tuple< Args... > from, std::tuple< Args &... > to)
     thread-safe setter for multiple variables More...
     
    template<>
    ros::Duration ParamLoader::loadParam2< ros::Duration > (const std::string &name, const ros::Duration &default_value)
     An overload for loading ros::Duration. More...
     
    template<>
    ros::Duration ParamLoader::loadParam2< ros::Duration > (const std::string &name)
     An overload for loading ros::Duration. More...
     
    +Intersection sectionIntersect (Eigen::RowVector2d start1, Eigen::RowVector2d end1, Eigen::RowVector2d start2, Eigen::RowVector2d end2)
     
    template<typename Class , class ... Types>
    void construct_object (Class &object, Types ... args)
     Helper function for object construstion e.g. in case of member objects. This function is useful to avoid specifying object template parameters twice - once in definition of the variable and second time during object construction. 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 argument and not as a return type. More...
     
    +bool breakable_sleep (const ros::Duration &dur, const std::atomic< bool > &continue_sleep)
     
    template<typename Iterator >
    std::string containerToString (const Iterator begin, const Iterator end, const std::string &delimiter=", ")
     Convenience function for converting container ranges to strings (e.g. for printing). More...
     
    template<typename Iterator >
    std::string containerToString (const Iterator begin, const Iterator end, const char *delimiter)
     Convenience function for converting container ranges to strings (e.g. for printing). More...
     
    template<typename Container >
    std::string containerToString (const Container &cont, const std::string &delimiter=", ")
     Convenience function for converting containers to strings (e.g. for printing). More...
     
    template<typename Container >
    std::string containerToString (const Container &cont, const char *delimiter=", ")
     Convenience function for converting containers to strings (e.g. for printing). More...
     
    template<typename T >
    T::iterator remove_const (const typename T::const_iterator &it, T &cont)
     Convenience class for removing const-ness from a container iterator. More...
     
    +template<typename T >
    int signum (T val)
     
    template<typename ret_t , typename in_t >
    ret_t convert (const in_t &in)
     Converts between different vector representations. More...
     
    +geometry_msgs::Point eigenToMsg (const Eigen::Vector3d &v)
     
    +std_msgs::ColorRGBA generateColor (const double r, const double g, const double b, const double a)
     
    +Eigen::Vector3d msgToEigen (const geometry_msgs::Point &p)
     
    +std::vector< Eigen::Vector3d > buildEllipse (const mrs_lib::geometry::Ellipse &ellipse, const int num_points)
     
    +template bool ParamProvider::getParam< std::string > (const std::string &name, std::string &out_value) const
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Variables

    +const double RADIANS_PER_DEGREE = M_PI / 180.0
     
    +const double DEGREES_PER_RADIAN = 180.0 / M_PI
     
    +const double WGS84_A = 6378137.0
     
    +const double WGS84_B = 6356752.31424518
     
    +const double WGS84_F = 0.0033528107
     
    +const double WGS84_E = 0.0818191908
     
    +const double WGS84_EP = 0.0820944379
     
    +const double UTM_K0 = 0.9996
     
    +const double UTM_FE = 500000.0
     
    +const double UTM_FN_N = 0.0
     
    +const double UTM_FN_S = 10000000.0
     
    +const double UTM_E2 = (WGS84_E * WGS84_E)
     
    +const double UTM_E4 = (UTM_E2 * UTM_E2)
     
    +const double UTM_E6 = (UTM_E4 * UTM_E2)
     
    +const double UTM_EP2 = (UTM_E2 / (1 - UTM_E2))
     
    +const int n_states = 4
     
    +const int n_inputs = 2
     
    +const int n_measurements = 2
     
    +const int n_states_norm_constrained = 2
     
    +const int n_params = 4
     
    +

    Detailed Description

    +

    All mrs_lib functions, classes, variables and definitions are contained in this namespace.

    +

    Function Documentation

    + +

    ◆ construct_object()

    + +
    +
    +
    +template<typename Class , class ... Types>
    + + + + + + + + + + + + + + + + + + +
    void mrs_lib::construct_object (Class & object,
    Types ... args 
    )
    +
    + +

    Helper function for object construstion e.g. in case of member objects. This function is useful to avoid specifying object template parameters twice - once in definition of the variable and second time during object construction. 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 argument and not as a return type.

    +
    Parameters
    + + + +
    objectThe object to be constructed.
    argsThese arguments are passed to the object constructor.
    +
    +
    +
    Examples
    subscribe_handler/example.cpp.
    +
    + +
    +
    + +

    ◆ containerToString() [1/4]

    + +
    +
    +
    +template<typename Container >
    + + + + + + + + + + + + + + + + + + +
    std::string mrs_lib::containerToString (const Container & cont,
    const char * delimiter = ", " 
    )
    +
    + +

    Convenience function for converting containers to strings (e.g. for printing).

    +
    Parameters
    + + + +
    contthe container that will be converted to std::string.
    delimiterwill be used to separate the elements in the output.
    +
    +
    +
    Returns
    elements of the container from begin to end (excluding), converted to string and separated by delimiter.
    + +
    +
    + +

    ◆ containerToString() [2/4]

    + +
    +
    +
    +template<typename Container >
    + + + + + + + + + + + + + + + + + + +
    std::string mrs_lib::containerToString (const Container & cont,
    const std::string & delimiter = ", " 
    )
    +
    + +

    Convenience function for converting containers to strings (e.g. for printing).

    +
    Parameters
    + + + +
    contthe container that will be converted to std::string.
    delimiterwill be used to separate the elements in the output.
    +
    +
    +
    Returns
    elements of the container from begin to end (excluding), converted to string and separated by delimiter.
    + +
    +
    + +

    ◆ containerToString() [3/4]

    + +
    +
    +
    +template<typename Iterator >
    + + + + + + + + + + + + + + + + + + + + + + + + +
    std::string mrs_lib::containerToString (const Iterator begin,
    const Iterator end,
    const char * delimiter 
    )
    +
    + +

    Convenience function for converting container ranges to strings (e.g. for printing).

    +
    Parameters
    + + + + +
    beginfirst element of the container that will be converted to std::string.
    endone-after-the-last element of the container that will be converted to std::string.
    delimiterwill be used to separate the elements in the output.
    +
    +
    +
    Returns
    elements of the container from begin to end (excluding), converted to string and separated by delimiter.
    + +
    +
    + +

    ◆ containerToString() [4/4]

    + +
    +
    +
    +template<typename Iterator >
    + + + + + + + + + + + + + + + + + + + + + + + + +
    std::string mrs_lib::containerToString (const Iterator begin,
    const Iterator end,
    const std::string & delimiter = ", " 
    )
    +
    + +

    Convenience function for converting container ranges to strings (e.g. for printing).

    +
    Parameters
    + + + + +
    beginfirst element of the container that will be converted to std::string.
    endone-after-the-last element of the container that will be converted to std::string.
    delimiterwill be used to separate the elements in the output.
    +
    +
    +
    Returns
    elements of the container from begin to end (excluding), converted to string and separated by delimiter.
    + +
    +
    + +

    ◆ convert()

    + +
    +
    +
    +template<typename ret_t , typename in_t >
    + + + + + + + + +
    ret_t mrs_lib::convert (const in_t & in)
    +
    + +

    Converts between different vector representations.

    +

    Usage (for full example, see the file vector_converter/example.cpp):

    +

    auto out = mrs_lib::convert<to_type>(in);

    +

    Supported types by default are: Eigen::Vector3d, cv::Vec3d, geometry_msgs::Vector3. If you want to use this with a new type, it should work automagically if it provides a reasonable API. 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).

    +
    Parameters
    + + +
    inThe input vector to be converted to the ret_t type.
    +
    +
    +
    Template Parameters
    + + + +
    ret_tType of the return vector. You need to specify this when calling the function.
    in_tType of the input vector. This parameter is deduced by the compiler and doesn't need to be specified in usual cases.
    +
    +
    + +
    +
    + +

    ◆ get_mutexed() [1/2]

    + +
    +
    +
    +template<class... Args>
    + + + + + + + + + + + + + + + + + + +
    std::tuple<Args...> mrs_lib::get_mutexed (std::mutex & mut,
    Args &... args 
    )
    +
    + +

    thread-safe getter for values of variables (args)

    +
    Template Parameters
    + + +
    Argstypes of the variables
    +
    +
    +
    Parameters
    + + + +
    mutmutex which protects the variables
    argsvariables to obtain the values from
    +
    +
    +
    Returns
    std::tuple of the values
    +
    Examples
    repredictor/example.cpp.
    +
    + +
    +
    + +

    ◆ get_mutexed() [2/2]

    + +
    +
    +
    +template<class T >
    + + + + + + + + + + + + + + + + + + +
    T mrs_lib::get_mutexed (std::mutex & mut,
    T & arg 
    )
    +
    + +

    thread-safe getter a value from a variable

    +
    Template Parameters
    + + +
    Ttype of the variable
    +
    +
    +
    Parameters
    + + + +
    mutmutex which protects the variable
    argvariable to obtain the value from
    +
    +
    +
    Returns
    value of the variable
    + +
    +
    + +

    ◆ get_set_mutexed()

    + +
    +
    +
    +template<class... GetArgs, class... SetArgs>
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    std::tuple<GetArgs...> mrs_lib::get_set_mutexed (std::mutex & mut,
    std::tuple< GetArgs &... > get,
    std::tuple< SetArgs... > from_set,
    std::tuple< SetArgs &... > to_set 
    )
    +
    + +

    thread-safe getter and setter for values of variables (args)

    +
    Template Parameters
    + + + +
    GetArgstypes of the variables to get
    SetArgstypes of the variables to set
    +
    +
    +
    Parameters
    + + + + + +
    mutmutex which protects the variables
    gettuple of variable references to obtain the values from
    to_settuple of variable references to set the new values from from_set
    from_settuple of the new values to be set to to_set
    +
    +
    +
    Returns
    tuple of the values from get
    + +
    +
    + +

    ◆ getHeading() [1/12]

    + +
    +
    + + + + + + + + +
    double mrs_lib::getHeading (const geometry_msgs::Pose & data)
    +
    + +

    get heading from geometry_msgs::Pose

    +
    Parameters
    + + +
    datapose
    +
    +
    +
    Returns
    heading
    + +
    +
    + +

    ◆ getHeading() [2/12]

    + +
    +
    + + + + + + + + +
    double mrs_lib::getHeading (const geometry_msgs::PoseConstPtr & data)
    +
    + +

    get heading from geometry_msgs::PoseConstPtr

    +
    Parameters
    + + +
    datapose (ConstPtr)
    +
    +
    +
    Returns
    heading
    + +
    +
    + +

    ◆ getHeading() [3/12]

    + +
    +
    + + + + + + + + +
    double mrs_lib::getHeading (const geometry_msgs::PoseWithCovariance & data)
    +
    + +

    get heading from geometry_msgs::PoseWithCovariance

    +
    Parameters
    + + +
    datapose with covariance
    +
    +
    +
    Returns
    heading
    + +
    +
    + +

    ◆ getHeading() [4/12]

    + +
    +
    + + + + + + + + +
    double mrs_lib::getHeading (const geometry_msgs::PoseWithCovarianceConstPtr & data)
    +
    + +

    get heading from geometry_msgs::PoseWithCovarianceConstPtr

    +
    Parameters
    + + +
    datapose with covariance (ConstPtr)
    +
    +
    +
    Returns
    heading
    + +
    +
    + +

    ◆ getHeading() [5/12]

    + +
    +
    + + + + + + + + +
    double mrs_lib::getHeading (const mrs_msgs::Reference & data)
    +
    + +

    get heading from mrs_msgs::Reference

    +
    Parameters
    + + +
    datareference
    +
    +
    +
    Returns
    heading
    + +
    +
    + +

    ◆ getHeading() [6/12]

    + +
    +
    + + + + + + + + +
    double mrs_lib::getHeading (const mrs_msgs::ReferenceConstPtr & data)
    +
    + +

    get heading from mrs_msgs::ReferenceConstPtr

    +
    Parameters
    + + +
    datareference (ContrPtr)
    +
    +
    +
    Returns
    heading
    + +
    +
    + +

    ◆ getHeading() [7/12]

    + +
    +
    + + + + + + + + +
    double mrs_lib::getHeading (const mrs_msgs::ReferenceStamped & data)
    +
    + +

    get heading from mrs_msgs::ReferenceStamped

    +
    Parameters
    + + +
    datareferencestamped
    +
    +
    +
    Returns
    heading
    + +
    +
    + +

    ◆ getHeading() [8/12]

    + +
    +
    + + + + + + + + +
    double mrs_lib::getHeading (const mrs_msgs::ReferenceStampedConstPtr & data)
    +
    + +

    get heading from mrs_msgs::ReferenceStampedConstPtr

    +
    Parameters
    + + +
    datareferencestamped (ContrPtr)
    +
    +
    +
    Returns
    heading
    + +
    +
    + +

    ◆ getHeading() [9/12]

    + +
    +
    + + + + + + + + +
    double mrs_lib::getHeading (const mrs_msgs::TrackerCommand & data)
    +
    + +

    get heading from mrs_msgs::TrackerCommand

    +
    Parameters
    + + +
    dataposition command
    +
    +
    +
    Returns
    heading
    + +
    +
    + +

    ◆ getHeading() [10/12]

    + +
    +
    + + + + + + + + +
    double mrs_lib::getHeading (const mrs_msgs::TrackerCommandConstPtr & data)
    +
    + +

    get heading from mrs_msgs::TrackerCommandConstPtr

    +
    Parameters
    + + +
    dataposition command (ConstPtr)
    +
    +
    +
    Returns
    heading
    + +
    +
    + +

    ◆ getHeading() [11/12]

    + +
    +
    + + + + + + + + +
    double mrs_lib::getHeading (const nav_msgs::Odometry & data)
    +
    + +

    get heading from nav_msgs::Odometry

    +
    Parameters
    + + +
    dataodometry
    +
    +
    +
    Returns
    heading
    + +
    +
    + +

    ◆ getHeading() [12/12]

    + +
    +
    + + + + + + + + +
    double mrs_lib::getHeading (const nav_msgs::OdometryConstPtr & data)
    +
    + +

    get heading from nav_msgs::OdometryConstPtr

    +
    Parameters
    + + +
    dataodometry (ConstPtr)
    +
    +
    +
    Returns
    heading
    + +
    +
    + +

    ◆ getPose() [1/2]

    + +
    +
    + + + + + + + + +
    geometry_msgs::Pose mrs_lib::getPose (const nav_msgs::Odometry & data)
    +
    + +

    returns the Pose part of the nav_msgs::Odometry message

    +
    Parameters
    + + +
    dataodometry
    +
    +
    +
    Returns
    pose
    + +
    +
    + +

    ◆ getPose() [2/2]

    + +
    +
    + + + + + + + + +
    geometry_msgs::Pose mrs_lib::getPose (const nav_msgs::OdometryConstPtr & data)
    +
    + +

    returns the Pose part of the nav_msgs::OdometryConstPtr message

    +
    Parameters
    + + +
    dataodometry (ConstPtr)
    +
    +
    +
    Returns
    pose
    + +
    +
    + +

    ◆ getPosition() [1/14]

    + +
    +
    + + + + + + + + +
    std::tuple<double, double, double> mrs_lib::getPosition (const geometry_msgs::Pose & data)
    +
    + +

    get position from geometry_msgs::Pose

    +
    Parameters
    + + +
    datapose
    +
    +
    +
    Returns
    x, y, z
    + +
    +
    + +

    ◆ getPosition() [2/14]

    + +
    +
    + + + + + + + + +
    std::tuple<double, double, double> mrs_lib::getPosition (const geometry_msgs::PoseConstPtr & data)
    +
    + +

    get position from geometry_msgs::PoseConstPtr

    +
    Parameters
    + + +
    datapose (ConstPtr)
    +
    +
    +
    Returns
    x, y, z
    + +
    +
    + +

    ◆ getPosition() [3/14]

    + +
    +
    + + + + + + + + +
    std::tuple<double, double, double> mrs_lib::getPosition (const geometry_msgs::PoseWithCovariance & data)
    +
    + +

    get position from geometry_msgs::PoseWithCovariance

    +
    Parameters
    + + +
    datapose with covariance
    +
    +
    +
    Returns
    x, y, z
    + +
    +
    + +

    ◆ getPosition() [4/14]

    + +
    +
    + + + + + + + + +
    std::tuple<double, double, double> mrs_lib::getPosition (const geometry_msgs::PoseWithCovarianceConstPtr & data)
    +
    + +

    get position from geometry_msgs::PoseWithCovarianceConstPtr

    +
    Parameters
    + + +
    datapose with covariance (ConstPtr)
    +
    +
    +
    Returns
    x, y, z
    + +
    +
    + +

    ◆ getPosition() [5/14]

    + +
    +
    + + + + + + + + +
    std::tuple<double, double, double> mrs_lib::getPosition (const geometry_msgs::TwistConstPtr & data)
    +
    + +

    get position from geometry_msgs::TwistConstPtr

    +
    Parameters
    + + +
    datatwist (ConstPtr)
    +
    +
    +
    Returns
    x, y, z
    + +
    +
    + +

    ◆ getPosition() [6/14]

    + +
    +
    + + + + + + + + +
    std::tuple<double, double, double> mrs_lib::getPosition (const geometry_msgs::TwistWithCovarianceConstPtr & data)
    +
    + +

    get position from geometry_msgs::TwistWithCovarianceConstPtr

    +
    Parameters
    + + +
    datatwistwithcovariance (ConstPtr)
    +
    +
    +
    Returns
    x, y, z
    + +
    +
    + +

    ◆ getPosition() [7/14]

    + +
    +
    + + + + + + + + +
    std::tuple<double, double, double> mrs_lib::getPosition (const mrs_msgs::Reference & data)
    +
    + +

    get position from mrs_msgs::Reference

    +
    Parameters
    + + +
    datareference
    +
    +
    +
    Returns
    x, y, z
    + +
    +
    + +

    ◆ getPosition() [8/14]

    + +
    +
    + + + + + + + + +
    std::tuple<double, double, double> mrs_lib::getPosition (const mrs_msgs::ReferenceConstPtr & data)
    +
    + +

    get position from mrs_msgs::ReferenceConstPtr

    +
    Parameters
    + + +
    datareference (ContrPtr)
    +
    +
    +
    Returns
    x, y, z
    + +
    +
    + +

    ◆ getPosition() [9/14]

    + +
    +
    + + + + + + + + +
    std::tuple<double, double, double> mrs_lib::getPosition (const mrs_msgs::ReferenceStamped & data)
    +
    + +

    get position from mrs_msgs::ReferenceStamped

    +
    Parameters
    + + +
    datareference stamped
    +
    +
    +
    Returns
    x, y, z
    + +
    +
    + +

    ◆ getPosition() [10/14]

    + +
    +
    + + + + + + + + +
    std::tuple<double, double, double> mrs_lib::getPosition (const mrs_msgs::ReferenceStampedConstPtr & data)
    +
    + +

    get position from mrs_msgs::ReferenceStampedConstPtr

    +
    Parameters
    + + +
    datareference stamped (ContrPtr)
    +
    +
    +
    Returns
    x, y, z
    + +
    +
    + +

    ◆ getPosition() [11/14]

    + +
    +
    + + + + + + + + +
    std::tuple<double, double, double> mrs_lib::getPosition (const mrs_msgs::TrackerCommand & data)
    +
    + +

    get position data from mrs_msgs::TrackerCommand

    +
    Parameters
    + + +
    dataposition command
    +
    +
    +
    Returns
    x, y, z
    + +
    +
    + +

    ◆ getPosition() [12/14]

    + +
    +
    + + + + + + + + +
    std::tuple<double, double, double> mrs_lib::getPosition (const mrs_msgs::TrackerCommandConstPtr & data)
    +
    + +

    get position data from mrs_msgs::TrackerCommandConstPtr

    +
    Parameters
    + + +
    dataposition command (ConstPtr)
    +
    +
    +
    Returns
    x, y, z
    + +
    +
    + +

    ◆ getPosition() [13/14]

    + +
    +
    + + + + + + + + +
    std::tuple<double, double, double> mrs_lib::getPosition (const nav_msgs::Odometry & data)
    +
    + +

    get position from nav_msgs::Odometry

    +
    Parameters
    + + +
    dataodometry
    +
    +
    +
    Returns
    x, y, z
    + +
    +
    + +

    ◆ getPosition() [14/14]

    + +
    +
    + + + + + + + + +
    std::tuple<double, double, double> mrs_lib::getPosition (const nav_msgs::OdometryConstPtr & data)
    +
    + +

    get position from nav_msgs::OdometryConstPtr

    +
    Parameters
    + + +
    dataodometry (ConstPtr)
    +
    +
    +
    Returns
    x, y, z
    + +
    +
    + +

    ◆ getVelocity() [1/6]

    + +
    +
    + + + + + + + + +
    std::tuple<double, double, double> mrs_lib::getVelocity (const geometry_msgs::Twist & data)
    +
    + +

    get velocity from geometry_msgs::Twist

    +
    Parameters
    + + +
    datatwist
    +
    +
    +
    Returns
    x, y, z
    + +
    +
    + +

    ◆ getVelocity() [2/6]

    + +
    +
    + + + + + + + + +
    std::tuple<double, double, double> mrs_lib::getVelocity (const geometry_msgs::TwistWithCovariance & data)
    +
    + +

    get velocity from geometry_msgs::TwistWithCovariance

    +
    Parameters
    + + +
    datatwistwithcovariance
    +
    +
    +
    Returns
    x, y, z
    + +
    +
    + +

    ◆ getVelocity() [3/6]

    + +
    +
    + + + + + + + + +
    std::tuple<double, double, double> mrs_lib::getVelocity (const mrs_msgs::TrackerCommand & data)
    +
    + +

    get velocity data from mrs_msgs::TrackerCommand

    +
    Parameters
    + + +
    dataposition command
    +
    +
    +
    Returns
    x, y, z
    + +
    +
    + +

    ◆ getVelocity() [4/6]

    + +
    +
    + + + + + + + + +
    std::tuple<double, double, double> mrs_lib::getVelocity (const mrs_msgs::TrackerCommandConstPtr & data)
    +
    + +

    get velocity data from mrs_msgs::TrackerCommandConstPtr

    +
    Parameters
    + + +
    dataposition command (ConstPtr)
    +
    +
    +
    Returns
    x, y, z
    + +
    +
    + +

    ◆ getVelocity() [5/6]

    + +
    +
    + + + + + + + + +
    std::tuple<double, double, double> mrs_lib::getVelocity (const nav_msgs::Odometry & data)
    +
    + +

    get position from nav_msgs::Odometry

    +
    Parameters
    + + +
    dataodometry
    +
    +
    +
    Returns
    x, y, z
    + +
    +
    + +

    ◆ getVelocity() [6/6]

    + +
    +
    + + + + + + + + +
    std::tuple<double, double, double> mrs_lib::getVelocity (const nav_msgs::OdometryConstPtr & data)
    +
    + +

    get velocity from nav_msgs::OdometryConstPtr

    +
    Parameters
    + + +
    dataodometry (ConstPtr)
    +
    +
    +
    Returns
    x, y, z
    + +
    +
    + +

    ◆ getXYZ() [1/4]

    + +
    +
    + + + + + + + + +
    std::tuple<double, double, double> mrs_lib::getXYZ (const geometry_msgs::Point & data)
    +
    + +

    get XYZ from geometry_msgs::Point

    +
    Parameters
    + + +
    datapoint
    +
    +
    +
    Returns
    x, y, z
    + +
    +
    + +

    ◆ getXYZ() [2/4]

    + +
    +
    + + + + + + + + +
    std::tuple<double, double, double> mrs_lib::getXYZ (const geometry_msgs::PointConstPtr & data)
    +
    + +

    get XYZ from geometry_msgs::PointConstPtr

    +
    Parameters
    + + +
    datapoint (ConstPtr)
    +
    +
    +
    Returns
    x, y, z
    + +
    +
    + +

    ◆ getXYZ() [3/4]

    + +
    +
    + + + + + + + + +
    std::tuple<double, double, double> mrs_lib::getXYZ (const geometry_msgs::Vector3 & data)
    +
    + +

    get XYZ from geometry_msgs::Vector3

    +
    Parameters
    + + +
    datavector3
    +
    +
    +
    Returns
    x, y, z
    + +
    +
    + +

    ◆ getXYZ() [4/4]

    + +
    +
    + + + + + + + + +
    std::tuple<double, double, double> mrs_lib::getXYZ (const geometry_msgs::Vector3ConstPtr & data)
    +
    + +

    get XYZ from geometry_msgs::Vector3ConstPtr

    +
    Parameters
    + + +
    datavector3 (ConstPtr)
    +
    +
    +
    Returns
    x, y, z
    + +
    +
    + +

    ◆ getYaw() [1/6]

    + +
    +
    + + + + + + + + +
    double mrs_lib::getYaw (const geometry_msgs::Pose & data)
    +
    + +

    get yaw from geometry_msgs::Pose

    +
    Parameters
    + + +
    datapose
    +
    +
    +
    Returns
    yaw
    + +
    +
    + +

    ◆ getYaw() [2/6]

    + +
    +
    + + + + + + + + +
    double mrs_lib::getYaw (const geometry_msgs::PoseConstPtr & data)
    +
    + +

    get yaw from geometry_msgs::PoseConstPtr

    +
    Parameters
    + + +
    datapose (ConstPtr)
    +
    +
    +
    Returns
    yaw
    + +
    +
    + +

    ◆ getYaw() [3/6]

    + +
    +
    + + + + + + + + +
    double mrs_lib::getYaw (const geometry_msgs::PoseWithCovariance & data)
    +
    + +

    get yaw from geometry_msgs::PoseWithCovariance

    +
    Parameters
    + + +
    datapose with covariance
    +
    +
    +
    Returns
    yaw
    + +
    +
    + +

    ◆ getYaw() [4/6]

    + +
    +
    + + + + + + + + +
    double mrs_lib::getYaw (const geometry_msgs::PoseWithCovarianceConstPtr & data)
    +
    + +

    get yaw from geometry_msgs::PoseWithCovarianceConstPtr

    +
    Parameters
    + + +
    datapose with covariance (ConstPtr)
    +
    +
    +
    Returns
    yaw
    + +
    +
    + +

    ◆ getYaw() [5/6]

    + +
    +
    + + + + + + + + +
    double mrs_lib::getYaw (const nav_msgs::Odometry & data)
    +
    + +

    get yaw from nav_msgs::Odometry

    +
    Parameters
    + + +
    dataodometry
    +
    +
    +
    Returns
    yaw
    + +
    +
    + +

    ◆ getYaw() [6/6]

    + +
    +
    + + + + + + + + +
    double mrs_lib::getYaw (const nav_msgs::OdometryConstPtr & data)
    +
    + +

    get yaw from nav_msgs::OdometryConstPtr

    +
    Parameters
    + + +
    dataodometry (ConstPtr)
    +
    +
    +
    Returns
    yaw
    + +
    +
    + +

    ◆ ParamLoader::loadParam2< ros::Duration >() [1/2]

    + +
    +
    +
    +template<>
    + + + + + + + + +
    ros::Duration mrs_lib::ParamLoader::loadParam2< ros::Duration > (const std::string & name)
    +
    + +

    An overload for loading ros::Duration.

    +

    The duration will be loaded as a double, representing a number of seconds, and then converted to ros::Duration.

    +
    Parameters
    + + +
    nameName of the parameter in the rosparam server.
    +
    +
    +
    Returns
    The loaded parameter value.
    + +
    +
    + +

    ◆ ParamLoader::loadParam2< ros::Duration >() [2/2]

    + +
    +
    +
    +template<>
    + + + + + + + + + + + + + + + + + + +
    ros::Duration mrs_lib::ParamLoader::loadParam2< ros::Duration > (const std::string & name,
    const ros::Duration & default_value 
    )
    +
    + +

    An overload for loading ros::Duration.

    +

    The duration will be loaded as a double, representing a number of seconds, and then converted to ros::Duration.

    +
    Parameters
    + + + +
    nameName of the parameter in the rosparam server.
    default_valueThis value will be used if the parameter name is not found in the rosparam server.
    +
    +
    +
    Returns
    The loaded parameter value.
    + +
    +
    + +

    ◆ probit()

    + +
    +
    + + + + + + + + +
    double mrs_lib::probit (const double quantile)
    +
    + +

    Inverse cumulative distribution function of the standard normal probability distribution.

    +

    Implements the quantile function of a standard normal probability distribution (aka the probit function, see https://en.wikipedia.org/wiki/Probit). The implementation uses the Beasley-Springer-Moro approximation (see page 68 of Glasserman, Paul, "Monte Carlo Methods in Financial Engineering. Stochastic Modelling and Applied Probability", 2003, doi:10.1007/978-0-387-21617-1, available at https://sci-hub.se/10.1007/978-0-387-21617-1).

    +
    Parameters
    + + +
    quantilethe probability that a realization of a random variable with a standard normal dostribution is equal or less than the returned value (see https://en.wikipedia.org/wiki/Quantile).
    +
    +
    +
    Returns
    such a value that the probability that a realization of a random variable with a standard normal dostribution is equal or less is quantile.
    + +
    +
    + +

    ◆ remove_const()

    + +
    +
    +
    +template<typename T >
    + + + + + + + + + + + + + + + + + + +
    T::iterator mrs_lib::remove_const (const typename T::const_iterator & it,
    T & cont 
    )
    +
    + +

    Convenience class for removing const-ness from a container iterator.

    +
    Parameters
    + + + +
    itthe iterator from which const-ness should be removed.
    contthe corresponding container of the iterator.
    +
    +
    +
    Returns
    a non-const iterator, pointing to the same element as it.
    + +
    +
    + +

    ◆ set_mutexed() [1/3]

    + +
    +
    +
    +template<class... Args>
    + + + + + + + + + + + + + + + + + + +
    auto mrs_lib::set_mutexed (std::mutex & mut,
    Args &... args 
    )
    +
    + +

    thread-safe setter for multiple variables

    +

    example: set_mutexed(my_mutex_, a, a_, b, b_, c, c_); where a, b, c are the values to be set a_, b_, c_ are the variables to be updated

    +
    Template Parameters
    + + +
    Argstypes of the variables
    +
    +
    +
    Parameters
    + + + +
    mutmutex to be locked
    args
    +
    +
    +
    Returns
    alternating list of values that were just set
    + +
    +
    + +

    ◆ set_mutexed() [2/3]

    + +
    +
    +
    +template<class... Args>
    + + + + + + + + + + + + + + + + + + + + + + + + +
    auto mrs_lib::set_mutexed (std::mutex & mut,
    const std::tuple< Args... > from,
    std::tuple< Args &... > to 
    )
    +
    + +

    thread-safe setter for multiple variables

    +

    example: set_mutexed(mu_mutex, std::tuple(a, b, c), std::forward_as_tuple(a_, b_, c_)); where a, b, c are the values to be set a_, b_, c_ are the updated variables

    +
    Template Parameters
    + + +
    Argstypes of the variables
    +
    +
    +
    Parameters
    + + + + +
    mutmutex to be locked
    fromstd::tuple of the values
    tostd::tuple of reference to the variablaes
    +
    +
    +
    Returns
    + +
    +
    + +

    ◆ set_mutexed() [3/3]

    + +
    +
    +
    +template<class T >
    + + + + + + + + + + + + + + + + + + + + + + + + +
    auto mrs_lib::set_mutexed (std::mutex & mut,
    const T what,
    T & where 
    )
    +
    + +

    thread-safe setter for a variable

    +
    Template Parameters
    + + +
    Ttype of the variable
    +
    +
    +
    Parameters
    + + + + +
    mutmutex to be locked
    whatvalue to set
    wherereference to be set
    +
    +
    +
    Returns
    +
    Examples
    repredictor/example.cpp.
    +
    + +
    +
    + +

    ◆ set_mutexed_impl() [1/2]

    + +
    +
    +
    +template<class T >
    + + + + + + + + + + + + + + + + + + +
    void mrs_lib::set_mutexed_impl (const T what,
    T & where 
    )
    +
    + +

    base case of the variadic template for set_mutexed()

    +
    Template Parameters
    + + +
    Tvariable type
    +
    +
    +
    Parameters
    + + + +
    whatvalue to set
    wherereference to be set
    +
    +
    + +
    +
    + +

    ◆ set_mutexed_impl() [2/2]

    + +
    +
    +
    +template<class T , class... Args>
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void mrs_lib::set_mutexed_impl (const T what,
    T & where,
    Args... args 
    )
    +
    + +

    general case of the variadic template for set_mutexed()

    +
    Template Parameters
    + + + +
    Ttype of the next variable to set
    Argstypes of the rest of the variables
    +
    +
    +
    Parameters
    + + + + +
    whatvalue to set
    wherereference to be set
    argsthe remaining arguments
    +
    +
    + +
    +
    +
    +
    + + + + diff --git a/namespacemrs__lib.js b/namespacemrs__lib.js new file mode 100644 index 00000000..ee6e0709 --- /dev/null +++ b/namespacemrs__lib.js @@ -0,0 +1,69 @@ +var namespacemrs__lib = +[ + [ "geometry", null, [ + [ "Cone", "classmrs__lib_1_1geometry_1_1Cone.html", "classmrs__lib_1_1geometry_1_1Cone" ], + [ "Cuboid", "classmrs__lib_1_1geometry_1_1Cuboid.html", "classmrs__lib_1_1geometry_1_1Cuboid" ], + [ "cyclic", "structmrs__lib_1_1geometry_1_1cyclic.html", "structmrs__lib_1_1geometry_1_1cyclic" ], + [ "Cylinder", "classmrs__lib_1_1geometry_1_1Cylinder.html", "classmrs__lib_1_1geometry_1_1Cylinder" ], + [ "degrees", "structmrs__lib_1_1geometry_1_1degrees.html", null ], + [ "Ellipse", "classmrs__lib_1_1geometry_1_1Ellipse.html", "classmrs__lib_1_1geometry_1_1Ellipse" ], + [ "radians", "structmrs__lib_1_1geometry_1_1radians.html", null ], + [ "Ray", "classmrs__lib_1_1geometry_1_1Ray.html", "classmrs__lib_1_1geometry_1_1Ray" ], + [ "Rectangle", "classmrs__lib_1_1geometry_1_1Rectangle.html", "classmrs__lib_1_1geometry_1_1Rectangle" ], + [ "sdegrees", "structmrs__lib_1_1geometry_1_1sdegrees.html", null ], + [ "sradians", "structmrs__lib_1_1geometry_1_1sradians.html", null ], + [ "Triangle", "classmrs__lib_1_1geometry_1_1Triangle.html", "classmrs__lib_1_1geometry_1_1Triangle" ] + ] ], + [ "quadratic_throttle_model", null, [ + [ "MotorParams_t", "structmrs__lib_1_1quadratic__throttle__model_1_1MotorParams__t.html", "structmrs__lib_1_1quadratic__throttle__model_1_1MotorParams__t" ] + ] ], + [ "AtomicScopeFlag", "classmrs__lib_1_1AtomicScopeFlag.html", "classmrs__lib_1_1AtomicScopeFlag" ], + [ "AttitudeConverter", "classmrs__lib_1_1AttitudeConverter.html", "classmrs__lib_1_1AttitudeConverter" ], + [ "BatchVisualizer", "classmrs__lib_1_1BatchVisualizer.html", "classmrs__lib_1_1BatchVisualizer" ], + [ "DKF", "classmrs__lib_1_1DKF.html", "classmrs__lib_1_1DKF" ], + [ "DynamicPublisher", "classmrs__lib_1_1DynamicPublisher.html", "classmrs__lib_1_1DynamicPublisher" ], + [ "DynamicReconfigureMgr", "classmrs__lib_1_1DynamicReconfigureMgr.html", "classmrs__lib_1_1DynamicReconfigureMgr" ], + [ "eigenvector_exception", "structmrs__lib_1_1eigenvector__exception.html", "structmrs__lib_1_1eigenvector__exception" ], + [ "EulerAttitude", "classmrs__lib_1_1EulerAttitude.html", "classmrs__lib_1_1EulerAttitude" ], + [ "IirFilter", "classmrs__lib_1_1IirFilter.html", "classmrs__lib_1_1IirFilter" ], + [ "ImagePubliserData", "structmrs__lib_1_1ImagePubliserData.html", "structmrs__lib_1_1ImagePubliserData" ], + [ "ImagePublisher", "classmrs__lib_1_1ImagePublisher.html", "classmrs__lib_1_1ImagePublisher" ], + [ "Intersection", "structmrs__lib_1_1Intersection.html", "structmrs__lib_1_1Intersection" ], + [ "JLKF", "classmrs__lib_1_1JLKF.html", "classmrs__lib_1_1JLKF" ], + [ "KalmanFilter", "classmrs__lib_1_1KalmanFilter.html", "classmrs__lib_1_1KalmanFilter" ], + [ "KalmanFilterAloamGarm", "classmrs__lib_1_1KalmanFilterAloamGarm.html", "classmrs__lib_1_1KalmanFilterAloamGarm" ], + [ "LKF", "classmrs__lib_1_1LKF.html", "classmrs__lib_1_1LKF" ], + [ "LKF_MRS_odom", "classmrs__lib_1_1LKF__MRS__odom.html", "classmrs__lib_1_1LKF__MRS__odom" ], + [ "MedianFilter", "classmrs__lib_1_1MedianFilter.html", "classmrs__lib_1_1MedianFilter" ], + [ "MRSTimer", "classmrs__lib_1_1MRSTimer.html", "classmrs__lib_1_1MRSTimer" ], + [ "NCLKF", "classmrs__lib_1_1NCLKF.html", "classmrs__lib_1_1NCLKF" ], + [ "NCLKF_partial", "classmrs__lib_1_1NCLKF__partial.html", "classmrs__lib_1_1NCLKF__partial" ], + [ "NCUKF", "classmrs__lib_1_1NCUKF.html", "classmrs__lib_1_1NCUKF" ], + [ "NotchFilter", "classmrs__lib_1_1NotchFilter.html", "classmrs__lib_1_1NotchFilter" ], + [ "ParamLoader", "classmrs__lib_1_1ParamLoader.html", "classmrs__lib_1_1ParamLoader" ], + [ "ParamProvider", "classmrs__lib_1_1ParamProvider.html", "classmrs__lib_1_1ParamProvider" ], + [ "Polygon", "classmrs__lib_1_1Polygon.html", "classmrs__lib_1_1Polygon" ], + [ "Profiler", "classmrs__lib_1_1Profiler.html", "classmrs__lib_1_1Profiler" ], + [ "PublisherHandler", "classmrs__lib_1_1PublisherHandler.html", "classmrs__lib_1_1PublisherHandler" ], + [ "PublisherHandler_impl", "classmrs__lib_1_1PublisherHandler__impl.html", "classmrs__lib_1_1PublisherHandler__impl" ], + [ "Repredictor", "classmrs__lib_1_1Repredictor.html", "classmrs__lib_1_1Repredictor" ], + [ "RepredictorAloamgarm", "classmrs__lib_1_1RepredictorAloamgarm.html", "classmrs__lib_1_1RepredictorAloamgarm" ], + [ "RHEIV", "classmrs__lib_1_1RHEIV.html", "classmrs__lib_1_1RHEIV" ], + [ "ROSTimer", "classmrs__lib_1_1ROSTimer.html", "classmrs__lib_1_1ROSTimer" ], + [ "Routine", "classmrs__lib_1_1Routine.html", "classmrs__lib_1_1Routine" ], + [ "SafetyZone", "classmrs__lib_1_1SafetyZone.html", "classmrs__lib_1_1SafetyZone" ], + [ "ScopeTimer", "classmrs__lib_1_1ScopeTimer.html", "classmrs__lib_1_1ScopeTimer" ], + [ "ScopeTimerLogger", "classmrs__lib_1_1ScopeTimerLogger.html", "classmrs__lib_1_1ScopeTimerLogger" ], + [ "ServiceClientHandler", "classmrs__lib_1_1ServiceClientHandler.html", "classmrs__lib_1_1ServiceClientHandler" ], + [ "ServiceClientHandler_impl", "classmrs__lib_1_1ServiceClientHandler__impl.html", "classmrs__lib_1_1ServiceClientHandler__impl" ], + [ "SubscribeHandler", "classmrs__lib_1_1SubscribeHandler.html", "classmrs__lib_1_1SubscribeHandler" ], + [ "SubscribeHandlerOptions", "structmrs__lib_1_1SubscribeHandlerOptions.html", "structmrs__lib_1_1SubscribeHandlerOptions" ], + [ "ThreadTimer", "classmrs__lib_1_1ThreadTimer.html", "classmrs__lib_1_1ThreadTimer" ], + [ "TimeoutManager", "classmrs__lib_1_1TimeoutManager.html", "classmrs__lib_1_1TimeoutManager" ], + [ "TransformBroadcaster", "classmrs__lib_1_1TransformBroadcaster.html", "classmrs__lib_1_1TransformBroadcaster" ], + [ "Transformer", "classmrs__lib_1_1Transformer.html", "classmrs__lib_1_1Transformer" ], + [ "UKF", "classmrs__lib_1_1UKF.html", "classmrs__lib_1_1UKF" ], + [ "varstepLKF", "classmrs__lib_1_1varstepLKF.html", "classmrs__lib_1_1varstepLKF" ], + [ "Vector3Converter", "classmrs__lib_1_1Vector3Converter.html", "classmrs__lib_1_1Vector3Converter" ], + [ "VisualObject", "classmrs__lib_1_1VisualObject.html", "classmrs__lib_1_1VisualObject" ] +]; \ No newline at end of file diff --git a/namespaces.html b/namespaces.html new file mode 100644 index 00000000..eaf35896 --- /dev/null +++ b/namespaces.html @@ -0,0 +1,106 @@ + + + + + + + +mrs_lib: Namespace List + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Namespace List
    +
    +
    +
    Here is a list of all documented namespaces with brief descriptions:
    + + +
     Nmrs_libAll mrs_lib functions, classes, variables and definitions are contained in this namespace
    +
    +
    +
    + + + + diff --git a/namespaces_dup.js b/namespaces_dup.js new file mode 100644 index 00000000..71db49b7 --- /dev/null +++ b/namespaces_dup.js @@ -0,0 +1,4 @@ +var namespaces_dup = +[ + [ "mrs_lib", "namespacemrs__lib.html", null ] +]; \ No newline at end of file diff --git a/nav_f.png b/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..72a58a529ed3a9ed6aa0c51a79cf207e026deee2 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQVE_ejv*C{Z|{2ZH7M}7UYxc) zn!W8uqtnIQ>_z8U literal 0 HcmV?d00001 diff --git a/nav_g.png b/nav_g.png new file mode 100644 index 0000000000000000000000000000000000000000..2093a237a94f6c83e19ec6e5fd42f7ddabdafa81 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrB!3HFm1ilyoDK$?Q$B+ufw|5PB85lU25BhtE tr?otc=hd~V+ws&_A@j8Fiv!KF$B+ufw|5=67#uj90@pIL wZ=Q8~_Ju`#59=RjDrmm`tMD@M=!-l18IR?&vFVdQ&MBb@0HFXL=0 ? varName.substring(i+1) : varName; + return eval(n.replace(/\-/g,'_')); +} + +function stripPath(uri) +{ + return uri.substring(uri.lastIndexOf('/')+1); +} + +function stripPath2(uri) +{ + var i = uri.lastIndexOf('/'); + var s = uri.substring(i+1); + var m = uri.substring(0,i+1).match(/\/d\w\/d\w\w\/$/); + return m ? uri.substring(i-6) : s; +} + +function hashValue() +{ + return $(location).attr('hash').substring(1).replace(/[^\w\-]/g,''); +} + +function hashUrl() +{ + return '#'+hashValue(); +} + +function pathName() +{ + return $(location).attr('pathname').replace(/[^-A-Za-z0-9+&@#/%?=~_|!:,.;\(\)]/g, ''); +} + +function localStorageSupported() +{ + try { + return 'localStorage' in window && window['localStorage'] !== null && window.localStorage.getItem; + } + catch(e) { + return false; + } +} + +function storeLink(link) +{ + if (!$("#nav-sync").hasClass('sync') && localStorageSupported()) { + window.localStorage.setItem('navpath',link); + } +} + +function deleteLink() +{ + if (localStorageSupported()) { + window.localStorage.setItem('navpath',''); + } +} + +function cachedLink() +{ + if (localStorageSupported()) { + return window.localStorage.getItem('navpath'); + } else { + return ''; + } +} + +function getScript(scriptName,func,show) +{ + var head = document.getElementsByTagName("head")[0]; + var script = document.createElement('script'); + script.id = scriptName; + script.type = 'text/javascript'; + script.onload = func; + script.src = scriptName+'.js'; + head.appendChild(script); +} + +function createIndent(o,domNode,node,level) +{ + var level=-1; + var n = node; + while (n.parentNode) { level++; n=n.parentNode; } + if (node.childrenData) { + var imgNode = document.createElement("span"); + imgNode.className = 'arrow'; + imgNode.style.paddingLeft=(16*level).toString()+'px'; + imgNode.innerHTML=arrowRight; + node.plus_img = imgNode; + node.expandToggle = document.createElement("a"); + node.expandToggle.href = "javascript:void(0)"; + node.expandToggle.onclick = function() { + if (node.expanded) { + $(node.getChildrenUL()).slideUp("fast"); + node.plus_img.innerHTML=arrowRight; + node.expanded = false; + } else { + expandNode(o, node, false, false); + } + } + node.expandToggle.appendChild(imgNode); + domNode.appendChild(node.expandToggle); + } else { + var span = document.createElement("span"); + span.className = 'arrow'; + span.style.width = 16*(level+1)+'px'; + span.innerHTML = ' '; + domNode.appendChild(span); + } +} + +var animationInProgress = false; + +function gotoAnchor(anchor,aname,updateLocation) +{ + var pos, docContent = $('#doc-content'); + var ancParent = $(anchor.parent()); + if (ancParent.hasClass('memItemLeft') || + ancParent.hasClass('memtitle') || + ancParent.hasClass('fieldname') || + ancParent.hasClass('fieldtype') || + ancParent.is(':header')) + { + pos = ancParent.position().top; + } else if (anchor.position()) { + pos = anchor.position().top; + } + if (pos) { + var dist = Math.abs(Math.min( + pos-docContent.offset().top, + docContent[0].scrollHeight- + docContent.height()-docContent.scrollTop())); + animationInProgress=true; + docContent.animate({ + scrollTop: pos + docContent.scrollTop() - docContent.offset().top + },Math.max(50,Math.min(500,dist)),function(){ + if (updateLocation) window.location.href=aname; + animationInProgress=false; + }); + } +} + +function newNode(o, po, text, link, childrenData, lastNode) +{ + var node = new Object(); + node.children = Array(); + node.childrenData = childrenData; + node.depth = po.depth + 1; + node.relpath = po.relpath; + node.isLast = lastNode; + + node.li = document.createElement("li"); + po.getChildrenUL().appendChild(node.li); + node.parentNode = po; + + node.itemDiv = document.createElement("div"); + node.itemDiv.className = "item"; + + node.labelSpan = document.createElement("span"); + node.labelSpan.className = "label"; + + createIndent(o,node.itemDiv,node,0); + node.itemDiv.appendChild(node.labelSpan); + node.li.appendChild(node.itemDiv); + + var a = document.createElement("a"); + node.labelSpan.appendChild(a); + node.label = document.createTextNode(text); + node.expanded = false; + a.appendChild(node.label); + if (link) { + var url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + link = url; + } else { + url = node.relpath+link; + } + a.className = stripPath(link.replace('#',':')); + if (link.indexOf('#')!=-1) { + var aname = '#'+link.split('#')[1]; + var srcPage = stripPath(pathName()); + var targetPage = stripPath(link.split('#')[0]); + a.href = srcPage!=targetPage ? url : "javascript:void(0)"; + a.onclick = function(){ + storeLink(link); + if (!$(a).parent().parent().hasClass('selected')) + { + $('.item').removeClass('selected'); + $('.item').removeAttr('id'); + $(a).parent().parent().addClass('selected'); + $(a).parent().parent().attr('id','selected'); + } + var anchor = $(aname); + gotoAnchor(anchor,aname,true); + }; + } else { + a.href = url; + a.onclick = function() { storeLink(link); } + } + } else { + if (childrenData != null) + { + a.className = "nolink"; + a.href = "javascript:void(0)"; + a.onclick = node.expandToggle.onclick; + } + } + + node.childrenUL = null; + node.getChildrenUL = function() { + if (!node.childrenUL) { + node.childrenUL = document.createElement("ul"); + node.childrenUL.className = "children_ul"; + node.childrenUL.style.display = "none"; + node.li.appendChild(node.childrenUL); + } + return node.childrenUL; + }; + + return node; +} + +function showRoot() +{ + var headerHeight = $("#top").height(); + var footerHeight = $("#nav-path").height(); + var windowHeight = $(window).height() - headerHeight - footerHeight; + (function (){ // retry until we can scroll to the selected item + try { + var navtree=$('#nav-tree'); + navtree.scrollTo('#selected',100,{offset:-windowHeight/2}); + } catch (err) { + setTimeout(arguments.callee, 0); + } + })(); +} + +function expandNode(o, node, imm, showRoot) +{ + if (node.childrenData && !node.expanded) { + if (typeof(node.childrenData)==='string') { + var varName = node.childrenData; + getScript(node.relpath+varName,function(){ + node.childrenData = getData(varName); + expandNode(o, node, imm, showRoot); + }, showRoot); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).slideDown("fast"); + node.plus_img.innerHTML = arrowDown; + node.expanded = true; + } + } +} + +function glowEffect(n,duration) +{ + n.addClass('glow').delay(duration).queue(function(next){ + $(this).removeClass('glow');next(); + }); +} + +function highlightAnchor() +{ + var aname = hashUrl(); + var anchor = $(aname); + if (anchor.parent().attr('class')=='memItemLeft'){ + var rows = $('.memberdecls tr[class$="'+hashValue()+'"]'); + glowEffect(rows.children(),300); // member without details + } else if (anchor.parent().attr('class')=='fieldname'){ + glowEffect(anchor.parent().parent(),1000); // enum value + } else if (anchor.parent().attr('class')=='fieldtype'){ + glowEffect(anchor.parent().parent(),1000); // struct field + } else if (anchor.parent().is(":header")) { + glowEffect(anchor.parent(),1000); // section header + } else { + glowEffect(anchor.next(),1000); // normal member + } +} + +function selectAndHighlight(hash,n) +{ + var a; + if (hash) { + var link=stripPath(pathName())+':'+hash.substring(1); + a=$('.item a[class$="'+link+'"]'); + } + if (a && a.length) { + a.parent().parent().addClass('selected'); + a.parent().parent().attr('id','selected'); + highlightAnchor(); + } else if (n) { + $(n.itemDiv).addClass('selected'); + $(n.itemDiv).attr('id','selected'); + } + if ($('#nav-tree-contents .item:first').hasClass('selected')) { + $('#nav-sync').css('top','30px'); + } else { + $('#nav-sync').css('top','5px'); + } + showRoot(); +} + +function showNode(o, node, index, hash) +{ + if (node && node.childrenData) { + if (typeof(node.childrenData)==='string') { + var varName = node.childrenData; + getScript(node.relpath+varName,function(){ + node.childrenData = getData(varName); + showNode(o,node,index,hash); + },true); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).css({'display':'block'}); + node.plus_img.innerHTML = arrowDown; + node.expanded = true; + var n = node.children[o.breadcrumbs[index]]; + if (index+11) hash = '#'+parts[1].replace(/[^\w\-]/g,''); + else hash=''; + } + if (hash.match(/^#l\d+$/)) { + var anchor=$('a[name='+hash.substring(1)+']'); + glowEffect(anchor.parent(),1000); // line number + hash=''; // strip line number anchors + } + var url=root+hash; + var i=-1; + while (NAVTREEINDEX[i+1]<=url) i++; + if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath) + } else { + getScript(relpath+'navtreeindex'+i,function(){ + navTreeSubIndices[i] = eval('NAVTREEINDEX'+i); + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath); + } + },true); + } +} + +function showSyncOff(n,relpath) +{ + n.html(''); +} + +function showSyncOn(n,relpath) +{ + n.html(''); +} + +function toggleSyncButton(relpath) +{ + var navSync = $('#nav-sync'); + if (navSync.hasClass('sync')) { + navSync.removeClass('sync'); + showSyncOff(navSync,relpath); + storeLink(stripPath2(pathName())+hashUrl()); + } else { + navSync.addClass('sync'); + showSyncOn(navSync,relpath); + deleteLink(); + } +} + +var loadTriggered = false; +var readyTriggered = false; +var loadObject,loadToRoot,loadUrl,loadRelPath; + +$(window).on('load',function(){ + if (readyTriggered) { // ready first + navTo(loadObject,loadToRoot,loadUrl,loadRelPath); + showRoot(); + } + loadTriggered=true; +}); + +function initNavTree(toroot,relpath) +{ + var o = new Object(); + o.toroot = toroot; + o.node = new Object(); + o.node.li = document.getElementById("nav-tree-contents"); + o.node.childrenData = NAVTREE; + o.node.children = new Array(); + o.node.childrenUL = document.createElement("ul"); + o.node.getChildrenUL = function() { return o.node.childrenUL; }; + o.node.li.appendChild(o.node.childrenUL); + o.node.depth = 0; + o.node.relpath = relpath; + o.node.expanded = false; + o.node.isLast = true; + o.node.plus_img = document.createElement("span"); + o.node.plus_img.className = 'arrow'; + o.node.plus_img.innerHTML = arrowRight; + + if (localStorageSupported()) { + var navSync = $('#nav-sync'); + if (cachedLink()) { + showSyncOff(navSync,relpath); + navSync.removeClass('sync'); + } else { + showSyncOn(navSync,relpath); + } + navSync.click(function(){ toggleSyncButton(relpath); }); + } + + if (loadTriggered) { // load before ready + navTo(o,toroot,hashUrl(),relpath); + showRoot(); + } else { // ready before load + loadObject = o; + loadToRoot = toroot; + loadUrl = hashUrl(); + loadRelPath = relpath; + readyTriggered=true; + } + + $(window).bind('hashchange', function(){ + if (window.location.hash && window.location.hash.length>1){ + var a; + if ($(location).attr('hash')){ + var clslink=stripPath(pathName())+':'+hashValue(); + a=$('.item a[class$="'+clslink.replace(/ + + + + + + +mrs_lib: include/mrs_lib/nckf.h Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    nckf.h
    +
    +
    +
    1 // clang: MatousFormat
    +
    6 #ifndef NCKFSYSTEMMODELS_H
    +
    7 #define NCKFSYSTEMMODELS_H
    +
    8 
    +
    9 #include <mrs_lib/lkf.h>
    +
    10 #include <mrs_lib/ukf.h>
    +
    11 
    +
    12 namespace mrs_lib
    +
    13 {
    +
    14 
    +
    15  /* class NCLKF //{ */
    +
    27  template <int n_states, int n_inputs, int n_measurements>
    +
    28  class NCLKF : public LKF<n_states, n_inputs, n_measurements>
    +
    29  {
    +
    30  public:
    +
    31  /* NCLKF definitions (typedefs, constants etc) //{ */
    +
    32  static const int n = n_states;
    +
    33  static const int m = n_inputs;
    +
    34  static const int p = n_measurements;
    + +
    37  using x_t = typename Base_class::x_t;
    +
    38  using u_t = typename Base_class::u_t;
    +
    39  using z_t = typename Base_class::z_t;
    +
    40  using P_t = typename Base_class::P_t;
    +
    41  using R_t = typename Base_class::R_t;
    +
    42  using Q_t = typename Base_class::Q_t;
    + +
    45  using A_t = typename Base_class::A_t;
    +
    46  using B_t = typename Base_class::B_t;
    +
    47  using H_t = typename Base_class::H_t;
    +
    48  using K_t = typename Base_class::K_t;
    +
    49  //}
    +
    50 
    +
    51  public:
    +
    58  NCLKF(){};
    +
    59 
    +
    68  NCLKF(const A_t& A, const B_t& B, const H_t& H, const double l) : Base_class(A, B, H), l(l) {};
    +
    69 
    +
    70  protected:
    +
    71  double l;
    +
    72 
    +
    73  protected:
    +
    74  /* computeKalmanGain() method //{ */
    +
    75  virtual K_t computeKalmanGain(const statecov_t& sc, const z_t& z, const R_t& R, const H_t& H) const override
    +
    76  {
    +
    77  const R_t W = H * sc.P * H.transpose() + R;
    +
    78  const R_t W_inv = Base_class::invert_W(W);
    +
    79  const K_t K_orig = sc.P * H.transpose() * W_inv;
    +
    80 
    +
    81  const z_t inn = z - (H * sc.x); // innovation
    +
    82  const x_t x = sc.x + K_orig * inn;
    +
    83  const double inn_scale = inn.transpose() * W_inv * inn;
    +
    84 
    +
    85  const double x_norm = x.norm();
    +
    86  const K_t K = K_orig + (l/x_norm - 1.0) * x * (inn.transpose() * W_inv) / inn_scale;
    +
    87 
    +
    88  return K;
    +
    89  }
    +
    90  //}
    +
    91 
    +
    92  };
    +
    93  //}
    +
    94 
    +
    95  /* class NCLKF_partial //{ */
    +
    96 
    +
    111  template <int n_states, int n_inputs, int n_measurements, int n_norm_constrained_states>
    +
    112  class NCLKF_partial : public NCLKF<n_states, n_inputs, n_measurements>
    +
    113  {
    +
    114  public:
    +
    115  /* NCLKF_partial definitions (typedefs, constants etc) //{ */
    +
    116  static const int n = n_states;
    +
    117  static const int m = n_inputs;
    +
    118  static const int p = n_measurements;
    +
    119  static const int nq = n_norm_constrained_states;
    + +
    122  using x_t = typename Base_class::x_t;
    +
    123  using u_t = typename Base_class::u_t;
    +
    124  using z_t = typename Base_class::z_t;
    +
    125  using P_t = typename Base_class::P_t;
    +
    126  using R_t = typename Base_class::R_t;
    +
    127  using Q_t = typename Base_class::Q_t;
    + +
    130  using A_t = typename Base_class::A_t;
    +
    131  using B_t = typename Base_class::B_t;
    +
    132  using H_t = typename Base_class::H_t;
    +
    133  using K_t = typename Base_class::K_t;
    +
    135  using indices_t = std::array<int, nq>;
    +
    136  using xq_t = Eigen::Matrix<double, nq, 1>;
    +
    137  using Hq_t = Eigen::Matrix<double, p, nq>;
    +
    138  using Kq_t = Eigen::Matrix<double, nq, p>;
    +
    139  //}
    +
    140 
    +
    141  public:
    + +
    149 
    +
    159  NCLKF_partial(const A_t& A, const B_t& B, const H_t& H, const double l, const indices_t& norm_constrained_indices)
    +
    160  : Base_class(A, B, H, l),
    +
    161  norm_indices(norm_constrained_indices)
    +
    162  {
    +
    163  if (n >= 0)
    +
    164  {
    +
    165  for (auto& idx : norm_indices)
    +
    166  {
    +
    167  if (idx > n)
    +
    168  {
    +
    169  ROS_ERROR("[NCLKF_partial]: Index of a norm-constrained state (%d) cannot be higher than the number of states (%d)! Setting it to zero.", idx, n);
    +
    170  idx = 0;
    +
    171  }
    +
    172  if (idx < 0)
    +
    173  {
    +
    174  ROS_ERROR("[NCLKF_partial]: Index of a norm-constrained state (%d) cannot be less than zero! Setting it to zero.", idx);
    +
    175  idx = 0;
    +
    176  }
    +
    177  }
    +
    178  }
    +
    179  };
    +
    180 
    +
    181  private:
    +
    182  indices_t norm_indices;
    +
    183 
    +
    184  /* helper methods for Eigen matrix subscripting //{ */
    +
    185 
    +
    186  template <typename T, int rows, int cols, size_t out_rows, size_t out_cols>
    +
    187  Eigen::Matrix<T, out_rows, out_cols> select_indices(const Eigen::Matrix<T, rows, cols>& mat, const std::array<int, out_rows>& row_indices, const std::array<int, out_cols>& col_indices) const
    +
    188  {
    +
    189  Eigen::Matrix<T, out_rows, cols> tmp;
    +
    190  for (int it = 0; it < (int)out_rows; it++)
    +
    191  {
    +
    192  const auto row = row_indices[it];
    +
    193  assert(rows < 0 || row < rows);
    +
    194  tmp.row(it) = mat.row(row);
    +
    195  }
    +
    196 
    +
    197  Eigen::Matrix<T, out_rows, out_cols> ret;
    +
    198  for (int it = 0; it < (int)out_cols; it++)
    +
    199  {
    +
    200  const auto col = col_indices[it];
    +
    201  assert(cols < 0 || col < cols);
    +
    202  tmp.col(it) = tmp.col(col);
    +
    203  }
    +
    204 
    +
    205  return ret;
    +
    206  }
    +
    207 
    +
    208  template <typename T, int rows, int cols, size_t out_rows>
    +
    209  Eigen::Matrix<T, out_rows, cols> select_rows(const Eigen::Matrix<T, rows, cols>& mat, const std::array<int, out_rows>& row_indices) const
    +
    210  {
    +
    211  Eigen::Matrix<T, out_rows, cols> ret;
    +
    212  for (int it = 0; it < (int)out_rows; it++)
    +
    213  {
    +
    214  const auto row = row_indices[it];
    +
    215  assert(rows < 0 || row < rows);
    +
    216  ret.row(it) = mat.row(row);
    +
    217  }
    +
    218  return ret;
    +
    219  }
    +
    220 
    +
    221  template <typename T, int rows, int cols, size_t out_cols>
    +
    222  Eigen::Matrix<T, rows, out_cols> select_cols(const Eigen::Matrix<T, rows, cols>& mat, const std::array<int, out_cols>& col_indices) const
    +
    223  {
    +
    224  Eigen::Matrix<T, rows, out_cols> ret;
    +
    225  for (int it = 0; it < (int)out_cols; it++)
    +
    226  {
    +
    227  const auto col = col_indices[it];
    +
    228  assert(cols < 0 || col < cols);
    +
    229  ret.col(it) = mat.col(col);
    +
    230  }
    +
    231  return ret;
    +
    232  }
    +
    233 
    +
    234  template <typename T, int rows, size_t out_rows>
    +
    235  Eigen::Matrix<T, out_rows, 1> select_indices(const Eigen::Matrix<T, rows, 1>& vec, const std::array<int, out_rows>& row_indices) const
    +
    236  {
    +
    237  return select_rows(vec, row_indices);
    +
    238  }
    +
    239 
    +
    240  template <typename T, int rows, int cols, size_t n_rows>
    +
    241  void set_rows(const Eigen::Matrix<T, (size_t)n_rows, cols>& from_mat, Eigen::Matrix<T, rows, cols>& to_mat, const std::array<int, n_rows>& row_indices) const
    +
    242  {
    +
    243  for (int rit = 0; rit < (int)n_rows; rit++)
    +
    244  {
    +
    245  const auto ridx = row_indices.at(rit);
    +
    246  assert(rows < 0 || ridx < rows);
    +
    247  to_mat.row(ridx) = from_mat.row(rit);
    +
    248  }
    +
    249  }
    +
    250 
    +
    251  //}
    +
    252 
    +
    253  protected:
    +
    254  /* computeKalmanGain() method //{ */
    +
    255  virtual K_t computeKalmanGain(const statecov_t& sc, const z_t& z, const R_t& R, const H_t& H) const override
    +
    256  {
    +
    257  const R_t W = H * sc.P * H.transpose() + R;
    +
    258  const R_t W_inv = Base_class::invert_W(W);
    +
    259  K_t K = sc.P * H.transpose() * W_inv;
    +
    260 
    +
    261  // calculate the kalman gain for the norm-constrained states
    +
    262  {
    +
    263  const Kq_t K_orig = select_rows(K, norm_indices);
    +
    264  const xq_t xq = select_indices(sc.x, norm_indices);
    +
    265  const Hq_t Hq = select_cols(H, norm_indices);
    +
    266  const z_t inn = z - (Hq * xq); // innovation
    +
    267  const xq_t x = xq + K_orig * inn;
    +
    268  const double inn_scale = inn.transpose() * W_inv * inn;
    +
    269 
    +
    270  const double x_norm = x.norm();
    +
    271  const Kq_t Kq = K_orig + (Base_class::l/x_norm - 1.0) * x * (inn.transpose() * W_inv) / inn_scale;
    +
    272  set_rows(Kq, K, norm_indices);
    +
    273  }
    +
    274 
    +
    275  return K;
    +
    276  }
    +
    277  //}
    +
    278 
    +
    279  };
    +
    280  //}
    +
    281 
    +
    282  /* class NCUKF //{ */
    +
    283  template <int n_states, int n_inputs, int n_measurements>
    +
    284  class NCUKF : public UKF<n_states, n_inputs, n_measurements>
    +
    285  {
    +
    286  public:
    +
    287  /* LKF definitions (typedefs, constants etc) //{ */
    +
    288  static const int n = n_states;
    +
    289  static const int m = n_inputs;
    +
    290  static const int p = n_measurements;
    +
    291  using Base_class = UKF<n, m, p>;
    +
    292 
    +
    293  using x_t = typename Base_class::x_t; // state vector n*1
    +
    294  using u_t = typename Base_class::u_t; // input vector m*1
    +
    295  using z_t = typename Base_class::z_t; // measurement vector p*1
    +
    296  using P_t = typename Base_class::P_t; // state covariance n*n
    +
    297  using R_t = typename Base_class::R_t; // measurement covariance p*p
    +
    298  using Q_t = typename Base_class::Q_t; // measurement covariance p*p
    +
    299  using statecov_t = typename Base_class::statecov_t; // helper struct for state and covariance
    +
    300 
    +
    301  using transition_model_t = typename Base_class::transition_model_t;
    +
    302  using observation_model_t = typename Base_class::observation_model_t;
    +
    303 
    +
    304  using X_t = typename Base_class::X_t; // state sigma points matrix n*w
    +
    305  using Z_t = typename Base_class::Z_t; // measurement sigma points matrix p*w
    +
    306  using Pzz_t = typename Base_class::Pzz_t; // Pzz helper matrix p*n
    +
    307  using K_t = typename Base_class::K_t; // kalman gain n*p
    +
    308  //}
    +
    309 
    +
    310  public:
    +
    311  NCUKF(){};
    +
    312 
    +
    313  NCUKF(const transition_model_t& transition_model, const observation_model_t& observation_model, const double l, const double alpha = 1e-3, const double kappa = 1, const double beta = 2)
    +
    314  : Base_class(transition_model, observation_model, alpha, kappa, beta), l(l) {};
    +
    315 
    +
    316  public:
    +
    317  /* correct() method //{ */
    +
    318  virtual statecov_t correct(const statecov_t& sc, const z_t& z, const R_t& R) const override
    +
    319  {
    +
    320  const auto& x = sc.x;
    +
    321  const auto& P = sc.P;
    +
    322  const X_t S = Base_class::computeSigmas(x, P);
    +
    323 
    +
    324  // propagate sigmas through the observation model
    +
    325  Z_t Z_exp;
    +
    326  for (int i = 0; i < Base_class::w; i++)
    +
    327  {
    +
    328  Z_exp.col(i) = Base_class::m_observation_model(S.col(i));
    +
    329  }
    +
    330 
    +
    331  // compute expected measurement
    +
    332  z_t z_exp = z_t::Zero();
    +
    333  for (int i = 0; i < Base_class::w; i++)
    +
    334  {
    +
    335  z_exp += Base_class::m_Wm(i) * Z_exp.col(i);
    +
    336  }
    +
    337 
    +
    338  // compute the covariance of measurement
    +
    339  Pzz_t Pzz = Pzz_t::Zero();
    +
    340  for (int i = 0; i < Base_class::w; i++)
    +
    341  {
    +
    342  Pzz += Base_class::m_Wc(i) * (Z_exp.col(i) - z_exp) * (Z_exp.col(i) - z_exp).transpose();
    +
    343  }
    +
    344  Pzz += R;
    +
    345 
    +
    346  // compute cross covariance
    +
    347  K_t Pxz = K_t::Zero();
    +
    348  for (int i = 0; i < Base_class::w; i++)
    +
    349  {
    +
    350  Pxz += Base_class::m_Wc(i) * (S.col(i) - x) * (Z_exp.col(i) - z_exp).transpose();
    +
    351  }
    +
    352 
    +
    353  // compute Kalman gain
    +
    354  const z_t inn = (z - z_exp); // innovation
    +
    355  const K_t K = computeKalmanGain(sc.x, inn, Pxz, Pzz);
    +
    356 
    +
    357  // check whether the inverse produced valid numbers
    +
    358  if (!K.array().isFinite().all())
    +
    359  {
    +
    360  ROS_ERROR("UKF: inverting of Pzz in correction update produced non-finite numbers!!! Fix your covariances (the measurement's is probably too low...)");
    +
    361  throw typename Base_class::inverse_exception();
    +
    362  }
    +
    363 
    +
    364  // correct
    +
    365  statecov_t ret;
    +
    366  ret.x = x + K * inn;
    +
    367  ret.P = P - K * Pxz.transpose() - Pxz * K.transpose() + K * Pzz * K.transpose();
    +
    368  return ret;
    +
    369  }
    +
    370  //}
    +
    371 
    +
    372  protected:
    +
    373  double l;
    +
    374 
    +
    375  protected:
    +
    376  /* computeKalmanGain() method //{ */
    +
    377  virtual K_t computeKalmanGain(const x_t& x, const z_t& inn, const K_t& Pxz, const Pzz_t& Pzz) const override
    +
    378  {
    +
    379  const Pzz_t Pzz_inv = Base_class::computeInverse(Pzz);
    +
    380  const K_t K_orig = Pxz * Pzz_inv;
    +
    381 
    +
    382  const x_t x_pred = x + K_orig * inn;
    +
    383  const double inn_scale = inn.transpose() * Pzz_inv * inn;
    +
    384 
    +
    385  const double x_norm = x_pred.norm();
    +
    386  const K_t K = K_orig + (l/x_norm - 1.0) * x_pred * (inn.transpose() * Pzz_inv) / inn_scale;
    +
    387 
    +
    388  return K;
    +
    389  }
    +
    390  //}
    +
    391 
    +
    392  };
    +
    393  //}
    +
    394 
    +
    395 } // namespace mrs_lib
    +
    396 
    +
    397 #endif // NCKFSYSTEMMODELS_H
    +
    398 
    +
    +
    +
    typename Eigen::Matrix< double, n, w > X_t
    State sigma points matrix.
    Definition: ukf.h:50
    +
    typename Base_class::Q_t Q_t
    process covariance n*n typedef
    Definition: ukf.h:69
    +
    typename Base_class::Q_t Q_t
    Process noise covariance matrix type .
    Definition: lkf.h:52
    +
    typename Base_class::B_t B_t
    Input to state mapping matrix type .
    Definition: nckf.h:46
    +
    Eigen::Matrix< double, p, n > H_t
    State to measurement mapping matrix type .
    Definition: lkf.h:57
    +
    typename Base_class::P_t P_t
    State uncertainty covariance matrix type .
    Definition: lkf.h:50
    +
    static const int m
    Length of the input vector of the system.
    Definition: nckf.h:33
    +
    typename Base_class::u_t u_t
    Input vector type .
    Definition: nckf.h:38
    +
    H_t H
    The state to measurement mapping matrix .
    Definition: lkf.h:150
    +
    static const int m
    Length of the input vector of the system.
    Definition: nckf.h:117
    +
    typename Base_class::z_t z_t
    measurement vector p*1 typedef
    Definition: ukf.h:63
    +
    static const int p
    Length of the measurement vector of the system.
    Definition: nckf.h:34
    +
    NCLKF_partial(const A_t &A, const B_t &B, const H_t &H, const double l, const indices_t &norm_constrained_indices)
    The main constructor.
    Definition: nckf.h:159
    +
    typename Base_class::statecov_t statecov_t
    Helper struct for passing around the state and its covariance in one variable.
    Definition: lkf.h:53
    +
    virtual statecov_t correct(const statecov_t &sc, const z_t &z, const R_t &R) const override
    Implements the state correction step (measurement update).
    Definition: nckf.h:318
    +
    typename Base_class::R_t R_t
    Measurement noise covariance matrix type .
    Definition: lkf.h:51
    +
    NCLKF()
    Convenience default constructor.
    Definition: nckf.h:58
    +
    Eigen::Matrix< double, p, p > R_t
    Measurement noise covariance matrix type .
    Definition: kalman_filter.h:39
    +
    typename Eigen::Matrix< double, n, p > K_t
    Kalman gain matrix.
    Definition: ukf.h:53
    +
    typename Base_class::z_t z_t
    Measurement vector type .
    Definition: nckf.h:39
    +
    typename Base_class::Q_t Q_t
    Process noise covariance matrix type .
    Definition: nckf.h:42
    +
    typename Base_class::x_t x_t
    State vector type .
    Definition: nckf.h:37
    +
    typename std::function< x_t(const x_t &, const u_t &, double)> transition_model_t
    function of the state transition model typedef
    Definition: ukf.h:75
    +
    static const int n
    Length of the state vector of the system.
    Definition: nckf.h:116
    +
    Eigen::Matrix< double, p, nq > Hq_t
    Norm-constrained measurement mapping type .
    Definition: nckf.h:137
    +
    Eigen::Matrix< double, n, n > P_t
    State uncertainty covariance matrix type .
    Definition: kalman_filter.h:38
    +
    This class implements the partially norm-constrained linear Kalman filter .
    Definition: nckf.h:112
    +
    typename Base_class::u_t u_t
    input vector m*1 typedef
    Definition: ukf.h:61
    +
    typename Base_class::P_t P_t
    State uncertainty covariance matrix type .
    Definition: nckf.h:40
    +
    typename Base_class::statecov_t statecov_t
    typedef of a helper struct for state and covariance
    Definition: ukf.h:73
    +
    static const int nq
    Number of states to which the norm constraint applies.
    Definition: nckf.h:119
    +
    typename Base_class::A_t A_t
    System transition matrix type .
    Definition: nckf.h:45
    +
    Eigen::Matrix< double, m, 1 > u_t
    Input vector type .
    Definition: kalman_filter.h:35
    +
    static constexpr int w
    Number of sigma points/weights.
    Definition: ukf.h:46
    +
    Eigen::Matrix< double, n, m > B_t
    Input to state mapping matrix type .
    Definition: lkf.h:56
    +
    typename Base_class::x_t x_t
    State vector type .
    Definition: lkf.h:47
    +
    typename std::function< z_t(const x_t &)> observation_model_t
    function of the observation model typedef
    Definition: ukf.h:77
    +
    Eigen::Matrix< double, n, 1 > x_t
    State vector type .
    Definition: kalman_filter.h:34
    +
    Eigen::Matrix< double, nq, 1 > xq_t
    Norm-constrained states vector type .
    Definition: nckf.h:136
    +
    NCLKF_partial()
    Convenience default constructor.
    Definition: nckf.h:148
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    +
    typename Base_class::R_t R_t
    measurement covariance p*p typedef
    Definition: ukf.h:67
    +
    typename Base_class::R_t R_t
    Measurement noise covariance matrix type .
    Definition: nckf.h:41
    +
    Eigen::Matrix< double, n, n > A_t
    System transition matrix type .
    Definition: lkf.h:55
    +
    B_t B
    The input to state mapping matrix .
    Definition: lkf.h:149
    +
    typename Eigen::Matrix< double, p, p > Pzz_t
    Pzz helper matrix.
    Definition: ukf.h:52
    +
    std::array< int, nq > indices_t
    Indices of the norm-constrained states type.
    Definition: nckf.h:135
    +
    typename Base_class::P_t P_t
    state covariance n*n typedef
    Definition: ukf.h:65
    +
    NCLKF(const A_t &A, const B_t &B, const H_t &H, const double l)
    The main constructor.
    Definition: nckf.h:68
    +
    static const int n
    Length of the state vector of the system.
    Definition: nckf.h:32
    +
    Implementation of the Linear Kalman filter .
    Definition: lkf.h:38
    +
    Eigen::Matrix< double, n, p > K_t
    Kalman gain matrix type .
    Definition: lkf.h:58
    +
    typename Base_class::K_t K_t
    Kalman gain matrix type .
    Definition: nckf.h:48
    +
    typename Base_class::statecov_t statecov_t
    Helper struct for passing around the state and its covariance in one variable.
    Definition: nckf.h:43
    +
    static const int p
    Length of the measurement vector of the system.
    Definition: nckf.h:118
    +
    typename Base_class::H_t H_t
    State to measurement mapping matrix type .
    Definition: nckf.h:47
    +
    typename Base_class::x_t x_t
    state vector n*1 typedef
    Definition: ukf.h:59
    +
    Eigen::Matrix< double, n, n > Q_t
    Process noise covariance matrix type .
    Definition: kalman_filter.h:40
    +
    typename Base_class::z_t z_t
    Measurement vector type .
    Definition: lkf.h:49
    +
    Eigen::Matrix< double, p, 1 > z_t
    Measurement vector type .
    Definition: kalman_filter.h:36
    +
    Definition: nckf.h:284
    +
    typename Base_class::K_t K_t
    Kalman gain matrix type .
    Definition: nckf.h:133
    +
    typename Eigen::Matrix< double, p, w > Z_t
    Measurement sigma points matrix.
    Definition: ukf.h:51
    +
    A_t A
    The system transition matrix .
    Definition: lkf.h:144
    +
    Defines UKF - a class implementing the Unscented Kalman Filter .
    +
    typename Base_class::u_t u_t
    Input vector type .
    Definition: lkf.h:48
    +
    This class implements the norm-constrained linear Kalman filter .
    Definition: nckf.h:28
    +
    Eigen::Matrix< double, nq, p > Kq_t
    Norm-constrained kalman gain type .
    Definition: nckf.h:138
    +
    Implementation of the Unscented Kalman filter .
    Definition: ukf.h:39
    +
    is thrown when taking the inverse of a matrix fails during kalman gain calculation
    Definition: ukf.h:89
    +
    This abstract class defines common interfaces and types for a generic Kalman filter.
    Definition: kalman_filter.h:26
    + + + + diff --git a/nckf__tests_8cpp.html b/nckf__tests_8cpp.html new file mode 100644 index 00000000..5b0299f8 --- /dev/null +++ b/nckf__tests_8cpp.html @@ -0,0 +1,205 @@ + + + + + + + +mrs_lib: src/nckf/nckf_tests.cpp File Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    nckf_tests.cpp File Reference
    +
    +
    + +

    Tests for the UKF implementation. +More...

    +
    #include <mrs_lib/nckf.h>
    +#include <random>
    +
    + + Include dependency graph for nckf_tests.cpp:
    +
    +
    + +
    + + + + +

    +Namespaces

     mrs_lib
     All mrs_lib functions, classes, variables and definitions are contained in this namespace.
     
    + + + + + + + + + + + + + + + + + + + +

    +Typedefs

    +using Q_t = lkf_t::Q_t
     
    +using x_t = lkf_t::x_t
     
    +using P_t = lkf_t::P_t
     
    +using u_t = lkf_t::u_t
     
    +using z_t = lkf_t::z_t
     
    +using R_t = lkf_t::R_t
     
    +using A_t = lkf_t::A_t
     
    +using B_t = lkf_t::B_t
     
    +using H_t = lkf_t::H_t
     
    + + + + + + + + + + +

    +Functions

    +x_t tra_model_f (const x_t &x, const u_t &u, [[maybe_unused]] const double dt)
     
    +z_t obs_model_f (const x_t &x)
     
    +template<int rows>
    Eigen::Matrix< double, rows, 1 > normal_randmat (const Eigen::Matrix< double, rows, rows > &cov)
     
    +int main ()
     
    + + + + + + + + + + + +

    +Variables

    +const int mrs_lib::n_states_norm_constrained = 2
     
    +constexpr int n = 4
     
    +A_t A
     
    +B_t B
     
    +H_t H
     
    +

    Detailed Description

    +

    Tests for the UKF implementation.

    +
    Author
    Matouš Vrba - vrbam.nosp@m.ato@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz
    +
    +
    + + + + diff --git a/nckf__tests_8cpp.js b/nckf__tests_8cpp.js new file mode 100644 index 00000000..edd79f67 --- /dev/null +++ b/nckf__tests_8cpp.js @@ -0,0 +1,21 @@ +var nckf__tests_8cpp = +[ + [ "A_t", "nckf__tests_8cpp.html#ae8fded1ffb13cfff36afc1eedabf215f", null ], + [ "B_t", "nckf__tests_8cpp.html#a5c39f7a461054863b37ddf9186eeb366", null ], + [ "H_t", "nckf__tests_8cpp.html#aa4437350efd30cd9ab6dbea2a2621faa", null ], + [ "P_t", "nckf__tests_8cpp.html#a8519b4182b449bbd63c34794c1b03312", null ], + [ "Q_t", "nckf__tests_8cpp.html#afb367b4e310274e83ea453f1d9329df0", null ], + [ "R_t", "nckf__tests_8cpp.html#a0571298449e0cf2aee255bf7e06e7b86", null ], + [ "u_t", "nckf__tests_8cpp.html#a846481e2173f20986bcee056e29a5b4c", null ], + [ "x_t", "nckf__tests_8cpp.html#a1db3b17743d9d81ac2aa852a6ed2e4c6", null ], + [ "z_t", "nckf__tests_8cpp.html#a3dd466ca19241875ff72a627b1f86a25", null ], + [ "main", "nckf__tests_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4", null ], + [ "normal_randmat", "nckf__tests_8cpp.html#a1aa37976011a3b2fb4c2af6d82853687", null ], + [ "obs_model_f", "nckf__tests_8cpp.html#a4ea961b6252e3dbe39f69775796091ee", null ], + [ "tra_model_f", "nckf__tests_8cpp.html#a8688a140d7d6993d6f2c1844c9359f4f", null ], + [ "A", "nckf__tests_8cpp.html#af1040ffeface88f6c9d4e56db0af4e8f", null ], + [ "B", "nckf__tests_8cpp.html#aaaf68e4cd1134a9f26b41018c8ebbb6a", null ], + [ "H", "nckf__tests_8cpp.html#a354ab4a2f81b229ea9b469d06b672c88", null ], + [ "n", "nckf__tests_8cpp.html#a64138b0bf948f19a2a23767106f99884", null ], + [ "n_states_norm_constrained", "nckf__tests_8cpp.html#a45a6d658a0ccfafbb641821f11d2d2f8", null ] +]; \ No newline at end of file diff --git a/nckf__tests_8cpp__incl.map b/nckf__tests_8cpp__incl.map new file mode 100644 index 00000000..d19e15d9 --- /dev/null +++ b/nckf__tests_8cpp__incl.map @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/nckf__tests_8cpp__incl.md5 b/nckf__tests_8cpp__incl.md5 new file mode 100644 index 00000000..9c1a1ce5 --- /dev/null +++ b/nckf__tests_8cpp__incl.md5 @@ -0,0 +1 @@ +4717a827b0d6a393820fd0a8f6657a63 \ No newline at end of file diff --git a/nckf__tests_8cpp__incl.png b/nckf__tests_8cpp__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..8db1f589895210151aab9ca758207fd39355e791 GIT binary patch literal 20533 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 d{ + + + + + + +mrs_lib: include/mrs_lib/notch_filter.h File Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    notch_filter.h File Reference
    +
    +
    +
    #include <Eigen/Dense>
    +#include <ros/ros.h>
    +#include <mrs_lib/iir_filter.h>
    +
    + + Include dependency graph for notch_filter.h:
    +
    +
    + +
    +

    Go to the source code of this file.

    + + + + +

    +Classes

    class  mrs_lib::NotchFilter
     
    + + + + +

    +Namespaces

     mrs_lib
     All mrs_lib functions, classes, variables and definitions are contained in this namespace.
     
    +

    Detailed Description

    +
    +
    + + + + diff --git a/notch__filter_8h__incl.map b/notch__filter_8h__incl.map new file mode 100644 index 00000000..0ae31ea1 --- /dev/null +++ b/notch__filter_8h__incl.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/notch__filter_8h__incl.md5 b/notch__filter_8h__incl.md5 new file mode 100644 index 00000000..ea0fb75f --- /dev/null +++ b/notch__filter_8h__incl.md5 @@ -0,0 +1 @@ +394e8a2edb668c11ca1d770f629cdfc0 \ No newline at end of file diff --git a/notch__filter_8h__incl.png b/notch__filter_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..edcdfac8579c218513f632df342d3b00831cf992 GIT binary patch literal 10084 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�dvimLeEka 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 b?;os|6`S0eIm1BN97Il9S?Y&`q2GT2#Sf*S literal 0 HcmV?d00001 diff --git a/notch__filter_8h_source.html b/notch__filter_8h_source.html new file mode 100644 index 00000000..c3635165 --- /dev/null +++ b/notch__filter_8h_source.html @@ -0,0 +1,132 @@ + + + + + + + +mrs_lib: include/mrs_lib/notch_filter.h Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    notch_filter.h
    +
    +
    +Go to the documentation of this file.
    1 
    +
    4 #ifndef NOTCH_FILTER_H
    +
    5 #define NOTCH_FILTER_H
    +
    6 
    +
    7 #include <Eigen/Dense>
    +
    8 #include <ros/ros.h>
    +
    9 
    +
    10 #include <mrs_lib/iir_filter.h>
    +
    11 
    +
    12 namespace mrs_lib
    +
    13 {
    +
    14 
    +
    15 class NotchFilter {
    +
    16 
    +
    17 public:
    +
    18  /* NotchFilter(const double& sample_rate, const std::vector<double>& frequencies_in, const std::vector<double>& bandwidths_in); */
    +
    19  NotchFilter(const double& sample_rate, const double& frequency_in, const double& bandwidth_in);
    +
    20 
    +
    21  double iterate(double& sample_in);
    +
    22 
    +
    23 private:
    +
    24  std::unique_ptr<mrs_lib::IirFilter> filter;
    +
    25 };
    +
    26 
    +
    27 } // namespace mrs_lib
    +
    28 
    +
    29 #endif
    +
    +
    + +
    Definition: notch_filter.h:15
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    + + + + diff --git a/open.png b/open.png new file mode 100644 index 0000000000000000000000000000000000000000..30f75c7efe2dd0c9e956e35b69777a02751f048b GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaDC0y znK1_#cQqJWPES%4Uujug^TE?jMft$}Eq^WaR~)%f)vSNs&gek&x%A9X9sM + + + + + + +mrs_lib: Related Pages + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Related Pages
    +
    +
    +
    Here is a list of all related documentation pages:
    + + +
     Bibliography
    +
    +
    +
    + + + + diff --git a/param__loader_2example_8cpp.html b/param__loader_2example_8cpp.html new file mode 100644 index 00000000..dfe873e2 --- /dev/null +++ b/param__loader_2example_8cpp.html @@ -0,0 +1,142 @@ + + + + + + + +mrs_lib: src/param_loader/example.cpp File Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    example.cpp File Reference
    +
    +
    + +

    Example file for the ParamLoader convenience class. +More...

    +
    + + Include dependency graph for example.cpp:
    +
    +
    + +
    + + + +

    +Functions

    +int main (int argc, char **argv)
     
    +

    Detailed Description

    +

    Example file for the ParamLoader convenience class.

    +
    Author
    Matouš Vrba - vrbam.nosp@m.ato@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz
    +

    This example may be run after building mrs_lib by executing rosrun mrs_lib param_loader_example.

    +

    See param_loader/example.cpp.

    +
    +
    + + + + diff --git a/param__loader_2example_8cpp.js b/param__loader_2example_8cpp.js new file mode 100644 index 00000000..a3f4b467 --- /dev/null +++ b/param__loader_2example_8cpp.js @@ -0,0 +1,4 @@ +var param__loader_2example_8cpp = +[ + [ "main", "param__loader_2example_8cpp.html#a3c04138a5bfe5d72780bb7e82a18e627", null ] +]; \ No newline at end of file diff --git a/param__loader_2example_8cpp__incl.map b/param__loader_2example_8cpp__incl.map new file mode 100644 index 00000000..e483383c --- /dev/null +++ b/param__loader_2example_8cpp__incl.map @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/param__loader_2example_8cpp__incl.md5 b/param__loader_2example_8cpp__incl.md5 new file mode 100644 index 00000000..40ea218b --- /dev/null +++ b/param__loader_2example_8cpp__incl.md5 @@ -0,0 +1 @@ +d0205ef8ffadf3c16ddf7174585d7710 \ No newline at end of file diff --git a/param__loader_2example_8cpp__incl.png b/param__loader_2example_8cpp__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..5d931d56ec9ff260c136d99ec3dfff0d714b498b GIT binary patch literal 28890 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 z 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 Pk0vE9FIFJ>%JY8!G%&{8 literal 0 HcmV?d00001 diff --git a/param__loader_8h.html b/param__loader_8h.html new file mode 100644 index 00000000..482a73cf --- /dev/null +++ b/param__loader_8h.html @@ -0,0 +1,179 @@ + + + + + + + +mrs_lib: include/mrs_lib/param_loader.h File Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    param_loader.h File Reference
    +
    +
    + +

    Defines ParamLoader - a convenience class for loading static ROS parameters. +More...

    +
    #include <ros/ros.h>
    +#include <string>
    +#include <map>
    +#include <unordered_set>
    +#include <iostream>
    +#include <Eigen/Dense>
    +#include <std_msgs/ColorRGBA.h>
    +#include <mrs_lib/param_provider.h>
    +
    + + Include dependency graph for param_loader.h:
    +
    +
    + +
    + + This graph shows which files directly or indirectly include this file:
    +
    +
    + +
    +

    Go to the source code of this file.

    + + + + + +

    +Classes

    class  mrs_lib::ParamLoader
     Convenience class for loading parameters from rosparam server. More...
     
    + + + + +

    +Namespaces

     mrs_lib
     All mrs_lib functions, classes, variables and definitions are contained in this namespace.
     
    + + + + + + + + + +

    +Functions

    template<>
    ros::Duration mrs_lib::ParamLoader::loadParam2< ros::Duration > (const std::string &name, const ros::Duration &default_value)
     An overload for loading ros::Duration. More...
     
    template<>
    ros::Duration mrs_lib::ParamLoader::loadParam2< ros::Duration > (const std::string &name)
     An overload for loading ros::Duration. More...
     
    +

    Detailed Description

    +

    Defines ParamLoader - a convenience class for loading static ROS parameters.

    +
    Author
    Matouš Vrba - vrbam.nosp@m.ato@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz
    +
    +
    + + + + diff --git a/param__loader_8h.js b/param__loader_8h.js new file mode 100644 index 00000000..c27695f9 --- /dev/null +++ b/param__loader_8h.js @@ -0,0 +1,6 @@ +var param__loader_8h = +[ + [ "ParamLoader", "classmrs__lib_1_1ParamLoader.html", "classmrs__lib_1_1ParamLoader" ], + [ "ParamLoader::loadParam2< ros::Duration >", "param__loader_8h.html#a3b3a11cf5354658548afb9fd6f241d72", null ], + [ "ParamLoader::loadParam2< ros::Duration >", "param__loader_8h.html#a5edbd3a77e55f8ab165500ca05ad26f4", null ] +]; \ No newline at end of file diff --git a/param__loader_8h__dep__incl.map b/param__loader_8h__dep__incl.map new file mode 100644 index 00000000..2dabe72e --- /dev/null +++ b/param__loader_8h__dep__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/param__loader_8h__dep__incl.md5 b/param__loader_8h__dep__incl.md5 new file mode 100644 index 00000000..d924b463 --- /dev/null +++ b/param__loader_8h__dep__incl.md5 @@ -0,0 +1 @@ +7878786be6298bf2c2579fde4b129309 \ No newline at end of file diff --git a/param__loader_8h__dep__incl.png b/param__loader_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..e0db90a860e7febe3ff7a357786289d1f0416e62 GIT binary patch literal 7930 zcmZWuby!rn*6hXSB%aJZ=5QZ)Zfk8S10qKyGZUh;+K^g%;xL;wC(6+VX=~av5_s*LSbmWd+ykkP39fG6ksHK97fk4c^{|uMRXHwetI_> zJfO`?=uX81aX64nA=+xm9rEb&&$TDOiYLQ`1mH(5)C>lJ(4p%-gg|;F67NGG+^;n; zGc#K*)>E&qy^3=n((G((10y3bsHc8rbPDPW;^KGR5tRJ={F<2ef`=j~1-!hx=oI>? zdSl}&Dk?5eCFO;Y_wcB-wY7_-Avb6l3SjFLy|EC81O}230*Ur#dzKLp5WvmD(?xrC zwb$C%&`?uVg=h5YAu)-sgoK2f+v#u*`eO<+SP`=|GETwqA*7m4;dOP6eAEX7LY2Bp zKas=u_Wa;a)?Cgxi^(P&Jq&_mjFvDrH`museV^#@+Qm*HU$Qw@6Bh^PaDTr|TOADz zZL~mzgO!!_#S0oSFNBrV=4xLYu@p5m^`h^cw~>(%crrX(!O`)1N(yw3QA|vXn3(wV z^c0JpKeZWguyTC-9wTsMYKokUOj}2%u%zUwk0pcXkBEp!Tx_hfi_7fnEQ?~&cZYdl zZ*T8wZ4VC*0s;c^;0O2bPfbsYdS6!M=E@iwi@$t%J(44DZEX!+?BL*FVq!ubyv!vc zDEOF!MAY-t?oW5b;NT$mzmk&D#KeT{WEnM&#phfWGwYBa}PVFIvEnY(0+|F}#PJDcP8NRn3US3Vr)vngoTh+FcoddC6 zFAN(VQ&3pj+u!`;XblPp$q;gpla~+S;Ln1anwkIJpQZdMWDuBr+{5EWmprwY0Ph>l{s7T!6daAS58d2t-|dy-;BL+X@}i{N9w5 zlpjBSoNP~SZ*G!PP&~lESec!+JAK!BQ)4~KEG;dKj~~HjJE5tq-HJH4M?W?*qi107 znd2?76j%y`28BY=`d&L(T3R|fa>n)Xa&c8uRz83BjNWZ^YwMyNlXlpOS2(>aH#avc zD=RzO6b`Sn7)-fM4|;%0IyEz6V`asriP+@#*6hz zN(#YS#Vchp$8NEb!YV2*eiGEs*hoo9Y0aAw6BCoGQ88@?yl5(A8Vqa;imt5{*js97 zXi&?Mo3D4V{1Jo=g+jgB3&E$j_+jk@$o={G`A*N1YbF;9)hmrj}OdT?dH8Ij*7Md|6r9`ntunuh>_r18gq5tBZ|{>Z+>q^}e4! zQ^mX+a)}Rp^aQ*wkGDn(T7}}ieBjK8I9NQTa78;Xh=?@AXi_Y%uH(FY*?(X8=m+yNbsYOLa zL9)2-&Us|`@IQF)00x7NkB>JuH-p3*OckIaD4;zuXn4Q1+z|pQ_}Q~(cKow_eXxJF z0_PgM(ALn<(AB-@i(>&bEX6|RLazGsdt$uDY>mBwqT*bWhl{0U0l*nmRiZ_|@e=Kx z?(Pqso|F_6>;`rF3(cPAr|BZ@-CbSmpbmVyZ;rP#ysi@2^<(4WKvv9+jhR_n*T3IV zH#c9yB&69yp`hgC$0Ex5`m?`(|K8u<4-Uq7^e7H2QCw1T2LB35g@uV}`Byn8p7-zH z--kb<3d{%r2{AG8#@5yri? z@C{R2SC@j6w0ly9z^@%*3mf(|_CC=95T~xLE+us@bucnAvb(mYvvYNI)u8zUA2;`5 zf5P+53@Ldzx#GgYG$9v@v)y@JUER)?0P#TRF$t(%DJk*s@XS`gF%NnOzHk^DRoiIE z$zi+;lfg2qcV^<`++XPmci9+Q#tkAwtbA{jReW@ctW2x-goYaKd25r6pb0U&v^ z_mvwQ&cNkYexW1&p_<-AbkH$CX*GB?)Bj0;h{LeT$;ruk;q>!u>!xSKse|3AXt?~e z+w$f7$8IV-M&M42^L@zqBQw~r3Rn=NDYzf;q@=7&4r>dA3bPTLh%&O@-08N3sNUPH zlN6_bLVeDcL%Y55$ak&I$ehwtQ^Hw&hm}^GU}t_f~0MHfIgQv8b5k866H%j@Q(f z7#gNvU~pJhi4}K9Vr4}VSZKt(h@1ZLmRAAxO2SAoF*jJzi^oPj#2KC=oce8Kx+sVU zDo|!}zQ3%AdGck~VXZ-!2ajiTViziebUEKwHa902my9_$J>}=)%M-?-<2s+EY%4D; z6y`Zv{w2Q1!SPP>P5#;Ou?cz2TmK#R#S1m+8U2)0k+d{70X|nEe6D=uYQ4JQiTN98 zQBmf+EVTN2x(~0j>grxF{E^htla!Us3B$P=Oci&4bK$|c$DLhjBdPi_`K2UVZ}nF9 z?nDn5f=zg#D~`jRq4`Eer)(24=;-!19q5N>$lUCXxIgtS?lv|l`w0w-5WJ3u58r&( zdGri>Fa6CoVUM-`oP~wj-D)npoY9H}qoG2z4`08=H8uTZXLl_MBkC3Ijm6m+&MK*> zNPhjAw}nkw^-cb-ul6o0on+EfN#{`L4A@0&jT_EQ$Y&Eocka#Qc6aN|;M?9D^g{@% z|Kl0)+hrR|%gE?`J(H1bxV17oeyHsLnk~udC zuQ~BF)UtZIF4V~rWWZh7*)NG#lupSbg2m3;3M(oikl+0b{Md?yKX?j_j8Ht+{+cA> ze*KvuCn5g!@{EXN&DyF^+QcsQ@FZQ>CBGVZNP9L<-aU`}sHH!9c-HD0mwXXDGv%ik zXgL>FlArH!g3?gQnCR}hcwr#8b+$M=KX=N@Uo&boHCB|Pu5m~2B2YX&t~4~nWoRhM z3*CuR`Aa}+bh)ndPE+&pZ1HXpX&yN;68?z_$M1X-d05c-_U+obm_BlqJUHuUhg`f`tQ4E&qi); zELBMsJXf6S(a^+YWDvk1zZ#pXs>C?=&Ae~6J3_wHH$>*KzN8BWu}SRiuHk5XnVxay zb#;1yhBhSC<5+Ky+&H=3we0ATAwxVf+bCfF`eyCR9ma!tS($;H(Pe25I#Q4dtEW3i zKHJ!Yc&nbME0q*8Iak3kL2qH-*&1Ap0zDd06w6IsrUXI(Pi zaMmxg1D+lC>oX0uA_B};BE7MP<<-@;9l=Msx=~Wn8>PnL+MDx* z*&a6ywl|lR)6-EM9UBiG)b|~;;Jy7WnHcXPD?9G*&oVpH0Fr2T)lA7%P(4V;xUoJ$ z1hLP<&W;^_UrfWT{)R+Gh5pa$AuX!Eu`biuX3)hHzXzdpwQyb&|7|fIn5CC zT;iAOaVj9bl>E7+`tG}xzo^vJ1L$PKRyM5?(wqCH5J@5O*IT0(|GBr6X-!p^!gIWs z7KJjR6+WK+JI${d!hjC)5tHy1N_$uG<;%@iQ85&Xbp)I_wQcxy3)#Qhdsb$&MOF!3X3006QVU}ZiwmA zgjWz4G#vY(9Q~^Ns&mtpYz-w{1-bE{W)Ly3etWg8%0!tc4=7%)1DA7D0GiXmO7mc< z#LLI(sI_!+}`i8kSc(cN+kb#*OR(N-?+G= zc$6a~;Vt{Kj!tVsP@TNJ5G-Ww-+&1c>Gk8S>z!E+i3{#PoW447W7QlkDBe2W=TmB zfq1fLwlHhVZ_jfd9WdDr(@F1w0NV^VNcBsC|3Td6)N%B*d+%FCXJG-OBEXY&VEIFQ zWbPPPo*M^h*83bd?g@AzA3Wjl0IY`g?fEJ?Z|^_SlXtJGESg6q@H2z__3?40WUyTz z8;r}!kiMKov=|5P<@Ee~YV>ztSTApHtR~pyAwIaq1Uwe39tHu|XuYvxz<8Vo|L#FR z1jc{~_rR{W@h4)Xfo)H@t)l63=oAR3tqjqKz*{BXnfDbJ7dJJ%#L0<)f8o$Js#oW8 z$zNv4NE+SZzAkkEGcPkUv!*=#Y;j5In{u&}zq*D7a|M7Ds8bUl$X-On$3HIah|yr|8Ss8V5fMsXLtWiaA{!eUfV6;l(a_K+GP?jSyXbSp zF7;{90x%h{N^~?44-b#My*(je6qptt9{ioH{k6DAOK1W3wX(7@AfA97H@a@WF)&C2 zdP!p9M6p)M<>lq4BtYSXZ70|;0-bi}>H{$e^>lQstgHlugytLFRR+*EM6mU1?3|pP zO}Uffn3ehm2T49FZ8~|M&Ab2UiDJPJ_dNZqT<|A^8Py4N61pHxyvpz2KZS*@I10+( ztx$=)o02Lg7UGrAS~I;>K!3aG;rZ`#2W)Y5b@lP_`T2!o!?_+SYwhQk z#a3T&9-gDFa5A8U2nh+94y|u*gVy;*PcP-`SD(XGm}z51hA|A*2e{&MR@UxF>g}zq zzU6B*o|vy+hfFK>C+{vNTM4KHRkgJ@mX5`4}@m9^=02|GTK?e0O_u zz73QgYI?w1wTz4+iC6)3_sAKp1`O+&)Fz;2=cj;{J_(w#;}^?pXn-y*OimW$HxYW?{kX;57BFdcXDi(*cMtP+!A0Z}N+ZLRFYX{Bg^e zLQO!-6<)nsiclJJa;l$OT3RyynFuZbQ6^@PGpKX)U+p~Xa@k*!G&VLiZ4&HJ4q`_^ zW2C<)-am9uornb!|2ZxQPmrpmd?g%Em)B4php|Gnrt*^FVg&q=s{vM4W@cuF&t*|X1s6LzAb{4l*B71T_f^=W zp0cwK4h==NzkN$i3WbL4y~>97oLoWCGOaN3jDG+4kzHQC2e>FBd~AF?^sWK$mUCRd zQ%_IbR(g;~?(2_0mx++GwX#}L+DAyiR8%$w*-Te%JXgU(mgeR_&gcQjF+E+MlOz3m zdN{))4U2LwMY@w2RYxQRbVyL{A|8jU74V+xn;YO3*y$l4{!9vq*GCz5rQg1-ISK*< z04)CI6KSY>L>nDN;Rm*hr%egBs4B_6SPKgaHqz~Ij+XPqyW7d%zhje2swgM*Neutz{oS9dUp>krVT%qpk<$&EF3^vnj|-}<+<-c?%u0%FZ&y%gOn(yDMfl_5J+(d~8e;XrECY_t4R6?Po2_ z%-*jLBo7QI8X6k5OvzA_N%fA7#>wS?*GJNbrg(9Xl9B>z43TD`iHUD?bjbHSwnN;F z7<4V|?b9;|jWg)(r&09nFLd7F^_yU2)E8oy!`AxgK*PNrMgtE)ZTC7I0 z=|8=$p%Q-I`}?=LhK36;_H1vlM*z6dVYX(ltLtN**;jGjTTmcCnghAt5sa_j{K3`J zQ$&nSRCK2YiUDg#b z0!`p>m#fpAo2#?bq$Dd_TTBd$u)BICZ|@t+4DbAcf`an$R?{w=rmy~tO+c$74bRKV zGl#=F^p}7}1uDkI!J#ZCrvsoR6r;UkS(Ha=5g49RUaoS?q*L#lS5jhYY)pGW@n}Qy zQv*?x4D|z!ENz3a)s?@;^9YUnfp1Kh=zA{YKf*|!V^{-TX#+H!e@ZT<^{xNMU`KXc z0|TJ$rKP6MPERLiWVAZ{k@LFh41I);hX>GedUp2bnll-j&eH1YF;L0!^YcLm1cJ9$ zQf1|liug@X6fM7<4rpBp3JP|1r68!@-l7#>fY5q%wiiVsdO48H^Uog^CMIgCs>3rg zmq700Nge=`As;`#nCIz0TN@o8U&87zLR;mZ3M%l<2t->}_G3xOc9X{uLLO(=9e6sN zl>NgAN(-pL0ER{~Yyl9cxVxVrkw_3Ed`f=B6kcp&b{rZ4CkvToCJ~X;J~J^;_5k2P z_pGk2UZoH9V3je%TBxLFWi*m1uPf~9D{oN^u!Z%;O5Br9W|B=n9ws)16<@BFWRvI( z_J@}r#wTTXB?&$#mLm2*E9U}2|AUqrpwOS&D3AGEsi_XQ3w9>cd*FWg2|#Egi3^^j zxDKRh4Aj3sbWYO|VzZ#a!cz>=N`A>N?ACQnPEOW3uf4_y7OS+d>Sc|WGA0ysUaxjAvZ|64Ba!MbSSX@1M7*UV?&I*yX-;O+p5rGT>Dxr0 zKF5FgqLRYfH#leyQTaHGD+%5wufFlz#`!QkOj-?T29OK%Yv4?|tOWhSZ8_6tT5H%_Vsb zl!(&U*w{xb%6LmfM0#%&>BMoUVCm(+m+q_tvVE}to&esCPE5#QDSdreUs4i|`qU=! zNu!^&3Z?Nq?9KNSt%3egG&WTdfJ$mZLqqND?I1V+mg(u~cXxMz^qhVA+**=raToCm zuTQ___Hw(wzaI#406~FZR#sSOm8tx3>EqH3JM0xWxS{nvCVukmh=fn*Lb)sJsV=gp z2&Sc#08XRsce0t2lwLkA%_b?eAgMfj{}xyC<7*hqgp-`s=R6AlenkZsm$)x{m{^~# z&yp=B6JI8#rKQ!?)m2sT0&$s)>Z5a)Q8j%y zvAIqH`nLk!>B$Lz6QA2_4>`Huq+b%9p}LQqQc`1rIvZ^lcBDK@pRrk&W#^Hm0YOJ8 zS-Lfm(dMxX2^yC7zKXgyeep86abo9WEE5ycrwtXdGQ-B;P92379*fvN-j?n6VXv}T zH9NN|_*J9XN|`QHs}reKe&}zpG}^+#T1Wf~)#$3_#H>hkvfxgt7#-57|GQn`TKbIyA&u(M4i`XFgD#`7 zBZ@IxdYePE>1SQKv4v`F;SkjJHaMYb7s<@dzURCDYZg18Fr%#!Lrt81Yat>cViq(} zD0IKHb9PwK>YvwrXc_6VY88Yb5NT<>uTJ5t_lPc+j5Tk9az&^`KU9J4HdAf;fHDQ! z{x7q|z>PR=F8#q19MD(;mGqE|4-N0r9k;g*Uxxa;0&|XoLk$uM&Jp(y4kWRP3Jd8* zBIY|kUwD7Q!G=iSFAzQ>x!$V-Gk*v^rJU>IcQG~5(RgCbXcAA<&yItg!6Cux*RTHx z;-Cj35Q4@Z@q>5^_Y=4w>T46<^uaMy;4&_`{NIydKoKE+19#|QN|GfwSeI?!{1^h0RhB7}dK>UxbWwT2 literal 0 HcmV?d00001 diff --git a/param__loader_8h__incl.map b/param__loader_8h__incl.map new file mode 100644 index 00000000..8ca81874 --- /dev/null +++ b/param__loader_8h__incl.map @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/param__loader_8h__incl.md5 b/param__loader_8h__incl.md5 new file mode 100644 index 00000000..5867e20f --- /dev/null +++ b/param__loader_8h__incl.md5 @@ -0,0 +1 @@ +0550d78d83bbae5a226ec30821d1ade6 \ No newline at end of file diff --git a/param__loader_8h__incl.png b/param__loader_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..a995b8e7cae7d8fc19dc90f9dfcc43b377124213 GIT binary patch literal 27291 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

    u2 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 S*@QOCL6zmz + + + + + + +mrs_lib: include/mrs_lib/param_loader.h Source File + + + + + + + + + + + + + +

    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    param_loader.h
    +
    +
    +Go to the documentation of this file.
    1 // clang: MatousFormat
    +
    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 
    + +
    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;
    + +
    72  std::unordered_set<std::string> m_loaded_params;
    +
    73 
    +
    74  /* printing helper functions //{ */
    +
    75  /* printError and print_warning functions //{*/
    +
    76  void printError(const std::string& str)
    +
    77  {
    +
    78  if (m_node_name.empty())
    +
    79  ROS_ERROR_STREAM(str);
    +
    80  else
    +
    81  ROS_ERROR_STREAM("[" << m_node_name << "]: " << str);
    +
    82  }
    +
    83  void print_warning(const std::string& str)
    +
    84  {
    +
    85  if (m_node_name.empty())
    +
    86  ROS_WARN_STREAM(str);
    +
    87  else
    +
    88  ROS_WARN_STREAM("[" << m_node_name << "]: " << str);
    +
    89  }
    +
    90  //}
    +
    91 
    +
    92  /* printValue function and overloads //{ */
    +
    93 
    +
    94  template <typename T>
    +
    95  void printValue(const std::string& name, const T& value)
    +
    96  {
    +
    97  if (m_node_name.empty())
    +
    98  std::cout << "\t" << name << ":\t" << value << std::endl;
    +
    99  else
    +
    100  ROS_INFO_STREAM("[" << m_node_name << "]: parameter '" << name << "':\t" << value);
    +
    101  }
    +
    102 
    +
    103  template <typename T>
    +
    104  void printValue(const std::string& name, const std::vector<T>& value)
    +
    105  {
    +
    106  std::stringstream strstr;
    +
    107  if (m_node_name.empty())
    +
    108  strstr << "\t";
    +
    109  strstr << name << ":\t";
    +
    110  size_t it = 0;
    +
    111  for (const auto& elem : value)
    +
    112  {
    +
    113  strstr << elem;
    +
    114  if (it < value.size() - 1)
    +
    115  strstr << ", ";
    +
    116  it++;
    +
    117  }
    +
    118  if (m_node_name.empty())
    +
    119  std::cout << strstr.str() << std::endl;
    +
    120  else
    +
    121  ROS_INFO_STREAM("[" << m_node_name << "]: parameter '" << strstr.str());
    +
    122  }
    +
    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  void printValue(const std::string& name, const MatrixX<T>& value)
    +
    147  {
    +
    148  std::stringstream strstr;
    +
    149  /* const Eigen::IOFormat fmt(4, 0, ", ", "\n", "\t\t[", "]"); */
    +
    150  /* strstr << value.format(fmt); */
    +
    151  const Eigen::IOFormat fmt;
    +
    152  strstr << value.format(fmt);
    +
    153  if (m_node_name.empty())
    +
    154  std::cout << "\t" << name << ":\t" << std::endl << strstr.str() << std::endl;
    +
    155  else
    +
    156  ROS_INFO_STREAM("[" << m_node_name << "]: parameter '" << name << "':" << std::endl << strstr.str());
    +
    157  }
    +
    158 
    +
    159  std::string printValue_recursive(const std::string& name, XmlRpc::XmlRpcValue& value, unsigned depth = 0)
    +
    160  {
    +
    161  std::stringstream strstr;
    +
    162  for (unsigned it = 0; it < depth; it++)
    +
    163  strstr << "\t";
    +
    164  strstr << name << ":";
    +
    165  switch (value.getType())
    +
    166  {
    +
    167  case XmlRpc::XmlRpcValue::TypeArray:
    +
    168  {
    +
    169  for (int it = 0; it < value.size(); it++)
    +
    170  {
    +
    171  strstr << std::endl;
    +
    172  const std::string name = "[" + std::to_string(it) + "]";
    +
    173  strstr << printValue_recursive(name, value[it], depth+1);
    +
    174  }
    +
    175  break;
    +
    176  }
    +
    177  case XmlRpc::XmlRpcValue::TypeStruct:
    +
    178  {
    +
    179  int it = 0;
    +
    180  for (auto& pair : value)
    +
    181  {
    +
    182  strstr << std::endl;
    +
    183  strstr << printValue_recursive(pair.first, pair.second, depth+1);
    +
    184  it++;
    +
    185  }
    +
    186  break;
    +
    187  }
    +
    188  default:
    +
    189  {
    +
    190  strstr << "\t" << value;
    +
    191  break;
    +
    192  }
    +
    193  }
    +
    194  return strstr.str();
    +
    195  }
    +
    196 
    +
    197  void printValue(const std::string& name, XmlRpc::XmlRpcValue& value)
    +
    198  {
    +
    199  const std::string txt = printValue_recursive(name, value);
    +
    200  if (m_node_name.empty())
    +
    201  std::cout << txt << std::endl;
    +
    202  else
    +
    203  ROS_INFO_STREAM("[" << m_node_name << "]: parameter '" << txt);
    +
    204  }
    +
    205 
    +
    206  //}
    +
    207 
    +
    208  std::string resolved(const std::string& param_name)
    +
    209  {
    +
    210  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  bool check_duplicit_loading(const std::string& name)
    +
    216  {
    +
    217  if (m_loaded_params.count(name))
    +
    218  {
    +
    219  printError(std::string("Tried to load parameter ") + name + std::string(" twice"));
    +
    220  m_load_successful = false;
    +
    221  return true;
    +
    222  } else
    +
    223  {
    +
    224  return false;
    +
    225  }
    +
    226  }
    +
    227  //}
    +
    228 
    +
    229  /* loadMatrixStatic_internal helper function for loading static Eigen matrices //{ */
    +
    230  template <int rows, int cols, typename T>
    +
    231  Eigen::Matrix<T, rows, cols> loadMatrixStatic_internal(const std::string& name, const Eigen::Matrix<T, rows, cols>& default_value, optional_t optional, unique_t unique)
    +
    232  {
    +
    233  MatrixX<T> dynamic = loadMatrixX(name, MatrixX<T>(default_value), rows, cols, optional, unique, NO_SWAP);
    +
    234  if (dynamic.rows() == rows || dynamic.cols() == cols)
    +
    235  return dynamic;
    +
    236  else
    +
    237  return default_value;
    +
    238  }
    +
    239  //}
    +
    240 
    +
    241  /* helper functions for loading dynamic Eigen matrices //{ */
    +
    242  // loadMatrixX helper function for loading dynamic Eigen matrices //{
    +
    243  template <typename T>
    +
    244  MatrixX<T> 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)
    +
    245  {
    +
    246  const std::string name_prefixed = m_prefix + name;
    +
    247  MatrixX<T> loaded = default_value;
    +
    248  // first, check if the user already tried to load this parameter
    +
    249  if (unique && check_duplicit_loading(name_prefixed))
    +
    250  return loaded;
    +
    251 
    +
    252  // this function only accepts dynamic columns (you can always transpose the matrix afterward)
    +
    253  if (rows < 0)
    +
    254  {
    +
    255  // if the parameter was compulsory, alert the user and set the flag
    +
    256  printError(std::string("Invalid expected matrix dimensions for parameter ") + resolved(name_prefixed));
    +
    257  m_load_successful = false;
    +
    258  return loaded;
    +
    259  }
    +
    260  bool expect_zero_matrix = rows == 0;
    +
    261  if (expect_zero_matrix)
    +
    262  {
    +
    263  if (cols > 0)
    +
    264  {
    +
    265  printError(std::string("Invalid expected matrix dimensions for parameter ") + resolved(name_prefixed) + ". One dimension indicates zero matrix, but other expects non-zero.");
    +
    266  m_load_successful = false;
    +
    267  return loaded;
    +
    268  }
    +
    269  }
    +
    270 
    +
    271 
    +
    272  bool cur_load_successful = true;
    +
    273  bool check_size_exact = true;
    +
    274  if (cols <= 0) // this means that the cols dimension is dynamic or a zero matrix is expected
    +
    275  check_size_exact = false;
    +
    276 
    +
    277  std::vector<T> tmp_vec;
    +
    278  // try to load the parameter
    +
    279  bool success = m_pp.getParam(name_prefixed, tmp_vec);
    +
    280  // check if the loaded vector has correct length
    +
    281  bool correct_size = (int)tmp_vec.size() == rows * cols;
    +
    282  if (!check_size_exact && !expect_zero_matrix)
    +
    283  correct_size = (int)tmp_vec.size() % rows == 0; // if the cols dimension is dynamic, the size just has to be divisable by rows
    +
    284 
    +
    285  if (success && correct_size)
    +
    286  {
    +
    287  // if successfully loaded, everything is in order
    +
    288  // transform the vector to the matrix
    +
    289  if (cols <= 0 && rows > 0)
    +
    290  cols = tmp_vec.size() / rows;
    +
    291  if (swap)
    +
    292  {
    +
    293  int tmp = cols;
    +
    294  cols = rows;
    +
    295  rows = tmp;
    +
    296  }
    +
    297  loaded = Eigen::Map<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>, Eigen::Unaligned>(tmp_vec.data(), rows, cols);
    +
    298  } else
    +
    299  {
    +
    300  if (success && !correct_size)
    +
    301  {
    +
    302  // warn the user that this parameter was not successfully loaded because of wrong vector length (might be an oversight)
    +
    303  std::string warning =
    +
    304  std::string("Matrix parameter ") + name_prefixed
    +
    305  + std::string(" could not be loaded because the vector has a wrong length " + std::to_string(tmp_vec.size()) + " instead of expected ");
    +
    306  // process the message correctly based on whether the loaded matrix should be dynamic or static
    +
    307  if (cols <= 0) // for dynamic matrices
    +
    308  warning = warning + std::string("number divisible by ") + std::to_string(rows);
    +
    309  else // for static matrices
    +
    310  warning = warning + std::to_string(rows * cols);
    +
    311  print_warning(warning);
    +
    312  }
    +
    313  // if it was not loaded, set the default value
    +
    314  loaded = default_value;
    +
    315  if (!optional)
    +
    316  {
    +
    317  // if the parameter was compulsory, alert the user and set the flag
    +
    318  printError(std::string("Could not load non-optional parameter ") + resolved(name_prefixed));
    +
    319  cur_load_successful = false;
    +
    320  }
    +
    321  }
    +
    322 
    +
    323  // check if load was a success
    +
    324  if (cur_load_successful)
    +
    325  {
    +
    326  if (m_print_values && printValues)
    +
    327  printValue(name_prefixed, loaded);
    +
    328  m_loaded_params.insert(name_prefixed);
    +
    329  } else
    +
    330  {
    +
    331  m_load_successful = false;
    +
    332  }
    +
    333  // finally, return the resulting value
    +
    334  return loaded;
    +
    335  }
    +
    336  //}
    +
    337 
    +
    338  /* loadMatrixArray_internal helper function for loading an array of EigenXd matrices with known dimensions //{ */
    +
    339  template <typename T>
    +
    340  std::vector<MatrixX<T>> loadMatrixArray_internal(const std::string& name, const std::vector<MatrixX<T>>& default_value, optional_t optional, unique_t unique)
    +
    341  {
    +
    342  const std::string name_prefixed = m_prefix + name;
    +
    343  int rows;
    +
    344  std::vector<int> cols;
    +
    345  bool success = true;
    +
    346  success = success && m_pp.getParam(name_prefixed + "/rows", rows);
    +
    347  success = success && m_pp.getParam(name_prefixed + "/cols", cols);
    +
    348 
    +
    349  std::vector<MatrixX<T>> loaded;
    +
    350  loaded.reserve(cols.size());
    +
    351 
    +
    352  int total_cols = 0;
    +
    353  /* check correctness of loaded parameters so far calculate the total dimension //{ */
    +
    354 
    +
    355  if (!success)
    +
    356  {
    +
    357  printError(std::string("Failed to load ") + resolved(name_prefixed) + std::string("/rows or ") + resolved(name_prefixed) + std::string("/cols"));
    +
    358  m_load_successful = false;
    +
    359  return default_value;
    +
    360  }
    +
    361  if (rows < 0)
    +
    362  {
    +
    363  printError(std::string("Invalid expected matrix dimensions for parameter ") + resolved(name_prefixed) + std::string(" (rows and cols must be >= 0)"));
    +
    364  m_load_successful = false;
    +
    365  return default_value;
    +
    366  }
    +
    367  for (const auto& col : cols)
    +
    368  {
    +
    369  if (col < 0)
    +
    370  {
    +
    371  printError(std::string("Invalid expected matrix dimensions for parameter ") + resolved(name_prefixed) + std::string(" (rows and cols must be >= 0)"));
    +
    372  m_load_successful = false;
    +
    373  return default_value;
    +
    374  }
    +
    375  total_cols += col;
    +
    376  }
    +
    377 
    +
    378  //}
    +
    379 
    +
    380  const MatrixX<T> loaded_matrix = loadMatrixX(name + "/data", MatrixX<T>(), rows, total_cols, optional, unique, NO_SWAP, false);
    +
    381  /* std::cout << "loaded_matrix: " << loaded_matrix << std::endl; */
    +
    382  /* std::cout << "loaded_matrix: " << loaded_matrix.rows() << "x" << loaded_matrix.cols() << std::endl; */
    +
    383  /* std::cout << "expected dims: " << rows << "x" << total_cols << std::endl; */
    +
    384  if (loaded_matrix.rows() != rows || loaded_matrix.cols() != total_cols)
    +
    385  {
    +
    386  m_load_successful = false;
    +
    387  return default_value;
    +
    388  }
    +
    389 
    +
    390  int cols_loaded = 0;
    +
    391  for (unsigned it = 0; it < cols.size(); it++)
    +
    392  {
    +
    393  const int cur_cols = cols.at(it);
    +
    394  const MatrixX<T> cur_mat = loaded_matrix.block(0, cols_loaded, rows, cur_cols);
    +
    395  /* std::cout << "cur_mat: " << cur_mat << std::endl; */
    +
    396  loaded.push_back(cur_mat);
    +
    397  cols_loaded += cur_cols;
    +
    398  printValue(name_prefixed + "/matrix#" + std::to_string(it), cur_mat);
    +
    399  }
    +
    400  return loaded;
    +
    401  }
    +
    402  //}
    +
    403 
    +
    404  /* loadMatrixStatic_internal helper function for loading EigenXd matrices with known dimensions //{ */
    +
    405  template <typename T>
    +
    406  MatrixX<T> loadMatrixStatic_internal(const std::string& name, const MatrixX<T>& default_value, int rows, int cols, optional_t optional, unique_t unique)
    +
    407  {
    +
    408  MatrixX<T> loaded = default_value;
    +
    409  // first, check that at least one dimension is set
    +
    410  if (rows <= 0 || cols <= 0)
    +
    411  {
    +
    412  printError(std::string("Invalid expected matrix dimensions for parameter ") + resolved(name) + std::string(" (use loadMatrixDynamic?)"));
    +
    413  m_load_successful = false;
    +
    414  return loaded;
    +
    415  }
    +
    416 
    +
    417  return loadMatrixX(name, default_value, rows, cols, optional, unique, NO_SWAP);
    +
    418  }
    +
    419  //}
    +
    420 
    +
    421  /* loadMatrixDynamic_internal helper function for loading Eigen matrices with one dynamic (unspecified) dimension //{ */
    +
    422  template <typename T>
    +
    423  MatrixX<T> loadMatrixDynamic_internal(const std::string& name, const MatrixX<T>& default_value, int rows, int cols, optional_t optional, unique_t unique)
    +
    424  {
    +
    425  MatrixX<T> loaded = default_value;
    +
    426 
    +
    427  // next, check that at least one dimension is set
    +
    428  if (rows <= 0 && cols <= 0)
    +
    429  {
    +
    430  printError(std::string("Invalid expected matrix dimensions for parameter ") + resolved(name) + std::string(" (at least one dimension must be specified)"));
    +
    431  m_load_successful = false;
    +
    432  return loaded;
    +
    433  }
    +
    434 
    +
    435  swap_t swap = NO_SWAP;
    +
    436  if (rows <= 0)
    +
    437  {
    +
    438  int tmp = rows;
    +
    439  rows = cols;
    +
    440  cols = tmp;
    +
    441  swap = SWAP;
    +
    442  }
    +
    443  return loadMatrixX(name, default_value, rows, cols, optional, unique, swap);
    +
    444  }
    +
    445  //}
    +
    446  //}
    +
    447 
    +
    448  /* load helper function for generic types //{ */
    +
    449  // This function tries to load a parameter with name 'name' and a default value.
    +
    450  // You can use the flag 'optional' to not throw a ROS_ERROR when the parameter
    +
    451  // cannot be loaded and the flag 'printValues' to set whether the loaded
    +
    452  // value and name of the parameter should be printed to cout.
    +
    453  // If 'optional' is set to false and the parameter could not be loaded,
    +
    454  // the flag 'load_successful' is set to false and a ROS_ERROR message
    +
    455  // is printer.
    +
    456  // If 'unique' flag is set to false then the parameter is not checked
    +
    457  // for being loaded twice.
    +
    458  // Returns a tuple, containing either the loaded or the default value and a bool,
    +
    459  // indicating if the value was loaded (true) or the default value was used (false).
    +
    460  template <typename T>
    +
    461  std::pair<T, bool> load(const std::string& name, const T& default_value, optional_t optional = OPTIONAL, unique_t unique = UNIQUE)
    +
    462  {
    +
    463  const std::string name_prefixed = m_prefix + name;
    +
    464  T loaded = default_value;
    +
    465  if (unique && check_duplicit_loading(name_prefixed))
    +
    466  return {loaded, false};
    +
    467 
    +
    468  bool cur_load_successful = true;
    +
    469  // try to load the parameter
    +
    470  const bool success = m_pp.getParam(name_prefixed, loaded);
    +
    471  if (!success)
    +
    472  {
    +
    473  // if it was not loaded, set the default value
    +
    474  loaded = default_value;
    +
    475  if (!optional)
    +
    476  {
    +
    477  // if the parameter was compulsory, alert the user and set the flag
    +
    478  printError(std::string("Could not load non-optional parameter ") + resolved(name_prefixed));
    +
    479  cur_load_successful = false;
    +
    480  }
    +
    481  }
    +
    482 
    +
    483  if (cur_load_successful)
    +
    484  {
    +
    485  // everything is fine and just print the name_prefixed and value if required
    +
    486  if (m_print_values)
    +
    487  printValue(name_prefixed, loaded);
    +
    488  // mark the param name_prefixed as successfully loaded
    +
    489  m_loaded_params.insert(name_prefixed);
    +
    490  } else
    +
    491  {
    +
    492  m_load_successful = false;
    +
    493  }
    +
    494  // finally, return the resulting value
    +
    495  return {loaded, success};
    +
    496  }
    +
    497  //}
    +
    498 
    +
    499 public:
    +
    507  ParamLoader(const ros::NodeHandle& nh, bool printValues = true, std::string_view node_name = std::string())
    +
    508  : m_load_successful(true),
    +
    509  m_print_values(printValues),
    +
    510  m_node_name(node_name),
    +
    511  m_nh(nh),
    +
    512  m_pp(nh, m_node_name)
    +
    513  {
    +
    514  /* std::cout << "Initialized1 ParamLoader for node " << node_name << std::endl; */
    +
    515  }
    +
    516 
    +
    517  /* Constructor overloads //{ */
    +
    524  ParamLoader(const ros::NodeHandle& nh, std::string_view node_name)
    +
    525  : ParamLoader(nh, true, node_name)
    +
    526  {
    +
    527  /* std::cout << "Initialized2 ParamLoader for node " << node_name << std::endl; */
    +
    528  }
    +
    529 
    +
    536  ParamLoader(const std::string& filepath, const ros::NodeHandle& nh)
    +
    537  : ParamLoader(nh, "none")
    +
    538  {
    +
    539  YAML::Node node = YAML::Load(filepath);
    +
    540  }
    +
    541  //}
    +
    542 
    +
    543  /* setPrefix function //{ */
    +
    544 
    +
    550  void setPrefix(const std::string& prefix)
    +
    551  {
    +
    552  m_prefix = prefix;
    +
    553  }
    +
    554 
    +
    555  //}
    +
    556 
    +
    557  /* getPrefix function //{ */
    +
    558 
    +
    564  std::string getPrefix()
    +
    565  {
    +
    566  return m_prefix;
    +
    567  }
    +
    568 
    +
    569  //}
    +
    570 
    +
    571  /* addYamlFile() function //{ */
    +
    572 
    +
    579  bool addYamlFile(const std::string& filepath)
    +
    580  {
    +
    581  return m_pp.addYamlFile(filepath);
    +
    582  }
    +
    583  //}
    +
    584 
    +
    585  /* addYamlFileFromParam() function //{ */
    +
    586 
    +
    593  bool addYamlFileFromParam(const std::string& param_name)
    +
    594  {
    +
    595  std::string filepath;
    +
    596  if (!loadParam(param_name, filepath))
    +
    597  return false;
    +
    598  return m_pp.addYamlFile(filepath);
    +
    599  }
    +
    600  //}
    +
    601 
    +
    602  /* loadedSuccessfully function //{ */
    + +
    609  {
    +
    610  return m_load_successful;
    +
    611  }
    +
    612  //}
    +
    613 
    +
    614  /* loadParam function for optional parameters //{ */
    +
    627  template <typename T>
    +
    628  bool loadParam(const std::string& name, T& out_value, const T& default_value)
    +
    629  {
    +
    630  const auto [ret, success] = load<T>(name, default_value, OPTIONAL, UNIQUE);
    +
    631  out_value = ret;
    +
    632  return success;
    +
    633  }
    +
    645  template <typename T>
    +
    646  T loadParam2(const std::string& name, const T& default_value)
    +
    647  {
    +
    648  const auto loaded = load<T>(name, default_value, OPTIONAL, UNIQUE);
    +
    649  return loaded.first;
    +
    650  }
    +
    663  template <typename T>
    +
    664  bool loadParamReusable(const std::string& name, T& out_value, const T& default_value)
    +
    665  {
    +
    666  const auto [ret, success] = load<T>(name, default_value, OPTIONAL, REUSABLE);
    +
    667  out_value = ret;
    +
    668  return success;
    +
    669  }
    +
    681  template <typename T>
    +
    682  T loadParamReusable2(const std::string& name, const T& default_value)
    +
    683  {
    +
    684  const auto [ret, success] = load<T>(name, default_value, OPTIONAL, REUSABLE);
    +
    685  return ret;
    +
    686  }
    +
    687  //}
    +
    688 
    +
    689  /* loadParam function for compulsory parameters //{ */
    +
    701  template <typename T>
    +
    702  bool loadParam(const std::string& name, T& out_value)
    +
    703  {
    +
    704  const auto [ret, success] = load<T>(name, T(), COMPULSORY, UNIQUE);
    +
    705  out_value = ret;
    +
    706  return success;
    +
    707  }
    +
    718  template <typename T>
    +
    719  T loadParam2(const std::string& name)
    +
    720  {
    +
    721  const auto [ret, success] = load<T>(name, T(), COMPULSORY, UNIQUE);
    +
    722  return ret;
    +
    723  }
    +
    735  template <typename T>
    +
    736  bool loadParamReusable(const std::string& name, T& out_value)
    +
    737  {
    +
    738  const auto [ret, success] = load<T>(name, T(), COMPULSORY, REUSABLE);
    +
    739  out_value = ret;
    +
    740  return success;
    +
    741  }
    +
    752  template <typename T>
    +
    753  T loadParamReusable2(const std::string& name)
    +
    754  {
    +
    755  const auto [ret, success] = load<T>(name, T(), COMPULSORY, REUSABLE);
    +
    756  return ret;
    +
    757  }
    +
    758  //}
    +
    759 
    +
    760  /* loadParam specializations for ros::Duration type //{ */
    +
    761 
    +
    772  bool loadParam(const std::string& name, ros::Duration& out, const ros::Duration& default_value)
    +
    773  {
    +
    774  double secs;
    +
    775  const bool ret = loadParam<double>(name, secs, default_value.toSec());
    +
    776  out = ros::Duration(secs);
    +
    777  return ret;
    +
    778  }
    +
    779 
    +
    789  bool loadParam(const std::string& name, ros::Duration& out)
    +
    790  {
    +
    791  double secs;
    +
    792  const bool ret = loadParam<double>(name, secs);
    +
    793  out = ros::Duration(secs);
    +
    794  return ret;
    +
    795  }
    +
    796 
    +
    797  //}
    +
    798 
    +
    799  /* loadParam specializations for std_msgs::ColorRGBA type //{ */
    +
    800 
    +
    811  bool loadParam(const std::string& name, std_msgs::ColorRGBA& out, const std_msgs::ColorRGBA& default_value = {})
    +
    812  {
    +
    813  std_msgs::ColorRGBA res;
    +
    814  bool ret = true;
    +
    815  ret = ret & loadParam(name+"/r", res.r, default_value.r);
    +
    816  ret = ret & loadParam(name+"/g", res.g, default_value.g);
    +
    817  ret = ret & loadParam(name+"/b", res.b, default_value.b);
    +
    818  ret = ret & loadParam(name+"/a", res.a, default_value.a);
    +
    819  if (ret)
    +
    820  out = res;
    +
    821  return ret;
    +
    822  }
    +
    823 
    +
    833  std_msgs::ColorRGBA loadParam2(const std::string& name, const std_msgs::ColorRGBA& default_value = {})
    +
    834  {
    +
    835  std_msgs::ColorRGBA ret;
    +
    836  loadParam(name, ret, default_value);
    +
    837  return ret;
    +
    838  }
    +
    839 
    +
    840  //}
    +
    841 
    +
    842  /* loadParam specializations for XmlRpc::Value type //{ */
    +
    843 
    +
    856  bool loadParam(const std::string& name, XmlRpc::XmlRpcValue& out, const XmlRpc::XmlRpcValue& default_value)
    +
    857  {
    +
    858  return loadParam<XmlRpc::XmlRpcValue>(name, out, default_value);
    +
    859  }
    +
    860 
    +
    872  bool loadParam(const std::string& name, XmlRpc::XmlRpcValue& out)
    +
    873  {
    +
    874  return loadParam<XmlRpc::XmlRpcValue>(name, out);
    +
    875  }
    +
    876 
    +
    888  XmlRpc::XmlRpcValue loadParam2(const std::string& name, const XmlRpc::XmlRpcValue& default_value)
    +
    889  {
    +
    890  return loadParam2<XmlRpc::XmlRpcValue>(name, default_value);
    +
    891  }
    +
    892 
    +
    893  //}
    +
    894 
    +
    895  /* loadParam specializations and convenience functions for Eigen dynamic matrix type //{ */
    +
    896 
    +
    910  template <typename T>
    +
    911  void loadParam(const std::string& name, MatrixX<T>& mat, const MatrixX<T>& default_value)
    +
    912  {
    +
    913  mat = loadParam2(name, default_value);
    +
    914  }
    +
    915 
    +
    929  template <typename T>
    +
    930  MatrixX<T> loadParam2(const std::string& name, const MatrixX<T>& default_value)
    +
    931  {
    +
    932  int rows = default_value.rows();
    +
    933  int cols = default_value.cols();
    +
    934  MatrixX<T> loaded;
    +
    935  loadMatrixDynamic(name, loaded, default_value, rows, cols);
    +
    936  return loaded;
    +
    937  }
    +
    938 
    +
    939  //}
    +
    940 
    +
    941  // loadMatrixStatic function for loading of static Eigen::Matrices //{
    +
    942 
    +
    958  template <int rows, int cols, typename T>
    +
    959  void loadMatrixStatic(const std::string& name, Eigen::Matrix<T, rows, cols>& mat)
    +
    960  {
    +
    961  mat = loadMatrixStatic2<rows, cols, T>(name);
    +
    962  }
    +
    963 
    +
    980  template <int rows, int cols, typename T, typename Derived>
    +
    981  void loadMatrixStatic(const std::string& name, Eigen::Matrix<T, rows, cols>& mat, const Eigen::MatrixBase<Derived>& default_value)
    +
    982  {
    +
    983  mat = loadMatrixStatic2<rows, cols, T>(name, default_value);
    +
    984  }
    +
    985 
    +
    1001  template <int rows, int cols, typename T = double>
    +
    1002  Eigen::Matrix<T, rows, cols> loadMatrixStatic2(const std::string& name)
    +
    1003  {
    +
    1004  return loadMatrixStatic_internal<rows, cols, T>(name, Eigen::Matrix<T, rows, cols>::Zero(), COMPULSORY, UNIQUE);
    +
    1005  }
    +
    1006 
    +
    1023  template <int rows, int cols, typename T, typename Derived>
    +
    1024  Eigen::Matrix<T, rows, cols> loadMatrixStatic2(const std::string& name, const Eigen::MatrixBase<Derived>& default_value)
    +
    1025  {
    +
    1026  return loadMatrixStatic_internal<rows, cols, T>(name, Eigen::Matrix<T, rows, cols>(default_value), OPTIONAL, UNIQUE);
    +
    1027  }
    +
    1028  //}
    +
    1029 
    +
    1030  // loadMatrixStatic function for loading of Eigen matrices with known dimensions //{
    +
    1031 
    +
    1045  template <typename T>
    +
    1046  void loadMatrixStatic(const std::string& name, MatrixX<T>& mat, int rows, int cols)
    +
    1047  {
    +
    1048  mat = loadMatrixStatic2<T>(name, rows, cols);
    +
    1049  }
    +
    1050 
    +
    1065  template <typename T, typename Derived>
    +
    1066  void loadMatrixStatic(const std::string& name, MatrixX<T>& mat, const Eigen::MatrixBase<Derived>& default_value, int rows, int cols)
    +
    1067  {
    +
    1068  mat = loadMatrixStatic2<T>(name, default_value, rows, cols);
    +
    1069  }
    +
    1070 
    +
    1084  template <typename T = double>
    +
    1085  MatrixX<T> loadMatrixStatic2(const std::string& name, int rows, int cols)
    +
    1086  {
    +
    1087  return loadMatrixStatic_internal(name, MatrixX<T>(), rows, cols, COMPULSORY, UNIQUE);
    +
    1088  }
    +
    1089 
    +
    1104  template <typename T, typename Derived>
    +
    1105  MatrixX<T> loadMatrixStatic2(const std::string& name, const Eigen::MatrixBase<Derived>& default_value, int rows, int cols)
    +
    1106  {
    +
    1107  return loadMatrixStatic_internal(name, MatrixX<T>(default_value), rows, cols, OPTIONAL, UNIQUE);
    +
    1108  }
    +
    1109  //}
    +
    1110 
    +
    1111  // loadMatrixDynamic function for half-dynamic loading of MatrixX<T> //{
    +
    1112 
    +
    1126  template <typename T>
    +
    1127  void loadMatrixDynamic(const std::string& name, MatrixX<T>& mat, int rows, int cols)
    +
    1128  {
    +
    1129  mat = loadMatrixDynamic2<T>(name, rows, cols);
    +
    1130  }
    +
    1131 
    +
    1146  template <typename T, typename Derived>
    +
    1147  void loadMatrixDynamic(const std::string& name, MatrixX<T>& mat, const Eigen::MatrixBase<Derived>& default_value, int rows, int cols)
    +
    1148  {
    +
    1149  mat = loadMatrixDynamic2<T>(name, default_value, rows, cols);
    +
    1150  }
    +
    1151 
    +
    1165  template <typename T = double>
    +
    1166  MatrixX<T> loadMatrixDynamic2(const std::string& name, int rows, int cols)
    +
    1167  {
    +
    1168  return loadMatrixDynamic_internal(name, MatrixX<T>(), rows, cols, COMPULSORY, UNIQUE);
    +
    1169  }
    +
    1170 
    +
    1185  template <typename T, typename Derived>
    +
    1186  MatrixX<T> loadMatrixDynamic2(const std::string& name, const Eigen::MatrixBase<Derived>& default_value, int rows, int cols)
    +
    1187  {
    +
    1188  return loadMatrixDynamic_internal(name, MatrixX<T>(default_value), rows, cols, OPTIONAL, UNIQUE);
    +
    1189  }
    +
    1190 
    +
    1191  //}
    +
    1192 
    +
    1193  // loadMatrixArray function for loading of an array of MatrixX<T> with known dimensions //{
    +
    1226  template <typename T>
    +
    1227  void loadMatrixArray(const std::string& name, std::vector<MatrixX<T>>& mat)
    +
    1228  {
    +
    1229  mat = loadMatrixArray2<double>(name);
    +
    1230  }
    +
    1231 
    +
    1243  template <typename T>
    +
    1244  void loadMatrixArray(const std::string& name, std::vector<MatrixX<T>>& mat, const std::vector<MatrixX<T>>& default_value)
    +
    1245  {
    +
    1246  mat = loadMatrixArray2(name, default_value);
    +
    1247  }
    +
    1248 
    +
    1259  template <typename T = double>
    +
    1260  std::vector<MatrixX<T>> loadMatrixArray2(const std::string& name)
    +
    1261  {
    +
    1262  return loadMatrixArray_internal(name, std::vector<MatrixX<T>>(), COMPULSORY, UNIQUE);
    +
    1263  }
    +
    1264 
    +
    1276  template <typename T>
    +
    1277  std::vector<MatrixX<T>> loadMatrixArray2(const std::string& name, const std::vector<MatrixX<T>>& default_value)
    +
    1278  {
    +
    1279  return loadMatrixArray_internal(name, default_value, OPTIONAL, UNIQUE);
    +
    1280  }
    +
    1281  //}
    +
    1282 
    +
    1283  //}
    +
    1284 
    +
    1285 };
    +
    1286 //}
    +
    1287 
    +
    1297  template <>
    +
    1298  ros::Duration ParamLoader::loadParam2<ros::Duration>(const std::string& name, const ros::Duration& default_value);
    +
    1299 
    +
    1308  template <>
    +
    1309  ros::Duration ParamLoader::loadParam2<ros::Duration>(const std::string& name);
    +
    1310 
    +
    1311 } // namespace mrs_lib
    +
    1312 
    +
    1313 #endif // PARAM_LOADER_H
    +
    +
    +
    bool addYamlFile(const std::string &filepath)
    Add a YAML file to be parsed and used for loading parameters.
    Definition: param_provider.cpp:18
    +
    bool loadParam(const std::string &name, XmlRpc::XmlRpcValue &out, const XmlRpc::XmlRpcValue &default_value)
    An overload for loading an optional XmlRpc::XmlRpcValue.
    Definition: param_loader.h:856
    +
    bool addYamlFile(const std::string &filepath)
    Adds the specified file as a source of static parameters.
    Definition: param_loader.h:579
    +
    void loadMatrixStatic(const std::string &name, MatrixX< T > &mat, const Eigen::MatrixBase< Derived > &default_value, int rows, int cols)
    Specialized method for loading Eigen matrix parameters with default value.
    Definition: param_loader.h:1066
    +
    void setPrefix(const std::string &prefix)
    All loaded parameters will be prefixed with this string.
    Definition: param_loader.h:550
    +
    MatrixX< T > loadMatrixStatic2(const std::string &name, const Eigen::MatrixBase< Derived > &default_value, int rows, int cols)
    Specialized method for loading Eigen matrix parameters with default value.
    Definition: param_loader.h:1105
    +
    void loadMatrixArray(const std::string &name, std::vector< MatrixX< T >> &mat, const std::vector< MatrixX< T >> &default_value)
    Specialized method for loading compulsory parameters, interpreted as an array of dynamic Eigen matric...
    Definition: param_loader.h:1244
    +
    MatrixX< T > loadMatrixStatic2(const std::string &name, int rows, int cols)
    Specialized method for loading compulsory Eigen matrix parameters.
    Definition: param_loader.h:1085
    +
    bool loadParam(const std::string &name, ros::Duration &out)
    An overload for loading ros::Duration.
    Definition: param_loader.h:789
    +
    bool loadParamReusable(const std::string &name, T &out_value, const T &default_value)
    Loads a parameter from the rosparam server with a default value.
    Definition: param_loader.h:664
    +
    void loadMatrixStatic(const std::string &name, Eigen::Matrix< T, rows, cols > &mat, const Eigen::MatrixBase< Derived > &default_value)
    Specialized method for loading Eigen matrix parameters with default value.
    Definition: param_loader.h:981
    +
    Eigen::Matrix< T, rows, cols > loadMatrixStatic2(const std::string &name)
    Specialized method for loading compulsory Eigen matrix parameters.
    Definition: param_loader.h:1002
    +
    bool getParam(const std::string &param_name, T &value_out) const
    Gets the value of a parameter.
    Definition: param_provider.hpp:9
    +
    T loadParam2(const std::string &name, const T &default_value)
    Loads a parameter from the rosparam server with a default value.
    Definition: param_loader.h:646
    +
    T loadParam2(const std::string &name)
    Loads a compulsory parameter from the rosparam server.
    Definition: param_loader.h:719
    +
    T loadParamReusable2(const std::string &name)
    Loads a compulsory parameter from the rosparam server.
    Definition: param_loader.h:753
    +
    bool loadParam(const std::string &name, std_msgs::ColorRGBA &out, const std_msgs::ColorRGBA &default_value={})
    An overload for loading std_msgs::ColorRGBA.
    Definition: param_loader.h:811
    +
    ParamLoader(const ros::NodeHandle &nh, std::string_view node_name)
    Convenience overload to enable writing ParamLoader pl(nh, node_name);.
    Definition: param_loader.h:524
    +
    T loadParamReusable2(const std::string &name, const T &default_value)
    Loads an optional reusable parameter from the rosparam server.
    Definition: param_loader.h:682
    +
    bool loadParam(const std::string &name, ros::Duration &out, const ros::Duration &default_value)
    An overload for loading ros::Duration.
    Definition: param_loader.h:772
    +
    std::vector< MatrixX< T > > loadMatrixArray2(const std::string &name)
    Specialized method for loading compulsory parameters, interpreted as an array of dynamic Eigen matric...
    Definition: param_loader.h:1260
    +
    bool loadedSuccessfully()
    Indicates whether all compulsory parameters were successfully loaded.
    Definition: param_loader.h:608
    +
    ParamLoader(const std::string &filepath, const ros::NodeHandle &nh)
    Convenience overload to enable writing ParamLoader pl(nh, "node_name");.
    Definition: param_loader.h:536
    +
    void loadMatrixArray(const std::string &name, std::vector< MatrixX< T >> &mat)
    Specialized method for loading compulsory parameters, interpreted as an array of dynamic Eigen matric...
    Definition: param_loader.h:1227
    +
    void loadMatrixDynamic(const std::string &name, MatrixX< T > &mat, const Eigen::MatrixBase< Derived > &default_value, int rows, int cols)
    Specialized method for loading compulsory dynamic Eigen matrix parameters.
    Definition: param_loader.h:1147
    +
    XmlRpc::XmlRpcValue loadParam2(const std::string &name, const XmlRpc::XmlRpcValue &default_value)
    An overload for loading an optional XmlRpc::XmlRpcValue.
    Definition: param_loader.h:888
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    +
    void loadMatrixStatic(const std::string &name, Eigen::Matrix< T, rows, cols > &mat)
    Specialized method for loading compulsory Eigen matrix parameters.
    Definition: param_loader.h:959
    +
    bool loadParam(const std::string &name, T &out_value, const T &default_value)
    Loads a parameter from the rosparam server with a default value.
    Definition: param_loader.h:628
    +
    std::vector< MatrixX< T > > loadMatrixArray2(const std::string &name, const std::vector< MatrixX< T >> &default_value)
    Specialized method for loading compulsory parameters, interpreted as an array of dynamic Eigen matric...
    Definition: param_loader.h:1277
    +
    bool loadParamReusable(const std::string &name, T &out_value)
    Loads a compulsory parameter from the rosparam server.
    Definition: param_loader.h:736
    +
    Convenience class for loading parameters from rosparam server.
    Definition: param_loader.h:43
    +
    void loadMatrixDynamic(const std::string &name, MatrixX< T > &mat, int rows, int cols)
    Specialized method for loading compulsory dynamic Eigen matrix parameters.
    Definition: param_loader.h:1127
    +
    MatrixX< T > loadParam2(const std::string &name, const MatrixX< T > &default_value)
    An overload for loading Eigen matrices.
    Definition: param_loader.h:930
    +
    std_msgs::ColorRGBA loadParam2(const std::string &name, const std_msgs::ColorRGBA &default_value={})
    An overload for loading std_msgs::ColorRGBA.
    Definition: param_loader.h:833
    +
    std::string getPrefix()
    Returns the current parameter name prefix.
    Definition: param_loader.h:564
    +
    bool loadParam(const std::string &name, T &out_value)
    Loads a compulsory parameter from the rosparam server.
    Definition: param_loader.h:702
    +
    void loadParam(const std::string &name, MatrixX< T > &mat, const MatrixX< T > &default_value)
    An overload for loading Eigen matrices.
    Definition: param_loader.h:911
    +
    Eigen::Matrix< T, rows, cols > loadMatrixStatic2(const std::string &name, const Eigen::MatrixBase< Derived > &default_value)
    Specialized method for loading Eigen matrix parameters with default value.
    Definition: param_loader.h:1024
    +
    bool addYamlFileFromParam(const std::string &param_name)
    Loads a filepath from a parameter loads that file as a YAML.
    Definition: param_loader.h:593
    +
    MatrixX< T > loadMatrixDynamic2(const std::string &name, int rows, int cols)
    Specialized method for loading compulsory dynamic Eigen matrix parameters.
    Definition: param_loader.h:1166
    +
    bool loadParam(const std::string &name, XmlRpc::XmlRpcValue &out)
    An overload for loading a compulsory XmlRpc::XmlRpcValue.
    Definition: param_loader.h:872
    +
    Helper class for ParamLoader.
    Definition: param_provider.h:28
    +
    Defines ParamProvider - a helper class for ParamLoader.
    +
    ParamLoader(const ros::NodeHandle &nh, bool printValues=true, std::string_view node_name=std::string())
    Main constructor.
    Definition: param_loader.h:507
    +
    MatrixX< T > loadMatrixDynamic2(const std::string &name, const Eigen::MatrixBase< Derived > &default_value, int rows, int cols)
    Specialized method for loading compulsory dynamic Eigen matrix parameters.
    Definition: param_loader.h:1186
    +
    void loadMatrixStatic(const std::string &name, MatrixX< T > &mat, int rows, int cols)
    Specialized method for loading compulsory Eigen matrix parameters.
    Definition: param_loader.h:1046
    + + + + diff --git a/param__provider_8h.html b/param__provider_8h.html new file mode 100644 index 00000000..7ffa5955 --- /dev/null +++ b/param__provider_8h.html @@ -0,0 +1,156 @@ + + + + + + + +mrs_lib: include/mrs_lib/param_provider.h File Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    param_provider.h File Reference
    +
    +
    + +

    Defines ParamProvider - a helper class for ParamLoader. +More...

    +
    #include <yaml-cpp/yaml.h>
    +#include <ros/node_handle.h>
    +#include "mrs_lib/impl/param_provider.hpp"
    +
    + + Include dependency graph for param_provider.h:
    +
    +
    + +
    + + This graph shows which files directly or indirectly include this file:
    +
    +
    + +
    +

    Go to the source code of this file.

    + + + + + +

    +Classes

    class  mrs_lib::ParamProvider
     Helper class for ParamLoader. More...
     
    + + + + +

    +Namespaces

     mrs_lib
     All mrs_lib functions, classes, variables and definitions are contained in this namespace.
     
    +

    Detailed Description

    +

    Defines ParamProvider - a helper class for ParamLoader.

    +
    Author
    Matouš Vrba - vrbam.nosp@m.ato@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz
    +
    +
    + + + + diff --git a/param__provider_8h__dep__incl.map b/param__provider_8h__dep__incl.map new file mode 100644 index 00000000..ee1af0c5 --- /dev/null +++ b/param__provider_8h__dep__incl.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/param__provider_8h__dep__incl.md5 b/param__provider_8h__dep__incl.md5 new file mode 100644 index 00000000..a5f64210 --- /dev/null +++ b/param__provider_8h__dep__incl.md5 @@ -0,0 +1 @@ +f9f65e218a04dc9c79ff9f654c2e54e9 \ No newline at end of file diff --git a/param__provider_8h__dep__incl.png b/param__provider_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..466c1c6325f76eadff9e5e440f42267c40b5c962 GIT binary patch literal 15342 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 + + + + + diff --git a/param__provider_8h__incl.md5 b/param__provider_8h__incl.md5 new file mode 100644 index 00000000..89b5a5dc --- /dev/null +++ b/param__provider_8h__incl.md5 @@ -0,0 +1 @@ +fe5b70913aee2d4723c32a56c2998fcc \ No newline at end of file diff --git a/param__provider_8h__incl.png b/param__provider_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..8d08bdee1d0fba5f1bc35a27e3197e65376f8169 GIT binary patch literal 10598 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 e|JoAgpJ96iSUU1*BNG0#EJ{nri + + + + + + +mrs_lib: include/mrs_lib/param_provider.h Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    param_provider.h
    +
    +
    +Go to the documentation of this file.
    1 // clang: MatousFormat
    +
    7 #ifndef PARAM_PROVIDER_H
    +
    8 #define PARAM_PROVIDER_H
    +
    9 
    +
    10 #include <yaml-cpp/yaml.h>
    +
    11 #include <ros/node_handle.h>
    +
    12 
    +
    13 namespace mrs_lib
    +
    14 {
    +
    15 
    +
    16 /*** ParamProvider CLASS //{ **/
    +
    17 
    + +
    29  {
    +
    30  public:
    +
    31 
    +
    39  ParamProvider(const ros::NodeHandle& nh, std::string node_name, const bool use_rosparam = true);
    +
    40 
    +
    48  bool addYamlFile(const std::string& filepath);
    +
    49 
    +
    61  template <typename T>
    +
    62  bool getParam(const std::string& param_name, T& value_out) const;
    +
    63 
    +
    75  bool getParam(const std::string& param_name, XmlRpc::XmlRpcValue& value_out) const;
    +
    76 
    +
    77  private:
    +
    78 
    +
    79  std::vector<YAML::Node> m_yamls;
    +
    80  ros::NodeHandle m_nh;
    +
    81  std::string m_node_name;
    +
    82  bool m_use_rosparam;
    +
    83 
    +
    84  template <typename T>
    +
    85  bool getParamImpl(const std::string& param_name, T& value_out) const;
    +
    86 
    +
    87  std::optional<YAML::Node> findYamlNode(const std::string& param_name) const;
    +
    88  };
    +
    89 //}
    +
    90 }
    +
    91 
    +
    92 #include "mrs_lib/impl/param_provider.hpp"
    +
    93 
    +
    94 #endif // PARAM_PROVIDER_H
    +
    +
    +
    bool addYamlFile(const std::string &filepath)
    Add a YAML file to be parsed and used for loading parameters.
    Definition: param_provider.cpp:18
    +
    ParamProvider(const ros::NodeHandle &nh, std::string node_name, const bool use_rosparam=true)
    Main constructor.
    Definition: param_provider.cpp:13
    +
    bool getParam(const std::string &param_name, T &value_out) const
    Gets the value of a parameter.
    Definition: param_provider.hpp:9
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    +
    Helper class for ParamLoader.
    Definition: param_provider.h:28
    + + + + diff --git a/param__provider_8hpp_source.html b/param__provider_8hpp_source.html new file mode 100644 index 00000000..eba7c700 --- /dev/null +++ b/param__provider_8hpp_source.html @@ -0,0 +1,153 @@ + + + + + + + +mrs_lib: include/mrs_lib/impl/param_provider.hpp Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    param_provider.hpp
    +
    +
    +
    1 #ifndef PARAM_PROVIDER_HPP
    +
    2 #define PARAM_PROVIDER_HPP
    +
    3 
    + +
    5 
    +
    6 namespace mrs_lib
    +
    7 {
    +
    8  template <typename T>
    +
    9  bool ParamProvider::getParam(const std::string& param_name, T& value_out) const
    +
    10  {
    +
    11  try
    +
    12  {
    +
    13  return getParamImpl(param_name, value_out);
    +
    14  }
    +
    15  catch (const YAML::Exception& e)
    +
    16  {
    +
    17  ROS_ERROR_STREAM("[" << m_node_name << "]: YAML-CPP threw an unknown exception: " << e.what());
    +
    18  return false;
    +
    19  }
    +
    20  }
    +
    21 
    +
    22  template <typename T>
    +
    23  bool ParamProvider::getParamImpl(const std::string& param_name, T& value_out) const
    +
    24  {
    +
    25  {
    +
    26  const auto found_node = findYamlNode(param_name);
    +
    27  if (found_node.has_value())
    +
    28  {
    +
    29  try
    +
    30  {
    +
    31  // try catch is the only type-generic option...
    +
    32  value_out = found_node.value().as<T>();
    +
    33  return true;
    +
    34  }
    +
    35  catch (const YAML::BadConversion& e)
    +
    36  {}
    +
    37  }
    +
    38 
    +
    39  }
    +
    40 
    +
    41  if (m_use_rosparam)
    +
    42  return m_nh.getParam(param_name, value_out);
    +
    43 
    +
    44  return false;
    +
    45  }
    +
    46 }
    +
    47 
    +
    48 #endif // PARAM_PROVIDER_HPP
    +
    +
    +
    bool getParam(const std::string &param_name, T &value_out) const
    Gets the value of a parameter.
    Definition: param_provider.hpp:9
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    +
    Defines ParamProvider - a helper class for ParamLoader.
    + + + + diff --git a/param_loader_2example_8cpp-example.html b/param_loader_2example_8cpp-example.html new file mode 100644 index 00000000..d372b4fc --- /dev/null +++ b/param_loader_2example_8cpp-example.html @@ -0,0 +1,183 @@ + + + + + + + +mrs_lib: param_loader/example.cpp + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    param_loader/example.cpp
    +
    +
    +

    This example may be run after building mrs_lib by executing rosrun mrs_lib param_loader_example. It demonstrates loading of parameters from the rosparam server inside your node/nodelet using ParamLoader.

    +

    To load parameters into the rosparam server, use a launchfile prefferably. See documentation of ROS launchfiles here: http://wiki.ros.org/roslaunch/XML. Specifically, the param XML tag is used for loading parameters directly from the launchfile: http://wiki.ros.org/roslaunch/XML/param, and the rosparam XML tag tag is used for loading parameters from a yaml file: http://wiki.ros.org/roslaunch/XML/rosparam.

    +

    Example code for using the ParamLoader (see documentation of the ParamLoader class):

    +
    // clang: MatousFormat
    +
    /* Include the ParamLoader header */
    + +
    +
    int main(int argc, char **argv)
    +
    {
    +
    /* Set up ROS. */
    +
    const std::string node_name("param_loader_example");
    +
    ros::init(argc, argv, node_name);
    +
    ros::NodeHandle nh;
    +
    +
    /* Set up some parameters to be loaded by the example. In normal usage,
    +
    * you don't have to do this. Parameters are loaded from the rosparam
    +
    * server or directly from a YAML file. */
    +
    ROS_INFO_STREAM("[" << node_name << "]: pushing testing parameters to the rosparam server");
    +
    nh.setParam("test_param_double", std::numeric_limits<double>::quiet_NaN());
    +
    nh.setParam("test_param_vector", std::vector<int>({6, 6, 6}));
    +
    +
    /* Initialize the param loader with a NodeHandle and optionally the name of this node. */
    +
    ROS_INFO_STREAM("[" << node_name <<" ]: loading parameters using ParamLoader");
    +
    mrs_lib::ParamLoader pl(nh, node_name);
    +
    +
    /* Most basic way to load a parameter to a variable, which could be a class member */
    +
    double test_param_double;
    +
    pl.loadParam("test_param_double", test_param_double);
    +
    +
    /* Load a parameter and return it */
    +
    const auto test_param_vector = pl.loadParam2<std::vector<int>>("test_param_vector");
    +
    +
    /* Load a parameter with a default value, which will be used in this case
    +
    * unless you manually push the parameter 'test_param_int' to the rosparam server
    +
    * (e.g. using 'rosparam set test_param_int 15'). */
    +
    const auto test_param_int = pl.loadParam2<int>("test_param_int", 4);
    +
    +
    /* Load a compulsory parameter - without a default value. This will fail in this
    +
    * case, unless you manually push the parameter to the server. */
    +
    const auto test_param_bool = pl.loadParam2<bool>("test_param_bool");
    +
    +
    /* So far, all the parameters were loaded from the ROS parameter server.
    +
    * These must be loaded to the server using the param or rosparam commands
    +
    * in the launchfile (or manually using the CLI tools). However, loading
    +
    * a large number of parameters from the ROS server in parallel can be slow,
    +
    * so we also offer the possibility to load parameters directly from a YAML file.
    +
    * To do this, firstly you tell the ParamLoader which file to use: */
    +
    pl.addYamlFile("/tmp/test.yaml");
    +
    /* (Note that this file will have to be created manually in this case for this */
    +
    /* example to work.) */
    +
    +
    /* Then, you can load parameters specified in the file normally. */
    +
    const auto string_from_yaml = pl.loadParam2<std::string>("string_from_yaml");
    +
    +
    /* Check if all parameters were loaded successfully */
    +
    if (!pl.loadedSuccessfully())
    +
    {
    +
    /* If not, alert the user and shut the node down */
    +
    ROS_ERROR_STREAM("[" << node_name << "]: parameter loading failure! Ending the node");
    +
    ros::shutdown();
    +
    return 1;
    +
    }
    +
    +
    /* Otherwise, continue the program and happily use the loaded parameters! */
    +
    /* This is just some nonsense usage for demonstration. */
    +
    if (test_param_bool)
    +
    {
    +
    ROS_INFO_STREAM("[" << node_name << "]: Showing values of: " << string_from_yaml);
    +
    for (auto& el : test_param_vector)
    +
    ROS_INFO_STREAM("[" << node_name << "]: Value: " << test_param_double * el + test_param_int);
    +
    }
    +
    +
    return 0;
    +
    +
    }
    +
    +
    +
    +
    bool addYamlFile(const std::string &filepath)
    Adds the specified file as a source of static parameters.
    Definition: param_loader.h:579
    +
    T loadParam2(const std::string &name, const T &default_value)
    Loads a parameter from the rosparam server with a default value.
    Definition: param_loader.h:646
    +
    bool loadedSuccessfully()
    Indicates whether all compulsory parameters were successfully loaded.
    Definition: param_loader.h:608
    +
    Defines ParamLoader - a convenience class for loading static ROS parameters.
    +
    bool loadParam(const std::string &name, T &out_value, const T &default_value)
    Loads a parameter from the rosparam server with a default value.
    Definition: param_loader.h:628
    +
    Convenience class for loading parameters from rosparam server.
    Definition: param_loader.h:43
    + + + + diff --git a/polygon_8h_source.html b/polygon_8h_source.html new file mode 100644 index 00000000..69407897 --- /dev/null +++ b/polygon_8h_source.html @@ -0,0 +1,159 @@ + + + + + + + +mrs_lib: include/mrs_lib/safety_zone/polygon.h Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    polygon.h
    +
    +
    +
    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  const char* what() const throw() {
    +
    32  return "Polygon: wrong number of vertices was supplied!";
    +
    33  }
    +
    34  };
    +
    35 
    +
    36  struct WrongNumberOfColumns : public std::exception
    +
    37  {
    +
    38  const char* what() const throw() {
    +
    39  return "Polygon: wrong number of colums, it should be =2!";
    +
    40  }
    +
    41  };
    +
    42 
    +
    43  struct ExtraVertices : public std::exception
    +
    44  {
    +
    45  const char* what() const throw() {
    +
    46  return "Polygon: useless vertices detected, polygon methods may break!";
    +
    47  }
    +
    48  };
    +
    49 };
    +
    50 } // namespace mrs_lib
    +
    51 
    +
    52 #endif // MRS_LIB_POLYGON_H
    +
    +
    + +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    +
    Definition: polygon.h:13
    +
    Definition: polygon.h:43
    + + + + + diff --git a/probit__gts_8h_source.html b/probit__gts_8h_source.html new file mode 100644 index 00000000..56ba921a --- /dev/null +++ b/probit__gts_8h_source.html @@ -0,0 +1,512 @@ + + + + + + + +mrs_lib: test/math/probit_gts.h Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    probit_gts.h
    +
    +
    +
    1 #include <limits>
    +
    2 
    +
    3 constexpr int n_samples = 200;
    +
    4 constexpr double probit_ins[] =
    +
    5 {
    +
    6  0.000000,
    +
    7  0.005025,
    +
    8  0.010050,
    +
    9  0.015075,
    +
    10  0.020101,
    +
    11  0.025126,
    +
    12  0.030151,
    +
    13  0.035176,
    +
    14  0.040201,
    +
    15  0.045226,
    +
    16  0.050251,
    +
    17  0.055276,
    +
    18  0.060302,
    +
    19  0.065327,
    +
    20  0.070352,
    +
    21  0.075377,
    +
    22  0.080402,
    +
    23  0.085427,
    +
    24  0.090452,
    +
    25  0.095477,
    +
    26  0.100503,
    +
    27  0.105528,
    +
    28  0.110553,
    +
    29  0.115578,
    +
    30  0.120603,
    +
    31  0.125628,
    +
    32  0.130653,
    +
    33  0.135678,
    +
    34  0.140704,
    +
    35  0.145729,
    +
    36  0.150754,
    +
    37  0.155779,
    +
    38  0.160804,
    +
    39  0.165829,
    +
    40  0.170854,
    +
    41  0.175879,
    +
    42  0.180905,
    +
    43  0.185930,
    +
    44  0.190955,
    +
    45  0.195980,
    +
    46  0.201005,
    +
    47  0.206030,
    +
    48  0.211055,
    +
    49  0.216080,
    +
    50  0.221106,
    +
    51  0.226131,
    +
    52  0.231156,
    +
    53  0.236181,
    +
    54  0.241206,
    +
    55  0.246231,
    +
    56  0.251256,
    +
    57  0.256281,
    +
    58  0.261307,
    +
    59  0.266332,
    +
    60  0.271357,
    +
    61  0.276382,
    +
    62  0.281407,
    +
    63  0.286432,
    +
    64  0.291457,
    +
    65  0.296482,
    +
    66  0.301508,
    +
    67  0.306533,
    +
    68  0.311558,
    +
    69  0.316583,
    +
    70  0.321608,
    +
    71  0.326633,
    +
    72  0.331658,
    +
    73  0.336683,
    +
    74  0.341709,
    +
    75  0.346734,
    +
    76  0.351759,
    +
    77  0.356784,
    +
    78  0.361809,
    +
    79  0.366834,
    +
    80  0.371859,
    +
    81  0.376884,
    +
    82  0.381910,
    +
    83  0.386935,
    +
    84  0.391960,
    +
    85  0.396985,
    +
    86  0.402010,
    +
    87  0.407035,
    +
    88  0.412060,
    +
    89  0.417085,
    +
    90  0.422111,
    +
    91  0.427136,
    +
    92  0.432161,
    +
    93  0.437186,
    +
    94  0.442211,
    +
    95  0.447236,
    +
    96  0.452261,
    +
    97  0.457286,
    +
    98  0.462312,
    +
    99  0.467337,
    +
    100  0.472362,
    +
    101  0.477387,
    +
    102  0.482412,
    +
    103  0.487437,
    +
    104  0.492462,
    +
    105  0.497487,
    +
    106  0.502513,
    +
    107  0.507538,
    +
    108  0.512563,
    +
    109  0.517588,
    +
    110  0.522613,
    +
    111  0.527638,
    +
    112  0.532663,
    +
    113  0.537688,
    +
    114  0.542714,
    +
    115  0.547739,
    +
    116  0.552764,
    +
    117  0.557789,
    +
    118  0.562814,
    +
    119  0.567839,
    +
    120  0.572864,
    +
    121  0.577889,
    +
    122  0.582915,
    +
    123  0.587940,
    +
    124  0.592965,
    +
    125  0.597990,
    +
    126  0.603015,
    +
    127  0.608040,
    +
    128  0.613065,
    +
    129  0.618090,
    +
    130  0.623116,
    +
    131  0.628141,
    +
    132  0.633166,
    +
    133  0.638191,
    +
    134  0.643216,
    +
    135  0.648241,
    +
    136  0.653266,
    +
    137  0.658291,
    +
    138  0.663317,
    +
    139  0.668342,
    +
    140  0.673367,
    +
    141  0.678392,
    +
    142  0.683417,
    +
    143  0.688442,
    +
    144  0.693467,
    +
    145  0.698492,
    +
    146  0.703518,
    +
    147  0.708543,
    +
    148  0.713568,
    +
    149  0.718593,
    +
    150  0.723618,
    +
    151  0.728643,
    +
    152  0.733668,
    +
    153  0.738693,
    +
    154  0.743719,
    +
    155  0.748744,
    +
    156  0.753769,
    +
    157  0.758794,
    +
    158  0.763819,
    +
    159  0.768844,
    +
    160  0.773869,
    +
    161  0.778894,
    +
    162  0.783920,
    +
    163  0.788945,
    +
    164  0.793970,
    +
    165  0.798995,
    +
    166  0.804020,
    +
    167  0.809045,
    +
    168  0.814070,
    +
    169  0.819095,
    +
    170  0.824121,
    +
    171  0.829146,
    +
    172  0.834171,
    +
    173  0.839196,
    +
    174  0.844221,
    +
    175  0.849246,
    +
    176  0.854271,
    +
    177  0.859296,
    +
    178  0.864322,
    +
    179  0.869347,
    +
    180  0.874372,
    +
    181  0.879397,
    +
    182  0.884422,
    +
    183  0.889447,
    +
    184  0.894472,
    +
    185  0.899497,
    +
    186  0.904523,
    +
    187  0.909548,
    +
    188  0.914573,
    +
    189  0.919598,
    +
    190  0.924623,
    +
    191  0.929648,
    +
    192  0.934673,
    +
    193  0.939698,
    +
    194  0.944724,
    +
    195  0.949749,
    +
    196  0.954774,
    +
    197  0.959799,
    +
    198  0.964824,
    +
    199  0.969849,
    +
    200  0.974874,
    +
    201  0.979899,
    +
    202  0.984925,
    +
    203  0.989950,
    +
    204  0.994975,
    +
    205  1.000000,
    +
    206 };
    +
    207 
    +
    208 constexpr double probit_gts[] =
    +
    209 {
    +
    210  -std::numeric_limits<double>::infinity(),
    +
    211  -2.574096,
    +
    212  -2.324467,
    +
    213  -2.168104,
    +
    214  -2.051678,
    +
    215  -1.957819,
    +
    216  -1.878583,
    +
    217  -1.809639,
    +
    218  -1.748358,
    +
    219  -1.693017,
    +
    220  -1.642422,
    +
    221  -1.595714,
    +
    222  -1.552247,
    +
    223  -1.511531,
    +
    224  -1.473176,
    +
    225  -1.436874,
    +
    226  -1.402373,
    +
    227  -1.369464,
    +
    228  -1.337975,
    +
    229  -1.307760,
    +
    230  -1.278693,
    +
    231  -1.250669,
    +
    232  -1.223594,
    +
    233  -1.197387,
    +
    234  -1.171978,
    +
    235  -1.147303,
    +
    236  -1.123308,
    +
    237  -1.099943,
    +
    238  -1.077164,
    +
    239  -1.054930,
    +
    240  -1.033206,
    +
    241  -1.011959,
    +
    242  -0.991159,
    +
    243  -0.970779,
    +
    244  -0.950795,
    +
    245  -0.931183,
    +
    246  -0.911923,
    +
    247  -0.892996,
    +
    248  -0.874383,
    +
    249  -0.856069,
    +
    250  -0.838037,
    +
    251  -0.820273,
    +
    252  -0.802765,
    +
    253  -0.785499,
    +
    254  -0.768465,
    +
    255  -0.751650,
    +
    256  -0.735046,
    +
    257  -0.718642,
    +
    258  -0.702428,
    +
    259  -0.686398,
    +
    260  -0.670542,
    +
    261  -0.654852,
    +
    262  -0.639323,
    +
    263  -0.623946,
    +
    264  -0.608715,
    +
    265  -0.593624,
    +
    266  -0.578667,
    +
    267  -0.563838,
    +
    268  -0.549132,
    +
    269  -0.534545,
    +
    270  -0.520070,
    +
    271  -0.505703,
    +
    272  -0.491440,
    +
    273  -0.477276,
    +
    274  -0.463207,
    +
    275  -0.449229,
    +
    276  -0.435339,
    +
    277  -0.421532,
    +
    278  -0.407805,
    +
    279  -0.394154,
    +
    280  -0.380576,
    +
    281  -0.367069,
    +
    282  -0.353627,
    +
    283  -0.340250,
    +
    284  -0.326933,
    +
    285  -0.313674,
    +
    286  -0.300469,
    +
    287  -0.287317,
    +
    288  -0.274215,
    +
    289  -0.261159,
    +
    290  -0.248148,
    +
    291  -0.235178,
    +
    292  -0.222248,
    +
    293  -0.209355,
    +
    294  -0.196497,
    +
    295  -0.183671,
    +
    296  -0.170876,
    +
    297  -0.158108,
    +
    298  -0.145366,
    +
    299  -0.132647,
    +
    300  -0.119950,
    +
    301  -0.107272,
    +
    302  -0.094612,
    +
    303  -0.081966,
    +
    304  -0.069334,
    +
    305  -0.056713,
    +
    306  -0.044101,
    +
    307  -0.031496,
    +
    308  -0.018895,
    +
    309  -0.006298,
    +
    310  0.006298,
    +
    311  0.018895,
    +
    312  0.031496,
    +
    313  0.044101,
    +
    314  0.056713,
    +
    315  0.069334,
    +
    316  0.081966,
    +
    317  0.094612,
    +
    318  0.107272,
    +
    319  0.119950,
    +
    320  0.132647,
    +
    321  0.145366,
    +
    322  0.158108,
    +
    323  0.170876,
    +
    324  0.183671,
    +
    325  0.196497,
    +
    326  0.209355,
    +
    327  0.222248,
    +
    328  0.235178,
    +
    329  0.248148,
    +
    330  0.261159,
    +
    331  0.274215,
    +
    332  0.287317,
    +
    333  0.300469,
    +
    334  0.313674,
    +
    335  0.326933,
    +
    336  0.340250,
    +
    337  0.353627,
    +
    338  0.367069,
    +
    339  0.380576,
    +
    340  0.394154,
    +
    341  0.407805,
    +
    342  0.421532,
    +
    343  0.435339,
    +
    344  0.449229,
    +
    345  0.463207,
    +
    346  0.477276,
    +
    347  0.491440,
    +
    348  0.505703,
    +
    349  0.520070,
    +
    350  0.534545,
    +
    351  0.549132,
    +
    352  0.563838,
    +
    353  0.578667,
    +
    354  0.593624,
    +
    355  0.608715,
    +
    356  0.623946,
    +
    357  0.639323,
    +
    358  0.654852,
    +
    359  0.670542,
    +
    360  0.686398,
    +
    361  0.702428,
    +
    362  0.718642,
    +
    363  0.735046,
    +
    364  0.751650,
    +
    365  0.768465,
    +
    366  0.785499,
    +
    367  0.802765,
    +
    368  0.820273,
    +
    369  0.838037,
    +
    370  0.856069,
    +
    371  0.874383,
    +
    372  0.892996,
    +
    373  0.911923,
    +
    374  0.931183,
    +
    375  0.950795,
    +
    376  0.970779,
    +
    377  0.991159,
    +
    378  1.011959,
    +
    379  1.033206,
    +
    380  1.054930,
    +
    381  1.077164,
    +
    382  1.099943,
    +
    383  1.123308,
    +
    384  1.147303,
    +
    385  1.171978,
    +
    386  1.197387,
    +
    387  1.223594,
    +
    388  1.250669,
    +
    389  1.278693,
    +
    390  1.307760,
    +
    391  1.337975,
    +
    392  1.369464,
    +
    393  1.402373,
    +
    394  1.436874,
    +
    395  1.473176,
    +
    396  1.511531,
    +
    397  1.552247,
    +
    398  1.595714,
    +
    399  1.642422,
    +
    400  1.693017,
    +
    401  1.748358,
    +
    402  1.809639,
    +
    403  1.878583,
    +
    404  1.957819,
    +
    405  2.051678,
    +
    406  2.168104,
    +
    407  2.324467,
    +
    408  2.574096,
    +
    409  std::numeric_limits<double>::infinity(),
    +
    410 };
    +
    +
    + + + + diff --git a/profiler_8h.html b/profiler_8h.html new file mode 100644 index 00000000..957dc9d5 --- /dev/null +++ b/profiler_8h.html @@ -0,0 +1,143 @@ + + + + + + + +mrs_lib: include/mrs_lib/profiler.h File Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    profiler.h File Reference
    +
    +
    + +

    A scoped function profiler which publishes ROS messages. +More...

    +
    #include <ros/ros.h>
    +#include <mrs_msgs/ProfilerUpdate.h>
    +#include <mutex>
    +
    + + Include dependency graph for profiler.h:
    +
    +
    + +
    +

    Go to the source code of this file.

    + + + + + + +

    +Classes

    class  mrs_lib::Routine
     
    class  mrs_lib::Profiler
     
    + + + + +

    +Namespaces

     mrs_lib
     All mrs_lib functions, classes, variables and definitions are contained in this namespace.
     
    +

    Detailed Description

    +

    A scoped function profiler which publishes ROS messages.

    +
    Author
    Tomas Baca - tomas.nosp@m..bac.nosp@m.a@fel.nosp@m..cvu.nosp@m.t.cz
    +
    +
    + + + + diff --git a/profiler_8h__incl.map b/profiler_8h__incl.map new file mode 100644 index 00000000..134d8d1d --- /dev/null +++ b/profiler_8h__incl.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/profiler_8h__incl.md5 b/profiler_8h__incl.md5 new file mode 100644 index 00000000..a89c3c4f --- /dev/null +++ b/profiler_8h__incl.md5 @@ -0,0 +1 @@ +499a7229350b591d2ab4bef448133be4 \ No newline at end of file diff --git a/profiler_8h__incl.png b/profiler_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..8bf692443ca9d251e9e982553d77b46f89a2c37a GIT binary patch literal 7767 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 AApigX literal 0 HcmV?d00001 diff --git a/profiler_8h_source.html b/profiler_8h_source.html new file mode 100644 index 00000000..9e0f77de --- /dev/null +++ b/profiler_8h_source.html @@ -0,0 +1,179 @@ + + + + + + + +mrs_lib: include/mrs_lib/profiler.h Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    profiler.h
    +
    +
    +Go to the documentation of this file.
    1 
    +
    5 #ifndef PROFILER_H
    +
    6 #define PROFILER_H
    +
    7 
    +
    8 #include <ros/ros.h>
    +
    9 #include <mrs_msgs/ProfilerUpdate.h>
    +
    10 #include <mutex>
    +
    11 
    +
    12 namespace mrs_lib
    +
    13 {
    +
    14 
    +
    15 class Routine {
    +
    16 
    +
    17 public:
    +
    18  Routine(std::string name, std::string node_name, std::shared_ptr<ros::Publisher> publisher, std::shared_ptr<std::mutex> mutex_publisher,
    +
    19  bool profiler_enabled);
    +
    20  Routine(std::string name, std::string node_name, double expected_rate, double threshold, std::shared_ptr<ros::Publisher> publisher,
    +
    21  std::shared_ptr<std::mutex> mutex_publisher, bool profiler_enabled, ros::TimerEvent event);
    +
    22  ~Routine();
    +
    23 
    +
    24  void end(void);
    +
    25 
    +
    26 private:
    +
    27  std::string _routine_name_;
    +
    28  std::string _node_name_;
    +
    29 
    +
    30  std::shared_ptr<ros::Publisher> publisher_;
    +
    31  std::shared_ptr<std::mutex> mutex_publisher_;
    +
    32 
    +
    33  // if periodic, those are the stats from the trigger event
    +
    34  double _threshold_;
    +
    35  long iteration_ = 0;
    +
    36 
    +
    37  bool _profiler_enabled_ = false;
    +
    38 
    +
    39  // those are the stats from the execution of the routine
    +
    40  ros::Time execution_start_;
    +
    41 
    +
    42  // this will be published
    +
    43  mrs_msgs::ProfilerUpdate msg_out_;
    +
    44 };
    +
    45 
    +
    46 class Profiler {
    +
    47 
    +
    48 public:
    +
    52  Profiler();
    +
    53 
    +
    61  Profiler(ros::NodeHandle& nh, std::string node_name, bool profiler_enabled);
    +
    62 
    +
    68  Profiler(const Profiler& other);
    +
    69 
    +
    77  Profiler& operator=(const Profiler& other);
    +
    78 
    +
    89  Routine createRoutine(std::string name, double expected_rate, double threshold, ros::TimerEvent event);
    +
    90 
    +
    98  Routine createRoutine(std::string name);
    +
    99 
    +
    100 private:
    +
    101  std::shared_ptr<ros::Publisher> publisher_;
    +
    102  std::shared_ptr<std::mutex> mutex_publisher_;
    +
    103  std::string _node_name_;
    +
    104  bool _profiler_enabled_ = false;
    +
    105 
    +
    106  std::shared_ptr<ros::NodeHandle> nh_;
    +
    107 
    +
    108  bool is_initialized_ = false;
    +
    109 };
    +
    110 
    +
    111 } // namespace mrs_lib
    +
    112 
    +
    113 #endif
    +
    +
    +
    Definition: profiler.h:46
    +
    Profiler & operator=(const Profiler &other)
    the assignment operator
    Definition: profiler.cpp:42
    +
    Routine createRoutine(std::string name, double expected_rate, double threshold, ros::TimerEvent event)
    create a routine for a periodic function
    Definition: profiler.cpp:65
    +
    Profiler()
    the basic constructor
    Definition: profiler.cpp:10
    +
    Definition: profiler.h:15
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    + + + + diff --git a/publisher__handler_8h.html b/publisher__handler_8h.html new file mode 100644 index 00000000..fd62da3c --- /dev/null +++ b/publisher__handler_8h.html @@ -0,0 +1,163 @@ + + + + + + + +mrs_lib: include/mrs_lib/publisher_handler.h File Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    publisher_handler.h File Reference
    +
    +
    + +

    Defines PublisherHandler and related convenience classes for upgrading the ROS publisher. +More...

    +
    #include <ros/ros.h>
    +#include <ros/package.h>
    +#include <atomic>
    +#include <string>
    +#include <mutex>
    +#include <mrs_lib/impl/publisher_handler.hpp>
    +
    + + Include dependency graph for publisher_handler.h:
    +
    +
    + +
    + + This graph shows which files directly or indirectly include this file:
    +
    +
    + +
    +

    Go to the source code of this file.

    + + + + + + + + +

    +Classes

    class  mrs_lib::PublisherHandler_impl< TopicType >
     implementation of the publisher handler More...
     
    class  mrs_lib::PublisherHandler< TopicType >
     user wrapper of the publisher handler implementation More...
     
    + + + + +

    +Namespaces

     mrs_lib
     All mrs_lib functions, classes, variables and definitions are contained in this namespace.
     
    +

    Detailed Description

    +

    Defines PublisherHandler and related convenience classes for upgrading the ROS publisher.

    +
    Author
    Tomas Baca - tomas.nosp@m..bac.nosp@m.a@fel.nosp@m..cvu.nosp@m.t.cz
    +
    +
    + + + + diff --git a/publisher__handler_8h__dep__incl.map b/publisher__handler_8h__dep__incl.map new file mode 100644 index 00000000..6162eacf --- /dev/null +++ b/publisher__handler_8h__dep__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/publisher__handler_8h__dep__incl.md5 b/publisher__handler_8h__dep__incl.md5 new file mode 100644 index 00000000..fcccd192 --- /dev/null +++ b/publisher__handler_8h__dep__incl.md5 @@ -0,0 +1 @@ +d69d5b07bd13b30a3060c980fc8a6540 \ No newline at end of file diff --git a/publisher__handler_8h__dep__incl.png b/publisher__handler_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..1ab7a29c15cc85a2249eb70cfedf360e9b9fef1a GIT binary patch literal 8123 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 + + + + + + + + diff --git a/publisher__handler_8h__incl.md5 b/publisher__handler_8h__incl.md5 new file mode 100644 index 00000000..cd27abf6 --- /dev/null +++ b/publisher__handler_8h__incl.md5 @@ -0,0 +1 @@ +076e3afa6af14a939844fca889281043 \ No newline at end of file diff --git a/publisher__handler_8h__incl.png b/publisher__handler_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..311f1f084897bb2af9e7cf7e68342f791aa3a2a7 GIT binary patch literal 15457 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 literal 0 HcmV?d00001 diff --git a/publisher__handler_8h_source.html b/publisher__handler_8h_source.html new file mode 100644 index 00000000..a9658c06 --- /dev/null +++ b/publisher__handler_8h_source.html @@ -0,0 +1,196 @@ + + + + + + + +mrs_lib: include/mrs_lib/publisher_handler.h Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    publisher_handler.h
    +
    +
    +Go to the documentation of this file.
    1 
    +
    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 
    +
    23 template <class TopicType>
    + +
    25 
    +
    26 public:
    + +
    31 
    + +
    36 
    +
    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 
    +
    54  void publish(const TopicType& msg);
    +
    55 
    +
    61  void publish(const boost::shared_ptr<TopicType>& msg);
    +
    62 
    +
    68  void publish(const boost::shared_ptr<TopicType const>& msg);
    +
    69 
    +
    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 
    +
    94 template <class TopicType>
    + +
    96 
    +
    97 public:
    + +
    102 
    + +
    107 
    + +
    116 
    +
    122  PublisherHandler(const PublisherHandler& other);
    +
    123 
    +
    132  PublisherHandler(ros::NodeHandle& nh, const std::string& address, const unsigned int& buffer_size = 1, const bool& latch = false, const double& rate = 0);
    +
    133 
    +
    139  void publish(const TopicType& msg);
    +
    140 
    +
    146  void publish(const boost::shared_ptr<TopicType>& msg);
    +
    147 
    +
    153  void publish(const boost::shared_ptr<TopicType const>& msg);
    +
    154 
    +
    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
    +
    +
    +
    PublisherHandler(void)
    generic constructor
    Definition: publisher_handler.h:101
    +
    void publish(const TopicType &msg)
    publish message
    Definition: publisher_handler.hpp:209
    +
    void publish(const TopicType &msg)
    publish message
    Definition: publisher_handler.hpp:54
    +
    ~PublisherHandler(void)
    generic destructor
    Definition: publisher_handler.h:106
    +
    PublisherHandler & operator=(const PublisherHandler &other)
    operator=
    Definition: publisher_handler.hpp:168
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    +
    implementation of the publisher handler
    Definition: publisher_handler.h:24
    +
    unsigned int getNumSubscribers(void)
    get number of subscribers
    Definition: publisher_handler.hpp:150
    +
    ~PublisherHandler_impl(void)
    default destructor
    Definition: publisher_handler.h:35
    +
    user wrapper of the publisher handler implementation
    Definition: publisher_handler.h:95
    +
    unsigned int getNumSubscribers(void)
    get number of subscribers
    Definition: publisher_handler.hpp:239
    +
    PublisherHandler_impl(void)
    default constructor
    Definition: publisher_handler.hpp:14
    + + + + diff --git a/publisher__handler_8hpp_source.html b/publisher__handler_8hpp_source.html new file mode 100644 index 00000000..64ad96dd --- /dev/null +++ b/publisher__handler_8hpp_source.html @@ -0,0 +1,359 @@ + + + + + + + +mrs_lib: include/mrs_lib/impl/publisher_handler.hpp Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    publisher_handler.hpp
    +
    +
    +
    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 PublisherHandler_impl<TopicType>::PublisherHandler_impl(ros::NodeHandle& nh, const std::string& address, const unsigned int& buffer_size, const bool& latch,
    +
    23  const double& rate) {
    +
    24 
    +
    25  {
    +
    26  std::scoped_lock lock(mutex_publisher_);
    +
    27 
    +
    28  publisher_ = nh.advertise<TopicType>(address, buffer_size, latch);
    +
    29 
    +
    30  if (rate > 0.0) {
    +
    31 
    +
    32  throttle_ = true;
    +
    33 
    +
    34  throttle_min_dt_ = 1.0 / rate;
    +
    35 
    +
    36  } else {
    +
    37 
    +
    38  throttle_ = false;
    +
    39 
    +
    40  throttle_min_dt_ = 0;
    +
    41  }
    +
    42 
    +
    43  last_time_published_ = ros::Time(0);
    +
    44  }
    +
    45 
    +
    46  publisher_initialized_ = true;
    +
    47 }
    +
    48 
    +
    49 //}
    +
    50 
    +
    51 /* publish(TopicType& msg) //{ */
    +
    52 
    +
    53 template <class TopicType>
    +
    54 void PublisherHandler_impl<TopicType>::publish(const TopicType& msg) {
    +
    55 
    +
    56  if (!publisher_initialized_) {
    +
    57  return;
    +
    58  }
    +
    59 
    +
    60  {
    +
    61  std::scoped_lock lock(mutex_publisher_);
    +
    62 
    +
    63  if (throttle_) {
    +
    64 
    +
    65  if ((ros::Time::now() - last_time_published_).toSec() < throttle_min_dt_) {
    +
    66  return;
    +
    67  }
    +
    68 
    +
    69  last_time_published_ = ros::Time::now();
    +
    70  }
    +
    71 
    +
    72  try {
    +
    73  publisher_.publish(msg);
    +
    74  }
    +
    75  catch (...) {
    +
    76  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 void PublisherHandler_impl<TopicType>::publish(const boost::shared_ptr<TopicType const>& msg) {
    +
    119 
    +
    120  if (!publisher_initialized_) {
    +
    121  return;
    +
    122  }
    +
    123 
    +
    124  {
    +
    125  std::scoped_lock lock(mutex_publisher_);
    +
    126 
    +
    127  if (throttle_) {
    +
    128 
    +
    129  if ((ros::Time::now() - last_time_published_).toSec() < throttle_min_dt_) {
    +
    130  return;
    +
    131  }
    +
    132 
    +
    133  last_time_published_ = ros::Time::now();
    +
    134  }
    +
    135 
    +
    136  try {
    +
    137  publisher_.publish(msg);
    +
    138  }
    +
    139  catch (...) {
    +
    140  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>
    + +
    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>
    + +
    169 
    +
    170  if (this == &other) {
    +
    171  return *this;
    +
    172  }
    +
    173 
    +
    174  if (other.impl_) {
    +
    175  this->impl_ = other.impl_;
    +
    176  }
    +
    177 
    +
    178  return *this;
    +
    179 }
    +
    180 
    +
    181 //}
    +
    182 
    +
    183 /* copy constructor //{ */
    +
    184 
    +
    185 template <class TopicType>
    + +
    187 
    +
    188  if (other.impl_) {
    +
    189  this->impl_ = other.impl_;
    +
    190  }
    +
    191 }
    +
    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 PublisherHandler<TopicType>::PublisherHandler(ros::NodeHandle& nh, const std::string& address, const unsigned int& buffer_size, const bool& latch,
    +
    199  const double& rate) {
    +
    200 
    +
    201  impl_ = std::make_shared<PublisherHandler_impl<TopicType>>(nh, address, buffer_size, latch, rate);
    +
    202 }
    +
    203 
    +
    204 //}
    +
    205 
    +
    206 /* publish(const TopicType& msg) //{ */
    +
    207 
    +
    208 template <class TopicType>
    +
    209 void PublisherHandler<TopicType>::publish(const TopicType& msg) {
    +
    210 
    +
    211  impl_->publish(msg);
    +
    212 }
    +
    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 void PublisherHandler<TopicType>::publish(const boost::shared_ptr<TopicType const>& msg) {
    +
    230 
    +
    231  impl_->publish(msg);
    +
    232 }
    +
    233 
    +
    234 //}
    +
    235 
    +
    236 /* getNumSubscribers(void) //{ */
    +
    237 
    +
    238 template <class TopicType>
    + +
    240 
    +
    241  return impl_->getNumSubscribers();
    +
    242 }
    +
    243 
    +
    244 //}
    +
    245 
    +
    246 } // namespace mrs_lib
    +
    247 
    +
    248 #endif // PUBLISHER_HANDLER_HPP
    +
    +
    +
    PublisherHandler(void)
    generic constructor
    Definition: publisher_handler.h:101
    +
    void publish(const TopicType &msg)
    publish message
    Definition: publisher_handler.hpp:209
    +
    void publish(const TopicType &msg)
    publish message
    Definition: publisher_handler.hpp:54
    +
    PublisherHandler & operator=(const PublisherHandler &other)
    operator=
    Definition: publisher_handler.hpp:168
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    +
    unsigned int getNumSubscribers(void)
    get number of subscribers
    Definition: publisher_handler.hpp:150
    +
    user wrapper of the publisher handler implementation
    Definition: publisher_handler.h:95
    +
    unsigned int getNumSubscribers(void)
    get number of subscribers
    Definition: publisher_handler.hpp:239
    +
    PublisherHandler_impl(void)
    default constructor
    Definition: publisher_handler.hpp:14
    + + + + diff --git a/quadratic__throttle__model_8h_source.html b/quadratic__throttle__model_8h_source.html new file mode 100644 index 00000000..543aea1f --- /dev/null +++ b/quadratic__throttle__model_8h_source.html @@ -0,0 +1,137 @@ + + + + + + + +mrs_lib: include/mrs_lib/quadratic_throttle_model.h Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    quadratic_throttle_model.h
    +
    +
    +
    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;
    + +
    18 
    +
    19 double inline throttleToForce(const MotorParams_t motor_params, const double throttle) {
    +
    20 
    +
    21  return motor_params.n_motors * pow((throttle - motor_params.B) / motor_params.A, 2);
    +
    22 }
    +
    23 
    +
    24 double inline forceToThrottle(const MotorParams_t motor_params, const double force) {
    +
    25 
    +
    26  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
    +
    +
    +
    Definition: quadratic_throttle_model.h:12
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    + + + + diff --git a/repredictor_2example_8cpp-example.html b/repredictor_2example_8cpp-example.html new file mode 100644 index 00000000..21e24a29 --- /dev/null +++ b/repredictor_2example_8cpp-example.html @@ -0,0 +1,388 @@ + + + + + + + +mrs_lib: repredictor/example.cpp + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    repredictor/example.cpp
    +
    +
    +

    This example may be run after building mrs_lib by executing rosrun mrs_lib repredictor_example.

    +
    // clang: MatousFormat
    +
    // Include the Repredictor header
    +
    #include <mrs_lib/repredictor.h>
    +
    // As a model, we'll use a LKF variant
    +
    #include <mrs_lib/lkf.h>
    +
    #include <mrs_lib/mutex.h>
    +
    #include <random>
    +
    #include <fstream>
    +
    #include <mutex>
    +
    #include <thread>
    +
    #include <ros/ros.h>
    +
    #include <mrs_msgs/Float64Stamped.h>
    +
    +
    // Define the LKF we will be using
    +
    namespace mrs_lib
    +
    {
    +
    const int n_states = 2;
    +
    const int n_inputs = 1;
    +
    const int n_measurements = 1;
    +
    +
    using lkf_t = varstepLKF<n_states, n_inputs, n_measurements>;
    +
    using rep_t = Repredictor<lkf_t>;
    +
    }
    +
    +
    /* helper aliases and definitions //{ */
    +
    +
    // Some helpful aliases to make writing of types shorter
    +
    using namespace mrs_lib;
    +
    using A_t = lkf_t::A_t;
    +
    using B_t = lkf_t::B_t;
    +
    using H_t = lkf_t::H_t;
    +
    using Q_t = lkf_t::Q_t;
    +
    using x_t = lkf_t::x_t;
    +
    using P_t = lkf_t::P_t;
    +
    using u_t = lkf_t::u_t;
    +
    using z_t = lkf_t::z_t;
    +
    using R_t = lkf_t::R_t;
    +
    using statecov_t = lkf_t::statecov_t;
    +
    +
    static std::random_device rd{};
    +
    static std::mt19937 gen{rd()};
    +
    static std::normal_distribution<> d{0,1};
    +
    +
    // Helper function to generate a random Eigen matrix with normal distribution
    +
    template <int rows>
    +
    Eigen::Matrix<double, rows, 1> multivariate_gaussian(const Eigen::Matrix<double, rows, rows>& cov)
    +
    {
    +
    Eigen::Matrix<double, rows, 1> ret;
    +
    for (int row = 0; row < rows; row++)
    +
    ret(row, 0) = d(gen);
    +
    return cov*ret;
    +
    }
    +
    +
    A_t generateA(const double dt)
    +
    {
    +
    A_t A;
    +
    A << 1, dt,
    +
    0, 1;
    +
    return A;
    +
    }
    +
    +
    B_t generateB([[maybe_unused]] const double dt)
    +
    {
    +
    B_t B;
    +
    B << dt*dt/2.0,
    +
    dt;
    +
    return B;
    +
    }
    +
    +
    const Q_t Q = 2.5*Q_t::Identity();
    +
    const H_t H( (H_t() << 1, 0).finished() );
    +
    const R_t R_fast = 5.5*R_t::Identity();
    +
    const R_t R_slow = 0.01*R_t::Identity();
    +
    +
    const x_t x0 = x_t::Zero();
    +
    const P_t P0 = 5.0*P_t::Identity();
    +
    const u_t u0 = u_t::Zero();
    +
    const ros::Time t0 = ros::Time(0);
    +
    const std::shared_ptr<lkf_t> lkf_ptr = std::make_shared<lkf_t>(generateA, generateB, H);
    +
    const unsigned buf_sz = 100;
    +
    +
    std::mutex rep_pubs_mtx;
    +
    rep_t rep(x0, P0, u0, Q, t0, lkf_ptr, buf_sz);
    +
    ros::Publisher pub_pos_est;
    +
    ros::Publisher pub_vel_est;
    +
    +
    enum type_e
    +
    {
    +
    input,
    +
    meas_fast,
    +
    meas_slow
    +
    };
    +
    +
    //}
    +
    +
    // --------------------------------------------------------------
    +
    // | THE IMPORTANT PART |
    +
    // --------------------------------------------------------------
    +
    void process_msg(const mrs_msgs::Float64Stamped::ConstPtr msg, type_e type)
    +
    {
    +
    // multithreading synchronization
    +
    std::scoped_lock lck(rep_pubs_mtx);
    +
    +
    // update the Repredictor with the latest message based on its type
    +
    switch (type)
    +
    {
    +
    case input: // interpret msg as system input
    +
    rep.addInputChangeWithNoise(u_t(msg->value), Q, msg->header.stamp);
    +
    break;
    +
    case meas_fast: // interpret msg as fast measurement (use the corresponding R)
    +
    rep.addMeasurement(z_t(msg->value), R_fast, msg->header.stamp);
    +
    break;
    +
    case meas_slow: // interpret msg as slow measurement (use the corresponding R)
    +
    rep.addMeasurement(z_t(msg->value), R_slow, msg->header.stamp);
    +
    break;
    +
    }
    +
    +
    // publish the latest estimate
    +
    mrs_msgs::Float64Stamped msg_out;
    +
    msg_out.header.stamp = ros::Time::now();
    +
    +
    // estimate the current state using Repredictor
    +
    const x_t x_pred = rep.predictTo(msg_out.header.stamp).x;
    +
    +
    // publish the position estimate
    +
    msg_out.value = x_pred.x();
    +
    pub_pos_est.publish(msg_out);
    +
    +
    // publish the velocity estimate
    +
    msg_out.value = x_pred.y();
    +
    pub_vel_est.publish(msg_out);
    +
    }
    +
    +
    /* callback splitting to process_msg() //{ */
    +
    +
    void callback_input(const mrs_msgs::Float64Stamped::ConstPtr msg)
    +
    {
    +
    process_msg(msg, input);
    +
    }
    +
    +
    void callback_meas_fast(const mrs_msgs::Float64Stamped::ConstPtr msg)
    +
    {
    +
    process_msg(msg, meas_fast);
    +
    }
    +
    +
    void callback_meas_slow(const mrs_msgs::Float64Stamped::ConstPtr msg)
    +
    {
    +
    process_msg(msg, meas_slow);
    +
    }
    +
    +
    //}
    +
    +
    // current state and its mutex
    +
    std::mutex x_mtx;
    +
    x_t x = x_t::Random();
    +
    +
    /* publisher thread of fast, imprecise measurements //{ */
    +
    +
    ros::Publisher pub_meas_fast;
    +
    void meas_generator_fast()
    +
    {
    +
    const R_t R = R_fast;
    +
    const double delay_std = 0.1;
    +
    +
    while (ros::ok())
    +
    {
    +
    const x_t x_gt = mrs_lib::get_mutexed(x_mtx, x);
    +
    const z_t z = H*x_gt + multivariate_gaussian(R);
    +
    const ros::Time stamp = ros::Time::now();
    +
    const double delay = delay_std*std::abs(d(gen));
    +
    ros::Duration(delay).sleep();
    +
    mrs_msgs::Float64Stamped msg;
    +
    msg.header.stamp = stamp;
    +
    msg.value = z.x();
    +
    pub_meas_fast.publish(msg);
    +
    }
    +
    }
    +
    +
    //}
    +
    +
    /* publisher thread of slow, precise measurements //{ */
    +
    +
    ros::Publisher pub_meas_slow;
    +
    void meas_generator_slow()
    +
    {
    +
    const R_t R = R_slow;
    +
    const double delay_std = 1.0;
    +
    +
    while (ros::ok())
    +
    {
    +
    const x_t x_gt = mrs_lib::get_mutexed(x_mtx, x);
    +
    const z_t z = H*x_gt + multivariate_gaussian(R);
    +
    const ros::Time stamp = ros::Time::now();
    +
    const double delay = delay_std*std::abs(d(gen));
    +
    ros::Duration(delay).sleep();
    +
    mrs_msgs::Float64Stamped msg;
    +
    msg.header.stamp = stamp;
    +
    msg.value = z.x();
    +
    pub_meas_slow.publish(msg);
    +
    }
    +
    }
    +
    +
    //}
    +
    +
    int main(int argc, char **argv)
    +
    {
    +
    /* Set up ROS. */
    +
    const std::string node_name("repredictor_example");
    +
    ros::init(argc, argv, node_name);
    +
    ros::NodeHandle nh;
    +
    +
    // subscriber on the topic
    +
    ros::Subscriber sub_inpt = nh.subscribe("velocity_inpt", 10, callback_input);
    +
    ros::Subscriber sub_meas_fast = nh.subscribe("position_meas_fast", 10, callback_meas_fast);
    +
    ros::Subscriber sub_meas_slow = nh.subscribe("position_meas_slow", 10, callback_meas_slow);
    +
    +
    // publishers for publishing generated measurements, ground truths and the estimate
    +
    pub_pos_est = nh.advertise<mrs_msgs::Float64Stamped>("position_est", 5);
    +
    pub_vel_est = nh.advertise<mrs_msgs::Float64Stamped>("velocity_est", 5);
    +
    pub_meas_fast = nh.advertise<mrs_msgs::Float64Stamped>("position_meas_fast", 5);
    +
    pub_meas_slow = nh.advertise<mrs_msgs::Float64Stamped>("position_meas_slow", 5);
    +
    ros::Publisher pub_inpt_gt = nh.advertise<mrs_msgs::Float64Stamped>("velocity_inpt", 5);
    +
    ros::Publisher pub_pos_gt = nh.advertise<mrs_msgs::Float64Stamped>("position_gt", 5);
    +
    ros::Publisher pub_vel_gt = nh.advertise<mrs_msgs::Float64Stamped>("velocity_gt", 5);
    +
    +
    // threads for publishing
    +
    std::thread th_fast(meas_generator_fast);
    +
    th_fast.detach();
    +
    std::thread th_slow(meas_generator_slow);
    +
    th_slow.detach();
    +
    +
    // our system model, generating the currant state x
    +
    ros::Duration dur(5e-2);
    +
    while (ros::ok())
    +
    {
    +
    const double dt = dur.toSec();
    +
    const u_t u = 3.0*u_t::Random();
    +
    const Q_t dtQ = dt*Q;
    +
    +
    // generate a new state
    +
    const x_t x_old = mrs_lib::get_mutexed(x_mtx, x);
    +
    const x_t x_new = generateA(dt)*x_old + generateB(dt)*u + multivariate_gaussian(dtQ);
    +
    mrs_lib::set_mutexed(x_mtx, x_new, x);
    +
    +
    mrs_msgs::Float64Stamped msg;
    +
    +
    // publish the position ground-truth
    +
    msg.header.stamp = ros::Time::now() - ros::Duration(dt);
    +
    msg.value = u.x();
    +
    pub_inpt_gt.publish(msg);
    +
    +
    // publish the position ground-truth
    +
    msg.header.stamp = ros::Time::now();
    +
    msg.value = x.x();
    +
    pub_pos_gt.publish(msg);
    +
    +
    // publish the velocity ground-truth
    +
    msg.header.stamp = ros::Time::now();
    +
    msg.value = x.y();
    +
    pub_vel_gt.publish(msg);
    +
    +
    ROS_INFO_THROTTLE(1.0, "[%s]: Spinning", ros::this_node::getName().c_str());
    +
    ros::spinOnce();
    +
    dur.sleep();
    +
    }
    +
    }
    +
    +
    +
    +
    +
    std::tuple< Args... > get_mutexed(std::mutex &mut, Args &... args)
    thread-safe getter for values of variables (args)
    Definition: mutex.h:48
    +
    typename Base_class::Q_t Q_t
    Process noise covariance matrix type .
    Definition: lkf.h:52
    +
    Eigen::Matrix< double, p, n > H_t
    State to measurement mapping matrix type .
    Definition: lkf.h:57
    +
    typename Base_class::P_t P_t
    State uncertainty covariance matrix type .
    Definition: lkf.h:50
    +
    std::enable_if_t<!check, statecov_t > predictTo(const ros::Time &to_stamp)
    Estimates the system state and covariance matrix at the specified time.
    Definition: repredictor.h:67
    +
    typename Base_class::statecov_t statecov_t
    Helper struct for passing around the state and its covariance in one variable.
    Definition: lkf.h:53
    +
    typename Base_class::R_t R_t
    Measurement noise covariance matrix type .
    Definition: lkf.h:51
    +
    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)
    Adds one measurement to the history buffer, removing the oldest element in the buffer if it is full.
    Definition: repredictor.h:296
    +
    Eigen::Matrix< double, n, m > B_t
    Input to state mapping matrix type .
    Definition: lkf.h:56
    +
    typename Base_class::x_t x_t
    State vector type .
    Definition: lkf.h:47
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    +
    Implementation of the Repredictor for fusing measurements with variable delays.
    Definition: repredictor.h:39
    +
    Eigen::Matrix< double, n, n > A_t
    System transition matrix type .
    Definition: lkf.h:55
    +
    Defines helper routines for getting and setting variables under mutex locks.
    +
    auto set_mutexed(std::mutex &mut, const T what, T &where)
    thread-safe setter for a variable
    Definition: mutex.h:116
    +
    typename Base_class::z_t z_t
    Measurement vector type .
    Definition: lkf.h:49
    +
    std::enable_if_t<!check > addInputChangeWithNoise(const u_t &u, const Q_t &Q, const ros::Time &stamp, const ModelPtr &model=nullptr)
    Adds one system input to the history buffer, removing the oldest element in the buffer if it is full.
    Definition: repredictor.h:141
    +
    typename Base_class::u_t u_t
    Input vector type .
    Definition: lkf.h:48
    + + + + diff --git a/repredictor_2example_8cpp.html b/repredictor_2example_8cpp.html new file mode 100644 index 00000000..488d18c6 --- /dev/null +++ b/repredictor_2example_8cpp.html @@ -0,0 +1,298 @@ + + + + + + + +mrs_lib: src/repredictor/example.cpp File Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    example.cpp File Reference
    +
    +
    + +

    Example file for the Repredictor implementation. +More...

    +
    #include <mrs_lib/repredictor.h>
    +#include <mrs_lib/lkf.h>
    +#include <mrs_lib/mutex.h>
    +#include <random>
    +#include <fstream>
    +#include <mutex>
    +#include <thread>
    +#include <ros/ros.h>
    +#include <mrs_msgs/Float64Stamped.h>
    +
    + + Include dependency graph for example.cpp:
    +
    +
    + +
    + + + + +

    +Namespaces

     mrs_lib
     All mrs_lib functions, classes, variables and definitions are contained in this namespace.
     
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Typedefs

    +using mrs_lib::rep_t = Repredictor< lkf_t >
     
    +using A_t = lkf_t::A_t
     
    +using B_t = lkf_t::B_t
     
    +using H_t = lkf_t::H_t
     
    +using Q_t = lkf_t::Q_t
     
    +using x_t = lkf_t::x_t
     
    +using P_t = lkf_t::P_t
     
    +using u_t = lkf_t::u_t
     
    +using z_t = lkf_t::z_t
     
    +using R_t = lkf_t::R_t
     
    +using statecov_t = lkf_t::statecov_t
     
    + + + +

    +Enumerations

    enum  type_e { input, +meas_fast, +meas_slow + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    +template<int rows>
    Eigen::Matrix< double, rows, 1 > multivariate_gaussian (const Eigen::Matrix< double, rows, rows > &cov)
     
    +A_t generateA (const double dt)
     
    +B_t generateB ([[maybe_unused]] const double dt)
     
    +const H_t H ((H_t()<< 1, 0).finished())
     
    +void process_msg (const mrs_msgs::Float64Stamped::ConstPtr msg, type_e type)
     
    +void callback_input (const mrs_msgs::Float64Stamped::ConstPtr msg)
     
    +void callback_meas_fast (const mrs_msgs::Float64Stamped::ConstPtr msg)
     
    +void callback_meas_slow (const mrs_msgs::Float64Stamped::ConstPtr msg)
     
    +void meas_generator_fast ()
     
    +void meas_generator_slow ()
     
    +int main (int argc, char **argv)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Variables

    +const Q_t Q = 2.5*Q_t::Identity()
     
    +const R_t R_fast = 5.5*R_t::Identity()
     
    +const R_t R_slow = 0.01*R_t::Identity()
     
    +const x_t x0 = x_t::Zero()
     
    +const P_t P0 = 5.0*P_t::Identity()
     
    +const u_t u0 = u_t::Zero()
     
    +const ros::Time t0 = ros::Time(0)
     
    +const std::shared_ptr< lkf_tlkf_ptr = std::make_shared<lkf_t>(generateA, generateB, H)
     
    +const unsigned buf_sz = 100
     
    +std::mutex rep_pubs_mtx
     
    +rep_t rep (x0, P0, u0, Q, t0, lkf_ptr, buf_sz)
     
    +ros::Publisher pub_pos_est
     
    +ros::Publisher pub_vel_est
     
    +std::mutex x_mtx
     
    +x_t x = x_t::Random()
     
    +ros::Publisher pub_meas_fast
     
    +ros::Publisher pub_meas_slow
     
    +

    Detailed Description

    +

    Example file for the Repredictor implementation.

    +
    Author
    Matouš Vrba - vrbam.nosp@m.ato@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz
    +

    This example may be run after building mrs_lib by executing rosrun mrs_lib repredictor_example.

    +

    See repredictor/example.cpp.

    +
    +
    + + + + diff --git a/repredictor_2example_8cpp.js b/repredictor_2example_8cpp.js new file mode 100644 index 00000000..19efc8b2 --- /dev/null +++ b/repredictor_2example_8cpp.js @@ -0,0 +1,47 @@ +var repredictor_2example_8cpp = +[ + [ "A_t", "repredictor_2example_8cpp.html#ae8fded1ffb13cfff36afc1eedabf215f", null ], + [ "B_t", "repredictor_2example_8cpp.html#a5c39f7a461054863b37ddf9186eeb366", null ], + [ "H_t", "repredictor_2example_8cpp.html#aa4437350efd30cd9ab6dbea2a2621faa", null ], + [ "P_t", "repredictor_2example_8cpp.html#a8519b4182b449bbd63c34794c1b03312", null ], + [ "Q_t", "repredictor_2example_8cpp.html#afb367b4e310274e83ea453f1d9329df0", null ], + [ "R_t", "repredictor_2example_8cpp.html#a0571298449e0cf2aee255bf7e06e7b86", null ], + [ "rep_t", "repredictor_2example_8cpp.html#a19304cdf9777c9a3c811aa6059a88546", null ], + [ "statecov_t", "repredictor_2example_8cpp.html#adf612d30d3a77fa99ff157ce72be6383", null ], + [ "u_t", "repredictor_2example_8cpp.html#a846481e2173f20986bcee056e29a5b4c", null ], + [ "x_t", "repredictor_2example_8cpp.html#a1db3b17743d9d81ac2aa852a6ed2e4c6", null ], + [ "z_t", "repredictor_2example_8cpp.html#a3dd466ca19241875ff72a627b1f86a25", null ], + [ "type_e", "repredictor_2example_8cpp.html#a39f6e5f83740a0914d53219949ecc69e", [ + [ "input", "repredictor_2example_8cpp.html#a39f6e5f83740a0914d53219949ecc69ea37943061a284187ff6e555ac7093f528", null ], + [ "meas_fast", "repredictor_2example_8cpp.html#a39f6e5f83740a0914d53219949ecc69ea379a0883597ae3d1f1e3c1a1517dd7ad", null ], + [ "meas_slow", "repredictor_2example_8cpp.html#a39f6e5f83740a0914d53219949ecc69eac39aa50f0e5debf0e3d1c82c66de5757", null ] + ] ], + [ "callback_input", "repredictor_2example_8cpp.html#a977e0ce1096923dfd87ccdf695f9f8b2", null ], + [ "callback_meas_fast", "repredictor_2example_8cpp.html#adf9153e3a603b2c7c08fa3cf7375474a", null ], + [ "callback_meas_slow", "repredictor_2example_8cpp.html#ae3421c5445d8aaae50e91724a0388ebb", null ], + [ "generateA", "repredictor_2example_8cpp.html#a1bc0c75a4c8c1c828f547193c36d41ed", null ], + [ "generateB", "repredictor_2example_8cpp.html#a04ad260106826343be9a78c3f06b9494", null ], + [ "H", "repredictor_2example_8cpp.html#a31932df0f35e7ed6e9973f650f418a07", null ], + [ "main", "repredictor_2example_8cpp.html#a3c04138a5bfe5d72780bb7e82a18e627", null ], + [ "meas_generator_fast", "repredictor_2example_8cpp.html#a341120b0d08c40b63a5154596202da78", null ], + [ "meas_generator_slow", "repredictor_2example_8cpp.html#a2bbc4de1050b3f81aec31aca08ab80df", null ], + [ "multivariate_gaussian", "repredictor_2example_8cpp.html#a8f8bd83d76b2b0d4a6a7f6c0790bbfdd", null ], + [ "process_msg", "repredictor_2example_8cpp.html#aba7846be673da103e71d72c40f8a08fb", null ], + [ "buf_sz", "repredictor_2example_8cpp.html#a00db3db50157f6d921e88e021811bf86", null ], + [ "lkf_ptr", "repredictor_2example_8cpp.html#afe1ed0bba9b15d37a4b2d73269fde97d", null ], + [ "P0", "repredictor_2example_8cpp.html#ae66da1ac30217d07f007e22eca0fea3c", null ], + [ "pub_meas_fast", "repredictor_2example_8cpp.html#a9c6a7b667bce566f9b0d755433a8866f", null ], + [ "pub_meas_slow", "repredictor_2example_8cpp.html#aee6e5b5aaa37a9795d80edd9f5995fc8", null ], + [ "pub_pos_est", "repredictor_2example_8cpp.html#a775551377e2a7c6e3fd6847b954c8082", null ], + [ "pub_vel_est", "repredictor_2example_8cpp.html#a352adc1a2c0a3bcc618377e9c709004e", null ], + [ "Q", "repredictor_2example_8cpp.html#ad73965f5fe03310152a90cdc9220c04b", null ], + [ "R_fast", "repredictor_2example_8cpp.html#a729d2c77258b8899f706bb4ab6358e8f", null ], + [ "R_slow", "repredictor_2example_8cpp.html#a0322341fab5d8ca5eb9bd456e97d7231", null ], + [ "rep", "repredictor_2example_8cpp.html#a3819710403de686f8acbaa8f3aac9e98", null ], + [ "rep_pubs_mtx", "repredictor_2example_8cpp.html#a73cfe801a23dbef4ae5d436efd88fac2", null ], + [ "t0", "repredictor_2example_8cpp.html#a8e0b3e2e88529ac7cd162baab552d6fd", null ], + [ "u0", "repredictor_2example_8cpp.html#a18307a2ee5d0bd32221c781c5dc87eb4", null ], + [ "x", "repredictor_2example_8cpp.html#a956fd740a35a42db892192588f528ea3", null ], + [ "x0", "repredictor_2example_8cpp.html#a398851be03b7067e59f304d76fbe0620", null ], + [ "x_mtx", "repredictor_2example_8cpp.html#abd02e0d2de9881fe9c0b60ed36f679a5", null ] +]; \ No newline at end of file diff --git a/repredictor_2example_8cpp__incl.map b/repredictor_2example_8cpp__incl.map new file mode 100644 index 00000000..61cdb06d --- /dev/null +++ b/repredictor_2example_8cpp__incl.map @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/repredictor_2example_8cpp__incl.md5 b/repredictor_2example_8cpp__incl.md5 new file mode 100644 index 00000000..94174509 --- /dev/null +++ b/repredictor_2example_8cpp__incl.md5 @@ -0,0 +1 @@ +e6224f00e37fb46c5046a300e09738be \ No newline at end of file diff --git a/repredictor_2example_8cpp__incl.png b/repredictor_2example_8cpp__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..1e8c162d7a086cb8625367d668b89c65e52c7ca6 GIT binary patch literal 60574 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%0A@ak9a{-o2}Y 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 IW6d}J3$eyQS^xk5 literal 0 HcmV?d00001 diff --git a/repredictor_8h_source.html b/repredictor_8h_source.html new file mode 100644 index 00000000..21f14316 --- /dev/null +++ b/repredictor_8h_source.html @@ -0,0 +1,509 @@ + + + + + + + +mrs_lib: include/mrs_lib/repredictor.h Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    repredictor.h
    +
    +
    +
    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 {
    +
    38  template <class Model, bool disable_reprediction=false>
    + +
    40  {
    +
    41  public:
    +
    42  /* states, inputs etc. definitions (typedefs, constants etc) //{ */
    +
    43 
    +
    44  using x_t = typename Model::x_t;
    +
    45  using u_t = typename Model::u_t;
    +
    46  using z_t = typename Model::z_t;
    +
    47  using P_t = typename Model::P_t;
    +
    48  using R_t = typename Model::R_t;
    +
    49  using Q_t = typename Model::Q_t;
    +
    50  using statecov_t = typename Model::statecov_t;
    +
    51  using ModelPtr = typename std::shared_ptr<Model>;
    +
    53  //}
    +
    54 
    +
    55  /* predictTo() method //{ */
    +
    66  template<bool check=disable_reprediction>
    +
    67  std::enable_if_t<!check, statecov_t> predictTo(const ros::Time& to_stamp)
    +
    68  {
    +
    69  assert(!m_history.empty());
    +
    70  auto hist_it = std::begin(m_history);
    +
    71  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  hist_it->is_measurement = false;
    +
    75  }
    +
    76  // cur_stamp corresponds to the time point of cur_sc estimation
    +
    77  auto cur_stamp = hist_it->stamp;
    +
    78  // cur_sc is the current state and covariance estimate
    +
    79  auto cur_sc = m_sc;
    +
    80  do
    +
    81  {
    +
    82  cur_sc.stamp = hist_it->stamp;
    +
    83  // do the correction if current history point is a measurement
    +
    84  if ((hist_it->is_measurement))
    +
    85  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  ros::Time next_stamp = to_stamp;
    +
    90  if ((hist_it + 1) != std::end(m_history) && (hist_it + 1)->stamp <= to_stamp)
    +
    91  next_stamp = (hist_it + 1)->stamp;
    +
    92 
    +
    93  // do the prediction
    +
    94  cur_sc = predictFrom(cur_sc, *hist_it, cur_stamp, next_stamp);
    +
    95  cur_stamp = next_stamp;
    +
    96 
    +
    97  // increment the history pointer
    +
    98  hist_it++;
    +
    99  } while (hist_it != std::end(m_history) && hist_it->stamp <= to_stamp);
    +
    100  cur_sc.stamp = to_stamp;
    +
    101  return cur_sc;
    +
    102  }
    +
    103 
    +
    116  template<bool check=disable_reprediction>
    +
    117  std::enable_if_t<check, statecov_t> predictTo(const ros::Time& to_stamp)
    +
    118  {
    +
    119  assert(!m_history.empty());
    +
    120  const auto& info = m_history.front();
    +
    121  auto sc = predictFrom(m_sc, info, info.stamp, to_stamp);
    +
    122  sc.stamp = to_stamp;
    +
    123  return sc;
    +
    124  }
    +
    125  //}
    +
    126 
    +
    127  /* addInputChangeWithNoise() method //{ */
    +
    140  template<bool check=disable_reprediction>
    +
    141  std::enable_if_t<!check> addInputChangeWithNoise(const u_t& u, const Q_t& Q, const ros::Time& stamp, const ModelPtr& model = nullptr)
    +
    142  {
    +
    143  const info_t info(stamp, u, Q, model);
    +
    144  // find the next point in the history buffer
    +
    145  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  const auto added = addInfo(info, next_it);
    +
    148  // update all measurements following the newly added system input up to the next system input
    +
    149  if (added != std::end(m_history))
    +
    150  for (auto it = added + 1; it != std::end(m_history) && it->is_measurement; it++)
    +
    151  it->updateUsing(info);
    +
    152  }
    +
    153 
    +
    166  template<bool check=disable_reprediction>
    +
    167  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  if (m_history.empty())
    +
    170  m_history.push_back({stamp});
    +
    171  m_history.front().u = u;
    +
    172  m_history.front().Q = Q;
    +
    173  m_history.front().stamp = stamp;
    +
    174  m_history.front().predict_model = model;
    +
    175  }
    +
    176  //}
    +
    177 
    +
    178  /* addInputChange() method //{ */
    +
    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 
    +
    219  template<bool check=disable_reprediction>
    +
    220  std::enable_if_t<check> addInputChange(const u_t& u, [[maybe_unused]] const ros::Time& stamp, const ModelPtr& model = nullptr)
    +
    221  {
    +
    222  if (m_history.empty())
    +
    223  m_history.push_back({stamp});
    +
    224  m_history.front().u = u;
    +
    225  m_history.front().stamp = stamp;
    +
    226  m_history.front().predict_model = model;
    +
    227  }
    +
    228  //}
    +
    229 
    +
    230  /* addProcessNoiseChange() method //{ */
    +
    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 
    +
    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 //{ */
    +
    295  template<bool check=disable_reprediction>
    +
    296  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  assert(!m_history.empty());
    +
    299  // helper variable for searching of the next point in the history buffer
    +
    300  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  const auto prev_it = next_it == std::begin(m_history) ? next_it : next_it - 1;
    +
    303  // initialize a new history info point
    +
    304  const info_t info(stamp, z, R, model, *prev_it, meas_id);
    +
    305  // add the point to the history buffer
    +
    306  addInfo(info, next_it);
    +
    307  }
    +
    308 
    +
    321  template<bool check=disable_reprediction>
    +
    322  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  if (m_history.empty())
    +
    325  m_history.push_back({stamp});
    +
    326  auto& info = m_history.front();
    +
    327  const ros::Time to_stamp = stamp > info.stamp ? stamp : info.stamp;
    +
    328  const auto sc = predictTo(to_stamp);
    +
    329  info.z = z;
    +
    330  info.R = R;
    +
    331  info.stamp = to_stamp;
    +
    332  info.is_measurement = true;
    +
    333  info.meas_id = meas_id;
    +
    334  info.correct_model = model;
    +
    335  m_sc = correctFrom(sc, info);
    +
    336  }
    +
    337  //}
    +
    338 
    +
    339  public:
    +
    340  /* constructor //{ */
    +
    341 
    +
    355  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  : m_sc{x0, P0}, m_default_model(model), m_history(history_t(hist_len))
    +
    357  {
    +
    358  assert(hist_len > 0);
    +
    359  addInputChangeWithNoise(u0, Q0, t0, model);
    +
    360  };
    +
    361 
    + +
    367 
    +
    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  info_t(const ros::Time& stamp) : stamp(stamp), is_measurement(false){};
    +
    417 
    +
    418  // constructor for a system input
    +
    419  info_t(const ros::Time& stamp, const u_t& u, const Q_t& Q, const ModelPtr& model)
    +
    420  : stamp(stamp), u(u), Q(Q), predict_model(model), is_measurement(false){};
    +
    421 
    +
    422  // constructor for a measurement
    +
    423  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  : stamp(stamp), z(z), R(R), correct_model(model), is_measurement(true), meas_id(meas_id)
    +
    425  {
    +
    426  updateUsing(prev_info);
    +
    427  };
    +
    428 
    +
    429  // copy system input-related information from a previous info
    +
    430  void updateUsing(const info_t& info)
    +
    431  {
    +
    432  u = info.u;
    +
    433  Q = info.Q;
    +
    434  predict_model = info.predict_model;
    +
    435  };
    +
    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  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  if (next_it == std::begin(m_history) && !m_history.empty())
    +
    483  {
    +
    484  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  return std::end(m_history);
    +
    488  }
    +
    489 
    +
    490  // check if adding a new element would throw out the oldest one
    +
    491  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  auto new_oldest = m_history.front();
    +
    495  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  new_oldest = info;
    +
    498  } else if (m_history.size() > 1)
    +
    499  {
    +
    500  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  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  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  return ret;
    +
    521  }
    +
    522  //}
    +
    523 
    +
    524  /* earlier() method //{ */
    +
    525  static bool earlier(const info_t& ob1, const info_t& ob2)
    +
    526  {
    +
    527  return ob1.stamp < ob2.stamp;
    +
    528  }
    +
    529  //}
    +
    530 
    +
    531  /* predictFrom() method //{ */
    +
    532  statecov_t predictFrom(const statecov_t& sc, const info_t& inpt, const ros::Time& from_stamp, const ros::Time& to_stamp)
    +
    533  {
    +
    534  const auto model = inpt.predict_model == nullptr ? m_default_model : inpt.predict_model;
    +
    535  const auto dt = (to_stamp - from_stamp).toSec();
    +
    536  return model->predict(sc, inpt.u, inpt.Q, dt);
    +
    537  }
    +
    538  //}
    +
    539 
    +
    540  /* correctFrom() method //{ */
    +
    541  statecov_t correctFrom(const statecov_t& sc, const info_t& meas)
    +
    542  {
    +
    543  assert(meas.is_measurement);
    +
    544  const auto model = meas.correct_model == nullptr ? m_default_model : meas.correct_model;
    +
    545  auto sc_tmp = sc;
    +
    546  return model->correct(sc_tmp, meas.z, meas.R);
    +
    547  }
    +
    548  //}
    +
    549  };
    +
    550 } // namespace mrs_lib
    +
    551 
    +
    552 
    +
    553 #endif // REPREDICTOR_H
    +
    +
    +
    Repredictor()
    Empty constructor.
    Definition: repredictor.h:366
    +
    std::enable_if_t< check > addProcessNoiseChange(const Q_t &Q, [[maybe_unused]] const ros::Time &stamp, const ModelPtr &model=nullptr)
    Adds one system input to the history buffer, removing the oldest element in the buffer if it is full.
    Definition: repredictor.h:272
    +
    typename Model::P_t P_t
    State uncertainty covariance matrix type .
    Definition: repredictor.h:47
    +
    Repredictor(const x_t &x0, const P_t &P0, const Q_t &Q0, const ros::Time &t0, const ModelPtr &model, const unsigned hist_len)
    Variation of the constructor for cases without a system input.
    Definition: repredictor.h:381
    +
    std::enable_if_t<!check, statecov_t > predictTo(const ros::Time &to_stamp)
    Estimates the system state and covariance matrix at the specified time.
    Definition: repredictor.h:67
    +
    typename Model::R_t R_t
    Measurement noise covariance matrix type .
    Definition: repredictor.h:48
    +
    std::enable_if_t< check > addInputChange(const u_t &u, [[maybe_unused]] const ros::Time &stamp, const ModelPtr &model=nullptr)
    Adds one system input to the history buffer, removing the oldest element in the buffer if it is full.
    Definition: repredictor.h:220
    +
    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)
    Adds one measurement to the history buffer, removing the oldest element in the buffer if it is full.
    Definition: repredictor.h:296
    +
    Defines various general utility functions.
    +
    typename Model::statecov_t statecov_t
    Helper struct for passing around the state and its covariance in one variable.
    Definition: repredictor.h:50
    +
    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)
    Adds one measurement to the history buffer, removing the oldest element in the buffer if it is full.
    Definition: repredictor.h:322
    +
    typename Model::Q_t Q_t
    Process noise covariance matrix type .
    Definition: repredictor.h:49
    +
    typename std::shared_ptr< Model > ModelPtr
    Shorthand type for a shared pointer-to-Model.
    Definition: repredictor.h:51
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    +
    Implementation of the Repredictor for fusing measurements with variable delays.
    Definition: repredictor.h:39
    +
    std::enable_if_t< check > addInputChangeWithNoise(const u_t &u, const Q_t &Q, [[maybe_unused]] const ros::Time &stamp, const ModelPtr &model=nullptr)
    Adds one system input to the history buffer, removing the oldest element in the buffer if it is full.
    Definition: repredictor.h:167
    +
    std::enable_if_t<!check > addProcessNoiseChange(const Q_t &Q, const ros::Time &stamp, const ModelPtr &model=nullptr)
    Adds one system input to the history buffer, removing the oldest element in the buffer if it is full.
    Definition: repredictor.h:243
    +
    typename Model::z_t z_t
    Measurement vector type .
    Definition: repredictor.h:46
    +
    std::enable_if_t<!check > addInputChange(const u_t &u, const ros::Time &stamp, const ModelPtr &model=nullptr)
    Adds one system input to the history buffer, removing the oldest element in the buffer if it is full.
    Definition: repredictor.h:191
    +
    typename Model::x_t x_t
    State vector type .
    Definition: repredictor.h:44
    +
    std::enable_if_t<!check > addInputChangeWithNoise(const u_t &u, const Q_t &Q, const ros::Time &stamp, const ModelPtr &model=nullptr)
    Adds one system input to the history buffer, removing the oldest element in the buffer if it is full.
    Definition: repredictor.h:141
    +
    std::enable_if_t< check, statecov_t > predictTo(const ros::Time &to_stamp)
    Estimates the system state and covariance matrix at the specified time.
    Definition: repredictor.h:117
    +
    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)
    The main constructor.
    Definition: repredictor.h:355
    +
    typename Model::u_t u_t
    Input vector type .
    Definition: repredictor.h:45
    + + + + diff --git a/repredictor__aloamgarm_8h_source.html b/repredictor__aloamgarm_8h_source.html new file mode 100644 index 00000000..a8de91d9 --- /dev/null +++ b/repredictor__aloamgarm_8h_source.html @@ -0,0 +1,163 @@ + + + + + + + +mrs_lib: include/mrs_lib/repredictor_aloamgarm.h Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    repredictor_aloamgarm.h
    +
    +
    +
    1 #ifndef REPREDICTOR_ALOAMGARM_H
    +
    2 #define REPREDICTOR_ALOAMGARM_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 #include <mrs_lib/repredictor.h>
    +
    11 
    +
    12 namespace mrs_lib
    +
    13 {
    +
    38 template <class Model>
    +
    39 class RepredictorAloamgarm : public Repredictor<Model> {
    +
    40 public:
    +
    41  /* states, inputs etc. definitions (typedefs, constants etc) //{ */
    +
    42 
    +
    43  using x_t = typename Model::x_t;
    +
    44  using u_t = typename Model::u_t;
    +
    45  using z_t = typename Model::z_t;
    +
    46  using P_t = typename Model::P_t;
    +
    47  using R_t = typename Model::R_t;
    +
    48  using Q_t = typename Model::Q_t;
    +
    49  using statecov_t = typename Model::statecov_t;
    +
    50  using ModelPtr = typename std::shared_ptr<Model>;
    +
    51  using history_t = typename Repredictor<Model>::history_t;
    +
    52 
    +
    53  //}
    +
    54 
    +
    55 public:
    +
    56  /* constructor //{ */
    +
    57 
    +
    72  RepredictorAloamgarm(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,
    +
    73  const std::shared_ptr<boost::circular_buffer<double>>& nis_buffer) {
    +
    74  Repredictor<Model>::m_sc = {x0, P0, nis_buffer};
    + +
    76  Repredictor<Model>::m_history = history_t(hist_len);
    +
    77  assert(hist_len > 0);
    + +
    79  };
    +
    80  //}
    +
    81 };
    +
    82 } // namespace mrs_lib
    +
    83 
    +
    84 
    +
    85 #endif // REPREDICTOR_ALOAMGARM_H
    +
    +
    +
    typename Model::z_t z_t
    Measurement vector type .
    Definition: repredictor_aloamgarm.h:45
    +
    Defines various general utility functions.
    +
    typename Model::P_t P_t
    State uncertainty covariance matrix type .
    Definition: repredictor_aloamgarm.h:46
    +
    typename Model::Q_t Q_t
    Process noise covariance matrix type .
    Definition: repredictor_aloamgarm.h:48
    +
    typename Model::x_t x_t
    State vector type .
    Definition: repredictor_aloamgarm.h:43
    +
    typename std::shared_ptr< Model > ModelPtr
    Shorthand type for a shared pointer-to-Model.
    Definition: repredictor_aloamgarm.h:50
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    +
    typename Model::u_t u_t
    Input vector type .
    Definition: repredictor_aloamgarm.h:44
    +
    typename Model::R_t R_t
    Measurement noise covariance matrix type .
    Definition: repredictor_aloamgarm.h:47
    +
    Implementation of the Repredictor for fusing measurements with variable delays.
    Definition: repredictor.h:39
    +
    typename Model::statecov_t statecov_t
    Helper struct for passing around the state and its covariance in one variable.
    Definition: repredictor_aloamgarm.h:49
    +
    RepredictorAloamgarm(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, const std::shared_ptr< boost::circular_buffer< double >> &nis_buffer)
    Variation of the constructor for kalman filter using nis_buffer (ALOAMGARM)
    Definition: repredictor_aloamgarm.h:72
    +
    Implementation of the RepredictorAloamgarm for fusing measurements with variable delays.
    Definition: repredictor_aloamgarm.h:39
    +
    std::enable_if_t<!check > addInputChangeWithNoise(const u_t &u, const Q_t &Q, const ros::Time &stamp, const ModelPtr &model=nullptr)
    Adds one system input to the history buffer, removing the oldest element in the buffer if it is full.
    Definition: repredictor.h:141
    + + + + diff --git a/resize.js b/resize.js new file mode 100644 index 00000000..a0bb5f45 --- /dev/null +++ b/resize.js @@ -0,0 +1,137 @@ +/* + @licstart The following is the entire license notice for the + JavaScript code in this file. + + Copyright (C) 1997-2017 by Dimitri van Heesch + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + @licend The above is the entire license notice + for the JavaScript code in this file + */ +function initResizable() +{ + var cookie_namespace = 'doxygen'; + var sidenav,navtree,content,header,collapsed,collapsedWidth=0,barWidth=6,desktop_vp=768,titleHeight; + + function readCookie(cookie) + { + var myCookie = cookie_namespace+"_"+cookie+"="; + if (document.cookie) { + var index = document.cookie.indexOf(myCookie); + if (index != -1) { + var valStart = index + myCookie.length; + var valEnd = document.cookie.indexOf(";", valStart); + if (valEnd == -1) { + valEnd = document.cookie.length; + } + var val = document.cookie.substring(valStart, valEnd); + return val; + } + } + return 0; + } + + function writeCookie(cookie, val, expiration) + { + if (val==undefined) return; + if (expiration == null) { + var date = new Date(); + date.setTime(date.getTime()+(10*365*24*60*60*1000)); // default expiration is one week + expiration = date.toGMTString(); + } + document.cookie = cookie_namespace + "_" + cookie + "=" + val + "; expires=" + expiration+"; path=/"; + } + + function resizeWidth() + { + var windowWidth = $(window).width() + "px"; + var sidenavWidth = $(sidenav).outerWidth(); + content.css({marginLeft:parseInt(sidenavWidth)+"px"}); + writeCookie('width',sidenavWidth-barWidth, null); + } + + function restoreWidth(navWidth) + { + var windowWidth = $(window).width() + "px"; + content.css({marginLeft:parseInt(navWidth)+barWidth+"px"}); + sidenav.css({width:navWidth + "px"}); + } + + function resizeHeight() + { + var headerHeight = header.outerHeight(); + var footerHeight = footer.outerHeight(); + var windowHeight = $(window).height() - headerHeight - footerHeight; + content.css({height:windowHeight + "px"}); + navtree.css({height:windowHeight + "px"}); + sidenav.css({height:windowHeight + "px"}); + var width=$(window).width(); + if (width!=collapsedWidth) { + if (width=desktop_vp) { + if (!collapsed) { + collapseExpand(); + } + } else if (width>desktop_vp && collapsedWidth0) { + restoreWidth(0); + collapsed=true; + } + else { + var width = readCookie('width'); + if (width>200 && width<$(window).width()) { restoreWidth(width); } else { restoreWidth(200); } + collapsed=false; + } + } + + header = $("#top"); + sidenav = $("#side-nav"); + content = $("#doc-content"); + navtree = $("#nav-tree"); + footer = $("#nav-path"); + $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(); } }); + $(sidenav).resizable({ minWidth: 0 }); + $(window).resize(function() { resizeHeight(); }); + var device = navigator.userAgent.toLowerCase(); + var touch_device = device.match(/(iphone|ipod|ipad|android)/); + if (touch_device) { /* wider split bar for touch only devices */ + $(sidenav).css({ paddingRight:'20px' }); + $('.ui-resizable-e').css({ width:'20px' }); + $('#nav-sync').css({ right:'34px' }); + barWidth=20; + } + var width = readCookie('width'); + if (width) { restoreWidth(width); } else { resizeWidth(); } + resizeHeight(); + var url = location.href; + var i=url.indexOf("#"); + if (i>=0) window.location.hash=url.substr(i); + var _preventDefault = function(evt) { evt.preventDefault(); }; + $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault); + $(".ui-resizable-handle").dblclick(collapseExpand); + $(window).on('load',resizeHeight); +} +/* @license-end */ diff --git a/rheiv_2example_8cpp-example.html b/rheiv_2example_8cpp-example.html new file mode 100644 index 00000000..3f392dca --- /dev/null +++ b/rheiv_2example_8cpp-example.html @@ -0,0 +1,176 @@ + + + + + + + +mrs_lib: rheiv/example.cpp + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    rheiv/example.cpp
    +
    +
    +

    This example may be run after building mrs_lib by executing rosrun mrs_lib rheiv_example.

    +

    A plane surface model in the cartesian form $ a x + b y + c z + d = 0 $ will be used in this example. The parameters $ a $, $ b $, $ c $ and $ d $ are elements of the parameter vector $ \mathbf{ \theta } $.

    +
    // clang: MatousFormat
    +
    // Include the LKF header
    +
    #include <mrs_lib/rheiv.h>
    +
    #include <ros/ros.h>
    +
    +
    // Define the LKF we will be using
    +
    namespace mrs_lib
    +
    {
    +
    const int n_states = 3;
    +
    const int n_params = 4;
    +
    +
    using rheiv_t = RHEIV<n_states, n_params>;
    +
    using theta_t = rheiv_t::theta_t;
    +
    using xs_t = rheiv_t::xs_t;
    +
    using zs_t = rheiv_t::zs_t;
    +
    using P_t = rheiv_t::P_t;
    +
    using Ps_t = rheiv_t::Ps_t;
    +
    using f_z_t = rheiv_t::f_z_t;
    +
    using dzdx_t = rheiv_t::dzdx_t;
    +
    }
    +
    +
    /* For the plane surface model, there is no need to transform the data. */
    +
    mrs_lib::zs_t f_z(const mrs_lib::xs_t& xs)
    +
    {
    +
    return xs;
    +
    }
    +
    +
    int main()
    +
    {
    +
    /* For the plane surface model, the Jacobian is just an identitiy matrix. */
    +
    const mrs_lib::dzdx_t dzdx = mrs_lib::dzdx_t::Identity();
    +
    +
    const int n_pts = 4;
    +
    mrs_lib::xs_t xs(3, n_pts);
    +
    xs <<
    +
    0, 1, 0, 10,
    +
    0, 0, 1, 0,
    +
    0, 0, 0, 0.001; // if you change the last value to 0, the iterative optimization will fail because the matrices M and N will be degenerate
    +
    const mrs_lib::P_t P = mrs_lib::P_t::Identity();
    +
    mrs_lib::Ps_t Ps;
    +
    Ps.reserve(n_pts);
    +
    for (int it = 0; it < n_pts; it++)
    +
    Ps.push_back(P);
    +
    +
    std::cout << "initializing object:" << std::endl;
    +
    mrs_lib::rheiv_t rheiv(f_z, dzdx, 1e-15, 10, std::chrono::milliseconds(1), 1);
    +
    std::cout << "running fit" << std::endl;
    +
    mrs_lib::theta_t theta;
    +
    try
    +
    {
    +
    theta = rheiv.fit(xs, Ps);
    +
    } catch (const mrs_lib::eigenvector_exception& ex)
    +
    {
    +
    std::cerr << "Iteration failed with message '" << ex.what() << "'." << std::endl;
    +
    std::cout << "using last valid theta" << std::endl;
    +
    theta = rheiv.get_last_estimate();
    +
    }
    +
    std::cout << "finished:" << std::endl << theta << std::endl;
    +
    }
    +
    +
    +
    +
    +
    Eigen::Matrix< double, l, 1 > theta_t
    Parameter vector type .
    Definition: rheiv.h:85
    +
    Implementation of the Reduced Heteroscedastic Errors In Variables surface fitting algorithm .
    Definition: rheiv.h:61
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    +
    Defines RHEIV and related stuff for surface fitting to points with known covariances according to .
    +
    typename std::function< zs_t(const xs_t &)> f_z_t
    Function signature of the mapping function.
    Definition: rheiv.h:79
    +
    std::vector< P_t > Ps_t
    Container type for covariances P of the input data array.
    Definition: rheiv.h:75
    +
    Eigen::Matrix< double, k, -1 > xs_t
    Container type for the input data array.
    Definition: rheiv.h:72
    +
    This exception may be thrown when solving the generalized eigenvalue problem with the M and N matrice...
    Definition: rheiv.h:24
    +
    Eigen::Matrix< double, lr, -1 > zs_t
    Container type for an array of the reduced transformed input vectors z.
    Definition: rheiv.h:78
    +
    Eigen::Matrix< double, k, k > P_t
    Covariance type of the input vector .
    Definition: rheiv.h:74
    +
    Eigen::Matrix< double, lr, k > dzdx_t
    Type of the jacobian matrix , evaluated at .
    Definition: rheiv.h:81
    +
    virtual const char * what() const override
    Returns the error message, describing what caused the exception.
    Definition: rheiv.h:31
    + + + + diff --git a/rheiv_2example_8cpp.html b/rheiv_2example_8cpp.html new file mode 100644 index 00000000..fe1822e7 --- /dev/null +++ b/rheiv_2example_8cpp.html @@ -0,0 +1,182 @@ + + + + + + + +mrs_lib: src/rheiv/example.cpp File Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    example.cpp File Reference
    +
    +
    + +

    Example file for the RHEIV implementation. +More...

    +
    #include <mrs_lib/rheiv.h>
    +#include <ros/ros.h>
    +
    + + Include dependency graph for example.cpp:
    +
    +
    + +
    + + + + +

    +Namespaces

     mrs_lib
     All mrs_lib functions, classes, variables and definitions are contained in this namespace.
     
    + + + + + + + + + + + + + + + + + +

    +Typedefs

    +using mrs_lib::rheiv_t = RHEIV< n_states, n_params >
     
    +using mrs_lib::theta_t = rheiv_t::theta_t
     
    +using mrs_lib::xs_t = rheiv_t::xs_t
     
    +using mrs_lib::zs_t = rheiv_t::zs_t
     
    +using mrs_lib::P_t = rheiv_t::P_t
     
    +using mrs_lib::Ps_t = rheiv_t::Ps_t
     
    +using mrs_lib::f_z_t = rheiv_t::f_z_t
     
    +using mrs_lib::dzdx_t = rheiv_t::dzdx_t
     
    + + + + + +

    +Functions

    +mrs_lib::zs_t f_z (const mrs_lib::xs_t &xs)
     
    +int main ()
     
    + + + +

    +Variables

    +const int mrs_lib::n_params = 4
     
    +

    Detailed Description

    +

    Example file for the RHEIV implementation.

    +
    Author
    Matouš Vrba - vrbam.nosp@m.ato@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz
    +

    This example may be run after building mrs_lib by executing rosrun mrs_lib rheiv_example.

    +

    A plane surface model in the cartesian form $ a x + b y + c z + d = 0 $ will be used in this example. The parameters $ a $, $ b $, $ c $ and $ d $ are elements of the parameter vector $ \mathbf{ \theta } $.

    +

    See rheiv/example.cpp.

    +
    +
    + + + + diff --git a/rheiv_2example_8cpp.js b/rheiv_2example_8cpp.js new file mode 100644 index 00000000..a0f12cd8 --- /dev/null +++ b/rheiv_2example_8cpp.js @@ -0,0 +1,14 @@ +var rheiv_2example_8cpp = +[ + [ "dzdx_t", "rheiv_2example_8cpp.html#a8922b52f8f99215122ae7610ab60fe99", null ], + [ "f_z_t", "rheiv_2example_8cpp.html#a99123d75b954055da17288a3f152d5fd", null ], + [ "P_t", "rheiv_2example_8cpp.html#a0770e4f020cae2e9ea332f603930b4b6", null ], + [ "Ps_t", "rheiv_2example_8cpp.html#a2dc8de6a6eec8b198afd92671e718a9d", null ], + [ "rheiv_t", "rheiv_2example_8cpp.html#ace8d39fa64a12d6a40409a110b66ca6d", null ], + [ "theta_t", "rheiv_2example_8cpp.html#acf21897841d7909efa4ec90cdd39b7fb", null ], + [ "xs_t", "rheiv_2example_8cpp.html#aedf522c12d38b1cd713cd24ca392db63", null ], + [ "zs_t", "rheiv_2example_8cpp.html#a601d4688003dea73e427cbd62f557032", null ], + [ "f_z", "rheiv_2example_8cpp.html#a4f53dcb724487fac3fcbe75a01cd0cf4", null ], + [ "main", "rheiv_2example_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4", null ], + [ "n_params", "rheiv_2example_8cpp.html#a509abd0a0bce319690b77d83cee06ea1", null ] +]; \ No newline at end of file diff --git a/rheiv_2example_8cpp__incl.map b/rheiv_2example_8cpp__incl.map new file mode 100644 index 00000000..497e9d0f --- /dev/null +++ b/rheiv_2example_8cpp__incl.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/rheiv_2example_8cpp__incl.md5 b/rheiv_2example_8cpp__incl.md5 new file mode 100644 index 00000000..68aae108 --- /dev/null +++ b/rheiv_2example_8cpp__incl.md5 @@ -0,0 +1 @@ +006589a71d2d3804df3a030f99da0caa \ No newline at end of file diff --git a/rheiv_2example_8cpp__incl.png b/rheiv_2example_8cpp__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..19d588c3c186784432a9a37bd380fe7e5c3a7b56 GIT binary patch literal 11620 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 MR#m1-$}ISQ0a(_8$p8QV literal 0 HcmV?d00001 diff --git a/rheiv_8h.html b/rheiv_8h.html new file mode 100644 index 00000000..5ff9a901 --- /dev/null +++ b/rheiv_8h.html @@ -0,0 +1,156 @@ + + + + + + + +mrs_lib: include/mrs_lib/rheiv.h File Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    rheiv.h File Reference
    +
    +
    + +

    Defines RHEIV and related stuff for surface fitting to points with known covariances according to [2]. +More...

    +
    #include <Eigen/Dense>
    +#include <iostream>
    +#include <chrono>
    +
    + + Include dependency graph for rheiv.h:
    +
    +
    + +
    + + This graph shows which files directly or indirectly include this file:
    +
    +
    + +
    +

    Go to the source code of this file.

    + + + + + + + + +

    +Classes

    struct  mrs_lib::eigenvector_exception
     This exception may be thrown when solving the generalized eigenvalue problem with the M and N matrices. More...
     
    class  mrs_lib::RHEIV< n_states, n_params >
     Implementation of the Reduced Heteroscedastic Errors In Variables surface fitting algorithm [2]. More...
     
    + + + + +

    +Namespaces

     mrs_lib
     All mrs_lib functions, classes, variables and definitions are contained in this namespace.
     
    +

    Detailed Description

    +

    Defines RHEIV and related stuff for surface fitting to points with known covariances according to [2].

    +
    Author
    Matouš Vrba - vrbam.nosp@m.ato@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz
    +
    +
    + + + + diff --git a/rheiv_8h__dep__incl.map b/rheiv_8h__dep__incl.map new file mode 100644 index 00000000..339990c4 --- /dev/null +++ b/rheiv_8h__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/rheiv_8h__dep__incl.md5 b/rheiv_8h__dep__incl.md5 new file mode 100644 index 00000000..4b26d672 --- /dev/null +++ b/rheiv_8h__dep__incl.md5 @@ -0,0 +1 @@ +ce93a9dfa5d735b586ac12b4194e6304 \ No newline at end of file diff --git a/rheiv_8h__dep__incl.png b/rheiv_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..cd96baba25a8bbaff576a85533781373e3fd02f4 GIT binary patch literal 3971 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 a>wwdsC5K^Ut2+-=)sUW+A*w>tF5+Ku2a + + + + + diff --git a/rheiv_8h__incl.md5 b/rheiv_8h__incl.md5 new file mode 100644 index 00000000..f453c58c --- /dev/null +++ b/rheiv_8h__incl.md5 @@ -0,0 +1 @@ +f57ecd40766812a4880b3864b40ba7ec \ No newline at end of file diff --git a/rheiv_8h__incl.png b/rheiv_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..245b4a103e91abad9848efb663036e063f226ce3 GIT binary patch literal 7414 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 T28#d(nGl$grecM>RnY$d7WPW@ literal 0 HcmV?d00001 diff --git a/rheiv_8h_source.html b/rheiv_8h_source.html new file mode 100644 index 00000000..7f244473 --- /dev/null +++ b/rheiv_8h_source.html @@ -0,0 +1,574 @@ + + + + + + + +mrs_lib: include/mrs_lib/rheiv.h Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    rheiv.h
    +
    +
    +Go to the documentation of this file.
    1 // clang: MatousFormat
    +
    7 #ifndef HEIV_H
    +
    8 #define HEIV_H
    +
    9 
    +
    10 #include <Eigen/Dense>
    +
    11 #include <iostream>
    +
    12 #include <chrono>
    +
    13 
    +
    14 namespace mrs_lib
    +
    15 {
    +
    16  /* eigenvector_exception //{ */
    +
    17 
    +
    24  struct eigenvector_exception : public std::exception
    +
    25  {
    +
    31  virtual const char* what() const throw() override
    +
    32  {
    +
    33  return "Could not compute matrix eigenvectors.";
    +
    34  }
    +
    35  };
    +
    36 
    +
    37  //}
    +
    38 
    +
    39  /* class RHEIV //{ */
    +
    60  template <int n_states, int n_params>
    +
    61  class RHEIV
    +
    62  {
    +
    63  static_assert(n_states <= n_params, "Sorry, n_states must be smaller or equal to n_params");
    +
    64  public:
    +
    65  /* RHEIV definitions (typedefs, constants etc) //{ */
    +
    66 
    +
    67  static const int k = n_states;
    +
    68  static const int l = n_params;
    +
    69  static const int lr = l - 1;
    +
    71  using x_t = Eigen::Matrix<double, k, 1>;
    +
    72  using xs_t = Eigen::Matrix<double, k, -1>;
    +
    73  using u_t = Eigen::Matrix<double, l, 1>;
    +
    74  using P_t = Eigen::Matrix<double, k, k>;
    +
    75  using Ps_t = std::vector<P_t>;
    +
    77  using z_t = Eigen::Matrix<double, lr, 1>;
    +
    78  using zs_t = Eigen::Matrix<double, lr, -1>;
    +
    79  using f_z_t = typename std::function<zs_t(const xs_t&)>;
    +
    81  using dzdx_t = Eigen::Matrix<double, lr, k>;
    +
    82  using dzdxs_t = std::vector<dzdx_t>;
    +
    83  using f_dzdx_t = typename std::function<dzdx_t(const xs_t&)>;
    +
    85  using theta_t = Eigen::Matrix<double, l, 1>;
    +
    86  using eta_t = z_t;
    +
    88  private:
    +
    89  using A_t = Eigen::Matrix<double, lr, lr>;
    +
    90  using B_t = A_t;
    +
    91  using Bs_t = std::vector<B_t>;
    +
    92  using M_t = A_t;
    +
    93  using N_t = A_t;
    +
    94  using betas_t = Eigen::Matrix<double, 1, -1>;
    +
    95  using ms_t = std::chrono::milliseconds;
    +
    96 
    +
    97  //}
    +
    98 
    +
    99  public:
    +
    100  /* constructor //{ */
    + +
    108  :
    +
    109  m_initialized(false),
    +
    110  m_f_z(),
    +
    111  m_f_dzdx(),
    +
    112  m_min_dtheta(),
    +
    113  m_max_its(),
    +
    114  m_timeout(),
    +
    115  m_debug_nth_it(),
    +
    116  m_ALS_theta_set(false),
    +
    117  m_last_theta_set(false)
    +
    118  {};
    +
    119 
    +
    135  RHEIV(const f_z_t& f_z, const f_dzdx_t& f_dzdx, const double min_dtheta = 1e-15, const unsigned max_its = 100)
    +
    136  :
    +
    137  m_initialized(true),
    +
    138  m_f_z(f_z),
    +
    139  m_f_dzdx(f_dzdx),
    +
    140  m_min_dtheta(min_dtheta),
    +
    141  m_max_its(max_its),
    +
    142  m_timeout(ms_t::zero()),
    +
    143  m_debug_nth_it(-1),
    +
    144  m_ALS_theta_set(false),
    +
    145  m_last_theta_set(false)
    +
    146  {};
    +
    147 
    +
    165  template <typename time_t>
    +
    166  RHEIV(const f_z_t& f_z, const f_dzdx_t& f_dzdx, const double min_dtheta = 1e-15, const unsigned max_its = 100, const time_t& timeout = std::chrono::duration_cast<time_t>(ms_t::zero()), const int debug_nth_it = -1)
    +
    167  :
    +
    168  m_initialized(true),
    +
    169  m_f_z(f_z),
    +
    170  m_f_dzdx(f_dzdx),
    +
    171  m_min_dtheta(min_dtheta),
    +
    172  m_max_its(max_its),
    +
    173  m_timeout(std::chrono::duration_cast<ms_t>(timeout)),
    +
    174  m_debug_nth_it(debug_nth_it),
    +
    175  m_ALS_theta_set(false),
    +
    176  m_last_theta_set(false)
    +
    177  {}
    +
    178 
    +
    189  RHEIV(const f_z_t& f_z, const dzdx_t& dzdx, const double min_dtheta = 1e-15, const unsigned max_its = 100)
    +
    190  :
    +
    191  m_initialized(true),
    +
    192  m_f_z(f_z),
    +
    193  // define a helper function which just returns the constant dzdx
    +
    194  m_f_dzdx(
    +
    195  {
    +
    196  [dzdx](const x_t&)
    +
    197  {
    +
    198  return dzdx;
    +
    199  }
    +
    200  }),
    +
    201  m_min_dtheta(min_dtheta),
    +
    202  m_max_its(max_its),
    +
    203  m_timeout(ms_t::zero()),
    +
    204  m_debug_nth_it(-1),
    +
    205  m_ALS_theta_set(false),
    +
    206  m_last_theta_set(false)
    +
    207  {};
    +
    208 
    +
    222  template <typename time_t>
    +
    223  RHEIV(const f_z_t& f_z, const dzdx_t& dzdx, const double min_dtheta = 1e-15, const unsigned max_its = 100, const time_t& timeout = std::chrono::duration_cast<time_t>(ms_t::zero()), const int debug_nth_it = -1)
    +
    224  :
    +
    225  m_initialized(true),
    +
    226  m_f_z(f_z),
    +
    227  // define a helper function which just returns the constant dzdx
    +
    228  m_f_dzdx(
    +
    229  {
    +
    230  [dzdx](const x_t&)
    +
    231  {
    +
    232  return dzdx;
    +
    233  }
    +
    234  }),
    +
    235  m_min_dtheta(min_dtheta),
    +
    236  m_max_its(max_its),
    +
    237  m_timeout(std::chrono::duration_cast<ms_t>(timeout)),
    +
    238  m_debug_nth_it(debug_nth_it),
    +
    239  m_ALS_theta_set(false),
    +
    240  m_last_theta_set(false)
    +
    241  {}
    +
    242  //}
    +
    243 
    +
    244  /* fit() method //{ */
    +
    258  theta_t fit(const xs_t& xs, const Ps_t& Ps)
    +
    259  {
    +
    260  assert(m_initialized);
    +
    261  assert((size_t)xs.cols() == Ps.size());
    +
    262  const std::chrono::system_clock::time_point fit_start = std::chrono::system_clock::now();
    +
    263 
    +
    264  const zs_t zs = m_f_z(xs);
    +
    265  const dzdxs_t dzdxs = precalculate_dxdzs(xs, m_f_dzdx);
    +
    266 
    +
    267  // Find initial conditions through ALS
    +
    268  m_ALS_theta = fit_ALS_impl(zs);
    +
    269  m_last_theta = m_ALS_theta;
    +
    270  m_ALS_theta_set = m_last_theta_set = true;
    +
    271  eta_t eta = m_ALS_theta.template block<lr, 1>(0, 0);
    +
    272 
    +
    273  for (unsigned it = 0; it < m_max_its; it++)
    +
    274  {
    +
    275  const std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
    +
    276  const auto fit_dur = now - fit_start;
    +
    277  if (m_timeout > ms_t::zero() && fit_dur > m_timeout)
    +
    278  {
    +
    279  if (m_debug_nth_it > 0)
    +
    280  std::cerr << "[RHEIV]: Ending at iteration " << it << " (max " << m_max_its << ") - timed out." << std::endl;
    +
    281  break;
    +
    282  }
    +
    283  const theta_t prev_theta = m_last_theta;
    +
    284  const auto [M, N, zc] = calc_MN(eta, zs, Ps, dzdxs);
    +
    285  eta = calc_min_eigvec(M, N);
    +
    286  m_last_theta = calc_theta(eta, zc);
    +
    287  const double dtheta = calc_dtheta(prev_theta, m_last_theta);
    +
    288  if (m_debug_nth_it > 0 && it % m_debug_nth_it == 0)
    +
    289  std::cout << "[RHEIV]: iteration " << it << " (max " << m_max_its << "), dtheta: " << dtheta << " (min " << m_min_dtheta << ") " << std::endl;
    +
    290  if (dtheta < m_min_dtheta)
    +
    291  break;
    +
    292  }
    +
    293  return m_last_theta;
    +
    294  }
    +
    295 
    +
    312  template <class T_it1,
    +
    313  class T_it2>
    +
    314  theta_t fit(const T_it1& xs_begin, const T_it1& xs_end, const T_it2& Ps_begin, const T_it2& Ps_end)
    +
    315  {
    +
    316  const xs_t xs = cont_to_eigen(xs_begin, xs_end);
    +
    317  const Ps_t Ps = cont_to_vector(Ps_begin, Ps_end);
    +
    318  const theta_t ret = fit(xs, Ps);
    +
    319  return ret;
    +
    320  }
    +
    321  //}
    +
    322 
    +
    323  /* fit_ALS() method //{ */
    +
    335  theta_t fit_ALS(const xs_t& xs)
    +
    336  {
    +
    337  assert(m_initialized);
    +
    338 
    +
    339  const zs_t zs = m_f_z(xs);
    +
    340  m_ALS_theta = fit_ALS_impl(zs);
    +
    341  m_ALS_theta_set = true;
    +
    342  return m_ALS_theta;
    +
    343  }
    +
    344  //}
    +
    345 
    +
    346  /* get_last_estimate() method //{ */
    + +
    359  {
    +
    360  assert(m_last_theta_set);
    +
    361  return m_last_theta;
    +
    362  }
    +
    363  //}
    +
    364 
    +
    365  /* get_ALS_estimate() method //{ */
    + +
    378  {
    +
    379  assert(m_ALS_theta_set);
    +
    380  return m_ALS_theta;
    +
    381  }
    +
    382  //}
    +
    383 
    +
    384  private:
    +
    385  bool m_initialized;
    +
    386 
    +
    387  private:
    +
    388  f_z_t m_f_z;
    +
    389  f_dzdx_t m_f_dzdx;
    +
    390  double m_min_dtheta;
    +
    391  unsigned m_max_its;
    +
    392  ms_t m_timeout;
    +
    393  int m_debug_nth_it;
    +
    394 
    +
    395  private:
    +
    396  bool m_ALS_theta_set;
    +
    397  theta_t m_ALS_theta;
    +
    398  bool m_last_theta_set;
    +
    399  theta_t m_last_theta;
    +
    400 
    +
    401  private:
    +
    402  /* calc_MN() method //{ */
    +
    403  std::tuple<M_t, N_t, z_t> calc_MN(const eta_t& eta, const zs_t& zs, const Ps_t& Ps, const dzdxs_t& dzdxs) const
    +
    404  {
    +
    405  const int n = zs.cols();
    +
    406 
    +
    407  const Bs_t Bs = calc_Bs(Ps, dzdxs);
    +
    408  const betas_t betas = calc_betas(eta, Bs);
    +
    409  const auto [zrs, zc] = reduce_zs(zs, betas);
    +
    410 
    +
    411  M_t M = M_t::Zero();
    +
    412  N_t N = N_t::Zero();
    +
    413  for (int it = 0; it < n; it++)
    +
    414  {
    +
    415  const double beta = betas(it);
    +
    416  const z_t& zr = zrs.col(it);
    +
    417  const B_t& B = Bs.at(it);
    +
    418  const A_t A = calc_A(zr);
    +
    419  M += A*beta;
    +
    420  N += (eta.transpose()*A*eta)*B*(beta*beta);
    +
    421  }
    +
    422  return {M, N, zc};
    +
    423  }
    +
    424  //}
    +
    425 
    +
    426  /* calc_Bs() method //{ */
    +
    427  Bs_t calc_Bs(const Ps_t& Ps, const dzdxs_t& dzdxs) const
    +
    428  {
    +
    429  const int n = Ps.size();
    +
    430  Bs_t Bs;
    +
    431  Bs.reserve(n);
    +
    432  for (int it = 0; it < n; it++)
    +
    433  {
    +
    434  const P_t& P = Ps.at(it);
    +
    435  const dzdx_t& dzdx = dzdxs.at(it);
    +
    436  const B_t B = dzdx*P*dzdx.transpose();
    +
    437  Bs.push_back(B);
    +
    438  }
    +
    439  return Bs;
    +
    440  }
    +
    441  //}
    +
    442 
    +
    443  /* calc_betas() method //{ */
    +
    444  betas_t calc_betas(const eta_t& eta, const Bs_t& Bs) const
    +
    445  {
    +
    446  const int n = Bs.size();
    +
    447  betas_t betas(n);
    +
    448  for (int it = 0; it < n; it++)
    +
    449  {
    +
    450  const B_t& B = Bs.at(it);
    +
    451  const double beta = 1.0/(eta.transpose()*B*eta);
    +
    452  betas(it) = beta;
    +
    453  }
    +
    454  return betas;
    +
    455  }
    +
    456  //}
    +
    457 
    +
    458  /* calc_A() method //{ */
    +
    459  A_t calc_A(const z_t& z) const
    +
    460  {
    +
    461  return z*z.transpose();
    +
    462  }
    +
    463  //}
    +
    464 
    +
    465  /* calc_dtheta() method //{ */
    +
    466  double calc_dtheta(const theta_t& th1, const theta_t& th2) const
    +
    467  {
    +
    468  return std::min( (th1 - th2).norm(), (th1 + th2).norm() );
    +
    469  }
    +
    470  //}
    +
    471 
    +
    472  /* calc_theta() method //{ */
    +
    473  theta_t calc_theta(const eta_t& eta, const z_t& zc) const
    +
    474  {
    +
    475  const double alpha = -zc.transpose()*eta;
    +
    476  const theta_t theta( (theta_t() << eta, alpha).finished().normalized() );
    +
    477  return theta;
    +
    478  }
    +
    479  //}
    +
    480 
    +
    481  /* calc_min_eigvec() method //{ */
    +
    482  eta_t calc_min_eigvec(const M_t& M, const N_t& N) const
    +
    483  {
    +
    484  const Eigen::GeneralizedSelfAdjointEigenSolver<M_t> es(M, N);
    +
    485  if (es.info() != Eigen::Success)
    +
    486  throw eigenvector_exception();
    +
    487  // eigenvalues are sorted in increasing order when using the GeneralizedSelfAdjointEigenSolver as per Eigen documentation
    +
    488  const eta_t evec = es.eigenvectors().col(0).normalized(); // altough the Eigen documentation states that this vector should already be normalized, it isn't!!
    +
    489  return evec;
    +
    490  }
    +
    491  //}
    +
    492 
    +
    493  /* calc_min_eigvec() method //{ */
    +
    494  eta_t calc_min_eigvec(const M_t& M) const
    +
    495  {
    +
    496  const Eigen::SelfAdjointEigenSolver<M_t> es(M);
    +
    497  if (es.info() != Eigen::Success)
    +
    498  throw eigenvector_exception();
    +
    499  // eigenvalues are sorted in increasing order when using the SelfAdjointEigenSolver as per Eigen documentation
    +
    500  const eta_t evec = es.eigenvectors().col(0).normalized(); // altough the Eigen documentation states that this vector should already be normalized, it isn't!!
    +
    501  return evec;
    +
    502  }
    +
    503  //}
    +
    504 
    +
    505  /* precalculate_dxdzs() method //{ */
    +
    506  dzdxs_t precalculate_dxdzs(const xs_t& xs, const f_dzdx_t& f_dzdx)
    +
    507  {
    +
    508  const int n = xs.cols();
    +
    509  dzdxs_t ret;
    +
    510  ret.reserve(n);
    +
    511  for (int it = 0; it < n; it++)
    +
    512  {
    +
    513  const x_t& x = xs.col(it);
    +
    514  ret.push_back(f_dzdx(x));
    +
    515  }
    +
    516  return ret;
    +
    517  }
    +
    518  //}
    +
    519 
    +
    520  /* calc_centroid() method //{ */
    +
    521  z_t calc_centroid(const zs_t& zs, const betas_t& betas) const
    +
    522  {
    +
    523  const z_t zc = (zs.array().rowwise() * betas.array()).rowwise().sum()/betas.sum();
    +
    524  return zc;
    +
    525  }
    +
    526  //}
    +
    527 
    +
    528  /* reduce_zs() method //{ */
    +
    529  std::pair<zs_t, z_t> reduce_zs(const zs_t& zs, const betas_t& betas) const
    +
    530  {
    +
    531  const z_t zc = calc_centroid(zs, betas);
    +
    532  const zs_t zrs = zs.colwise() - zc;
    +
    533  return {zrs, zc};
    +
    534  }
    +
    535  //}
    +
    536 
    +
    537  /* cont_to_eigen() method //{ */
    +
    538  template <typename T_it>
    +
    539  xs_t cont_to_eigen(const T_it& begin, const T_it& end)
    +
    540  {
    +
    541  const auto n = end-begin;
    +
    542  xs_t ret(n_states, n);
    +
    543  size_t i = 0;
    +
    544  for (T_it it = begin; it != end; it++)
    +
    545  {
    +
    546  ret.template block<n_states, 1>(0, i) = *it;
    +
    547  i++;
    +
    548  }
    +
    549  return ret;
    +
    550  }
    +
    551  //}
    +
    552 
    +
    553  /* cont_to_vector() method //{ */
    +
    554  template <typename T_it>
    +
    555  Ps_t cont_to_vector(const T_it& begin, const T_it& end)
    +
    556  {
    +
    557  const auto n = end-begin;
    +
    558  Ps_t ret(n);
    +
    559  size_t i = 0;
    +
    560  for (T_it it = begin; it != end; it++)
    +
    561  {
    +
    562  ret.at(i) = *it;
    +
    563  i++;
    +
    564  }
    +
    565  return ret;
    +
    566  }
    +
    567  //}
    +
    568 
    +
    569 
    +
    570 // --------------------------------------------------------------
    +
    571 // | Algebraic Least Squares-related methods |
    +
    572 // --------------------------------------------------------------
    +
    573 
    +
    574  z_t calc_centroid(const zs_t& zs) const
    +
    575  {
    +
    576  return zs.rowwise().mean();
    +
    577  }
    +
    578 
    +
    579  std::pair<zs_t, z_t> reduce_zs(const zs_t& zs) const
    +
    580  {
    +
    581  const z_t zc = calc_centroid(zs);
    +
    582  const zs_t zrs = zs.colwise() - zc;
    +
    583  return {zrs, zc};
    +
    584  }
    +
    585 
    +
    586  theta_t fit_ALS_impl(const zs_t& zs) const
    +
    587  {
    +
    588  const auto [zrs, zc] = reduce_zs(zs);
    +
    589  M_t M = M_t::Zero();
    +
    590  for (int it = 0; it < zrs.cols(); it++)
    +
    591  {
    +
    592  const z_t& z = zrs.col(it);
    +
    593  const A_t A = calc_A(z);
    +
    594  M += A;
    +
    595  }
    +
    596  const eta_t eta = calc_min_eigvec(M);
    +
    597  const theta_t theta = calc_theta(eta, zc);
    +
    598  return theta;
    +
    599  }
    +
    600 
    +
    601  };
    +
    602  //}
    +
    603 
    +
    604 }
    +
    605 
    +
    606 #endif // HEIV_H
    +
    +
    +
    std::vector< dzdx_t > dzdxs_t
    Contained type for an array of the jacobian matrices.
    Definition: rheiv.h:82
    +
    typename std::function< dzdx_t(const xs_t &)> f_dzdx_t
    Function signature of the jacobian .
    Definition: rheiv.h:83
    +
    RHEIV(const f_z_t &f_z, const dzdx_t &dzdx, const double min_dtheta=1e-15, const unsigned max_its=100)
    A convenience constructor constructor.
    Definition: rheiv.h:189
    +
    Eigen::Matrix< double, l, 1 > theta_t
    Parameter vector type .
    Definition: rheiv.h:85
    +
    RHEIV(const f_z_t &f_z, const dzdx_t &dzdx, const double min_dtheta=1e-15, const unsigned max_its=100, const time_t &timeout=std::chrono::duration_cast< time_t >(ms_t::zero()), const int debug_nth_it=-1)
    A convenience constructor constructor.
    Definition: rheiv.h:223
    +
    static const int lr
    Length of the reduced parameter vector .
    Definition: rheiv.h:69
    +
    theta_t get_last_estimate() const
    Returns the last valid estimate of .
    Definition: rheiv.h:358
    +
    theta_t fit_ALS(const xs_t &xs)
    Fit the defined model to the provided data using Algebraic Least Squares (not RHEIV).
    Definition: rheiv.h:335
    +
    Eigen::Matrix< double, l, 1 > u_t
    Transformed input vector type .
    Definition: rheiv.h:73
    +
    Implementation of the Reduced Heteroscedastic Errors In Variables surface fitting algorithm .
    Definition: rheiv.h:61
    +
    RHEIV()
    Convenience default constructor.
    Definition: rheiv.h:107
    +
    theta_t fit(const xs_t &xs, const Ps_t &Ps)
    Fit the defined model to the provided data.
    Definition: rheiv.h:258
    +
    theta_t fit(const T_it1 &xs_begin, const T_it1 &xs_end, const T_it2 &Ps_begin, const T_it2 &Ps_end)
    Fit the defined model to the provided data.
    Definition: rheiv.h:314
    +
    static const int l
    Length of the parameter vector .
    Definition: rheiv.h:68
    +
    RHEIV(const f_z_t &f_z, const f_dzdx_t &f_dzdx, const double min_dtheta=1e-15, const unsigned max_its=100)
    The main constructor.
    Definition: rheiv.h:135
    +
    theta_t get_ALS_estimate() const
    Returns the Algebraic Least Squares estimate of .
    Definition: rheiv.h:377
    +
    static const int k
    Length of the state vector x.
    Definition: rheiv.h:67
    +
    Eigen::Matrix< double, k, 1 > x_t
    Input vector type .
    Definition: rheiv.h:71
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    +
    RHEIV(const f_z_t &f_z, const f_dzdx_t &f_dzdx, const double min_dtheta=1e-15, const unsigned max_its=100, const time_t &timeout=std::chrono::duration_cast< time_t >(ms_t::zero()), const int debug_nth_it=-1)
    The main constructor.
    Definition: rheiv.h:166
    +
    Eigen::Matrix< double, lr, 1 > z_t
    Type of a reduced transformed input vector .
    Definition: rheiv.h:77
    +
    typename std::function< zs_t(const xs_t &)> f_z_t
    Function signature of the mapping function.
    Definition: rheiv.h:79
    +
    z_t eta_t
    Reduced parameter vector type .
    Definition: rheiv.h:86
    +
    std::vector< P_t > Ps_t
    Container type for covariances P of the input data array.
    Definition: rheiv.h:75
    +
    Eigen::Matrix< double, k, -1 > xs_t
    Container type for the input data array.
    Definition: rheiv.h:72
    +
    This exception may be thrown when solving the generalized eigenvalue problem with the M and N matrice...
    Definition: rheiv.h:24
    +
    Eigen::Matrix< double, lr, -1 > zs_t
    Container type for an array of the reduced transformed input vectors z.
    Definition: rheiv.h:78
    +
    Eigen::Matrix< double, k, k > P_t
    Covariance type of the input vector .
    Definition: rheiv.h:74
    +
    Eigen::Matrix< double, lr, k > dzdx_t
    Type of the jacobian matrix , evaluated at .
    Definition: rheiv.h:81
    +
    virtual const char * what() const override
    Returns the error message, describing what caused the exception.
    Definition: rheiv.h:31
    + + + + diff --git a/safety__zone_8h_source.html b/safety__zone_8h_source.html new file mode 100644 index 00000000..895df241 --- /dev/null +++ b/safety__zone_8h_source.html @@ -0,0 +1,143 @@ + + + + + + + +mrs_lib: include/mrs_lib/safety_zone/safety_zone.h Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    safety_zone.h
    +
    +
    +
    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  const char* what() const throw() {
    +
    31  return "SafeZone: Wrong configuration for the border";
    +
    32  }
    +
    33  };
    +
    34 };
    +
    35 } // namespace mrs_lib
    +
    36 
    +
    37 #endif // MRS_LIB_SAFETYZONE_H
    +
    +
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    +
    Definition: safety_zone.h:28
    +
    Definition: polygon.h:13
    +
    Definition: safety_zone.h:12
    + + + + diff --git a/scope__timer_8h.html b/scope__timer_8h.html new file mode 100644 index 00000000..acf23c57 --- /dev/null +++ b/scope__timer_8h.html @@ -0,0 +1,153 @@ + + + + + + + +mrs_lib: include/mrs_lib/scope_timer.h File Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    scope_timer.h File Reference
    +
    +
    + +

    Simple timer which times a duration of its scope, with additional optional checkpoints. +More...

    +
    #include <ros/ros.h>
    +#include <chrono>
    +#include <iostream>
    +#include <fstream>
    +#include <iomanip>
    +#include <mutex>
    +
    + + Include dependency graph for scope_timer.h:
    +
    +
    + +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Classes

    class  mrs_lib::ScopeTimerLogger
     Simple file logger of scope timer and its checkpoints. More...
     
    class  mrs_lib::ScopeTimer
     Simple timer which will time a duration of a scope and checkpoints inside the scope in ros time and std::chrono time. More...
     
    struct  mrs_lib::ScopeTimer::time_point
     
    + + + + +

    +Namespaces

     mrs_lib
     All mrs_lib functions, classes, variables and definitions are contained in this namespace.
     
    +

    Detailed Description

    +

    Simple timer which times a duration of its scope, with additional optional checkpoints.

    +
    Author
    Daniel Hert - hertd.nosp@m.ani@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz
    +
    +
    + + + + diff --git a/scope__timer_8h__incl.map b/scope__timer_8h__incl.map new file mode 100644 index 00000000..b83fc858 --- /dev/null +++ b/scope__timer_8h__incl.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/scope__timer_8h__incl.md5 b/scope__timer_8h__incl.md5 new file mode 100644 index 00000000..a6f54c10 --- /dev/null +++ b/scope__timer_8h__incl.md5 @@ -0,0 +1 @@ +419d8e6fee60c2f74e5e0ced5d9a8fc2 \ No newline at end of file diff --git a/scope__timer_8h__incl.png b/scope__timer_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..17acc5ff2d81cf14b44fc603589b618fa88674d4 GIT binary patch literal 12742 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 Cila*a literal 0 HcmV?d00001 diff --git a/scope__timer_8h_source.html b/scope__timer_8h_source.html new file mode 100644 index 00000000..73b33efa --- /dev/null +++ b/scope__timer_8h_source.html @@ -0,0 +1,229 @@ + + + + + + + +mrs_lib: include/mrs_lib/scope_timer.h Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    scope_timer.h
    +
    +
    +Go to the documentation of this file.
    1 
    +
    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 
    + +
    25 
    +
    26 public:
    +
    30  ScopeTimerLogger(const std::string& logfile, const bool enable_logging = true, const int log_precision = 10);
    +
    31 
    + +
    36 
    +
    40  bool shouldLog() {
    +
    41  return _should_log_;
    +
    42  }
    +
    43 
    +
    48  bool loggingEnabled() {
    +
    49  return _logging_enabled_;
    +
    50  }
    +
    51 
    +
    55  std::string getLogFilepath() {
    +
    56  return _log_filepath_;
    +
    57  }
    +
    58 
    +
    59  using chrono_tp = std::chrono::time_point<std::chrono::steady_clock>;
    +
    60 
    +
    64  void log(const std::string& scope, const chrono_tp& time_start, const chrono_tp& time_end);
    +
    65 
    +
    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 
    +
    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  time_point(const std::string& label) : ros_time(ros::Time::now()), chrono_time(std::chrono::steady_clock::now()), label(label) {
    +
    93  }
    +
    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:
    +
    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 
    +
    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 
    +
    132  ScopeTimer(const std::string& label, const std::shared_ptr<ScopeTimerLogger> scope_timer_logger, const bool enable = true);
    +
    133 
    +
    137  void checkpoint(const std::string& label);
    +
    138 
    +
    144  float getLifetime();
    +
    145 
    +
    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
    +
    +
    +
    ScopeTimerLogger(const std::string &logfile, const bool enable_logging=true, const int log_precision=10)
    The basic constructor with a user-defined path to the logger file, enable flag and float-logging prec...
    Definition: scope_timer.cpp:9
    +
    float getLifetime()
    Getter for scope timer lifetime.
    Definition: scope_timer.cpp:126
    +
    std::string getLogFilepath()
    Returns the path to the log.
    Definition: scope_timer.h:55
    +
    Simple timer which will time a duration of a scope and checkpoints inside the scope in ros time and s...
    Definition: scope_timer.h:84
    +
    ~ScopeTimer()
    The basic destructor which prints out or logs the scope times, if enabled.
    Definition: scope_timer.cpp:135
    +
    Simple file logger of scope timer and its checkpoints.
    Definition: scope_timer.h:24
    +
    ScopeTimer(const std::string &label, const ros::Duration &throttle_period=ros::Duration(0), const bool enable=true, const std::shared_ptr< ScopeTimerLogger > scope_timer_logger=nullptr)
    The basic constructor with a user-defined label of the timer, throttled period and file logger.
    Definition: scope_timer.cpp:84
    +
    void checkpoint(const std::string &label)
    Checkpoint, prints the time passed until the point this function is called.
    Definition: scope_timer.cpp:115
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    +
    void log(const std::string &scope, const chrono_tp &time_start, const chrono_tp &time_end)
    Writes the time data of the given scope and empty checkpoints into the logger stream.
    Definition: scope_timer.cpp:55
    +
    bool shouldLog()
    Returns true if a non-empty path to a logger file was given by the user.
    Definition: scope_timer.h:40
    +
    ~ScopeTimerLogger()
    The basic destructor which closes the logging file.
    Definition: scope_timer.cpp:46
    +
    bool loggingEnabled()
    Returns true if the enable flag was set to true, a non-empty path to a logger file was given by the u...
    Definition: scope_timer.h:48
    +
    Definition: scope_timer.h:87
    + + + + diff --git a/search/all_0.html b/search/all_0.html new file mode 100644 index 00000000..26dd244f --- /dev/null +++ b/search/all_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_0.js b/search/all_0.js new file mode 100644 index 00000000..4aefee34 --- /dev/null +++ b/search/all_0.js @@ -0,0 +1,31 @@ +var searchData= +[ + ['a_0',['A',['../classmrs__lib_1_1LKF.html#a0926533d35a53410b4302fda99a45321',1,'mrs_lib::LKF::A()'],['../classmrs__lib_1_1geometry_1_1Triangle.html#abd847d705725f4dffa10e6e00ba5f24c',1,'mrs_lib::geometry::Triangle::a()'],['../classmrs__lib_1_1geometry_1_1Rectangle.html#a5370711517c0449167cfd0efaee8e821',1,'mrs_lib::geometry::Rectangle::a()'],['../classmrs__lib_1_1geometry_1_1Ellipse.html#aee622887a91b50f8fa8bbd476614006e',1,'mrs_lib::geometry::Ellipse::a()']]], + ['a_5ft_1',['A_t',['../classmrs__lib_1_1DKF.html#a1d615e5b5aef4c5a00de9b42eef43c1b',1,'mrs_lib::DKF::A_t()'],['../classmrs__lib_1_1JLKF.html#a72ceb375903022d0dfc396b6f1ead479',1,'mrs_lib::JLKF::A_t()'],['../classmrs__lib_1_1LKF.html#aa5c83985c5c7685ebe2af0e445fbc0ad',1,'mrs_lib::LKF::A_t()'],['../classmrs__lib_1_1NCLKF.html#aa7b38a32abe6a319930d6392178d5e3e',1,'mrs_lib::NCLKF::A_t()'],['../classmrs__lib_1_1NCLKF__partial.html#a6d62f542c4ee39019c9466e82ed0cd51',1,'mrs_lib::NCLKF_partial::A_t()']]], + ['add_2',['add',['../classmrs__lib_1_1MedianFilter.html#aaf3d8e3bab539001962f2b29dabd314d',1,'mrs_lib::MedianFilter']]], + ['addcheck_3',['addCheck',['../classmrs__lib_1_1MedianFilter.html#a234342f8780bce6019f5183f798fe348',1,'mrs_lib::MedianFilter']]], + ['addcone_4',['addCone',['../classmrs__lib_1_1BatchVisualizer.html#a937c831f9caac50bc84f671c3260f1a7',1,'mrs_lib::BatchVisualizer']]], + ['addcuboid_5',['addCuboid',['../classmrs__lib_1_1BatchVisualizer.html#ab5aba26d50dbe7fe22cd4c0549a99051',1,'mrs_lib::BatchVisualizer']]], + ['addcylinder_6',['addCylinder',['../classmrs__lib_1_1BatchVisualizer.html#abd2f9394a4cb63da0478ad1621ed7e79',1,'mrs_lib::BatchVisualizer']]], + ['addellipse_7',['addEllipse',['../classmrs__lib_1_1BatchVisualizer.html#ac03c515ed44761d88f43a2af446c26b7',1,'mrs_lib::BatchVisualizer']]], + ['addinputchange_8',['addInputChange',['../classmrs__lib_1_1Repredictor.html#a4db1b1896eb17c54bc906d0e9da1eee9',1,'mrs_lib::Repredictor::addInputChange(const u_t &u, const ros::Time &stamp, const ModelPtr &model=nullptr)'],['../classmrs__lib_1_1Repredictor.html#a2fa01fc3dbe7a557b80b6104466c8b7e',1,'mrs_lib::Repredictor::addInputChange(const u_t &u, [[maybe_unused]] const ros::Time &stamp, const ModelPtr &model=nullptr)']]], + ['addinputchangewithnoise_9',['addInputChangeWithNoise',['../classmrs__lib_1_1Repredictor.html#ac85faca4dca9e6f785078eac6819f10f',1,'mrs_lib::Repredictor::addInputChangeWithNoise(const u_t &u, const Q_t &Q, const ros::Time &stamp, const ModelPtr &model=nullptr)'],['../classmrs__lib_1_1Repredictor.html#a203a2fc80f2ab2d0caeb2b09e2c410a3',1,'mrs_lib::Repredictor::addInputChangeWithNoise(const u_t &u, const Q_t &Q, [[maybe_unused]] const ros::Time &stamp, const ModelPtr &model=nullptr)']]], + ['addmeasurement_10',['addMeasurement',['../classmrs__lib_1_1Repredictor.html#a5e1db8bec67cabd386b8924c5312f648',1,'mrs_lib::Repredictor::addMeasurement(const z_t &z, const R_t &R, const ros::Time &stamp, const ModelPtr &model=nullptr, const double &meas_id=-1)'],['../classmrs__lib_1_1Repredictor.html#a0aed856752f139230db775620b4b97da',1,'mrs_lib::Repredictor::addMeasurement(const z_t &z, const R_t &R, const ros::Time &stamp, const ModelPtr &model=nullptr, const double &meas_id=-1)']]], + ['addnullline_11',['addNullLine',['../classmrs__lib_1_1BatchVisualizer.html#a7f4d6d1ae967d6a5c15351969d9e4592',1,'mrs_lib::BatchVisualizer']]], + ['addnullpoint_12',['addNullPoint',['../classmrs__lib_1_1BatchVisualizer.html#a7556fd856cd4be7d0bdea9a4c0c6e1fc',1,'mrs_lib::BatchVisualizer']]], + ['addnulltriangle_13',['addNullTriangle',['../classmrs__lib_1_1BatchVisualizer.html#a6a844cdffd1474570988e8d1a87126cb',1,'mrs_lib::BatchVisualizer']]], + ['addpoint_14',['addPoint',['../classmrs__lib_1_1BatchVisualizer.html#ac9c76c18ef837dc7b87cf20f5e2511b9',1,'mrs_lib::BatchVisualizer']]], + ['addprocessnoisechange_15',['addProcessNoiseChange',['../classmrs__lib_1_1Repredictor.html#a1a409036d5c94ee2115b2e31465fd2c7',1,'mrs_lib::Repredictor::addProcessNoiseChange(const Q_t &Q, const ros::Time &stamp, const ModelPtr &model=nullptr)'],['../classmrs__lib_1_1Repredictor.html#ad07b1f478d926355157c46d93cde1b4b',1,'mrs_lib::Repredictor::addProcessNoiseChange(const Q_t &Q, [[maybe_unused]] const ros::Time &stamp, const ModelPtr &model=nullptr)']]], + ['addray_16',['addRay',['../classmrs__lib_1_1BatchVisualizer.html#ae3c2f932f592a0e61da8e51643cc686a',1,'mrs_lib::BatchVisualizer']]], + ['addrectangle_17',['addRectangle',['../classmrs__lib_1_1BatchVisualizer.html#a5a68c474ce18a4fccbc8f14066267d73',1,'mrs_lib::BatchVisualizer']]], + ['addtrajectory_18',['addTrajectory',['../classmrs__lib_1_1BatchVisualizer.html#a5dad7ddef02d959da350385544b98063',1,'mrs_lib::BatchVisualizer']]], + ['addtriangle_19',['addTriangle',['../classmrs__lib_1_1BatchVisualizer.html#ae2cf4d2a0578711a060f7f398179a677',1,'mrs_lib::BatchVisualizer']]], + ['addyamlfile_20',['addYamlFile',['../classmrs__lib_1_1ParamLoader.html#a7e0a9d3c3ca4e85692999f99b51e53e7',1,'mrs_lib::ParamLoader::addYamlFile()'],['../classmrs__lib_1_1ParamProvider.html#a137506901a03daeaaebcb5544de777f0',1,'mrs_lib::ParamProvider::addYamlFile()']]], + ['addyamlfilefromparam_21',['addYamlFileFromParam',['../classmrs__lib_1_1ParamLoader.html#a3ae6c294bc7bcf0fa17557ee36e04b31',1,'mrs_lib::ParamLoader']]], + ['angleaxisbetween_22',['angleaxisBetween',['../misc_8h.html#a3c40238e3620a619ddadf518321ccaae',1,'mrs_lib::geometry']]], + ['anglebetween_23',['angleBetween',['../misc_8h.html#a926f171b122a39c63ccb860666a7e254',1,'mrs_lib::geometry::angleBetween(const vec2_t &a, const vec2_t &b)'],['../misc_8h.html#a277dbfe7688635c28c5a1b34f32ed81e',1,'mrs_lib::geometry::angleBetween(const vec3_t &a, const vec3_t &b)']]], + ['atomicscopeflag_24',['AtomicScopeFlag',['../classmrs__lib_1_1AtomicScopeFlag.html',1,'mrs_lib::AtomicScopeFlag'],['../classmrs__lib_1_1AtomicScopeFlag.html#a168dc1d0a0ae38b254d89a84afdc4cab',1,'mrs_lib::AtomicScopeFlag::AtomicScopeFlag()']]], + ['attitude_5fconverter_2eh_25',['attitude_converter.h',['../attitude__converter_8h.html',1,'']]], + ['attitudeconverter_26',['AttitudeConverter',['../classmrs__lib_1_1AttitudeConverter.html',1,'mrs_lib::AttitudeConverter'],['../classmrs__lib_1_1AttitudeConverter.html#a1a98367c2a004a298a2026d883cfc0eb',1,'mrs_lib::AttitudeConverter::AttitudeConverter(const double &roll, const double &pitch, const double &yaw, const RPY_convention_t &format=RPY_EXTRINSIC)'],['../classmrs__lib_1_1AttitudeConverter.html#a134453cd539536eea199763467690483',1,'mrs_lib::AttitudeConverter::AttitudeConverter(const tf::Quaternion quaternion)'],['../classmrs__lib_1_1AttitudeConverter.html#a9f00a180ebe802b8b7e30e08cc688f26',1,'mrs_lib::AttitudeConverter::AttitudeConverter(const geometry_msgs::Quaternion quaternion)'],['../classmrs__lib_1_1AttitudeConverter.html#a28987247a78e426e03eb37d51c7b6d82',1,'mrs_lib::AttitudeConverter::AttitudeConverter(const mrs_lib::EulerAttitude &euler_attitude)'],['../classmrs__lib_1_1AttitudeConverter.html#a15e411e1c06cd3af16d10f660656718b',1,'mrs_lib::AttitudeConverter::AttitudeConverter(const Eigen::Quaterniond quaternion)'],['../classmrs__lib_1_1AttitudeConverter.html#ad50e60f2d412b2253221c00fbbff2ead',1,'mrs_lib::AttitudeConverter::AttitudeConverter(const Eigen::Matrix3d matrix)'],['../classmrs__lib_1_1AttitudeConverter.html#a0046963fb6f70e1ecc1d50c9778fec44',1,'mrs_lib::AttitudeConverter::AttitudeConverter(const Eigen::AngleAxis< T > angle_axis)'],['../classmrs__lib_1_1AttitudeConverter.html#a7d3224c3f9b32c2a9c65f63f5a2644ea',1,'mrs_lib::AttitudeConverter::AttitudeConverter(const tf2::Quaternion quaternion)'],['../classmrs__lib_1_1AttitudeConverter.html#a24d9d274eb16af01c3630ecb32065652',1,'mrs_lib::AttitudeConverter::AttitudeConverter(const tf2::Matrix3x3 matrix)']]], + ['autostart_27',['autostart',['../structmrs__lib_1_1SubscribeHandlerOptions.html#aab7865b63b3dd44b61dba06c54f981c8',1,'mrs_lib::SubscribeHandlerOptions']]] +]; diff --git a/search/all_1.html b/search/all_1.html new file mode 100644 index 00000000..8eb215b9 --- /dev/null +++ b/search/all_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_1.js b/search/all_1.js new file mode 100644 index 00000000..c8af0c4d --- /dev/null +++ b/search/all_1.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['b_28',['B',['../classmrs__lib_1_1LKF.html#a2d88249f1992d772631026387a45445a',1,'mrs_lib::LKF::B()'],['../classmrs__lib_1_1geometry_1_1Triangle.html#a6ac4e01a62fbb343d177bf47b3d38219',1,'mrs_lib::geometry::Triangle::b()'],['../classmrs__lib_1_1geometry_1_1Rectangle.html#a82cb0598bd97e772d5fdbeeb5fde3657',1,'mrs_lib::geometry::Rectangle::b()'],['../classmrs__lib_1_1geometry_1_1Ellipse.html#ab42e4c580aeda44204c5854e1ccd4513',1,'mrs_lib::geometry::Ellipse::b()']]], + ['b_5ft_29',['B_t',['../classmrs__lib_1_1DKF.html#a5de2bdb0aa87e268361e19206849bb22',1,'mrs_lib::DKF::B_t()'],['../classmrs__lib_1_1JLKF.html#ac8971eebc826cd62aadd45d4b64d216c',1,'mrs_lib::JLKF::B_t()'],['../classmrs__lib_1_1LKF.html#a5ca7805e401bd7b718b510269a6ce7bf',1,'mrs_lib::LKF::B_t()'],['../classmrs__lib_1_1NCLKF.html#af283625e8caefbccb8ca64072dab91a8',1,'mrs_lib::NCLKF::B_t()'],['../classmrs__lib_1_1NCLKF__partial.html#a749bb8222899e2b056e27875c0f951f6',1,'mrs_lib::NCLKF_partial::B_t()']]], + ['base_5fclass_30',['Base_class',['../classmrs__lib_1_1DKF.html#ad7e6756be6a89592151d092f20d19811',1,'mrs_lib::DKF::Base_class()'],['../classmrs__lib_1_1LKF.html#ae54a2cc807bafeee1777ffdbd37e3c02',1,'mrs_lib::LKF::Base_class()'],['../classmrs__lib_1_1NCLKF.html#aa670be9fba29c7d8d8c7c849d9d844d1',1,'mrs_lib::NCLKF::Base_class()'],['../classmrs__lib_1_1NCLKF__partial.html#a13dac50b4906535f6ff5837b1057597f',1,'mrs_lib::NCLKF_partial::Base_class()'],['../classmrs__lib_1_1UKF.html#ae5a0eb2f31131ed4cec117d4a1000080',1,'mrs_lib::UKF::Base_class()']]], + ['batch_5fvisualizer_2eh_31',['batch_visualizer.h',['../batch__visualizer_8h.html',1,'']]], + ['batchvisualizer_32',['BatchVisualizer',['../classmrs__lib_1_1BatchVisualizer.html',1,'mrs_lib::BatchVisualizer'],['../classmrs__lib_1_1BatchVisualizer.html#a2a426c62b02dec6430362920db0d6c80',1,'mrs_lib::BatchVisualizer::BatchVisualizer()'],['../classmrs__lib_1_1BatchVisualizer.html#a3a857713e5516bec553b5380eaa423f8',1,'mrs_lib::BatchVisualizer::BatchVisualizer(ros::NodeHandle &nh, std::string marker_topic_name, std::string parent_frame)']]], + ['bequiet_33',['beQuiet',['../classmrs__lib_1_1Transformer.html#ab1e3fff472e6c6320a41d6f6ca331ca0',1,'mrs_lib::Transformer']]], + ['bordererror_34',['BorderError',['../structmrs__lib_1_1SafetyZone_1_1BorderError.html',1,'mrs_lib::SafetyZone']]], + ['bibliography_35',['Bibliography',['../citelist.html',1,'']]] +]; diff --git a/search/all_10.html b/search/all_10.html new file mode 100644 index 00000000..6fd3a4aa --- /dev/null +++ b/search/all_10.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_10.js b/search/all_10.js new file mode 100644 index 00000000..3f865fbd --- /dev/null +++ b/search/all_10.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['q_5ft_255',['Q_t',['../classmrs__lib_1_1DKF.html#a59afcc2127ecd2a9dba8a53ca505f97a',1,'mrs_lib::DKF::Q_t()'],['../classmrs__lib_1_1KalmanFilter.html#ab2c5ddabe3fc919334595ec1e535c848',1,'mrs_lib::KalmanFilter::Q_t()'],['../classmrs__lib_1_1KalmanFilterAloamGarm.html#ab9efcd795fc6c47ef94c20f9ff9547dc',1,'mrs_lib::KalmanFilterAloamGarm::Q_t()'],['../classmrs__lib_1_1LKF.html#a5df2fd299b9da75a872e8d9194da1ca9',1,'mrs_lib::LKF::Q_t()'],['../classmrs__lib_1_1NCLKF.html#aab7df7efe1e8e70d0e79ad374c6674a0',1,'mrs_lib::NCLKF::Q_t()'],['../classmrs__lib_1_1NCLKF__partial.html#a2ba0fce7ba12825a0c498f7676848fce',1,'mrs_lib::NCLKF_partial::Q_t()'],['../classmrs__lib_1_1Repredictor.html#af0b9dfd5f21b220e87c79298b061f63d',1,'mrs_lib::Repredictor::Q_t()'],['../classmrs__lib_1_1RepredictorAloamgarm.html#aa031cc536ee7a46c3e79287c65fc1fa7',1,'mrs_lib::RepredictorAloamgarm::Q_t()'],['../classmrs__lib_1_1UKF.html#abd8f845f1b3f138949bd95c7dc12e011',1,'mrs_lib::UKF::Q_t()']]], + ['quaternionbetween_256',['quaternionBetween',['../misc_8h.html#afc7674301c81fd347f26a2bc0bb96979',1,'mrs_lib::geometry']]], + ['quaternionfromeuler_257',['quaternionFromEuler',['../misc_8h.html#acbd2f281f58752d98b9482f3a9697363',1,'mrs_lib::geometry::quaternionFromEuler(double x, double y, double z)'],['../misc_8h.html#a105c80e76bac24eb3e2a16bed6609a80',1,'mrs_lib::geometry::quaternionFromEuler(const Eigen::Vector3d &euler)']]], + ['quaternionfromheading_258',['quaternionFromHeading',['../misc_8h.html#aac041627690bc6f377e60b99344b8b3a',1,'mrs_lib::geometry']]], + ['queue_5fsize_259',['queue_size',['../structmrs__lib_1_1SubscribeHandlerOptions.html#a5abe6590d88b396d94cce7a7ae652e09',1,'mrs_lib::SubscribeHandlerOptions']]] +]; diff --git a/search/all_11.html b/search/all_11.html new file mode 100644 index 00000000..f78343b9 --- /dev/null +++ b/search/all_11.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_11.js b/search/all_11.js new file mode 100644 index 00000000..8d750aef --- /dev/null +++ b/search/all_11.js @@ -0,0 +1,23 @@ +var searchData= +[ + ['r_260',['r',['../classmrs__lib_1_1geometry_1_1Cylinder.html#aa442455784da2246f8bc25aa0eccadbb',1,'mrs_lib::geometry::Cylinder']]], + ['r_5ft_261',['R_t',['../classmrs__lib_1_1DKF.html#a6c1a5e6a6cdcb52271774b566957f948',1,'mrs_lib::DKF::R_t()'],['../classmrs__lib_1_1KalmanFilter.html#a1e4c8aa79cfcea707876d85950132450',1,'mrs_lib::KalmanFilter::R_t()'],['../classmrs__lib_1_1KalmanFilterAloamGarm.html#ab6bf1e91bfeb633b08038f54b2b5d0fa',1,'mrs_lib::KalmanFilterAloamGarm::R_t()'],['../classmrs__lib_1_1LKF.html#a5d2cb5ed042b660f1a44bdb9f4d2612f',1,'mrs_lib::LKF::R_t()'],['../classmrs__lib_1_1NCLKF.html#a4b6b964e9491ca80fdfc1afacc9b23fc',1,'mrs_lib::NCLKF::R_t()'],['../classmrs__lib_1_1NCLKF__partial.html#a7754b24176416b24869450c88a1328aa',1,'mrs_lib::NCLKF_partial::R_t()'],['../classmrs__lib_1_1Repredictor.html#aac7c07ba0237230fa7346932fb542ae9',1,'mrs_lib::Repredictor::R_t()'],['../classmrs__lib_1_1RepredictorAloamgarm.html#afa36b8b183f868a84dc182e4ac562d44',1,'mrs_lib::RepredictorAloamgarm::R_t()'],['../classmrs__lib_1_1UKF.html#a0af0d9a246df0798b1cb1308cec82fd2',1,'mrs_lib::UKF::R_t()']]], + ['radians_262',['radians',['../structmrs__lib_1_1geometry_1_1radians.html',1,'mrs_lib::geometry']]], + ['range_263',['range',['../structmrs__lib_1_1geometry_1_1cyclic.html#a406dfc057fd17b5935add5a7bf9fe325',1,'mrs_lib::geometry::cyclic']]], + ['ray_264',['Ray',['../classmrs__lib_1_1geometry_1_1Ray.html',1,'mrs_lib::geometry::Ray'],['../classmrs__lib_1_1geometry_1_1Ray.html#aa0bff9427d14806607b5689f1d71604d',1,'mrs_lib::geometry::Ray::Ray()'],['../classmrs__lib_1_1geometry_1_1Ray.html#ab7466369083c82552f805fb20a16a8aa',1,'mrs_lib::geometry::Ray::Ray(Eigen::Vector3d p1, Eigen::Vector3d p2)']]], + ['rectangle_265',['Rectangle',['../classmrs__lib_1_1geometry_1_1Rectangle.html',1,'mrs_lib::geometry::Rectangle'],['../classmrs__lib_1_1geometry_1_1Rectangle.html#af119a484beb0dbae7dd0a9a2d5f5123d',1,'mrs_lib::geometry::Rectangle::Rectangle()'],['../classmrs__lib_1_1geometry_1_1Rectangle.html#a3b85d8ba9c03a1b2962eda68293da077',1,'mrs_lib::geometry::Rectangle::Rectangle(std::vector< Eigen::Vector3d > points)'],['../classmrs__lib_1_1geometry_1_1Rectangle.html#a707a6df742b90d626e5321a4324d75fd',1,'mrs_lib::geometry::Rectangle::Rectangle(Eigen::Vector3d a, Eigen::Vector3d b, Eigen::Vector3d c, Eigen::Vector3d d)']]], + ['remove_5fconst_266',['remove_const',['../namespacemrs__lib.html#a006d8eb9265ad5e8b2f908df6deb55b5',1,'mrs_lib']]], + ['repredictor_267',['Repredictor',['../classmrs__lib_1_1Repredictor.html',1,'mrs_lib::Repredictor< Model, disable_reprediction >'],['../classmrs__lib_1_1Repredictor.html#a035888099138efba982bda818c5fe390',1,'mrs_lib::Repredictor::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)'],['../classmrs__lib_1_1Repredictor.html#a0245871abc8208f13b4b33a7c2ece708',1,'mrs_lib::Repredictor::Repredictor()'],['../classmrs__lib_1_1Repredictor.html#a6ffbce95c9194f159c203378845851d0',1,'mrs_lib::Repredictor::Repredictor(const x_t &x0, const P_t &P0, const Q_t &Q0, const ros::Time &t0, const ModelPtr &model, const unsigned hist_len)']]], + ['repredictor_3c_20model_20_3e_268',['Repredictor< Model >',['../classmrs__lib_1_1Repredictor.html',1,'mrs_lib']]], + ['repredictoraloamgarm_269',['RepredictorAloamgarm',['../classmrs__lib_1_1RepredictorAloamgarm.html',1,'mrs_lib::RepredictorAloamgarm< Model >'],['../classmrs__lib_1_1RepredictorAloamgarm.html#a1e1d3245d8f2fd98c9f80d4795061395',1,'mrs_lib::RepredictorAloamgarm::RepredictorAloamgarm()']]], + ['resolveframe_270',['resolveFrame',['../classmrs__lib_1_1Transformer.html#aa4cf06770b355a01c66f227363a4967f',1,'mrs_lib::Transformer']]], + ['retrylookupnewest_271',['retryLookupNewest',['../classmrs__lib_1_1Transformer.html#abef2a59ed83e09ab103c060abb31dbb1',1,'mrs_lib::Transformer']]], + ['rheiv_272',['RHEIV',['../classmrs__lib_1_1RHEIV.html',1,'mrs_lib::RHEIV< n_states, n_params >'],['../classmrs__lib_1_1RHEIV.html#a057ffc158ceb64e933d3ae73e96bb033',1,'mrs_lib::RHEIV::RHEIV()'],['../classmrs__lib_1_1RHEIV.html#a4712a3306cdd759a73d2124b23bb388b',1,'mrs_lib::RHEIV::RHEIV(const f_z_t &f_z, const f_dzdx_t &f_dzdx, const double min_dtheta=1e-15, const unsigned max_its=100)'],['../classmrs__lib_1_1RHEIV.html#a8c8f7b9c1b3ea4daafc08e1a29941558',1,'mrs_lib::RHEIV::RHEIV(const f_z_t &f_z, const f_dzdx_t &f_dzdx, const double min_dtheta=1e-15, const unsigned max_its=100, const time_t &timeout=std::chrono::duration_cast< time_t >(ms_t::zero()), const int debug_nth_it=-1)'],['../classmrs__lib_1_1RHEIV.html#a66a840487d929607a3385e90b3c35ec5',1,'mrs_lib::RHEIV::RHEIV(const f_z_t &f_z, const dzdx_t &dzdx, const double min_dtheta=1e-15, const unsigned max_its=100)'],['../classmrs__lib_1_1RHEIV.html#a9c0c437bea8612516cb37d9503b6a852',1,'mrs_lib::RHEIV::RHEIV(const f_z_t &f_z, const dzdx_t &dzdx, const double min_dtheta=1e-15, const unsigned max_its=100, const time_t &timeout=std::chrono::duration_cast< time_t >(ms_t::zero()), const int debug_nth_it=-1)']]], + ['rheiv_2eh_273',['rheiv.h',['../rheiv_8h.html',1,'']]], + ['roll_274',['roll',['../classmrs__lib_1_1EulerAttitude.html#a7d62c8be0341555c3e03e124a617d765',1,'mrs_lib::EulerAttitude']]], + ['rostimer_275',['ROSTimer',['../classmrs__lib_1_1ROSTimer.html',1,'mrs_lib::ROSTimer'],['../classmrs__lib_1_1ROSTimer.html#aaf683893d28eca7f91e4b2333cf4eed5',1,'mrs_lib::ROSTimer::ROSTimer(const ros::NodeHandle &nh, const ros::Rate &rate, void(ObjectType::*const callback)(const ros::TimerEvent &), ObjectType *const obj, const bool oneshot=false, const bool autostart=true)'],['../classmrs__lib_1_1ROSTimer.html#ad4913fe0402a8be9b131ad5afb9d7d05',1,'mrs_lib::ROSTimer::ROSTimer(const ros::NodeHandle &nh, const ros::Duration &duration, void(ObjectType::*const callback)(const ros::TimerEvent &), ObjectType *const obj, const bool oneshot=false, const bool autostart=true)']]], + ['rotatecovariance_276',['rotateCovariance',['../misc_8h.html#acfda874d1843fd8c03fb309b5024818f',1,'mrs_lib::geometry']]], + ['rotationbetween_277',['rotationBetween',['../misc_8h.html#a59d7c7ddea21a014b2c831a0fc65fbb1',1,'mrs_lib::geometry']]], + ['routine_278',['Routine',['../classmrs__lib_1_1Routine.html',1,'mrs_lib']]], + ['running_279',['running',['../classmrs__lib_1_1MRSTimer.html#a54461ff4541da2848c3263e646ff928a',1,'mrs_lib::MRSTimer::running()'],['../classmrs__lib_1_1ROSTimer.html#af5074139258db68cf314b1bf4868243a',1,'mrs_lib::ROSTimer::running()'],['../classmrs__lib_1_1ThreadTimer.html#ab3ecdba649fd5c849acd94ce9ad0c824',1,'mrs_lib::ThreadTimer::running()']]] +]; diff --git a/search/all_12.html b/search/all_12.html new file mode 100644 index 00000000..dd9ff1d5 --- /dev/null +++ b/search/all_12.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_12.js b/search/all_12.js new file mode 100644 index 00000000..b02d9c58 --- /dev/null +++ b/search/all_12.js @@ -0,0 +1,51 @@ +var searchData= +[ + ['safetyzone_280',['SafetyZone',['../classmrs__lib_1_1SafetyZone.html',1,'mrs_lib']]], + ['scope_5ftimer_2eh_281',['scope_timer.h',['../scope__timer_8h.html',1,'']]], + ['scopetimer_282',['ScopeTimer',['../classmrs__lib_1_1ScopeTimer.html',1,'mrs_lib::ScopeTimer'],['../classmrs__lib_1_1ScopeTimer.html#aebac3a7bad2d63f49d5777e08b504661',1,'mrs_lib::ScopeTimer::ScopeTimer(const std::string &label, const ros::Duration &throttle_period=ros::Duration(0), const bool enable=true, const std::shared_ptr< ScopeTimerLogger > scope_timer_logger=nullptr)'],['../classmrs__lib_1_1ScopeTimer.html#a8943aec6fbe491633b7f698eb3f0d131',1,'mrs_lib::ScopeTimer::ScopeTimer(const std::string &label, const time_point &tp0, const ros::Duration &throttle_period=ros::Duration(0), const bool enable=true, const std::shared_ptr< ScopeTimerLogger > scope_timer_logger=nullptr)'],['../classmrs__lib_1_1ScopeTimer.html#abdaf77484c74055916b8e491c8ffe318',1,'mrs_lib::ScopeTimer::ScopeTimer(const std::string &label, const std::shared_ptr< ScopeTimerLogger > scope_timer_logger, const bool enable=true)']]], + ['scopetimerlogger_283',['ScopeTimerLogger',['../classmrs__lib_1_1ScopeTimerLogger.html',1,'mrs_lib::ScopeTimerLogger'],['../classmrs__lib_1_1ScopeTimerLogger.html#a5369b8ec91eab0a06b87485bed5c130c',1,'mrs_lib::ScopeTimerLogger::ScopeTimerLogger()']]], + ['sdegrees_284',['sdegrees',['../structmrs__lib_1_1geometry_1_1sdegrees.html',1,'mrs_lib::geometry']]], + ['sendtransform_285',['sendTransform',['../classmrs__lib_1_1TransformBroadcaster.html#a93913661cb31baeedb7d4e1f72142b93',1,'mrs_lib::TransformBroadcaster::sendTransform(const geometry_msgs::TransformStamped &transform)'],['../classmrs__lib_1_1TransformBroadcaster.html#a2adf5bd449b5561323fb7d8633e04bf5',1,'mrs_lib::TransformBroadcaster::sendTransform(const std::vector< geometry_msgs::TransformStamped > &transforms)']]], + ['service_5fclient_5fhandler_2eh_286',['service_client_handler.h',['../service__client__handler_8h.html',1,'']]], + ['serviceclienthandler_287',['ServiceClientHandler',['../classmrs__lib_1_1ServiceClientHandler.html',1,'mrs_lib::ServiceClientHandler< ServiceType >'],['../classmrs__lib_1_1ServiceClientHandler.html#a7d0e35cfbbe280ab0d739c23a26189de',1,'mrs_lib::ServiceClientHandler::ServiceClientHandler(void)'],['../classmrs__lib_1_1ServiceClientHandler.html#acf286dd2720d41fa05e98c7327d94413',1,'mrs_lib::ServiceClientHandler::ServiceClientHandler(const ServiceClientHandler &other)'],['../classmrs__lib_1_1ServiceClientHandler.html#a6da5592ce8388bd1aa08b63fd3d3d060',1,'mrs_lib::ServiceClientHandler::ServiceClientHandler(ros::NodeHandle &nh, const std::string &address)']]], + ['serviceclienthandler_5fimpl_288',['ServiceClientHandler_impl',['../classmrs__lib_1_1ServiceClientHandler__impl.html',1,'mrs_lib::ServiceClientHandler_impl< ServiceType >'],['../classmrs__lib_1_1ServiceClientHandler__impl.html#ae1f6eb48630bf4d3eb9e92b95c6269c8',1,'mrs_lib::ServiceClientHandler_impl::ServiceClientHandler_impl(void)'],['../classmrs__lib_1_1ServiceClientHandler__impl.html#a4ae10aba33d5d46013bf25a61c005ac0',1,'mrs_lib::ServiceClientHandler_impl::ServiceClientHandler_impl(ros::NodeHandle &nh, const std::string &address)']]], + ['set_5fmutexed_289',['set_mutexed',['../namespacemrs__lib.html#afae3eb66a47b80bd8bae3b4a0c6a9368',1,'mrs_lib::set_mutexed(std::mutex &mut, const T what, T &where)'],['../namespacemrs__lib.html#aa09cacb136795c2831ed0499518a2b17',1,'mrs_lib::set_mutexed(std::mutex &mut, Args &... args)'],['../namespacemrs__lib.html#a953c3bb11623623e1daef402272e6833',1,'mrs_lib::set_mutexed(std::mutex &mut, const std::tuple< Args... > from, std::tuple< Args &... > to)']]], + ['set_5fmutexed_5fimpl_290',['set_mutexed_impl',['../namespacemrs__lib.html#acc32702fff28a4a1515a586a94f51e79',1,'mrs_lib::set_mutexed_impl(const T what, T &where)'],['../namespacemrs__lib.html#ad43e8bfd91df3dae404738c355b136e9',1,'mrs_lib::set_mutexed_impl(const T what, T &where, Args... args)']]], + ['setbufferlength_291',['setBufferLength',['../classmrs__lib_1_1MedianFilter.html#af2888fa7449ce3ebc82f3255a519fe6a',1,'mrs_lib::MedianFilter']]], + ['setconstants_292',['setConstants',['../classmrs__lib_1_1UKF.html#a646b7755aaa478bb86d89e1923d5ed2a',1,'mrs_lib::UKF']]], + ['setdefaultframe_293',['setDefaultFrame',['../classmrs__lib_1_1Transformer.html#a16a54cd35b1f071a80197cbccccfe9c0',1,'mrs_lib::Transformer']]], + ['setdefaultprefix_294',['setDefaultPrefix',['../classmrs__lib_1_1Transformer.html#a5d6f4288d53f09474c92bda26d0c9f55',1,'mrs_lib::Transformer']]], + ['setheading_295',['setHeading',['../classmrs__lib_1_1AttitudeConverter.html#ac818b4e515d614d5d473be95b5ee9024',1,'mrs_lib::AttitudeConverter']]], + ['setheadingexception_296',['SetHeadingException',['../structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException.html',1,'mrs_lib::AttitudeConverter']]], + ['setlatlon_297',['setLatLon',['../classmrs__lib_1_1Transformer.html#a54764308675cc6df1782954870e1f3c2',1,'mrs_lib::Transformer']]], + ['setlinesscale_298',['setLinesScale',['../classmrs__lib_1_1BatchVisualizer.html#af36566a7f7267a2cdb167a533e4cb856',1,'mrs_lib::BatchVisualizer']]], + ['setlookuptimeout_299',['setLookupTimeout',['../classmrs__lib_1_1Transformer.html#ac073019d60f1d9c6d48a0c207bafb678',1,'mrs_lib::Transformer']]], + ['setmaxdifference_300',['setMaxDifference',['../classmrs__lib_1_1MedianFilter.html#a82d854470b0920fac623472721b01601',1,'mrs_lib::MedianFilter']]], + ['setmaxvalue_301',['setMaxValue',['../classmrs__lib_1_1MedianFilter.html#a8162e19bd901f6dcd542d4c8615732f9',1,'mrs_lib::MedianFilter']]], + ['setminvalue_302',['setMinValue',['../classmrs__lib_1_1MedianFilter.html#a569e93d2d4be9632db2943fedb8133ba',1,'mrs_lib::MedianFilter']]], + ['setobservationmodel_303',['setObservationModel',['../classmrs__lib_1_1UKF.html#a272c7435d05b9a8867df4bd131f01177',1,'mrs_lib::UKF']]], + ['setparentframe_304',['setParentFrame',['../classmrs__lib_1_1BatchVisualizer.html#a284c94fdfec8f359704d92f9ef79cd74',1,'mrs_lib::BatchVisualizer']]], + ['setperiod_305',['setPeriod',['../classmrs__lib_1_1MRSTimer.html#acf818ea5cffe17b89ed00866ca7cbeff',1,'mrs_lib::MRSTimer::setPeriod()'],['../classmrs__lib_1_1ROSTimer.html#a7dd4d03428c7abe2de8ea260a9a4eeff',1,'mrs_lib::ROSTimer::setPeriod()'],['../classmrs__lib_1_1ThreadTimer.html#a038246468811544860d5d2d1c4091e2d',1,'mrs_lib::ThreadTimer::setPeriod()']]], + ['setpointsscale_306',['setPointsScale',['../classmrs__lib_1_1BatchVisualizer.html#ac613c22b8ed79cd169636e6aafacf2dc',1,'mrs_lib::BatchVisualizer']]], + ['setprefix_307',['setPrefix',['../classmrs__lib_1_1ParamLoader.html#a8ad978834d5d6d1745a96f1ecc65a759',1,'mrs_lib::ParamLoader']]], + ['settransitionmodel_308',['setTransitionModel',['../classmrs__lib_1_1UKF.html#a724d2e508dd45e4e6cb7b08b023cae34',1,'mrs_lib::UKF']]], + ['setyaw_309',['setYaw',['../classmrs__lib_1_1AttitudeConverter.html#a945e6c80d148df27897391bfd69c0505',1,'mrs_lib::AttitudeConverter']]], + ['shapes_2eh_310',['shapes.h',['../shapes_8h.html',1,'']]], + ['shouldlog_311',['shouldLog',['../classmrs__lib_1_1ScopeTimerLogger.html#a8bb5c6453336967529f118a717f20825',1,'mrs_lib::ScopeTimerLogger']]], + ['simple_5fexample_2ecpp_312',['simple_example.cpp',['../simple__example_8cpp.html',1,'']]], + ['solidangle_313',['solidAngle',['../misc_8h.html#a3f9294141cc559ae94b4c026ac47d05a',1,'mrs_lib::geometry']]], + ['solidanglerelativeto_314',['solidAngleRelativeTo',['../classmrs__lib_1_1geometry_1_1Rectangle.html#a803dbb3eb6f8a24146bd4c01877769ce',1,'mrs_lib::geometry::Rectangle']]], + ['sphericaltrianglearea_315',['sphericalTriangleArea',['../misc_8h.html#a8605d3a799002897f1d260cc4be95682',1,'mrs_lib::geometry']]], + ['square_5froot_5fexception_316',['square_root_exception',['../structmrs__lib_1_1UKF_1_1square__root__exception.html',1,'mrs_lib::UKF']]], + ['sradians_317',['sradians',['../structmrs__lib_1_1geometry_1_1sradians.html',1,'mrs_lib::geometry']]], + ['stamp_318',['stamp',['../structmrs__lib_1_1KalmanFilter_1_1statecov__t.html#ab576efb895b5def90a7aab738c610f83',1,'mrs_lib::KalmanFilter::statecov_t']]], + ['start_319',['start',['../classmrs__lib_1_1SubscribeHandler.html#af8bc123e16de75e3b6c00724b817eaaf',1,'mrs_lib::SubscribeHandler::start()'],['../classmrs__lib_1_1MRSTimer.html#afda0c038cd360ccaa71b95227e413b44',1,'mrs_lib::MRSTimer::start()'],['../classmrs__lib_1_1ROSTimer.html#afd70b40e8e4b84b48215eeafc5e27520',1,'mrs_lib::ROSTimer::start()'],['../classmrs__lib_1_1ThreadTimer.html#a0425600320550d52408d1499ee3d7891',1,'mrs_lib::ThreadTimer::start()']]], + ['statecov_5ft_320',['statecov_t',['../structmrs__lib_1_1KalmanFilter_1_1statecov__t.html',1,'mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >::statecov_t'],['../structmrs__lib_1_1KalmanFilterAloamGarm_1_1statecov__t.html',1,'mrs_lib::KalmanFilterAloamGarm< n_states, n_inputs, n_measurements >::statecov_t'],['../classmrs__lib_1_1DKF.html#a1408b975fe2e4bd3fc5009c80d43f06b',1,'mrs_lib::DKF::statecov_t()'],['../classmrs__lib_1_1LKF.html#a54b2b4a3932510daad92da5a2b1274c1',1,'mrs_lib::LKF::statecov_t()'],['../classmrs__lib_1_1NCLKF.html#abac1b51597611226f2c0642230207e71',1,'mrs_lib::NCLKF::statecov_t()'],['../classmrs__lib_1_1NCLKF__partial.html#a2bc4e99acb7f38dc41d6e63cdce5e805',1,'mrs_lib::NCLKF_partial::statecov_t()'],['../classmrs__lib_1_1Repredictor.html#a794952d1627187223300848cd3e1bf66',1,'mrs_lib::Repredictor::statecov_t()'],['../classmrs__lib_1_1RepredictorAloamgarm.html#a4d5da8a5d296bf98bff6f99eaf550ae7',1,'mrs_lib::RepredictorAloamgarm::statecov_t()'],['../classmrs__lib_1_1UKF.html#a604c0bfee69ee5a34dc4412af3cc6e53',1,'mrs_lib::UKF::statecov_t()']]], + ['stop_321',['stop',['../classmrs__lib_1_1SubscribeHandler.html#a36a097cf480a16bf239885be6e35b5d0',1,'mrs_lib::SubscribeHandler::stop()'],['../classmrs__lib_1_1MRSTimer.html#aeda0660a5031f17bb57f55f4166e737e',1,'mrs_lib::MRSTimer::stop()'],['../classmrs__lib_1_1ROSTimer.html#a6a774123e3400848884fa83fe01e1955',1,'mrs_lib::ROSTimer::stop()'],['../classmrs__lib_1_1ThreadTimer.html#a26d89795a716aa2ae6d7f890626c0aaa',1,'mrs_lib::ThreadTimer::stop()']]], + ['subobject_322',['SubObject',['../classSubObject.html',1,'']]], + ['subscribe_5fhandler_2eh_323',['subscribe_handler.h',['../subscribe__handler_8h.html',1,'']]], + ['subscribedtopicname_324',['subscribedTopicName',['../classmrs__lib_1_1SubscribeHandler.html#a2ee619f8b6fe5ce56599752e63161b51',1,'mrs_lib::SubscribeHandler']]], + ['subscribehandler_325',['SubscribeHandler',['../classmrs__lib_1_1SubscribeHandler.html',1,'mrs_lib::SubscribeHandler< MessageType >'],['../classmrs__lib_1_1SubscribeHandler.html#a13159347fe9f13d778d7c02f2d1b1a98',1,'mrs_lib::SubscribeHandler::SubscribeHandler()'],['../classmrs__lib_1_1SubscribeHandler.html#aaceb7739b06d44d7fe619418d5cecd4e',1,'mrs_lib::SubscribeHandler::SubscribeHandler(const SubscribeHandlerOptions &options, const std::string &topic_name, Types ... args)'],['../classmrs__lib_1_1SubscribeHandler.html#a40f16a8553532b9685feb4b33f342602',1,'mrs_lib::SubscribeHandler::SubscribeHandler(const SubscribeHandlerOptions &options, const message_callback_t &message_callback={})'],['../classmrs__lib_1_1SubscribeHandler.html#aa625f9d69548da72d92f7e8a25b078e3',1,'mrs_lib::SubscribeHandler::SubscribeHandler(const SubscribeHandlerOptions &options, const timeout_callback_t &timeout_callback, Types ... args)'],['../classmrs__lib_1_1SubscribeHandler.html#ab24f400bfd36d733366d25b63ec8889d',1,'mrs_lib::SubscribeHandler::SubscribeHandler(const SubscribeHandlerOptions &options, void(ObjectType1::*const timeout_callback)(const std::string &topic_name, const ros::Time &last_msg), ObjectType1 *const obj1, Types ... args)'],['../classmrs__lib_1_1SubscribeHandler.html#a27ac792b1dfa8a62d087b565bec33925',1,'mrs_lib::SubscribeHandler::SubscribeHandler(const SubscribeHandlerOptions &options, void(ObjectType2::*const message_callback)(typename MessageType::ConstPtr), ObjectType2 *const obj2, Types ... args)'],['../classmrs__lib_1_1SubscribeHandler.html#a14c1c92e119c047a3c40724f1152b7b9',1,'mrs_lib::SubscribeHandler::SubscribeHandler(const SubscribeHandlerOptions &options, void(ObjectType2::*const message_callback)(typename MessageType::ConstPtr), ObjectType2 *const obj2, void(ObjectType1::*const timeout_callback)(const std::string &topic_name, const ros::Time &last_msg), ObjectType1 *const obj1, Types ... args)'],['../classmrs__lib_1_1SubscribeHandler.html#a367e7245e60ee2a87f680a27c0e1a8e5',1,'mrs_lib::SubscribeHandler::SubscribeHandler(const SubscribeHandlerOptions &options, const ros::Duration &no_message_timeout, Types ... args)'],['../classmrs__lib_1_1SubscribeHandler.html#ab3499b8b5910450df90c905d1811e4a3',1,'mrs_lib::SubscribeHandler::SubscribeHandler(const SubscribeHandlerOptions &options, mrs_lib::TimeoutManager &timeout_manager, Types ... args)']]], + ['subscribehandleroptions_326',['SubscribeHandlerOptions',['../structmrs__lib_1_1SubscribeHandlerOptions.html',1,'mrs_lib']]], + ['supremum_327',['supremum',['../structmrs__lib_1_1geometry_1_1cyclic.html#adf3f559f3099bf6002a8f1331df42142',1,'mrs_lib::geometry::cyclic']]] +]; diff --git a/search/all_13.html b/search/all_13.html new file mode 100644 index 00000000..2611a100 --- /dev/null +++ b/search/all_13.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_13.js b/search/all_13.js new file mode 100644 index 00000000..3caf0c34 --- /dev/null +++ b/search/all_13.js @@ -0,0 +1,31 @@ +var searchData= +[ + ['theta_328',['theta',['../classmrs__lib_1_1geometry_1_1Cone.html#a708721c0fde7cb53e7ba4e585a2d5743',1,'mrs_lib::geometry::Cone']]], + ['theta_5ft_329',['theta_t',['../classmrs__lib_1_1RHEIV.html#af6d8212b941ad45ce6b53bc4e8449de1',1,'mrs_lib::RHEIV']]], + ['threadsafe_330',['threadsafe',['../structmrs__lib_1_1SubscribeHandlerOptions.html#a7c924f3581ff84d571b825d7e77b9511',1,'mrs_lib::SubscribeHandlerOptions']]], + ['threadtimer_331',['ThreadTimer',['../classmrs__lib_1_1ThreadTimer.html',1,'mrs_lib::ThreadTimer'],['../classmrs__lib_1_1ThreadTimer.html#ac2e365201eccac6aae67400e4da4438f',1,'mrs_lib::ThreadTimer::ThreadTimer(const ros::NodeHandle &nh, const ros::Rate &rate, void(ObjectType::*const callback)(const ros::TimerEvent &), ObjectType *const obj, const bool oneshot=false, const bool autostart=true)'],['../classmrs__lib_1_1ThreadTimer.html#a2ccbea65e537f1f73da1fa75f37833fc',1,'mrs_lib::ThreadTimer::ThreadTimer(const ros::NodeHandle &nh, const ros::Duration &duration, void(ObjectType::*const callback)(const ros::TimerEvent &), ObjectType *const obj, bool oneshot=false, const bool autostart=true)']]], + ['time_5fpoint_332',['time_point',['../structmrs__lib_1_1ScopeTimer_1_1time__point.html',1,'mrs_lib::ScopeTimer']]], + ['timeout_5fcallback_333',['timeout_callback',['../structmrs__lib_1_1SubscribeHandlerOptions.html#aba6f6f262bfeae0d1f6f39bb778d04af',1,'mrs_lib::SubscribeHandlerOptions']]], + ['timeout_5fcallback_5ft_334',['timeout_callback_t',['../classmrs__lib_1_1SubscribeHandler.html#a6f12a82506c6967a8af9c2c878a1803a',1,'mrs_lib::SubscribeHandler']]], + ['timeout_5fmanager_335',['timeout_manager',['../structmrs__lib_1_1SubscribeHandlerOptions.html#a50dd6637eb0800d0ee53c1cd6cee058e',1,'mrs_lib::SubscribeHandlerOptions']]], + ['timeout_5fmanager_2eh_336',['timeout_manager.h',['../timeout__manager_8h.html',1,'']]], + ['timeoutmanager_337',['TimeoutManager',['../classmrs__lib_1_1TimeoutManager.html',1,'mrs_lib::TimeoutManager'],['../classmrs__lib_1_1TimeoutManager.html#a7627ccd5204a4f13c832db2cb558128f',1,'mrs_lib::TimeoutManager::TimeoutManager()']]], + ['topic_5fname_338',['topic_name',['../structmrs__lib_1_1SubscribeHandlerOptions.html#a374f745d46497064c62909412ebdf266',1,'mrs_lib::SubscribeHandlerOptions']]], + ['topicname_339',['topicName',['../classmrs__lib_1_1SubscribeHandler.html#a512ffa88a2164e420f1c4a6ae1823e68',1,'mrs_lib::SubscribeHandler']]], + ['transform_340',['transform',['../classmrs__lib_1_1Transformer.html#a8a66075edc7025976292ebd401d7de16',1,'mrs_lib::Transformer::transform(const T &what, const geometry_msgs::TransformStamped &tf)'],['../classmrs__lib_1_1Transformer.html#a8b05fe85c78f490b938bbf3d5884fce4',1,'mrs_lib::Transformer::transform(const boost::shared_ptr< const T > &what, const geometry_msgs::TransformStamped &tf)'],['../classmrs__lib_1_1Transformer.html#a6509524feeb70fe794964b7462f28409',1,'mrs_lib::Transformer::transform(const boost::shared_ptr< T > &what, const geometry_msgs::TransformStamped &tf)']]], + ['transformaspoint_341',['transformAsPoint',['../classmrs__lib_1_1Transformer.html#ae56ae48888d4fcaf21c912ed491b35d1',1,'mrs_lib::Transformer::transformAsPoint(const Eigen::Vector3d &what, const geometry_msgs::TransformStamped &tf)'],['../classmrs__lib_1_1Transformer.html#ab1533c559b6c94b406322bfbfc700ef7',1,'mrs_lib::Transformer::transformAsPoint(const std::string &from_frame, const Eigen::Vector3d &what, const std::string &to_frame, const ros::Time &time_stamp=ros::Time(0))']]], + ['transformasvector_342',['transformAsVector',['../classmrs__lib_1_1Transformer.html#af17729e67e82876f6bbce2d5cec55613',1,'mrs_lib::Transformer::transformAsVector(const Eigen::Vector3d &what, const geometry_msgs::TransformStamped &tf)'],['../classmrs__lib_1_1Transformer.html#a1c71e387e846a2591616e83a88071d24',1,'mrs_lib::Transformer::transformAsVector(const std::string &from_frame, const Eigen::Vector3d &what, const std::string &to_frame, const ros::Time &time_stamp=ros::Time(0))']]], + ['transformbroadcaster_343',['TransformBroadcaster',['../classmrs__lib_1_1TransformBroadcaster.html',1,'mrs_lib::TransformBroadcaster'],['../classmrs__lib_1_1TransformBroadcaster.html#ab8760c98f2d7111cc029f45b11e24bb9',1,'mrs_lib::TransformBroadcaster::TransformBroadcaster()']]], + ['transformer_344',['Transformer',['../classmrs__lib_1_1Transformer.html',1,'mrs_lib::Transformer'],['../classmrs__lib_1_1Transformer.html#aca0408b710e4fa6e163ac23719d30fd1',1,'mrs_lib::Transformer::Transformer()'],['../classmrs__lib_1_1Transformer.html#ae1a34c10d53059f9dfaf4c8c05a4f617',1,'mrs_lib::Transformer::Transformer(const std::string &node_name, const ros::Duration &cache_time=ros::Duration(tf2_ros::Buffer::DEFAULT_CACHE_TIME))'],['../classmrs__lib_1_1Transformer.html#a561b0c5342c38dea6071ab400b8eaae4',1,'mrs_lib::Transformer::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))']]], + ['transformsingle_345',['transformSingle',['../classmrs__lib_1_1Transformer.html#a623af4e8100b71ac700ad5ffac96d2e2',1,'mrs_lib::Transformer::transformSingle(const T &what, const std::string &to_frame)'],['../classmrs__lib_1_1Transformer.html#a58e8e6d80098e192a0d415a14c6deec0',1,'mrs_lib::Transformer::transformSingle(const boost::shared_ptr< T > &what, const std::string &to_frame)'],['../classmrs__lib_1_1Transformer.html#a2c45ff29ac5f482ba9b9c2537d82b8fb',1,'mrs_lib::Transformer::transformSingle(const boost::shared_ptr< const T > &what, const std::string &to_frame)'],['../classmrs__lib_1_1Transformer.html#a7cea399425c4a51a676ba5aa285612d4',1,'mrs_lib::Transformer::transformSingle(const std::string &from_frame, const T &what, const std::string &to_frame, const ros::Time &time_stamp=ros::Time(0))'],['../classmrs__lib_1_1Transformer.html#a5afde5d58bc9a558cba5da9e0c2d4d1b',1,'mrs_lib::Transformer::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))'],['../classmrs__lib_1_1Transformer.html#a4d01ec1804bb492694d328704dada907',1,'mrs_lib::Transformer::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))']]], + ['transition_5fmodel_5ft_346',['transition_model_t',['../classmrs__lib_1_1UKF.html#a986f17f015282a33b140af4adabce091',1,'mrs_lib::UKF']]], + ['transport_5fhints_347',['transport_hints',['../structmrs__lib_1_1SubscribeHandlerOptions.html#a41f19ca415439152b934b3633933ec25',1,'mrs_lib::SubscribeHandlerOptions']]], + ['triangle_348',['Triangle',['../classmrs__lib_1_1geometry_1_1Triangle.html',1,'mrs_lib::geometry::Triangle'],['../classmrs__lib_1_1geometry_1_1Triangle.html#a14203384b0eb6d3a7ff01330ab24f679',1,'mrs_lib::geometry::Triangle::Triangle()'],['../classmrs__lib_1_1geometry_1_1Triangle.html#af765e8be7fef5ae4cfb972ec51c4a6e8',1,'mrs_lib::geometry::Triangle::Triangle(Eigen::Vector3d a, Eigen::Vector3d b, Eigen::Vector3d c)']]], + ['trianglearea_349',['triangleArea',['../misc_8h.html#a62f7d942a2445dc2c362678523966241',1,'mrs_lib::geometry']]], + ['triangles_350',['triangles',['../classmrs__lib_1_1geometry_1_1Rectangle.html#a4f2e1bce541675c91179b723aa4f9176',1,'mrs_lib::geometry::Rectangle']]], + ['tuple_5felement_3c_200_2c_20mrs_5flib_3a_3aattitudeconverter_20_3e_351',['tuple_element< 0, mrs_lib::AttitudeConverter >',['../structstd_1_1tuple__element_3_010_00_01mrs__lib_1_1AttitudeConverter_01_4.html',1,'std']]], + ['tuple_5felement_3c_201_2c_20mrs_5flib_3a_3aattitudeconverter_20_3e_352',['tuple_element< 1, mrs_lib::AttitudeConverter >',['../structstd_1_1tuple__element_3_011_00_01mrs__lib_1_1AttitudeConverter_01_4.html',1,'std']]], + ['tuple_5felement_3c_202_2c_20mrs_5flib_3a_3aattitudeconverter_20_3e_353',['tuple_element< 2, mrs_lib::AttitudeConverter >',['../structstd_1_1tuple__element_3_012_00_01mrs__lib_1_1AttitudeConverter_01_4.html',1,'std']]], + ['tuple_5fsize_3c_20mrs_5flib_3a_3aattitudeconverter_20_3e_354',['tuple_size< mrs_lib::AttitudeConverter >',['../structstd_1_1tuple__size_3_01mrs__lib_1_1AttitudeConverter_01_4.html',1,'std']]], + ['twopointcast_355',['twopointCast',['../classmrs__lib_1_1geometry_1_1Ray.html#a4092f0d023b25fcf61fb426c7f0f6630',1,'mrs_lib::geometry::Ray']]] +]; diff --git a/search/all_14.html b/search/all_14.html new file mode 100644 index 00000000..72d12e90 --- /dev/null +++ b/search/all_14.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_14.js b/search/all_14.js new file mode 100644 index 00000000..8939979d --- /dev/null +++ b/search/all_14.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['u_5ft_356',['u_t',['../classmrs__lib_1_1DKF.html#a5998af081256d469dbd4ac5a1d4d7fd7',1,'mrs_lib::DKF::u_t()'],['../classmrs__lib_1_1KalmanFilter.html#ad92ac4f280e849986554bc593e5ab96e',1,'mrs_lib::KalmanFilter::u_t()'],['../classmrs__lib_1_1KalmanFilterAloamGarm.html#ae680d65b40883e1678e0365ed3924c16',1,'mrs_lib::KalmanFilterAloamGarm::u_t()'],['../classmrs__lib_1_1LKF.html#a98e130a3d14cd93b01b0b942de8af10c',1,'mrs_lib::LKF::u_t()'],['../classmrs__lib_1_1NCLKF.html#a8992c34838e430a64b070929e92c263a',1,'mrs_lib::NCLKF::u_t()'],['../classmrs__lib_1_1NCLKF__partial.html#a5718270798d8227ccaf76a5d3b97fda5',1,'mrs_lib::NCLKF_partial::u_t()'],['../classmrs__lib_1_1Repredictor.html#a19532d9b875ac33f80ffe313dfb26e6d',1,'mrs_lib::Repredictor::u_t()'],['../classmrs__lib_1_1RepredictorAloamgarm.html#acf7e98ab597eeeb4766b9794cf861f13',1,'mrs_lib::RepredictorAloamgarm::u_t()'],['../classmrs__lib_1_1RHEIV.html#a3bc18fd815c8f09123b0a9083ca3b959',1,'mrs_lib::RHEIV::u_t()'],['../classmrs__lib_1_1UKF.html#a6589d6a1f5eba355f1bec91e99826b71',1,'mrs_lib::UKF::u_t()']]], + ['ukf_357',['UKF',['../classmrs__lib_1_1UKF.html',1,'mrs_lib::UKF< n_states, n_inputs, n_measurements >'],['../classmrs__lib_1_1UKF.html#acf37d546ec0e03f1ef4c031f96057733',1,'mrs_lib::UKF::UKF()'],['../classmrs__lib_1_1UKF.html#a43f196bc0b8ef4dd75feba3b025576cb',1,'mrs_lib::UKF::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)']]], + ['ukf_2eh_358',['ukf.h',['../ukf_8h.html',1,'']]], + ['ukf_2ehpp_359',['ukf.hpp',['../ukf_8hpp.html',1,'']]], + ['unwrap_360',['unwrap',['../structmrs__lib_1_1geometry_1_1cyclic.html#a21d98e561a2d296e1d64b38a74883902',1,'mrs_lib::geometry::cyclic']]], + ['usedmsg_361',['usedMsg',['../classmrs__lib_1_1SubscribeHandler.html#ab027bb4a6edece35701e17ba0c137cfc',1,'mrs_lib::SubscribeHandler']]], + ['utils_2eh_362',['utils.h',['../utils_8h.html',1,'']]] +]; diff --git a/search/all_15.html b/search/all_15.html new file mode 100644 index 00000000..767aec36 --- /dev/null +++ b/search/all_15.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_15.js b/search/all_15.js new file mode 100644 index 00000000..fa780dbe --- /dev/null +++ b/search/all_15.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['value_363',['value',['../structmrs__lib_1_1geometry_1_1cyclic.html#a064a156dd856871bf1b4acf22cba78e3',1,'mrs_lib::geometry::cyclic']]], + ['varsteplkf_364',['varstepLKF',['../classmrs__lib_1_1varstepLKF.html',1,'mrs_lib::varstepLKF< n_states, n_inputs, n_measurements >'],['../classmrs__lib_1_1varstepLKF.html#afe2d9f3643f3f8e4c82879384a4a5eea',1,'mrs_lib::varstepLKF::varstepLKF()']]], + ['vector3converter_365',['Vector3Converter',['../classmrs__lib_1_1Vector3Converter.html',1,'mrs_lib::Vector3Converter'],['../classmrs__lib_1_1Vector3Converter.html#ac5cf91c41293661ea55749d55aec4d48',1,'mrs_lib::Vector3Converter::Vector3Converter(const tf2::Vector3 &vector3)'],['../classmrs__lib_1_1Vector3Converter.html#abf2c3e688787834522c8a99c374f656e',1,'mrs_lib::Vector3Converter::Vector3Converter(const Eigen::Vector3d &vector3)'],['../classmrs__lib_1_1Vector3Converter.html#aec2780b4e6f0b58ee2c465ab2338df17',1,'mrs_lib::Vector3Converter::Vector3Converter(const geometry_msgs::Vector3 &vector3)'],['../classmrs__lib_1_1Vector3Converter.html#a3936cad709ed1018aba1d05d47639c80',1,'mrs_lib::Vector3Converter::Vector3Converter(const double &x, const double &y, const double &z)']]], + ['vector_5fconverter_2eh_366',['vector_converter.h',['../vector__converter_8h.html',1,'']]], + ['vector_5fconverter_2ehpp_367',['vector_converter.hpp',['../vector__converter_8hpp.html',1,'']]], + ['vectorconvertertest_368',['VectorConverterTest',['../classVectorConverterTest.html',1,'']]], + ['vertices_369',['vertices',['../classmrs__lib_1_1geometry_1_1Triangle.html#ad873b5c4ba04613f24dd12348f898487',1,'mrs_lib::geometry::Triangle::vertices()'],['../classmrs__lib_1_1geometry_1_1Rectangle.html#a05fbbe3a262e09d5834431bc31f2648b',1,'mrs_lib::geometry::Rectangle::vertices()'],['../classmrs__lib_1_1geometry_1_1Cuboid.html#ae03413de879b1dd07df7a8f26b0a75f2',1,'mrs_lib::geometry::Cuboid::vertices()']]], + ['visual_5fobject_2eh_370',['visual_object.h',['../visual__object_8h.html',1,'']]], + ['visualobject_371',['VisualObject',['../classmrs__lib_1_1VisualObject.html',1,'mrs_lib']]] +]; diff --git a/search/all_16.html b/search/all_16.html new file mode 100644 index 00000000..7bd7afe6 --- /dev/null +++ b/search/all_16.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_16.js b/search/all_16.js new file mode 100644 index 00000000..94f22deb --- /dev/null +++ b/search/all_16.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['w_372',['w',['../classmrs__lib_1_1UKF.html#a2bbb3c02f086402351601ca3c3a4c52f',1,'mrs_lib::UKF']]], + ['w_5ft_373',['W_t',['../classmrs__lib_1_1UKF.html#aca628bd6d14b59b9d0a10652a2665a32',1,'mrs_lib::UKF']]], + ['waitfornew_374',['waitForNew',['../classmrs__lib_1_1SubscribeHandler.html#a94f4bedf9229325ca6a14202f5cfbcc5',1,'mrs_lib::SubscribeHandler']]], + ['what_375',['what',['../structmrs__lib_1_1JLKF_1_1inverse__exception.html#a1f02bea6207ec02864a693067bcd499f',1,'mrs_lib::JLKF::inverse_exception::what()'],['../structmrs__lib_1_1LKF_1_1inverse__exception.html#a44d325f6cd975003b995d33bd78948ac',1,'mrs_lib::LKF::inverse_exception::what()'],['../structmrs__lib_1_1eigenvector__exception.html#ab825ec32cb055c8c0b3b8b59125e90b5',1,'mrs_lib::eigenvector_exception::what()']]], + ['wrap_376',['wrap',['../structmrs__lib_1_1geometry_1_1cyclic.html#ada5b55bcb4a01898fd9fdd9c393efd95',1,'mrs_lib::geometry::cyclic']]], + ['wrongnumberofcolumns_377',['WrongNumberOfColumns',['../structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns.html',1,'mrs_lib::Polygon']]], + ['wrongnumberofvertices_378',['WrongNumberOfVertices',['../structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices.html',1,'mrs_lib::Polygon']]] +]; diff --git a/search/all_17.html b/search/all_17.html new file mode 100644 index 00000000..35702ecd --- /dev/null +++ b/search/all_17.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_17.js b/search/all_17.js new file mode 100644 index 00000000..5397fc74 --- /dev/null +++ b/search/all_17.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['x_379',['x',['../structmrs__lib_1_1KalmanFilter_1_1statecov__t.html#a725b61d95901486bbc17cf79e45bd5e4',1,'mrs_lib::KalmanFilter::statecov_t::x()'],['../structmrs__lib_1_1KalmanFilterAloamGarm_1_1statecov__t.html#a78cb90ec0a35a04f7f4abe69847979ec',1,'mrs_lib::KalmanFilterAloamGarm::statecov_t::x()']]], + ['x_5ft_380',['X_t',['../classmrs__lib_1_1UKF.html#a1435f2ed4e333151990355813cee95ba',1,'mrs_lib::UKF::X_t()'],['../classmrs__lib_1_1DKF.html#a094cf9bcb768de6db47e4c2703bede20',1,'mrs_lib::DKF::x_t()'],['../classmrs__lib_1_1KalmanFilter.html#a5b8f47081daf208496a19a4364e6509c',1,'mrs_lib::KalmanFilter::x_t()'],['../classmrs__lib_1_1KalmanFilterAloamGarm.html#a0e19e15226a8e251452cd486153fba12',1,'mrs_lib::KalmanFilterAloamGarm::x_t()'],['../classmrs__lib_1_1LKF.html#abfad09fe2386fb87eaea7b4dd8b24409',1,'mrs_lib::LKF::x_t()'],['../classmrs__lib_1_1NCLKF.html#a8fa90de14ea4fa4125882bd49d101888',1,'mrs_lib::NCLKF::x_t()'],['../classmrs__lib_1_1NCLKF__partial.html#afaae66f623e768b19c0160fb21be9373',1,'mrs_lib::NCLKF_partial::x_t()'],['../classmrs__lib_1_1Repredictor.html#ac9550981d03dc3c898dcbd39c4bc461f',1,'mrs_lib::Repredictor::x_t()'],['../classmrs__lib_1_1RepredictorAloamgarm.html#a5c2992c6bde2dd8f3bdc7673fc3977da',1,'mrs_lib::RepredictorAloamgarm::x_t()'],['../classmrs__lib_1_1RHEIV.html#a6482f5ff13cbfaef9f8dc86912c1258d',1,'mrs_lib::RHEIV::x_t()'],['../classmrs__lib_1_1UKF.html#a5ab9d25f7b2470c7abeacda7f8b80630',1,'mrs_lib::UKF::x_t()']]], + ['xq_5ft_381',['xq_t',['../classmrs__lib_1_1NCLKF__partial.html#a50092f2c99a521668dfd3211c999441c',1,'mrs_lib::NCLKF_partial']]], + ['xs_5ft_382',['xs_t',['../classmrs__lib_1_1RHEIV.html#aee3df85ac46e5b29259f8898388324ec',1,'mrs_lib::RHEIV']]] +]; diff --git a/search/all_18.html b/search/all_18.html new file mode 100644 index 00000000..540cdb6a --- /dev/null +++ b/search/all_18.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_18.js b/search/all_18.js new file mode 100644 index 00000000..aa6e0254 --- /dev/null +++ b/search/all_18.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['yaw_383',['yaw',['../classmrs__lib_1_1EulerAttitude.html#ab29c3b0fb567107c23eff485e8f2578d',1,'mrs_lib::EulerAttitude']]] +]; diff --git a/search/all_19.html b/search/all_19.html new file mode 100644 index 00000000..14e13e7d --- /dev/null +++ b/search/all_19.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_19.js b/search/all_19.js new file mode 100644 index 00000000..d5ca4f2c --- /dev/null +++ b/search/all_19.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['z_5ft_384',['z_t',['../classmrs__lib_1_1DKF.html#ad919f1d7a6f5d8be7361a8336aa6fd85',1,'mrs_lib::DKF::z_t()'],['../classmrs__lib_1_1KalmanFilter.html#a0825f38a6a4ddc522239bb7bf6279737',1,'mrs_lib::KalmanFilter::z_t()'],['../classmrs__lib_1_1KalmanFilterAloamGarm.html#ae7fc4baaa223bf1ccebebc20c4b02bcc',1,'mrs_lib::KalmanFilterAloamGarm::z_t()'],['../classmrs__lib_1_1LKF.html#af4318056f5e0c024651bb882b60ec640',1,'mrs_lib::LKF::z_t()'],['../classmrs__lib_1_1NCLKF.html#a80db36613d09068f8daa0dc7e735dc64',1,'mrs_lib::NCLKF::z_t()'],['../classmrs__lib_1_1NCLKF__partial.html#ad5308432a3010edabc4598a92786fad5',1,'mrs_lib::NCLKF_partial::z_t()'],['../classmrs__lib_1_1Repredictor.html#a4f12cadd7f0377eccb70b8d61e7ee8e3',1,'mrs_lib::Repredictor::z_t()'],['../classmrs__lib_1_1RepredictorAloamgarm.html#a3e265f15f9b8b031af819d1d2045909b',1,'mrs_lib::RepredictorAloamgarm::z_t()'],['../classmrs__lib_1_1RHEIV.html#a8e01ed1580572ec20f0230d9bfe5273f',1,'mrs_lib::RHEIV::z_t()'],['../classmrs__lib_1_1UKF.html#a7a68877ffa7bd8bb10f16d1f104e0a73',1,'mrs_lib::UKF::z_t()'],['../classmrs__lib_1_1UKF.html#a06a3fae37e8a0613d8169b638c4c0001',1,'mrs_lib::UKF::Z_t()']]], + ['zs_5ft_385',['zs_t',['../classmrs__lib_1_1RHEIV.html#a3b4e40932aae907ae8185df7703d5677',1,'mrs_lib::RHEIV']]] +]; diff --git a/search/all_1a.html b/search/all_1a.html new file mode 100644 index 00000000..233281a1 --- /dev/null +++ b/search/all_1a.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_1a.js b/search/all_1a.js new file mode 100644 index 00000000..580a1fa7 --- /dev/null +++ b/search/all_1a.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['_7eatomicscopeflag_386',['~AtomicScopeFlag',['../classmrs__lib_1_1AtomicScopeFlag.html#aafdf61c0af0bffada120eec2a8c858b1',1,'mrs_lib::AtomicScopeFlag']]], + ['_7ebatchvisualizer_387',['~BatchVisualizer',['../classmrs__lib_1_1BatchVisualizer.html#a83a3baa46f7a3c22079a1d80aaed4459',1,'mrs_lib::BatchVisualizer']]], + ['_7econe_388',['~Cone',['../classmrs__lib_1_1geometry_1_1Cone.html#ae687be891abfb2db67245cd2c13f8586',1,'mrs_lib::geometry::Cone']]], + ['_7ecuboid_389',['~Cuboid',['../classmrs__lib_1_1geometry_1_1Cuboid.html#a5a78508d282bd8d273d97f3055ae0357',1,'mrs_lib::geometry::Cuboid']]], + ['_7ecylinder_390',['~Cylinder',['../classmrs__lib_1_1geometry_1_1Cylinder.html#a9a558196740fd2be133a3c2df7173f4f',1,'mrs_lib::geometry::Cylinder']]], + ['_7eellipse_391',['~Ellipse',['../classmrs__lib_1_1geometry_1_1Ellipse.html#a973caa18f7b0c2e41b263a4267914650',1,'mrs_lib::geometry::Ellipse']]], + ['_7epublisherhandler_392',['~PublisherHandler',['../classmrs__lib_1_1PublisherHandler.html#a9acaa1ef56768636f2163c75dd9e307e',1,'mrs_lib::PublisherHandler']]], + ['_7epublisherhandler_5fimpl_393',['~PublisherHandler_impl',['../classmrs__lib_1_1PublisherHandler__impl.html#a685a159577dfe363423c58a91ba92ac6',1,'mrs_lib::PublisherHandler_impl']]], + ['_7eray_394',['~Ray',['../classmrs__lib_1_1geometry_1_1Ray.html#ad79e6fdb9416510694f14fd92ca41c7a',1,'mrs_lib::geometry::Ray']]], + ['_7erectangle_395',['~Rectangle',['../classmrs__lib_1_1geometry_1_1Rectangle.html#a66d9286f92d6f8ea5c7ebc7400cb29be',1,'mrs_lib::geometry::Rectangle']]], + ['_7escopetimer_396',['~ScopeTimer',['../classmrs__lib_1_1ScopeTimer.html#a243e048e46a8ef623b60c465dc7ee102',1,'mrs_lib::ScopeTimer']]], + ['_7escopetimerlogger_397',['~ScopeTimerLogger',['../classmrs__lib_1_1ScopeTimerLogger.html#a0152ea8087d16a05027e66c44d99662e',1,'mrs_lib::ScopeTimerLogger']]], + ['_7eserviceclienthandler_398',['~ServiceClientHandler',['../classmrs__lib_1_1ServiceClientHandler.html#ad796fc7f9044bdeeacdf549faa1d2f48',1,'mrs_lib::ServiceClientHandler']]], + ['_7eserviceclienthandler_5fimpl_399',['~ServiceClientHandler_impl',['../classmrs__lib_1_1ServiceClientHandler__impl.html#a2d906a4c237db032edfb7578d0eb2be1',1,'mrs_lib::ServiceClientHandler_impl']]], + ['_7ethreadtimer_400',['~ThreadTimer',['../classmrs__lib_1_1ThreadTimer.html#a175a2bcce428cfca8bbf3f4ef836f4ed',1,'mrs_lib::ThreadTimer']]], + ['_7etriangle_401',['~Triangle',['../classmrs__lib_1_1geometry_1_1Triangle.html#ad5cc0e9eb09f9f4900f94fa1908b60f3',1,'mrs_lib::geometry::Triangle']]] +]; diff --git a/search/all_2.html b/search/all_2.html new file mode 100644 index 00000000..b26d9165 --- /dev/null +++ b/search/all_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_2.js b/search/all_2.js new file mode 100644 index 00000000..4e3a235d --- /dev/null +++ b/search/all_2.js @@ -0,0 +1,31 @@ +var searchData= +[ + ['c_36',['c',['../classmrs__lib_1_1geometry_1_1Triangle.html#aff6f8fb09fb5e7d4ebf2116142b85638',1,'mrs_lib::geometry::Triangle::c()'],['../classmrs__lib_1_1geometry_1_1Rectangle.html#a9cd35540a57a2b0663a2a4b360e02d8c',1,'mrs_lib::geometry::Rectangle::c()']]], + ['c_5ft_37',['C_t',['../classmrs__lib_1_1JLKF.html#af34d34f55cb8804bd4e873a16c9e9a08',1,'mrs_lib::JLKF']]], + ['call_38',['call',['../classmrs__lib_1_1ServiceClientHandler__impl.html#a50394dc3190eafbce4c58b20823942d6',1,'mrs_lib::ServiceClientHandler_impl::call(ServiceType &srv)'],['../classmrs__lib_1_1ServiceClientHandler__impl.html#a35cc1c54991d1eb2801e2dfd205e1ef0',1,'mrs_lib::ServiceClientHandler_impl::call(ServiceType &srv, const int &attempts)'],['../classmrs__lib_1_1ServiceClientHandler__impl.html#aecd6585588ea75d444577651591fb847',1,'mrs_lib::ServiceClientHandler_impl::call(ServiceType &srv, const int &attempts, const double &repeat_delay)'],['../classmrs__lib_1_1ServiceClientHandler.html#acd827db26db5d8e1f310769509176fe2',1,'mrs_lib::ServiceClientHandler::call(ServiceType &srv)'],['../classmrs__lib_1_1ServiceClientHandler.html#a7eee51ebff7a805d425673ddc166d489',1,'mrs_lib::ServiceClientHandler::call(ServiceType &srv, const int &attempts)'],['../classmrs__lib_1_1ServiceClientHandler.html#afdf41e0cf6b2fa0941ee0ae703facc71',1,'mrs_lib::ServiceClientHandler::call(ServiceType &srv, const int &attempts, const double &repeat_delay)']]], + ['callasync_39',['callAsync',['../classmrs__lib_1_1ServiceClientHandler__impl.html#a39ed1a2c10f97d75447224bd9cb9e968',1,'mrs_lib::ServiceClientHandler_impl::callAsync(ServiceType &srv)'],['../classmrs__lib_1_1ServiceClientHandler__impl.html#acbc6113b775545e89e7fa4fd41cf15ed',1,'mrs_lib::ServiceClientHandler_impl::callAsync(ServiceType &srv, const int &attempts)'],['../classmrs__lib_1_1ServiceClientHandler__impl.html#ae15fc00b04219ae241e03c0973a00c5a',1,'mrs_lib::ServiceClientHandler_impl::callAsync(ServiceType &srv, const int &attempts, const double &repeat_delay)'],['../classmrs__lib_1_1ServiceClientHandler.html#aa7f3a5d1566aa2a361594797f162ca0d',1,'mrs_lib::ServiceClientHandler::callAsync(ServiceType &srv)'],['../classmrs__lib_1_1ServiceClientHandler.html#a390d8d24962c3efd849f44627b29387e',1,'mrs_lib::ServiceClientHandler::callAsync(ServiceType &srv, const int &attempts)'],['../classmrs__lib_1_1ServiceClientHandler.html#ac6babcda855d48bc3b8fc72f45f7672b',1,'mrs_lib::ServiceClientHandler::callAsync(ServiceType &srv, const int &attempts, const double &repeat_delay)']]], + ['center_40',['center',['../classmrs__lib_1_1geometry_1_1Triangle.html#a419f55d2c47dac6035495004fec746c9',1,'mrs_lib::geometry::Triangle::center()'],['../classmrs__lib_1_1geometry_1_1Rectangle.html#ab541a2748c4876234b4af0f3c220fb2d',1,'mrs_lib::geometry::Rectangle::center()'],['../classmrs__lib_1_1geometry_1_1Cuboid.html#a7ce6626c7018bdae2722073490c1729f',1,'mrs_lib::geometry::Cuboid::center()'],['../classmrs__lib_1_1geometry_1_1Ellipse.html#a058c83435e1cf0f393c1bde54e94f570',1,'mrs_lib::geometry::Ellipse::center()'],['../classmrs__lib_1_1geometry_1_1Cylinder.html#a766270eba57b916335ad0901fec74355',1,'mrs_lib::geometry::Cylinder::center()'],['../classmrs__lib_1_1geometry_1_1Cone.html#a2553c04b3dfef8dfceb938699e11f432',1,'mrs_lib::geometry::Cone::center()']]], + ['check_41',['check',['../classmrs__lib_1_1MedianFilter.html#a518d744f114ad6d0b2591d3804f6f095',1,'mrs_lib::MedianFilter']]], + ['checkpoint_42',['checkpoint',['../classmrs__lib_1_1ScopeTimer.html#acbb378343cba8f94ef228024d7a4b938',1,'mrs_lib::ScopeTimer']]], + ['clear_43',['clear',['../classmrs__lib_1_1MedianFilter.html#a533c6e194f991a9c11b9e2aadf7087a5',1,'mrs_lib::MedianFilter']]], + ['clearbuffers_44',['clearBuffers',['../classmrs__lib_1_1BatchVisualizer.html#a317a263d7a57b88805a3d264976b4c9f',1,'mrs_lib::BatchVisualizer']]], + ['clearvisuals_45',['clearVisuals',['../classmrs__lib_1_1BatchVisualizer.html#aacda752bbfd192279da0fe15f001b0bb',1,'mrs_lib::BatchVisualizer']]], + ['cone_46',['Cone',['../classmrs__lib_1_1geometry_1_1Cone.html',1,'mrs_lib::geometry::Cone'],['../classmrs__lib_1_1geometry_1_1Cone.html#a27103a8552d930ae3a3a2513990d9399',1,'mrs_lib::geometry::Cone::Cone()'],['../classmrs__lib_1_1geometry_1_1Cone.html#a078bc613852240cbf2a0adb086d3d127',1,'mrs_lib::geometry::Cone::Cone(Eigen::Vector3d origin_point, double angle, double height, Eigen::Vector3d orientation)']]], + ['construct_5fobject_47',['construct_object',['../namespacemrs__lib.html#a6bd2a4b1c7a370ecf5abcb082d68f02f',1,'mrs_lib']]], + ['containertostring_48',['containerToString',['../namespacemrs__lib.html#adcd658b38c38786fa906e95b1252393a',1,'mrs_lib::containerToString(const Iterator begin, const Iterator end, const std::string &delimiter=", ")'],['../namespacemrs__lib.html#a10c2af0f8c317177ca6abca5fd80a52a',1,'mrs_lib::containerToString(const Iterator begin, const Iterator end, const char *delimiter)'],['../namespacemrs__lib.html#a1c0c2c8502894646615382a9134c866a',1,'mrs_lib::containerToString(const Container &cont, const std::string &delimiter=", ")'],['../namespacemrs__lib.html#ad5bd70829aedd3ff4a67d8902855eed9',1,'mrs_lib::containerToString(const Container &cont, const char *delimiter=", ")']]], + ['convert_49',['convert',['../structmrs__lib_1_1geometry_1_1cyclic.html#a872202b166f48d3759cd58cc57242f5f',1,'mrs_lib::geometry::cyclic::convert(const cyclic &what)'],['../structmrs__lib_1_1geometry_1_1cyclic.html#aa86da042144ee34330e4cef57b410f58',1,'mrs_lib::geometry::cyclic::convert() const'],['../namespacemrs__lib.html#a66ab536759b8cab264138c098008c9ca',1,'mrs_lib::convert()']]], + ['correct_50',['correct',['../classmrs__lib_1_1JLKF.html#a6aa1475ecb42a4ee97e8d7e93cb5c523',1,'mrs_lib::JLKF::correct()'],['../classmrs__lib_1_1KalmanFilter.html#a66c1e0d2e496f304a4f6166e7b894aac',1,'mrs_lib::KalmanFilter::correct()'],['../classmrs__lib_1_1KalmanFilterAloamGarm.html#a3e541e3ec53df99c77f8cc7031728d6f',1,'mrs_lib::KalmanFilterAloamGarm::correct()'],['../classmrs__lib_1_1LKF.html#a8ba4552b6fa909e5d899d2fe8c8fdaa5',1,'mrs_lib::LKF::correct()'],['../classmrs__lib_1_1NCUKF.html#ab12dfb8b6ad4c831c761327a3be2d814',1,'mrs_lib::NCUKF::correct()'],['../classmrs__lib_1_1UKF.html#ad31a0a6b6c1ea433daa0bae83e6fb6e4',1,'mrs_lib::UKF::correct()']]], + ['correctline_51',['correctLine',['../classmrs__lib_1_1DKF.html#a7e5d887496dea33a60b8cf2a0acc5fec',1,'mrs_lib::DKF']]], + ['createroutine_52',['createRoutine',['../classmrs__lib_1_1Profiler.html#aaf170ec3c6f67e11931cde978a5d3750',1,'mrs_lib::Profiler::createRoutine(std::string name, double expected_rate, double threshold, ros::TimerEvent event)'],['../classmrs__lib_1_1Profiler.html#a631e75be501cf4353dc8578bd9f66029',1,'mrs_lib::Profiler::createRoutine(std::string name)']]], + ['cross_53',['cross',['../misc_8h.html#aedd0e70cfd555703b53c469312d56293',1,'mrs_lib::geometry']]], + ['cuboid_54',['Cuboid',['../classmrs__lib_1_1geometry_1_1Cuboid.html',1,'mrs_lib::geometry::Cuboid'],['../classmrs__lib_1_1geometry_1_1Cuboid.html#a31a698a34b8443596be58a06f3046c79',1,'mrs_lib::geometry::Cuboid::Cuboid()'],['../classmrs__lib_1_1geometry_1_1Cuboid.html#a1dfbd69913658cddfc2394d8cfed8215',1,'mrs_lib::geometry::Cuboid::Cuboid(Eigen::Vector3d p0, Eigen::Vector3d p1, Eigen::Vector3d p2, Eigen::Vector3d p3, Eigen::Vector3d p4, Eigen::Vector3d p5, Eigen::Vector3d p6, Eigen::Vector3d p7)'],['../classmrs__lib_1_1geometry_1_1Cuboid.html#adcacc925347e73dbfd81529842ff3c21',1,'mrs_lib::geometry::Cuboid::Cuboid(std::vector< Eigen::Vector3d > points)'],['../classmrs__lib_1_1geometry_1_1Cuboid.html#a34b3cc64de7244e0b3ac2f71cdb22d95',1,'mrs_lib::geometry::Cuboid::Cuboid(Eigen::Vector3d center, Eigen::Vector3d size, Eigen::Quaterniond orientation)']]], + ['cyclic_55',['cyclic',['../structmrs__lib_1_1geometry_1_1cyclic.html',1,'mrs_lib::geometry::cyclic< flt, spec >'],['../structmrs__lib_1_1geometry_1_1cyclic.html#ab366578641265f73655d1edc023cc2c7',1,'mrs_lib::geometry::cyclic::cyclic()'],['../structmrs__lib_1_1geometry_1_1cyclic.html#ae0cfbde43f9fa6a3f26f1e4cf8184d30',1,'mrs_lib::geometry::cyclic::cyclic(const flt val)'],['../structmrs__lib_1_1geometry_1_1cyclic.html#a9ca52b4d47969ec56057b8217f201ab9',1,'mrs_lib::geometry::cyclic::cyclic(const cyclic &other)'],['../structmrs__lib_1_1geometry_1_1cyclic.html#ad40f88cb0dab7a684335f3403a9df7b0',1,'mrs_lib::geometry::cyclic::cyclic(const spec &other)']]], + ['cyclic_2eh_56',['cyclic.h',['../cyclic_8h.html',1,'']]], + ['cyclic_3c_20double_2c_20degrees_20_3e_57',['cyclic< double, degrees >',['../structmrs__lib_1_1geometry_1_1cyclic.html',1,'mrs_lib::geometry']]], + ['cyclic_3c_20double_2c_20radians_20_3e_58',['cyclic< double, radians >',['../structmrs__lib_1_1geometry_1_1cyclic.html',1,'mrs_lib::geometry']]], + ['cyclic_3c_20double_2c_20sdegrees_20_3e_59',['cyclic< double, sdegrees >',['../structmrs__lib_1_1geometry_1_1cyclic.html',1,'mrs_lib::geometry']]], + ['cyclic_3c_20double_2c_20sradians_20_3e_60',['cyclic< double, sradians >',['../structmrs__lib_1_1geometry_1_1cyclic.html',1,'mrs_lib::geometry']]], + ['cyclic_3c_20float_2c_20degrees_20_3e_61',['cyclic< float, degrees >',['../structmrs__lib_1_1geometry_1_1cyclic.html',1,'mrs_lib::geometry']]], + ['cyclic_5fexample_2ecpp_62',['cyclic_example.cpp',['../cyclic__example_8cpp.html',1,'']]], + ['cylinder_63',['Cylinder',['../classmrs__lib_1_1geometry_1_1Cylinder.html',1,'mrs_lib::geometry::Cylinder'],['../classmrs__lib_1_1geometry_1_1Cylinder.html#ae4b5f3500ae892f398ab88f5e545e0aa',1,'mrs_lib::geometry::Cylinder::Cylinder()'],['../classmrs__lib_1_1geometry_1_1Cylinder.html#a868fdc0baa204d3bf78d614b532aa32e',1,'mrs_lib::geometry::Cylinder::Cylinder(Eigen::Vector3d center, double radius, double height, Eigen::Quaterniond orientation)']]] +]; diff --git a/search/all_3.html b/search/all_3.html new file mode 100644 index 00000000..b61b96f8 --- /dev/null +++ b/search/all_3.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_3.js b/search/all_3.js new file mode 100644 index 00000000..8868ab24 --- /dev/null +++ b/search/all_3.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['d_64',['d',['../classmrs__lib_1_1geometry_1_1Rectangle.html#aec6ae68b84c5a24580068fbc70a9452d',1,'mrs_lib::geometry::Rectangle']]], + ['d_5ft_65',['D_t',['../classmrs__lib_1_1JLKF.html#ac047c1625da963988acfc47edc200a57',1,'mrs_lib::JLKF']]], + ['degrees_66',['degrees',['../structmrs__lib_1_1geometry_1_1degrees.html',1,'mrs_lib::geometry::degrees'],['../structdegrees.html',1,'degrees']]], + ['diff_67',['diff',['../structmrs__lib_1_1geometry_1_1cyclic.html#aa5b1c6f8e1ab47b374f10a1a96de910b',1,'mrs_lib::geometry::cyclic']]], + ['direction_68',['direction',['../classmrs__lib_1_1geometry_1_1Ray.html#a01b7ff2bb88b61c178f4991c8cd847bf',1,'mrs_lib::geometry::Ray::direction()'],['../classmrs__lib_1_1geometry_1_1Cone.html#aa973eb3025776015d9e542af7aea730f',1,'mrs_lib::geometry::Cone::direction()']]], + ['directioncast_69',['directionCast',['../classmrs__lib_1_1geometry_1_1Ray.html#ab8ea82597cf6d0eb1e72105c13f41fed',1,'mrs_lib::geometry::Ray']]], + ['dist_70',['dist',['../structmrs__lib_1_1geometry_1_1cyclic.html#a9eb4b1ce4c4307d6bed9642bbf52133e',1,'mrs_lib::geometry::cyclic::dist()'],['../misc_8h.html#a53aed2b4889c7574f51b590d0a602722',1,'mrs_lib::geometry::dist(const vec2_t &a, const vec2_t &b)'],['../misc_8h.html#ae00d8eaf9c43e838e245454ef7c290f4',1,'mrs_lib::geometry::dist(const vec3_t &a, const vec3_t &b)']]], + ['dkf_71',['DKF',['../classmrs__lib_1_1DKF.html',1,'mrs_lib::DKF'],['../classmrs__lib_1_1DKF.html#a75bd345a8f4e3856d35d23d3b85b12cd',1,'mrs_lib::DKF::DKF()'],['../classmrs__lib_1_1DKF.html#a68c0d27c7ae1897c6b54cea9e75b95ec',1,'mrs_lib::DKF::DKF(const A_t &A, const B_t &B)']]], + ['dynamic_5fpublisher_2eh_72',['dynamic_publisher.h',['../dynamic__publisher_8h.html',1,'']]], + ['dynamic_5freconfigure_5fmgr_2eh_73',['dynamic_reconfigure_mgr.h',['../dynamic__reconfigure__mgr_8h.html',1,'']]], + ['dynamicpublisher_74',['DynamicPublisher',['../classmrs__lib_1_1DynamicPublisher.html',1,'mrs_lib::DynamicPublisher'],['../classmrs__lib_1_1DynamicPublisher.html#a2c671b4d99d4bb6bde12e7a1d8717687',1,'mrs_lib::DynamicPublisher::DynamicPublisher()'],['../classmrs__lib_1_1DynamicPublisher.html#a6a17d49f4d7203f8b8693c6ceb2fb1d9',1,'mrs_lib::DynamicPublisher::DynamicPublisher(const ros::NodeHandle &nh)']]], + ['dynamicreconfiguremgr_75',['DynamicReconfigureMgr',['../classmrs__lib_1_1DynamicReconfigureMgr.html',1,'mrs_lib']]], + ['dzdx_5ft_76',['dzdx_t',['../classmrs__lib_1_1RHEIV.html#abec4cb102b681ff3ec39786dc1d2bd4b',1,'mrs_lib::RHEIV']]], + ['dzdxs_5ft_77',['dzdxs_t',['../classmrs__lib_1_1RHEIV.html#ad85f14fb415e2fbe69ad05db0dc56e7b',1,'mrs_lib::RHEIV']]] +]; diff --git a/search/all_4.html b/search/all_4.html new file mode 100644 index 00000000..06de1550 --- /dev/null +++ b/search/all_4.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_4.js b/search/all_4.js new file mode 100644 index 00000000..956d3cf4 --- /dev/null +++ b/search/all_4.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['eigenvector_5fexception_78',['eigenvector_exception',['../structmrs__lib_1_1eigenvector__exception.html',1,'mrs_lib']]], + ['ellipse_79',['Ellipse',['../classmrs__lib_1_1geometry_1_1Ellipse.html',1,'mrs_lib::geometry::Ellipse'],['../classmrs__lib_1_1geometry_1_1Ellipse.html#ab891e8f86df11bb34f0571ebeb136c2a',1,'mrs_lib::geometry::Ellipse::Ellipse()'],['../classmrs__lib_1_1geometry_1_1Ellipse.html#ad64c67ccd7e0c21b5698a6791adf6831',1,'mrs_lib::geometry::Ellipse::Ellipse(Eigen::Vector3d center, Eigen::Quaterniond orientation, double a, double b)']]], + ['eta_5ft_80',['eta_t',['../classmrs__lib_1_1RHEIV.html#a238b7a1a44cb7711756bd7b94a11797d',1,'mrs_lib::RHEIV']]], + ['eulerattitude_81',['EulerAttitude',['../classmrs__lib_1_1EulerAttitude.html',1,'mrs_lib::EulerAttitude'],['../classmrs__lib_1_1EulerAttitude.html#ac4da09217c4956043801841737da8521',1,'mrs_lib::EulerAttitude::EulerAttitude()']]], + ['eulerformatexception_82',['EulerFormatException',['../structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException.html',1,'mrs_lib::AttitudeConverter']]], + ['example_2ecpp_83',['example.cpp',['../dynamic__publisher_2example_8cpp.html',1,'(Global Namespace)'],['../lkf_2example_8cpp.html',1,'(Global Namespace)'],['../param__loader_2example_8cpp.html',1,'(Global Namespace)'],['../repredictor_2example_8cpp.html',1,'(Global Namespace)'],['../rheiv_2example_8cpp.html',1,'(Global Namespace)'],['../subscribe__handler_2example_8cpp.html',1,'(Global Namespace)'],['../ukf_2example_8cpp.html',1,'(Global Namespace)'],['../vector__converter_2example_8cpp.html',1,'(Global Namespace)']]], + ['extravertices_84',['ExtraVertices',['../structmrs__lib_1_1Polygon_1_1ExtraVertices.html',1,'mrs_lib::Polygon']]] +]; diff --git a/search/all_5.html b/search/all_5.html new file mode 100644 index 00000000..2544c4e5 --- /dev/null +++ b/search/all_5.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_5.js b/search/all_5.js new file mode 100644 index 00000000..8b3be133 --- /dev/null +++ b/search/all_5.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['f_5fdzdx_5ft_85',['f_dzdx_t',['../classmrs__lib_1_1RHEIV.html#ac5b425f7782114173db5a275bea2c871',1,'mrs_lib::RHEIV']]], + ['f_5fz_5ft_86',['f_z_t',['../classmrs__lib_1_1RHEIV.html#abfea65ce9c912fcde3e805a66dc8ca42',1,'mrs_lib::RHEIV']]], + ['fit_87',['fit',['../classmrs__lib_1_1RHEIV.html#aad00da516e55bb60661b5cf234487932',1,'mrs_lib::RHEIV::fit(const xs_t &xs, const Ps_t &Ps)'],['../classmrs__lib_1_1RHEIV.html#a9eaa3b7a946a9c590326d3b47295d728',1,'mrs_lib::RHEIV::fit(const T_it1 &xs_begin, const T_it1 &xs_end, const T_it2 &Ps_begin, const T_it2 &Ps_end)']]], + ['fit_5fals_88',['fit_ALS',['../classmrs__lib_1_1RHEIV.html#a2123ee2ffa07063a8a50275b998874ca',1,'mrs_lib::RHEIV']]], + ['frame_5ffrom_89',['frame_from',['../classmrs__lib_1_1Transformer.html#a0a440d4cd248304525a05e8cfa9662f7',1,'mrs_lib::Transformer::frame_from(const geometry_msgs::TransformStamped &msg)'],['../classmrs__lib_1_1Transformer.html#a7a53d960ee4b76ea943d9c19d23f2e95',1,'mrs_lib::Transformer::frame_from(geometry_msgs::TransformStamped &msg)']]], + ['frame_5fto_90',['frame_to',['../classmrs__lib_1_1Transformer.html#a4f4befc33e5518afa01026b7955c1e2b',1,'mrs_lib::Transformer::frame_to(const geometry_msgs::TransformStamped &msg)'],['../classmrs__lib_1_1Transformer.html#a34792e38e397efc72701898ff22114cc',1,'mrs_lib::Transformer::frame_to(geometry_msgs::TransformStamped &msg)']]], + ['full_91',['full',['../classmrs__lib_1_1MedianFilter.html#acdd73f7ffc9868eb6a05e7b6aea35d85',1,'mrs_lib::MedianFilter']]] +]; diff --git a/search/all_6.html b/search/all_6.html new file mode 100644 index 00000000..43f14eab --- /dev/null +++ b/search/all_6.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_6.js b/search/all_6.js new file mode 100644 index 00000000..12335b9b --- /dev/null +++ b/search/all_6.js @@ -0,0 +1,33 @@ +var searchData= +[ + ['get_5fals_5festimate_92',['get_ALS_estimate',['../classmrs__lib_1_1RHEIV.html#a96de075c76bf79a411606d762e4b9728',1,'mrs_lib::RHEIV']]], + ['get_5flast_5festimate_93',['get_last_estimate',['../classmrs__lib_1_1RHEIV.html#ac7f24b984bcfdee4f21de1206942f986',1,'mrs_lib::RHEIV']]], + ['get_5fmutexed_94',['get_mutexed',['../namespacemrs__lib.html#aaf62529e79b5d131ea5c0fedee10b9ca',1,'mrs_lib::get_mutexed(std::mutex &mut, Args &... args)'],['../namespacemrs__lib.html#aa3a541823230c37a69e51d4e90aa54e0',1,'mrs_lib::get_mutexed(std::mutex &mut, T &arg)']]], + ['get_5fset_5fmutexed_95',['get_set_mutexed',['../namespacemrs__lib.html#ae41b720a78b36db5ac51d8213972d001',1,'mrs_lib']]], + ['getcap_96',['getCap',['../classmrs__lib_1_1geometry_1_1Cylinder.html#a9730caea8c6bd44467038a8e04212fe6',1,'mrs_lib::geometry::Cylinder::getCap()'],['../classmrs__lib_1_1geometry_1_1Cone.html#a2e0546bb5ccb22ee88f1056dccc9a488',1,'mrs_lib::geometry::Cone::getCap()']]], + ['getextrinsicrpy_97',['getExtrinsicRPY',['../classmrs__lib_1_1AttitudeConverter.html#a0a9b9b0d146b4ccdc50c9a9037aec346',1,'mrs_lib::AttitudeConverter']]], + ['getheading_98',['getHeading',['../classmrs__lib_1_1AttitudeConverter.html#a6efdbb896bca9d52abdafb2eec0daf48',1,'mrs_lib::AttitudeConverter::getHeading()'],['../namespacemrs__lib.html#a193b468ac0f1b874af53c64ea0400236',1,'mrs_lib::getHeading(const geometry_msgs::Pose &data)'],['../namespacemrs__lib.html#a4c4a63d0de925cfa92316f6b5be78169',1,'mrs_lib::getHeading(const geometry_msgs::PoseConstPtr &data)'],['../namespacemrs__lib.html#ab57f24ac15517d030da375dfd6b27f2a',1,'mrs_lib::getHeading(const geometry_msgs::PoseWithCovariance &data)'],['../namespacemrs__lib.html#a0006b1926f70e598a4f22d0a4d0fd177',1,'mrs_lib::getHeading(const geometry_msgs::PoseWithCovarianceConstPtr &data)'],['../namespacemrs__lib.html#a482e880bcf945677389dcab02597e90f',1,'mrs_lib::getHeading(const nav_msgs::Odometry &data)'],['../namespacemrs__lib.html#aba8b3d81b8855577fbe90fc9a2f84fb6',1,'mrs_lib::getHeading(const nav_msgs::OdometryConstPtr &data)'],['../namespacemrs__lib.html#ad3594a3b11dd4b67c42c25e3caba896e',1,'mrs_lib::getHeading(const mrs_msgs::TrackerCommand &data)'],['../namespacemrs__lib.html#adfa03f341e40b1999bc66cdf066b714e',1,'mrs_lib::getHeading(const mrs_msgs::TrackerCommandConstPtr &data)'],['../namespacemrs__lib.html#af4481d1d612b63a2c63f9e2dac6aaa3c',1,'mrs_lib::getHeading(const mrs_msgs::Reference &data)'],['../namespacemrs__lib.html#a0285b59825283d220c6b3501853a2b28',1,'mrs_lib::getHeading(const mrs_msgs::ReferenceConstPtr &data)'],['../namespacemrs__lib.html#a58888855de6c5e0e9c0e9d9340299e54',1,'mrs_lib::getHeading(const mrs_msgs::ReferenceStamped &data)'],['../namespacemrs__lib.html#acfd8813200df68fad24ad3051f6b4a3d',1,'mrs_lib::getHeading(const mrs_msgs::ReferenceStampedConstPtr &data)']]], + ['getheadingexception_99',['GetHeadingException',['../structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException.html',1,'mrs_lib::AttitudeConverter']]], + ['getheadingrate_100',['getHeadingRate',['../classmrs__lib_1_1AttitudeConverter.html#ab3ac6086b34f743ac5e78249640eeddd',1,'mrs_lib::AttitudeConverter']]], + ['getintrinsicrpy_101',['getIntrinsicRPY',['../classmrs__lib_1_1AttitudeConverter.html#abe03466ce1c2aefb74d402a3f1433693',1,'mrs_lib::AttitudeConverter']]], + ['getlifetime_102',['getLifetime',['../classmrs__lib_1_1ScopeTimer.html#abe8dc75be918b3a2ca7bbb043a022106',1,'mrs_lib::ScopeTimer']]], + ['getlogfilepath_103',['getLogFilepath',['../classmrs__lib_1_1ScopeTimerLogger.html#addb114f39d72c3c3ee2ea8a4074cf455',1,'mrs_lib::ScopeTimerLogger']]], + ['getmsg_104',['getMsg',['../classmrs__lib_1_1SubscribeHandler.html#a19a708c3f200ccfac2695a649b9d6e77',1,'mrs_lib::SubscribeHandler']]], + ['getnumsubscribers_105',['getNumSubscribers',['../classmrs__lib_1_1PublisherHandler__impl.html#a2043d0a61e0ff0dbd0acd6a64f1e4bef',1,'mrs_lib::PublisherHandler_impl::getNumSubscribers()'],['../classmrs__lib_1_1PublisherHandler.html#acae5a82536022514c6a2cefa2f7980b1',1,'mrs_lib::PublisherHandler::getNumSubscribers()']]], + ['getparam_106',['getParam',['../classmrs__lib_1_1ParamProvider.html#a6b3be6133e7eecc3f15b3c898c0911e0',1,'mrs_lib::ParamProvider::getParam(const std::string &param_name, T &value_out) const'],['../classmrs__lib_1_1ParamProvider.html#aa3106f4d258195b890e8583d485c7547',1,'mrs_lib::ParamProvider::getParam(const std::string &param_name, XmlRpc::XmlRpcValue &value_out) const']]], + ['getpitch_107',['getPitch',['../classmrs__lib_1_1AttitudeConverter.html#a599afad1265aaa6fd32d518e4de7817f',1,'mrs_lib::AttitudeConverter']]], + ['getpose_108',['getPose',['../namespacemrs__lib.html#a1cd3887061c0b071a29dbbfe1b8a11dd',1,'mrs_lib::getPose(const nav_msgs::Odometry &data)'],['../namespacemrs__lib.html#acb6bfcfa0d9432d2184852b4f4d2694b',1,'mrs_lib::getPose(const nav_msgs::OdometryConstPtr &data)']]], + ['getposition_109',['getPosition',['../namespacemrs__lib.html#aafe68a11e627c33f976dac00f49edb03',1,'mrs_lib::getPosition(const geometry_msgs::Pose &data)'],['../namespacemrs__lib.html#a6ee4630b5dd76e9c67f00e7f4ce35806',1,'mrs_lib::getPosition(const geometry_msgs::PoseConstPtr &data)'],['../namespacemrs__lib.html#a4a813c8d2b7a92090ef94ed0ccc1f2d7',1,'mrs_lib::getPosition(const geometry_msgs::PoseWithCovariance &data)'],['../namespacemrs__lib.html#a2f32a3fa1e335cf1c33833ef33838f36',1,'mrs_lib::getPosition(const geometry_msgs::PoseWithCovarianceConstPtr &data)'],['../namespacemrs__lib.html#af2a47eec589a6a62199f9fa2b4879d5b',1,'mrs_lib::getPosition(const geometry_msgs::TwistConstPtr &data)'],['../namespacemrs__lib.html#addf482f99d48899ccf29a9e89eb5771e',1,'mrs_lib::getPosition(const geometry_msgs::TwistWithCovarianceConstPtr &data)'],['../namespacemrs__lib.html#a6beef9718623cdac64b8b5ea35c8be4a',1,'mrs_lib::getPosition(const nav_msgs::Odometry &data)'],['../namespacemrs__lib.html#a52981dc7eab7573aedf1d447cb40b1fb',1,'mrs_lib::getPosition(const nav_msgs::OdometryConstPtr &data)'],['../namespacemrs__lib.html#a4c51dc5a87098b8ecd7d7e78599be7b8',1,'mrs_lib::getPosition(const mrs_msgs::TrackerCommand &data)'],['../namespacemrs__lib.html#af85023d127c2383e6825ab7e4f7da1fb',1,'mrs_lib::getPosition(const mrs_msgs::TrackerCommandConstPtr &data)'],['../namespacemrs__lib.html#a8f78d985e8d87688482e5e30c948b067',1,'mrs_lib::getPosition(const mrs_msgs::Reference &data)'],['../namespacemrs__lib.html#aa767373d0d66e633d754d5fa4db1afca',1,'mrs_lib::getPosition(const mrs_msgs::ReferenceConstPtr &data)'],['../namespacemrs__lib.html#aa1c31d89c94806084e8da6fecd4ff575',1,'mrs_lib::getPosition(const mrs_msgs::ReferenceStamped &data)'],['../namespacemrs__lib.html#ae4a1dc71e3e48fa26fa8d2fed9211c8c',1,'mrs_lib::getPosition(const mrs_msgs::ReferenceStampedConstPtr &data)']]], + ['getprefix_110',['getPrefix',['../classmrs__lib_1_1ParamLoader.html#a68eb35df103229cd2de7416252723bf8',1,'mrs_lib::ParamLoader']]], + ['getrectangle_111',['getRectangle',['../classmrs__lib_1_1geometry_1_1Cuboid.html#a4279ad2916689b183e9647fbede9bcfb',1,'mrs_lib::geometry::Cuboid']]], + ['getroll_112',['getRoll',['../classmrs__lib_1_1AttitudeConverter.html#a82b32b4b7ff4de5bcf78b168f0c3c569',1,'mrs_lib::AttitudeConverter']]], + ['gettransform_113',['getTransform',['../classmrs__lib_1_1Transformer.html#a3a29dfb385f1b9c4deee695181880995',1,'mrs_lib::Transformer::getTransform(const std::string &from_frame, const std::string &to_frame, const ros::Time &time_stamp=ros::Time(0))'],['../classmrs__lib_1_1Transformer.html#a73ce6b60499d9ed491859a444f8d8afd',1,'mrs_lib::Transformer::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)']]], + ['getvectorx_114',['getVectorX',['../classmrs__lib_1_1AttitudeConverter.html#a131f7ba8484bd0c7465594625d19ae89',1,'mrs_lib::AttitudeConverter']]], + ['getvectory_115',['getVectorY',['../classmrs__lib_1_1AttitudeConverter.html#a901ca23ee140e6d42027b242f0dfac8b',1,'mrs_lib::AttitudeConverter']]], + ['getvectorz_116',['getVectorZ',['../classmrs__lib_1_1AttitudeConverter.html#a4853f4582b8af4f224726d15a18e9fbc',1,'mrs_lib::AttitudeConverter']]], + ['getvelocity_117',['getVelocity',['../namespacemrs__lib.html#a6e64da46123dd4cc793419585a66e54c',1,'mrs_lib::getVelocity(const geometry_msgs::Twist &data)'],['../namespacemrs__lib.html#a0669aa00311586cf9882f1bccff07d16',1,'mrs_lib::getVelocity(const geometry_msgs::TwistWithCovariance &data)'],['../namespacemrs__lib.html#aab2704bf692a6cfc5674272fc6ff06ca',1,'mrs_lib::getVelocity(const nav_msgs::Odometry &data)'],['../namespacemrs__lib.html#af8c731a97cd737d35d9524ec60f4ee2f',1,'mrs_lib::getVelocity(const nav_msgs::OdometryConstPtr &data)'],['../namespacemrs__lib.html#ade26d077c3e43c9f201a2e8d73dba2b7',1,'mrs_lib::getVelocity(const mrs_msgs::TrackerCommand &data)'],['../namespacemrs__lib.html#ad278e1089b273b3e0216977ee8df8ac5',1,'mrs_lib::getVelocity(const mrs_msgs::TrackerCommandConstPtr &data)']]], + ['getxyz_118',['getXYZ',['../namespacemrs__lib.html#a9ad821408d076d95467fc662b1dac1ab',1,'mrs_lib::getXYZ(const geometry_msgs::Point &data)'],['../namespacemrs__lib.html#a8fc9b477f93c9b8694fb8f90956ae830',1,'mrs_lib::getXYZ(const geometry_msgs::PointConstPtr &data)'],['../namespacemrs__lib.html#af79ccb18192e6ff1f1fc7fdafdee0a0b',1,'mrs_lib::getXYZ(const geometry_msgs::Vector3 &data)'],['../namespacemrs__lib.html#a32ae31e9589cb55806ec32edcf79f928',1,'mrs_lib::getXYZ(const geometry_msgs::Vector3ConstPtr &data)']]], + ['getyaw_119',['getYaw',['../classmrs__lib_1_1AttitudeConverter.html#ab2e8185898d05e5c2c9f7c7bf597f9a3',1,'mrs_lib::AttitudeConverter::getYaw()'],['../namespacemrs__lib.html#af1993419f7b19d38bdbfe3ceb5b7350f',1,'mrs_lib::getYaw(const geometry_msgs::Pose &data)'],['../namespacemrs__lib.html#acc3f167cadca01d5e92be7dc43078feb',1,'mrs_lib::getYaw(const geometry_msgs::PoseConstPtr &data)'],['../namespacemrs__lib.html#a13152460c1973b54f71f230340b20494',1,'mrs_lib::getYaw(const geometry_msgs::PoseWithCovariance &data)'],['../namespacemrs__lib.html#a2aa307f37eb6f60fc4d360adb8559946',1,'mrs_lib::getYaw(const geometry_msgs::PoseWithCovarianceConstPtr &data)'],['../namespacemrs__lib.html#af17cc11983807fb3d6bd17092fa30fc4',1,'mrs_lib::getYaw(const nav_msgs::Odometry &data)'],['../namespacemrs__lib.html#af62f21eed6f44954b6aefbf0afbbf2e0',1,'mrs_lib::getYaw(const nav_msgs::OdometryConstPtr &data)']]], + ['getyawrateintrinsic_120',['getYawRateIntrinsic',['../classmrs__lib_1_1AttitudeConverter.html#afa7a3ddc0e143fe90bd966a6ba9f2913',1,'mrs_lib::AttitudeConverter']]], + ['gps_5fconversions_2eh_121',['gps_conversions.h',['../gps__conversions_8h.html',1,'']]] +]; diff --git a/search/all_7.html b/search/all_7.html new file mode 100644 index 00000000..af52f82a --- /dev/null +++ b/search/all_7.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_7.js b/search/all_7.js new file mode 100644 index 00000000..39c74c15 --- /dev/null +++ b/search/all_7.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['h_122',['H',['../classmrs__lib_1_1LKF.html#a552fedb99ce43148c212c809dcd8191f',1,'mrs_lib::LKF::H()'],['../classmrs__lib_1_1geometry_1_1Cylinder.html#a730fee04b106aa4ec3fe08be6bb90751',1,'mrs_lib::geometry::Cylinder::h()'],['../classmrs__lib_1_1geometry_1_1Cone.html#a319fa2045f6d56c94f3fa198bd7ae7fc',1,'mrs_lib::geometry::Cone::h()']]], + ['h_5ft_123',['H_t',['../classmrs__lib_1_1DKF.html#aaee9d5c96d921fa7854f24460edf58ab',1,'mrs_lib::DKF::H_t()'],['../classmrs__lib_1_1JLKF.html#a7599ec962b434fe92534a58d48cdfacb',1,'mrs_lib::JLKF::H_t()'],['../classmrs__lib_1_1LKF.html#a78733a13f277480c5c8c42228d440df7',1,'mrs_lib::LKF::H_t()'],['../classmrs__lib_1_1NCLKF.html#a92eb1e6f9fe04297bb54fdfbdc74d460',1,'mrs_lib::NCLKF::H_t()'],['../classmrs__lib_1_1NCLKF__partial.html#a12079d59b1f0e949c535e478d8e1d88c',1,'mrs_lib::NCLKF_partial::H_t()']]], + ['half_5frange_124',['half_range',['../structmrs__lib_1_1geometry_1_1cyclic.html#a78cd52e438886de479af6455e97da2b6',1,'mrs_lib::geometry::cyclic']]], + ['hasmsg_125',['hasMsg',['../classmrs__lib_1_1SubscribeHandler.html#a9c6bcd07e10b60c70f02de2c6d5f632e',1,'mrs_lib::SubscribeHandler']]], + ['haversin_126',['haversin',['../misc_8h.html#a61d1dcf236aac255d384e35efd67370e',1,'mrs_lib::geometry']]], + ['headingfromrot_127',['headingFromRot',['../misc_8h.html#ac5072a0343d0cfe703ddce456e7c5756',1,'mrs_lib::geometry']]], + ['hq_5ft_128',['Hq_t',['../classmrs__lib_1_1NCLKF__partial.html#a6f311605a0470b290c6917d555bb4c9a',1,'mrs_lib::NCLKF_partial']]] +]; diff --git a/search/all_8.html b/search/all_8.html new file mode 100644 index 00000000..cf2b5df9 --- /dev/null +++ b/search/all_8.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_8.js b/search/all_8.js new file mode 100644 index 00000000..cddd2143 --- /dev/null +++ b/search/all_8.js @@ -0,0 +1,22 @@ +var searchData= +[ + ['iir_5ffilter_2eh_129',['iir_filter.h',['../iir__filter_8h.html',1,'']]], + ['iirfilter_130',['IirFilter',['../classmrs__lib_1_1IirFilter.html',1,'mrs_lib']]], + ['imagepubliserdata_131',['ImagePubliserData',['../structmrs__lib_1_1ImagePubliserData.html',1,'mrs_lib']]], + ['imagepublisher_132',['ImagePublisher',['../classmrs__lib_1_1ImagePublisher.html',1,'mrs_lib']]], + ['impl_133',['impl',['../classDynamicPublisher_1_1impl.html',1,'DynamicPublisher::impl'],['../classmrs__lib_1_1SubscribeHandler_1_1Impl.html',1,'mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >'],['../classThreadTimer_1_1Impl.html',1,'ThreadTimer::Impl']]], + ['implthreadsafe_134',['ImplThreadsafe',['../classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe.html',1,'mrs_lib::SubscribeHandler']]], + ['indices_5ft_135',['indices_t',['../classmrs__lib_1_1NCLKF__partial.html#a93afd8063033124c0698426cd03d4507',1,'mrs_lib::NCLKF_partial']]], + ['initialize_136',['initialize',['../classmrs__lib_1_1ServiceClientHandler.html#adff9526494a62051bf864ef6a7178450',1,'mrs_lib::ServiceClientHandler']]], + ['initialized_137',['initialized',['../classmrs__lib_1_1MedianFilter.html#a843ddc70b6daf92fa91f225fab5b36f7',1,'mrs_lib::MedianFilter']]], + ['inrange_138',['inRange',['../structmrs__lib_1_1geometry_1_1cyclic.html#ae7ff9988f0d3ef6cf3bd724f3e29273b',1,'mrs_lib::geometry::cyclic']]], + ['interp_139',['interp',['../structmrs__lib_1_1geometry_1_1cyclic.html#afe8344d8017f4ed883ecc28379465d99',1,'mrs_lib::geometry::cyclic']]], + ['interpunwrapped_140',['interpUnwrapped',['../structmrs__lib_1_1geometry_1_1cyclic.html#a1c2837eea4d0635833a786d571922d76',1,'mrs_lib::geometry::cyclic']]], + ['intersection_141',['Intersection',['../structmrs__lib_1_1Intersection.html',1,'mrs_lib']]], + ['intersectionray_142',['intersectionRay',['../classmrs__lib_1_1geometry_1_1Triangle.html#a94238065a0e8d0c27135f55e1daa4ed3',1,'mrs_lib::geometry::Triangle::intersectionRay()'],['../classmrs__lib_1_1geometry_1_1Rectangle.html#a0b92252c39c755b3a7cba989fbb5c854',1,'mrs_lib::geometry::Rectangle::intersectionRay()'],['../classmrs__lib_1_1geometry_1_1Cuboid.html#adfde2a501c9806bd6e6e99dcf0cac6ff',1,'mrs_lib::geometry::Cuboid::intersectionRay()']]], + ['invalidattitudeexception_143',['InvalidAttitudeException',['../structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException.html',1,'mrs_lib::AttitudeConverter']]], + ['inverse_144',['inverse',['../classmrs__lib_1_1Transformer.html#a17440196c1c894e265f77b0b9112336a',1,'mrs_lib::Transformer']]], + ['inverse_5fexception_145',['inverse_exception',['../structmrs__lib_1_1JLKF_1_1inverse__exception.html',1,'mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >::inverse_exception'],['../structmrs__lib_1_1UKF_1_1inverse__exception.html',1,'mrs_lib::UKF< n_states, n_inputs, n_measurements >::inverse_exception'],['../structmrs__lib_1_1LKF_1_1inverse__exception.html',1,'mrs_lib::LKF< n_states, n_inputs, n_measurements >::inverse_exception']]], + ['invhaversin_146',['invHaversin',['../misc_8h.html#a600a2f5b7f1e654339f7177f9a64934c',1,'mrs_lib::geometry']]], + ['isfacing_147',['isFacing',['../classmrs__lib_1_1geometry_1_1Rectangle.html#a62a1b7d39bd141d4c38d8079d43ffe02',1,'mrs_lib::geometry::Rectangle']]] +]; diff --git a/search/all_9.html b/search/all_9.html new file mode 100644 index 00000000..690785a5 --- /dev/null +++ b/search/all_9.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_9.js b/search/all_9.js new file mode 100644 index 00000000..fb3897a5 --- /dev/null +++ b/search/all_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['jlkf_148',['JLKF',['../classmrs__lib_1_1JLKF.html',1,'mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >'],['../classmrs__lib_1_1JLKF.html#a0c21f3599fe8ccfb1164ee204a0ae606',1,'mrs_lib::JLKF::JLKF()']]] +]; diff --git a/search/all_a.html b/search/all_a.html new file mode 100644 index 00000000..f2f3d3a3 --- /dev/null +++ b/search/all_a.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_a.js b/search/all_a.js new file mode 100644 index 00000000..e8df0e07 --- /dev/null +++ b/search/all_a.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['k_149',['k',['../classmrs__lib_1_1RHEIV.html#a8d5b4a0df9a65eaf7127a6d93b38bf5e',1,'mrs_lib::RHEIV']]], + ['k_5ft_150',['K_t',['../classmrs__lib_1_1DKF.html#a87d3b7863fbd0b392f9c831fcaf8e345',1,'mrs_lib::DKF::K_t()'],['../classmrs__lib_1_1JLKF.html#a20be98f26b355640d078f196f9495fd5',1,'mrs_lib::JLKF::K_t()'],['../classmrs__lib_1_1LKF.html#a33b80f4e1b9b7eb7243b71a4ae6d99c6',1,'mrs_lib::LKF::K_t()'],['../classmrs__lib_1_1NCLKF.html#ae2d30fe948b17723e0a89450044f8f93',1,'mrs_lib::NCLKF::K_t()'],['../classmrs__lib_1_1NCLKF__partial.html#a47b90d150c6147ab30ae1866b66ea49c',1,'mrs_lib::NCLKF_partial::K_t()'],['../classmrs__lib_1_1UKF.html#ace5416fd8ac52fba822337bceaf751a7',1,'mrs_lib::UKF::K_t()']]], + ['kalman_5ffilter_2eh_151',['kalman_filter.h',['../kalman__filter_8h.html',1,'']]], + ['kalman_5ffilter_5faloamgarm_2eh_152',['kalman_filter_aloamgarm.h',['../kalman__filter__aloamgarm_8h.html',1,'']]], + ['kalmanfilter_153',['KalmanFilter',['../classmrs__lib_1_1KalmanFilter.html',1,'mrs_lib']]], + ['kalmanfilteraloamgarm_154',['KalmanFilterAloamGarm',['../classmrs__lib_1_1KalmanFilterAloamGarm.html',1,'mrs_lib']]], + ['kq_5ft_155',['Kq_t',['../classmrs__lib_1_1NCLKF__partial.html#a459ce71ac559eb881415485df4d622fa',1,'mrs_lib::NCLKF_partial']]] +]; diff --git a/search/all_b.html b/search/all_b.html new file mode 100644 index 00000000..14f34036 --- /dev/null +++ b/search/all_b.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_b.js b/search/all_b.js new file mode 100644 index 00000000..e40bcb93 --- /dev/null +++ b/search/all_b.js @@ -0,0 +1,23 @@ +var searchData= +[ + ['l_156',['l',['../classmrs__lib_1_1RHEIV.html#a1495045a8f4fca1f045da6866f5e62b0',1,'mrs_lib::RHEIV']]], + ['lastmsgtime_157',['lastMsgTime',['../classmrs__lib_1_1SubscribeHandler.html#ab96777b29e74827ad109346504565f9b',1,'mrs_lib::SubscribeHandler']]], + ['lkf_158',['LKF',['../classmrs__lib_1_1LKF.html',1,'mrs_lib::LKF< n_states, n_inputs, n_measurements >'],['../classmrs__lib_1_1LKF.html#aecd505e79c0102609c9e5ffbd91a7cc3',1,'mrs_lib::LKF::LKF()'],['../classmrs__lib_1_1LKF.html#a8bb9eee4045a176b56c28bc7e0113fa0',1,'mrs_lib::LKF::LKF(const A_t &A, const B_t &B, const H_t &H)']]], + ['lkf_3c_203_2c_20_2d1_2c_202_20_3e_159',['LKF< 3, -1, 2 >',['../classmrs__lib_1_1LKF.html',1,'mrs_lib']]], + ['lkf_3c_203_2c_201_2c_201_20_3e_160',['LKF< 3, 1, 1 >',['../classmrs__lib_1_1LKF.html',1,'mrs_lib']]], + ['lkf_5fmrs_5fodom_161',['LKF_MRS_odom',['../classmrs__lib_1_1LKF__MRS__odom.html',1,'mrs_lib']]], + ['loadedsuccessfully_162',['loadedSuccessfully',['../classmrs__lib_1_1ParamLoader.html#ad49130b893f09bc2247e2bc37a41f6d5',1,'mrs_lib::ParamLoader']]], + ['loadmatrixarray_163',['loadMatrixArray',['../classmrs__lib_1_1ParamLoader.html#af5397147ce0a3ecaf0e1f178a9435183',1,'mrs_lib::ParamLoader::loadMatrixArray(const std::string &name, std::vector< MatrixX< T >> &mat)'],['../classmrs__lib_1_1ParamLoader.html#aaeaec89a76f044b2e5fe2883ae768942',1,'mrs_lib::ParamLoader::loadMatrixArray(const std::string &name, std::vector< MatrixX< T >> &mat, const std::vector< MatrixX< T >> &default_value)']]], + ['loadmatrixarray2_164',['loadMatrixArray2',['../classmrs__lib_1_1ParamLoader.html#af7ffe39a26bd4a457ab01b83e5d5795d',1,'mrs_lib::ParamLoader::loadMatrixArray2(const std::string &name)'],['../classmrs__lib_1_1ParamLoader.html#a46bb91300eaa5c0d06d462b950f92897',1,'mrs_lib::ParamLoader::loadMatrixArray2(const std::string &name, const std::vector< MatrixX< T >> &default_value)']]], + ['loadmatrixdynamic_165',['loadMatrixDynamic',['../classmrs__lib_1_1ParamLoader.html#aabecb03ea3643752ddc3154e6c58d390',1,'mrs_lib::ParamLoader::loadMatrixDynamic(const std::string &name, MatrixX< T > &mat, int rows, int cols)'],['../classmrs__lib_1_1ParamLoader.html#a6b1fbdb2c1ed41ac533a67abad8638d9',1,'mrs_lib::ParamLoader::loadMatrixDynamic(const std::string &name, MatrixX< T > &mat, const Eigen::MatrixBase< Derived > &default_value, int rows, int cols)']]], + ['loadmatrixdynamic2_166',['loadMatrixDynamic2',['../classmrs__lib_1_1ParamLoader.html#a89bdbb61a1de508cc0f247f234d824d6',1,'mrs_lib::ParamLoader::loadMatrixDynamic2(const std::string &name, int rows, int cols)'],['../classmrs__lib_1_1ParamLoader.html#a99673cb2d8f39c18da5e6db967238ec9',1,'mrs_lib::ParamLoader::loadMatrixDynamic2(const std::string &name, const Eigen::MatrixBase< Derived > &default_value, int rows, int cols)']]], + ['loadmatrixstatic_167',['loadMatrixStatic',['../classmrs__lib_1_1ParamLoader.html#a03dc26f5fad92b0fb8b7437c074b23aa',1,'mrs_lib::ParamLoader::loadMatrixStatic(const std::string &name, Eigen::Matrix< T, rows, cols > &mat)'],['../classmrs__lib_1_1ParamLoader.html#a19bc5cbd5c3ee7d4614555dfe3d96001',1,'mrs_lib::ParamLoader::loadMatrixStatic(const std::string &name, Eigen::Matrix< T, rows, cols > &mat, const Eigen::MatrixBase< Derived > &default_value)'],['../classmrs__lib_1_1ParamLoader.html#aafc3bb716f3728d5a1b1cfc45b0d3ddf',1,'mrs_lib::ParamLoader::loadMatrixStatic(const std::string &name, MatrixX< T > &mat, int rows, int cols)'],['../classmrs__lib_1_1ParamLoader.html#af96b60fd7bce95d3e1d3aa351bccba9b',1,'mrs_lib::ParamLoader::loadMatrixStatic(const std::string &name, MatrixX< T > &mat, const Eigen::MatrixBase< Derived > &default_value, int rows, int cols)']]], + ['loadmatrixstatic2_168',['loadMatrixStatic2',['../classmrs__lib_1_1ParamLoader.html#a2a78e5b64d8681a46976a6e9d0486b1a',1,'mrs_lib::ParamLoader::loadMatrixStatic2(const std::string &name)'],['../classmrs__lib_1_1ParamLoader.html#ab6b1b2b00e8548b092893afcfbeee79f',1,'mrs_lib::ParamLoader::loadMatrixStatic2(const std::string &name, const Eigen::MatrixBase< Derived > &default_value)'],['../classmrs__lib_1_1ParamLoader.html#af06e1f2bdf94f8a18a19ae3e77a0f99a',1,'mrs_lib::ParamLoader::loadMatrixStatic2(const std::string &name, int rows, int cols)'],['../classmrs__lib_1_1ParamLoader.html#af8ab00da18479e583adf86983e77c577',1,'mrs_lib::ParamLoader::loadMatrixStatic2(const std::string &name, const Eigen::MatrixBase< Derived > &default_value, int rows, int cols)']]], + ['loadparam_169',['loadParam',['../classmrs__lib_1_1ParamLoader.html#a9e55225fa7d9de0e948b2e64494eb229',1,'mrs_lib::ParamLoader::loadParam(const std::string &name, T &out_value, const T &default_value)'],['../classmrs__lib_1_1ParamLoader.html#af5d9f2ac1549f9a7f03a04b9cebf9fed',1,'mrs_lib::ParamLoader::loadParam(const std::string &name, T &out_value)'],['../classmrs__lib_1_1ParamLoader.html#a5368f22f9c1eee287b39bcc91b8d8f42',1,'mrs_lib::ParamLoader::loadParam(const std::string &name, ros::Duration &out, const ros::Duration &default_value)'],['../classmrs__lib_1_1ParamLoader.html#ae4893dc129c5f6fd07fc26f6c03279cd',1,'mrs_lib::ParamLoader::loadParam(const std::string &name, ros::Duration &out)'],['../classmrs__lib_1_1ParamLoader.html#a472acaab459f4318dc20df8416b6023d',1,'mrs_lib::ParamLoader::loadParam(const std::string &name, std_msgs::ColorRGBA &out, const std_msgs::ColorRGBA &default_value={})'],['../classmrs__lib_1_1ParamLoader.html#a297d547c380c4ca1eab5903fcbbc5f42',1,'mrs_lib::ParamLoader::loadParam(const std::string &name, XmlRpc::XmlRpcValue &out, const XmlRpc::XmlRpcValue &default_value)'],['../classmrs__lib_1_1ParamLoader.html#a759df0d67059a44f87d1205782d4e4f7',1,'mrs_lib::ParamLoader::loadParam(const std::string &name, XmlRpc::XmlRpcValue &out)'],['../classmrs__lib_1_1ParamLoader.html#a6ee4d78d716c92045a38c40d6ae41c4d',1,'mrs_lib::ParamLoader::loadParam(const std::string &name, MatrixX< T > &mat, const MatrixX< T > &default_value)']]], + ['loadparam2_170',['loadParam2',['../classmrs__lib_1_1ParamLoader.html#a7b31603059669efa75b00d8e73bc163a',1,'mrs_lib::ParamLoader::loadParam2(const std::string &name, const T &default_value)'],['../classmrs__lib_1_1ParamLoader.html#ab8a37a3b88261e120d6ff36a6aebf960',1,'mrs_lib::ParamLoader::loadParam2(const std::string &name)'],['../classmrs__lib_1_1ParamLoader.html#a708d62a49386efe8334d8c13af2d8f85',1,'mrs_lib::ParamLoader::loadParam2(const std::string &name, const std_msgs::ColorRGBA &default_value={})'],['../classmrs__lib_1_1ParamLoader.html#a880ad3b0f30ecd7b7742766253422c6a',1,'mrs_lib::ParamLoader::loadParam2(const std::string &name, const XmlRpc::XmlRpcValue &default_value)'],['../classmrs__lib_1_1ParamLoader.html#a080f2c2605b42219c63d62d0fd8e0948',1,'mrs_lib::ParamLoader::loadParam2(const std::string &name, const MatrixX< T > &default_value)']]], + ['loadparamreusable_171',['loadParamReusable',['../classmrs__lib_1_1ParamLoader.html#add294058e4857eda6a8ece7e0b451390',1,'mrs_lib::ParamLoader::loadParamReusable(const std::string &name, T &out_value, const T &default_value)'],['../classmrs__lib_1_1ParamLoader.html#a31b36d7e1109d2c1d663122c689359c0',1,'mrs_lib::ParamLoader::loadParamReusable(const std::string &name, T &out_value)']]], + ['loadparamreusable2_172',['loadParamReusable2',['../classmrs__lib_1_1ParamLoader.html#ae3e15767c2e94a1f22a9205ae3f507f1',1,'mrs_lib::ParamLoader::loadParamReusable2(const std::string &name, const T &default_value)'],['../classmrs__lib_1_1ParamLoader.html#abe9a7f5aea80c8cdb2d624c12f098a90',1,'mrs_lib::ParamLoader::loadParamReusable2(const std::string &name)']]], + ['log_173',['log',['../classmrs__lib_1_1ScopeTimerLogger.html#a98f7fe29f151e4d0b88952530f40ef06',1,'mrs_lib::ScopeTimerLogger::log(const std::string &scope, const chrono_tp &time_start, const chrono_tp &time_end)'],['../classmrs__lib_1_1ScopeTimerLogger.html#a8f3794f5477960606a86543ddb708b1f',1,'mrs_lib::ScopeTimerLogger::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)']]], + ['loggingenabled_174',['loggingEnabled',['../classmrs__lib_1_1ScopeTimerLogger.html#aaf51a60a214ab18976a354c328fc9d09',1,'mrs_lib::ScopeTimerLogger']]], + ['lr_175',['lr',['../classmrs__lib_1_1RHEIV.html#af267a00d1631e4685e5a1451f2510ac0',1,'mrs_lib::RHEIV']]] +]; diff --git a/search/all_c.html b/search/all_c.html new file mode 100644 index 00000000..da60ab8d --- /dev/null +++ b/search/all_c.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_c.js b/search/all_c.js new file mode 100644 index 00000000..1a271a81 --- /dev/null +++ b/search/all_c.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['mrs_20libraries_176',['MRS libraries',['../index.html',1,'']]], + ['m_177',['m',['../classmrs__lib_1_1DKF.html#a266b963fd1ed94246fc413ecfa510e54',1,'mrs_lib::DKF::m()'],['../classmrs__lib_1_1KalmanFilter.html#a472b37319b5dabb8cd4e4146bd86b8bf',1,'mrs_lib::KalmanFilter::m()'],['../classmrs__lib_1_1KalmanFilterAloamGarm.html#a336bd0445bfa4ca091dda05d0f83757b',1,'mrs_lib::KalmanFilterAloamGarm::m()'],['../classmrs__lib_1_1LKF.html#ab2132e00d769c35bf4c89760b1f7da2f',1,'mrs_lib::LKF::m()'],['../classmrs__lib_1_1NCLKF.html#a4b3f2c1a84f0e0000d3d191c9f337306',1,'mrs_lib::NCLKF::m()'],['../classmrs__lib_1_1NCLKF__partial.html#a748e915398e1ff3c09675bfcb1af7985',1,'mrs_lib::NCLKF_partial::m()'],['../classmrs__lib_1_1UKF.html#a81c0e0d290f9eb1aecd28b0e0fa3b7ce',1,'mrs_lib::UKF::m()']]], + ['math_2eh_178',['math.h',['../math_8h.html',1,'']]], + ['matherrorexception_179',['MathErrorException',['../structmrs__lib_1_1AttitudeConverter_1_1MathErrorException.html',1,'mrs_lib::AttitudeConverter']]], + ['median_180',['median',['../classmrs__lib_1_1MedianFilter.html#a53562ea9addbf12ba3cd257cdede4af6',1,'mrs_lib::MedianFilter']]], + ['median_5ffilter_2eh_181',['median_filter.h',['../median__filter_8h.html',1,'']]], + ['medianfilter_182',['MedianFilter',['../classmrs__lib_1_1MedianFilter.html',1,'mrs_lib::MedianFilter'],['../classmrs__lib_1_1MedianFilter.html#a6c6bd20d15d66535b900634396e99f51',1,'mrs_lib::MedianFilter::MedianFilter(const size_t buffer_length, const double min_value=-std::numeric_limits< double >::infinity(), const double max_value=std::numeric_limits< double >::infinity(), const double max_diff=std::numeric_limits< double >::infinity())'],['../classmrs__lib_1_1MedianFilter.html#ae810bd254e4fccfeb883b4585062f166',1,'mrs_lib::MedianFilter::MedianFilter()'],['../classmrs__lib_1_1MedianFilter.html#aa17291d605ef5364db2835745a2c669c',1,'mrs_lib::MedianFilter::MedianFilter(const MedianFilter &other)'],['../classmrs__lib_1_1MedianFilter.html#a46da8f440b739a1d01710104fc38611c',1,'mrs_lib::MedianFilter::MedianFilter(MedianFilter &&other)']]], + ['message_5fcallback_5ft_183',['message_callback_t',['../classmrs__lib_1_1SubscribeHandler.html#a38b7371b24896e5ea21f5a8dd2821cf6',1,'mrs_lib::SubscribeHandler']]], + ['message_5ftype_184',['message_type',['../classmrs__lib_1_1SubscribeHandler.html#aab546ccb302e3e05d8e97e9085f62b9a',1,'mrs_lib::SubscribeHandler::message_type()'],['../namespacemrs__lib.html#afe10d9f91cc2173fa3c30021514a5c12',1,'mrs_lib::message_type()']]], + ['minimum_185',['minimum',['../structmrs__lib_1_1geometry_1_1cyclic.html#ada8bf8d17bfa81025b75d5a4e1da8ac0',1,'mrs_lib::geometry::cyclic']]], + ['misc_2eh_186',['misc.h',['../misc_8h.html',1,'']]], + ['modelptr_187',['ModelPtr',['../classmrs__lib_1_1Repredictor.html#acb4a34d97aab3896de9565012a890381',1,'mrs_lib::Repredictor::ModelPtr()'],['../classmrs__lib_1_1RepredictorAloamgarm.html#a7766d3dbccd04fcbe584cca6730153ca',1,'mrs_lib::RepredictorAloamgarm::ModelPtr()']]], + ['motorparams_5ft_188',['MotorParams_t',['../structmrs__lib_1_1quadratic__throttle__model_1_1MotorParams__t.html',1,'mrs_lib::quadratic_throttle_model']]], + ['mrs_5flib_189',['mrs_lib',['../namespacemrs__lib.html',1,'']]], + ['mrstimer_190',['MRSTimer',['../classmrs__lib_1_1MRSTimer.html',1,'mrs_lib']]], + ['msg_5fextractor_2eh_191',['msg_extractor.h',['../msg__extractor_8h.html',1,'']]], + ['mutex_2eh_192',['mutex.h',['../mutex_8h.html',1,'']]], + ['mypoint_193',['MyPoint',['../structMyPoint.html',1,'']]] +]; diff --git a/search/all_d.html b/search/all_d.html new file mode 100644 index 00000000..bc376fec --- /dev/null +++ b/search/all_d.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_d.js b/search/all_d.js new file mode 100644 index 00000000..ae384520 --- /dev/null +++ b/search/all_d.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['n_194',['n',['../classmrs__lib_1_1DKF.html#a1c8d43906017aca20230464f87c0a28c',1,'mrs_lib::DKF::n()'],['../classmrs__lib_1_1KalmanFilter.html#a33bade5cb8e189919bd7c5c7d81a75fd',1,'mrs_lib::KalmanFilter::n()'],['../classmrs__lib_1_1KalmanFilterAloamGarm.html#a7b9714f54a6ec03679cf3af571e4219a',1,'mrs_lib::KalmanFilterAloamGarm::n()'],['../classmrs__lib_1_1LKF.html#a23db0a12382876c56c4f696119a38dfb',1,'mrs_lib::LKF::n()'],['../classmrs__lib_1_1NCLKF.html#a8e0f671100fb36a431a1d2f6ed1df7b9',1,'mrs_lib::NCLKF::n()'],['../classmrs__lib_1_1NCLKF__partial.html#afa31bda8d042554992676389d464cfd9',1,'mrs_lib::NCLKF_partial::n()'],['../classmrs__lib_1_1UKF.html#a42270573cc14c2339a46841a5d3e264e',1,'mrs_lib::UKF::n()']]], + ['nckf_5ftests_2ecpp_195',['nckf_tests.cpp',['../nckf__tests_8cpp.html',1,'']]], + ['nclkf_196',['NCLKF',['../classmrs__lib_1_1NCLKF.html',1,'mrs_lib::NCLKF< n_states, n_inputs, n_measurements >'],['../classmrs__lib_1_1NCLKF.html#a5f970519deaccdbb021df412645f26d5',1,'mrs_lib::NCLKF::NCLKF()'],['../classmrs__lib_1_1NCLKF.html#aa4dcb47ceca9f506407e14858567ea09',1,'mrs_lib::NCLKF::NCLKF(const A_t &A, const B_t &B, const H_t &H, const double l)']]], + ['nclkf_5fpartial_197',['NCLKF_partial',['../classmrs__lib_1_1NCLKF__partial.html',1,'mrs_lib::NCLKF_partial< n_states, n_inputs, n_measurements, n_norm_constrained_states >'],['../classmrs__lib_1_1NCLKF__partial.html#aabe13461dda8a89463ce87888fd6e428',1,'mrs_lib::NCLKF_partial::NCLKF_partial()'],['../classmrs__lib_1_1NCLKF__partial.html#a1c6b3f2a9bd2d7cafe652d1bb24872e7',1,'mrs_lib::NCLKF_partial::NCLKF_partial(const A_t &A, const B_t &B, const H_t &H, const double l, const indices_t &norm_constrained_indices)']]], + ['ncukf_198',['NCUKF',['../classmrs__lib_1_1NCUKF.html',1,'mrs_lib']]], + ['newmsg_199',['newMsg',['../classmrs__lib_1_1SubscribeHandler.html#a46bde5660a9480814caa801e2baf3cd3',1,'mrs_lib::SubscribeHandler']]], + ['nh_200',['nh',['../structmrs__lib_1_1SubscribeHandlerOptions.html#ac5f6fabbc933d7e3f9beba07b166c054',1,'mrs_lib::SubscribeHandlerOptions']]], + ['no_5fmessage_5ftimeout_201',['no_message_timeout',['../structmrs__lib_1_1SubscribeHandlerOptions.html#a5702cb78ed291f5e36c960d0f90bb35c',1,'mrs_lib::SubscribeHandlerOptions']]], + ['node_5fname_202',['node_name',['../structmrs__lib_1_1SubscribeHandlerOptions.html#a3d31e2d693f41df180cd6911a3fb8310',1,'mrs_lib::SubscribeHandlerOptions']]], + ['normal_203',['normal',['../classmrs__lib_1_1geometry_1_1Triangle.html#ac9b355e443d37f91d83ab76bbfa35aa6',1,'mrs_lib::geometry::Triangle::normal()'],['../classmrs__lib_1_1geometry_1_1Rectangle.html#a5cf41dfd6e82f02c8bcc18bc134d235b',1,'mrs_lib::geometry::Rectangle::normal()']]], + ['notch_5ffilter_2eh_204',['notch_filter.h',['../notch__filter_8h.html',1,'']]], + ['notchfilter_205',['NotchFilter',['../classmrs__lib_1_1NotchFilter.html',1,'mrs_lib']]], + ['nq_206',['nq',['../classmrs__lib_1_1NCLKF__partial.html#a139afd8f356f87aa0faadea3e8878649',1,'mrs_lib::NCLKF_partial']]] +]; diff --git a/search/all_e.html b/search/all_e.html new file mode 100644 index 00000000..2e3c74dc --- /dev/null +++ b/search/all_e.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_e.js b/search/all_e.js new file mode 100644 index 00000000..ed49f87a --- /dev/null +++ b/search/all_e.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['angleaxis_3c_20t_20_3e_207',['AngleAxis< T >',['../classmrs__lib_1_1AttitudeConverter.html#a10847ba4ce35fa86efbe5933ba488183',1,'mrs_lib::AttitudeConverter']]], + ['matrix3x3_208',['Matrix3x3',['../classmrs__lib_1_1AttitudeConverter.html#a123b85369560e858a9d3aba19a49227a',1,'mrs_lib::AttitudeConverter']]], + ['obj_5ft_209',['obj_t',['../structobj__t.html',1,'']]], + ['observation_5fmodel_5ft_210',['observation_model_t',['../classmrs__lib_1_1UKF.html#ac515ea8c688d7ee67250c384417f9ab9',1,'mrs_lib::UKF']]], + ['operator_20eulerattitude_211',['operator EulerAttitude',['../classmrs__lib_1_1AttitudeConverter.html#a03ef9a1c10a9963e650fa217f0f04707',1,'mrs_lib::AttitudeConverter']]], + ['operator_2b_212',['operator+',['../structmrs__lib_1_1geometry_1_1cyclic.html#a58ca734b0e19c5f25da90761303451b7',1,'mrs_lib::geometry::cyclic']]], + ['operator_2b_3d_213',['operator+=',['../structmrs__lib_1_1geometry_1_1cyclic.html#a0d797e1245025227ede866ab08bcc19f',1,'mrs_lib::geometry::cyclic']]], + ['operator_2d_214',['operator-',['../structmrs__lib_1_1geometry_1_1cyclic.html#a9d401b110dd9e5372ffa4951f073e794',1,'mrs_lib::geometry::cyclic']]], + ['operator_2d_3d_215',['operator-=',['../structmrs__lib_1_1geometry_1_1cyclic.html#ad45609e5fa890a79729b100231e427da',1,'mrs_lib::geometry::cyclic']]], + ['operator_3c_216',['operator<',['../cyclic_8h.html#a8bb4c24541320f151f1781100c789cd3',1,'mrs_lib::geometry']]], + ['operator_3c_3c_217',['operator<<',['../cyclic_8h.html#aebc05b8cec59b7a37a72024e26a449f7',1,'mrs_lib::geometry']]], + ['operator_3d_218',['operator=',['../structmrs__lib_1_1geometry_1_1cyclic.html#a1ff6b499102b0eb290b6d121284c51ce',1,'mrs_lib::geometry::cyclic::operator=(const flt nval)'],['../structmrs__lib_1_1geometry_1_1cyclic.html#ace7e2ff831cf60311e28a70035114bcd',1,'mrs_lib::geometry::cyclic::operator=(const cyclic &other)'],['../structmrs__lib_1_1geometry_1_1cyclic.html#a8c81dca050a406b4225e8816a1955fb2',1,'mrs_lib::geometry::cyclic::operator=(cyclic &&other)'],['../classmrs__lib_1_1MedianFilter.html#ab30170b4f0d029c66e0a616936c7b693',1,'mrs_lib::MedianFilter::operator=(const MedianFilter &other)'],['../classmrs__lib_1_1MedianFilter.html#acc63d667e153c07ea9481eb0b3d74c54',1,'mrs_lib::MedianFilter::operator=(MedianFilter &&other)'],['../classmrs__lib_1_1Profiler.html#ae054cd2655538ee7b4a0dec35aa0cf16',1,'mrs_lib::Profiler::operator=()'],['../classmrs__lib_1_1PublisherHandler.html#a23a8578213fd78347ebaa259ee17c218',1,'mrs_lib::PublisherHandler::operator=()'],['../classmrs__lib_1_1ServiceClientHandler.html#a03d184432cd8b51f683746e87b071bdb',1,'mrs_lib::ServiceClientHandler::operator=()'],['../classmrs__lib_1_1Transformer.html#a6c4c846758bf173c7aeb488c8ff773b1',1,'mrs_lib::Transformer::operator=()']]], + ['operator_3e_219',['operator>',['../cyclic_8h.html#a60745f66bbc41c3cb323c8b1c3f050d7',1,'mrs_lib::geometry']]], + ['orientation_220',['orientation',['../classmrs__lib_1_1geometry_1_1Ellipse.html#a65f59ca228eea37a914ce0d6d6695b2d',1,'mrs_lib::geometry::Ellipse::orientation()'],['../classmrs__lib_1_1geometry_1_1Cylinder.html#aa7eccea15c92f1df02fc48684bb4d219',1,'mrs_lib::geometry::Cylinder::orientation()']]], + ['origin_221',['origin',['../classmrs__lib_1_1geometry_1_1Cone.html#a35b559777042218051ff46c3b7353232',1,'mrs_lib::geometry::Cone']]], + ['quaternion_222',['Quaternion',['../classmrs__lib_1_1AttitudeConverter.html#abc1686c5d27246a937c661f313ca13d0',1,'mrs_lib::AttitudeConverter::Quaternion() const'],['../classmrs__lib_1_1AttitudeConverter.html#a4dd088014d1f15da217c960e8a9dbd6f',1,'mrs_lib::AttitudeConverter::Quaternion() const'],['../classmrs__lib_1_1AttitudeConverter.html#a7b6d71e47ec12e76f25823ad408c704c',1,'mrs_lib::AttitudeConverter::Quaternion() const']]], + ['quaternion_3c_20t_20_3e_223',['Quaternion< T >',['../classmrs__lib_1_1AttitudeConverter.html#a6db421976b5060c086f495f00edca314',1,'mrs_lib::AttitudeConverter']]], + ['transform_224',['Transform',['../classmrs__lib_1_1AttitudeConverter.html#a09cd3459f52f9071db33c1ac7a5161de',1,'mrs_lib::AttitudeConverter']]], + ['tuple_3c_20double_20_26_2c_20double_20_26_2c_20double_20_26_20_3e_225',['tuple< double &, double &, double & >',['../classmrs__lib_1_1AttitudeConverter.html#a8f7e3a434632e7546149d64b2ab2e191',1,'mrs_lib::AttitudeConverter']]], + ['vector3_226',['Vector3',['../classmrs__lib_1_1Vector3Converter.html#a6f6edf59403aded9e3bffcd603cce5c0',1,'mrs_lib::Vector3Converter::Vector3() const'],['../classmrs__lib_1_1Vector3Converter.html#a96b9daae53786acb4f52e09e8fb7bc8a',1,'mrs_lib::Vector3Converter::Vector3() const']]], + ['vector3d_227',['Vector3d',['../classmrs__lib_1_1Vector3Converter.html#a69c3a9a8dbcff2876e40d28022c019e3',1,'mrs_lib::Vector3Converter']]] +]; diff --git a/search/all_f.html b/search/all_f.html new file mode 100644 index 00000000..246f8ab1 --- /dev/null +++ b/search/all_f.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_f.js b/search/all_f.js new file mode 100644 index 00000000..d519e64d --- /dev/null +++ b/search/all_f.js @@ -0,0 +1,30 @@ +var searchData= +[ + ['loadparam2_3c_20ros_3a_3aduration_20_3e_228',['loadParam2< ros::Duration >',['../namespacemrs__lib.html#a5edbd3a77e55f8ab165500ca05ad26f4',1,'mrs_lib::loadParam2< ros::Duration >(const std::string &name, const ros::Duration &default_value)'],['../namespacemrs__lib.html#a3b3a11cf5354658548afb9fd6f241d72',1,'mrs_lib::loadParam2< ros::Duration >(const std::string &name)']]], + ['p_229',['P',['../structmrs__lib_1_1KalmanFilter_1_1statecov__t.html#aa2747c6fd07bc3a4d9b2c153e38c11ff',1,'mrs_lib::KalmanFilter::statecov_t::P()'],['../structmrs__lib_1_1KalmanFilterAloamGarm_1_1statecov__t.html#a876ae3c9d4dafac63ddd0723fe351874',1,'mrs_lib::KalmanFilterAloamGarm::statecov_t::P()'],['../classmrs__lib_1_1DKF.html#afffd4a1421cb0ca08f75cd10c7cc2c78',1,'mrs_lib::DKF::p()'],['../classmrs__lib_1_1KalmanFilter.html#a72ed6c241094ce2b25fca0a97679a4c7',1,'mrs_lib::KalmanFilter::p()'],['../classmrs__lib_1_1KalmanFilterAloamGarm.html#aade8833d5835d0ee12be558e16fe595a',1,'mrs_lib::KalmanFilterAloamGarm::p()'],['../classmrs__lib_1_1LKF.html#a87db95f28f4834e801cd7fbd0e98e388',1,'mrs_lib::LKF::p()'],['../classmrs__lib_1_1NCLKF.html#adc5fb114b6abc3e2a72fbe4ed3ba0753',1,'mrs_lib::NCLKF::p()'],['../classmrs__lib_1_1NCLKF__partial.html#a2048d62a3e243b91802f6e85fcdcf2b3',1,'mrs_lib::NCLKF_partial::p()'],['../classmrs__lib_1_1UKF.html#a0042b2b7c0deb10b5bb2825f10c5d769',1,'mrs_lib::UKF::p()']]], + ['p1_230',['p1',['../classmrs__lib_1_1geometry_1_1Ray.html#a8591c6b82a120832a7ed349fbd90163a',1,'mrs_lib::geometry::Ray']]], + ['p2_231',['p2',['../classmrs__lib_1_1geometry_1_1Ray.html#a7c830a43aa9550ef6d7b798dcb69f3f5',1,'mrs_lib::geometry::Ray']]], + ['p_5ft_232',['P_t',['../classmrs__lib_1_1DKF.html#aa351bed9f3bdac26c6ed2526a5b2ac01',1,'mrs_lib::DKF::P_t()'],['../classmrs__lib_1_1KalmanFilter.html#a8f5e50ea6668129218bd4113f4ffdf6f',1,'mrs_lib::KalmanFilter::P_t()'],['../classmrs__lib_1_1KalmanFilterAloamGarm.html#a9b8488ef81812059a366fcc2e92e04f6',1,'mrs_lib::KalmanFilterAloamGarm::P_t()'],['../classmrs__lib_1_1LKF.html#a5d5cee075e30da36ffb946cffcfca688',1,'mrs_lib::LKF::P_t()'],['../classmrs__lib_1_1NCLKF.html#a1448842265f0b39d5da536488d146db3',1,'mrs_lib::NCLKF::P_t()'],['../classmrs__lib_1_1NCLKF__partial.html#aef875cb026a1a0d8df31a8fc3f02e63b',1,'mrs_lib::NCLKF_partial::P_t()'],['../classmrs__lib_1_1Repredictor.html#aca5fb76c2e698ed1dd2c58e340adca58',1,'mrs_lib::Repredictor::P_t()'],['../classmrs__lib_1_1RepredictorAloamgarm.html#a1f2bffb8cbea233b14036e016e8bb654',1,'mrs_lib::RepredictorAloamgarm::P_t()'],['../classmrs__lib_1_1RHEIV.html#a9adfedc8dfbe38ccf06f556481a6c5c9',1,'mrs_lib::RHEIV::P_t()'],['../classmrs__lib_1_1UKF.html#ac1128f5d7fa36305a52859a752a97fda',1,'mrs_lib::UKF::P_t()']]], + ['param_5floader_2eh_233',['param_loader.h',['../param__loader_8h.html',1,'']]], + ['param_5fprovider_2eh_234',['param_provider.h',['../param__provider_8h.html',1,'']]], + ['paramloader_235',['ParamLoader',['../classmrs__lib_1_1ParamLoader.html',1,'mrs_lib::ParamLoader'],['../classmrs__lib_1_1ParamLoader.html#a26079fe045fe261add0548c40c5d3baa',1,'mrs_lib::ParamLoader::ParamLoader(const ros::NodeHandle &nh, bool printValues=true, std::string_view node_name=std::string())'],['../classmrs__lib_1_1ParamLoader.html#a09d03d4f79736e8269f66ba2f11356c5',1,'mrs_lib::ParamLoader::ParamLoader(const ros::NodeHandle &nh, std::string_view node_name)'],['../classmrs__lib_1_1ParamLoader.html#ac3de917c61f02060c4e28afb2765f71c',1,'mrs_lib::ParamLoader::ParamLoader(const std::string &filepath, const ros::NodeHandle &nh)']]], + ['paramprovider_236',['ParamProvider',['../classmrs__lib_1_1ParamProvider.html',1,'mrs_lib::ParamProvider'],['../classmrs__lib_1_1ParamProvider.html#aa6f38dd58d2fd1093d6646134a5d6e59',1,'mrs_lib::ParamProvider::ParamProvider()']]], + ['pdist_237',['pdist',['../structmrs__lib_1_1geometry_1_1cyclic.html#a51db20b50daabf98afae8bd77e3a3ac4',1,'mrs_lib::geometry::cyclic']]], + ['peekmsg_238',['peekMsg',['../classmrs__lib_1_1SubscribeHandler.html#a6638d8d589149edba21bf08fa571f18e',1,'mrs_lib::SubscribeHandler']]], + ['pinterp_239',['pinterp',['../structmrs__lib_1_1geometry_1_1cyclic.html#a9b314c2ffd8a73a5a944bcdb751fdeac',1,'mrs_lib::geometry::cyclic']]], + ['pinterpunwrapped_240',['pinterpUnwrapped',['../structmrs__lib_1_1geometry_1_1cyclic.html#a0d9809504c23cb0854df0b4ceb95f426',1,'mrs_lib::geometry::cyclic']]], + ['pitch_241',['pitch',['../classmrs__lib_1_1EulerAttitude.html#abbed482a509d21505dfd1e608cd362fe',1,'mrs_lib::EulerAttitude']]], + ['polygon_242',['Polygon',['../classmrs__lib_1_1Polygon.html',1,'mrs_lib']]], + ['predict_243',['predict',['../classmrs__lib_1_1JLKF.html#acb856c6a2d7378bc6abd46af99efe580',1,'mrs_lib::JLKF::predict()'],['../classmrs__lib_1_1KalmanFilter.html#a7c8e64828a78d1a680d1ef467633d9d5',1,'mrs_lib::KalmanFilter::predict()'],['../classmrs__lib_1_1KalmanFilterAloamGarm.html#a139f8d4f64e9e45ca68b9141ecae8c99',1,'mrs_lib::KalmanFilterAloamGarm::predict()'],['../classmrs__lib_1_1LKF.html#af4027c4bef5dda2a12af1f728e92c45a',1,'mrs_lib::LKF::predict()'],['../classmrs__lib_1_1varstepLKF.html#ac1f671eb73017a1c05303e29ddf0c1f2',1,'mrs_lib::varstepLKF::predict()'],['../classmrs__lib_1_1UKF.html#a4c9c1e158bb4b6739b8bfdbdc1369c41',1,'mrs_lib::UKF::predict()']]], + ['predictto_244',['predictTo',['../classmrs__lib_1_1Repredictor.html#a018a96efcc5533e0e43b195cc23ee42e',1,'mrs_lib::Repredictor::predictTo(const ros::Time &to_stamp)'],['../classmrs__lib_1_1Repredictor.html#ac4bd7a77f3a9c73309108c35cad4936c',1,'mrs_lib::Repredictor::predictTo(const ros::Time &to_stamp)']]], + ['probit_245',['probit',['../namespacemrs__lib.html#a8b597ab1c70f0f92933e24e13f390bf5',1,'mrs_lib']]], + ['profiler_246',['Profiler',['../classmrs__lib_1_1Profiler.html',1,'mrs_lib::Profiler'],['../classmrs__lib_1_1Profiler.html#aeb0acb43639e4e29572b1ecbedf6029e',1,'mrs_lib::Profiler::Profiler()'],['../classmrs__lib_1_1Profiler.html#a1a61b447fb65e1d09a0bd6dab57c73eb',1,'mrs_lib::Profiler::Profiler(ros::NodeHandle &nh, std::string node_name, bool profiler_enabled)'],['../classmrs__lib_1_1Profiler.html#ac384b6aa30ce0f43ee8d38eaad93ca28',1,'mrs_lib::Profiler::Profiler(const Profiler &other)']]], + ['profiler_2eh_247',['profiler.h',['../profiler_8h.html',1,'']]], + ['projectpoint_248',['projectPoint',['../classmrs__lib_1_1geometry_1_1Cone.html#a80223a2934d899aead407545c044e279',1,'mrs_lib::geometry::Cone']]], + ['ps_5ft_249',['Ps_t',['../classmrs__lib_1_1RHEIV.html#aab24b461160051b3537f76e633d47d8d',1,'mrs_lib::RHEIV']]], + ['publish_250',['publish',['../classmrs__lib_1_1BatchVisualizer.html#a3b7e6b602bdaf7d42e1c48ea511aa93b',1,'mrs_lib::BatchVisualizer::publish()'],['../classmrs__lib_1_1DynamicPublisher.html#a57946b630bcf2892658f754ecb6b735d',1,'mrs_lib::DynamicPublisher::publish()'],['../classmrs__lib_1_1PublisherHandler__impl.html#a4404a3234f548fe9184ec43ac18c9671',1,'mrs_lib::PublisherHandler_impl::publish(const TopicType &msg)'],['../classmrs__lib_1_1PublisherHandler__impl.html#ad41ed622292e537101a2dac779c08f34',1,'mrs_lib::PublisherHandler_impl::publish(const boost::shared_ptr< TopicType > &msg)'],['../classmrs__lib_1_1PublisherHandler__impl.html#a80c0caa745661936409fdc93277e7453',1,'mrs_lib::PublisherHandler_impl::publish(const boost::shared_ptr< TopicType const > &msg)'],['../classmrs__lib_1_1PublisherHandler.html#a0c5bebc2848b0547048edb1297833290',1,'mrs_lib::PublisherHandler::publish(const TopicType &msg)'],['../classmrs__lib_1_1PublisherHandler.html#a3201fd4703f7e9cec24de7bc189356a5',1,'mrs_lib::PublisherHandler::publish(const boost::shared_ptr< TopicType > &msg)'],['../classmrs__lib_1_1PublisherHandler.html#ace9906a5cf9ae33115fc44af0e078f3f',1,'mrs_lib::PublisherHandler::publish(const boost::shared_ptr< TopicType const > &msg)']]], + ['publisher_5fhandler_2eh_251',['publisher_handler.h',['../publisher__handler_8h.html',1,'']]], + ['publisherhandler_252',['PublisherHandler',['../classmrs__lib_1_1PublisherHandler.html',1,'mrs_lib::PublisherHandler< TopicType >'],['../classmrs__lib_1_1PublisherHandler.html#aefafd64bd0d8a9b9717c94b76368fd0d',1,'mrs_lib::PublisherHandler::PublisherHandler(void)'],['../classmrs__lib_1_1PublisherHandler.html#a08abb836db076c390101880ff34b8fe8',1,'mrs_lib::PublisherHandler::PublisherHandler(const PublisherHandler &other)'],['../classmrs__lib_1_1PublisherHandler.html#a334376e25e8fb011ca27736cd2cf12b7',1,'mrs_lib::PublisherHandler::PublisherHandler(ros::NodeHandle &nh, const std::string &address, const unsigned int &buffer_size=1, const bool &latch=false, const double &rate=0)']]], + ['publisherhandler_5fimpl_253',['PublisherHandler_impl',['../classmrs__lib_1_1PublisherHandler__impl.html',1,'mrs_lib::PublisherHandler_impl< TopicType >'],['../classmrs__lib_1_1PublisherHandler__impl.html#ab6dfde5a454ce357957a2ea8618890fc',1,'mrs_lib::PublisherHandler_impl::PublisherHandler_impl(void)'],['../classmrs__lib_1_1PublisherHandler__impl.html#a9168a142f84bf96f73563fe5f3589ce7',1,'mrs_lib::PublisherHandler_impl::PublisherHandler_impl(ros::NodeHandle &nh, const std::string &address, const unsigned int &buffer_size=1, const bool &latch=false, const double &rate=0.0)']]], + ['pzz_5ft_254',['Pzz_t',['../classmrs__lib_1_1UKF.html#af11dc75b608a43930e8289c51e8ab7c6',1,'mrs_lib::UKF']]] +]; diff --git a/search/classes_0.html b/search/classes_0.html new file mode 100644 index 00000000..f7e4c14e --- /dev/null +++ b/search/classes_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_0.js b/search/classes_0.js new file mode 100644 index 00000000..1b726116 --- /dev/null +++ b/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['atomicscopeflag_402',['AtomicScopeFlag',['../classmrs__lib_1_1AtomicScopeFlag.html',1,'mrs_lib']]], + ['attitudeconverter_403',['AttitudeConverter',['../classmrs__lib_1_1AttitudeConverter.html',1,'mrs_lib']]] +]; diff --git a/search/classes_1.html b/search/classes_1.html new file mode 100644 index 00000000..c7ff4b31 --- /dev/null +++ b/search/classes_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_1.js b/search/classes_1.js new file mode 100644 index 00000000..1ae5ca91 --- /dev/null +++ b/search/classes_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['batchvisualizer_404',['BatchVisualizer',['../classmrs__lib_1_1BatchVisualizer.html',1,'mrs_lib']]], + ['bordererror_405',['BorderError',['../structmrs__lib_1_1SafetyZone_1_1BorderError.html',1,'mrs_lib::SafetyZone']]] +]; diff --git a/search/classes_10.html b/search/classes_10.html new file mode 100644 index 00000000..abf37f53 --- /dev/null +++ b/search/classes_10.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_10.js b/search/classes_10.js new file mode 100644 index 00000000..57022ff7 --- /dev/null +++ b/search/classes_10.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['threadtimer_478',['ThreadTimer',['../classmrs__lib_1_1ThreadTimer.html',1,'mrs_lib']]], + ['time_5fpoint_479',['time_point',['../structmrs__lib_1_1ScopeTimer_1_1time__point.html',1,'mrs_lib::ScopeTimer']]], + ['timeoutmanager_480',['TimeoutManager',['../classmrs__lib_1_1TimeoutManager.html',1,'mrs_lib']]], + ['transformbroadcaster_481',['TransformBroadcaster',['../classmrs__lib_1_1TransformBroadcaster.html',1,'mrs_lib']]], + ['transformer_482',['Transformer',['../classmrs__lib_1_1Transformer.html',1,'mrs_lib']]], + ['triangle_483',['Triangle',['../classmrs__lib_1_1geometry_1_1Triangle.html',1,'mrs_lib::geometry']]], + ['tuple_5felement_3c_200_2c_20mrs_5flib_3a_3aattitudeconverter_20_3e_484',['tuple_element< 0, mrs_lib::AttitudeConverter >',['../structstd_1_1tuple__element_3_010_00_01mrs__lib_1_1AttitudeConverter_01_4.html',1,'std']]], + ['tuple_5felement_3c_201_2c_20mrs_5flib_3a_3aattitudeconverter_20_3e_485',['tuple_element< 1, mrs_lib::AttitudeConverter >',['../structstd_1_1tuple__element_3_011_00_01mrs__lib_1_1AttitudeConverter_01_4.html',1,'std']]], + ['tuple_5felement_3c_202_2c_20mrs_5flib_3a_3aattitudeconverter_20_3e_486',['tuple_element< 2, mrs_lib::AttitudeConverter >',['../structstd_1_1tuple__element_3_012_00_01mrs__lib_1_1AttitudeConverter_01_4.html',1,'std']]], + ['tuple_5fsize_3c_20mrs_5flib_3a_3aattitudeconverter_20_3e_487',['tuple_size< mrs_lib::AttitudeConverter >',['../structstd_1_1tuple__size_3_01mrs__lib_1_1AttitudeConverter_01_4.html',1,'std']]] +]; diff --git a/search/classes_11.html b/search/classes_11.html new file mode 100644 index 00000000..29283b0f --- /dev/null +++ b/search/classes_11.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_11.js b/search/classes_11.js new file mode 100644 index 00000000..e74d143a --- /dev/null +++ b/search/classes_11.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['ukf_488',['UKF',['../classmrs__lib_1_1UKF.html',1,'mrs_lib']]] +]; diff --git a/search/classes_12.html b/search/classes_12.html new file mode 100644 index 00000000..5353e463 --- /dev/null +++ b/search/classes_12.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_12.js b/search/classes_12.js new file mode 100644 index 00000000..00728972 --- /dev/null +++ b/search/classes_12.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['varsteplkf_489',['varstepLKF',['../classmrs__lib_1_1varstepLKF.html',1,'mrs_lib']]], + ['vector3converter_490',['Vector3Converter',['../classmrs__lib_1_1Vector3Converter.html',1,'mrs_lib']]], + ['vectorconvertertest_491',['VectorConverterTest',['../classVectorConverterTest.html',1,'']]], + ['visualobject_492',['VisualObject',['../classmrs__lib_1_1VisualObject.html',1,'mrs_lib']]] +]; diff --git a/search/classes_13.html b/search/classes_13.html new file mode 100644 index 00000000..94ea6cbb --- /dev/null +++ b/search/classes_13.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_13.js b/search/classes_13.js new file mode 100644 index 00000000..959c6bd4 --- /dev/null +++ b/search/classes_13.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['wrongnumberofcolumns_493',['WrongNumberOfColumns',['../structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns.html',1,'mrs_lib::Polygon']]], + ['wrongnumberofvertices_494',['WrongNumberOfVertices',['../structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices.html',1,'mrs_lib::Polygon']]] +]; diff --git a/search/classes_2.html b/search/classes_2.html new file mode 100644 index 00000000..0d1e8a0c --- /dev/null +++ b/search/classes_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_2.js b/search/classes_2.js new file mode 100644 index 00000000..d0957ce8 --- /dev/null +++ b/search/classes_2.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['cone_406',['Cone',['../classmrs__lib_1_1geometry_1_1Cone.html',1,'mrs_lib::geometry']]], + ['cuboid_407',['Cuboid',['../classmrs__lib_1_1geometry_1_1Cuboid.html',1,'mrs_lib::geometry']]], + ['cyclic_408',['cyclic',['../structmrs__lib_1_1geometry_1_1cyclic.html',1,'mrs_lib::geometry']]], + ['cyclic_3c_20double_2c_20degrees_20_3e_409',['cyclic< double, degrees >',['../structmrs__lib_1_1geometry_1_1cyclic.html',1,'mrs_lib::geometry']]], + ['cyclic_3c_20double_2c_20radians_20_3e_410',['cyclic< double, radians >',['../structmrs__lib_1_1geometry_1_1cyclic.html',1,'mrs_lib::geometry']]], + ['cyclic_3c_20double_2c_20sdegrees_20_3e_411',['cyclic< double, sdegrees >',['../structmrs__lib_1_1geometry_1_1cyclic.html',1,'mrs_lib::geometry']]], + ['cyclic_3c_20double_2c_20sradians_20_3e_412',['cyclic< double, sradians >',['../structmrs__lib_1_1geometry_1_1cyclic.html',1,'mrs_lib::geometry']]], + ['cyclic_3c_20float_2c_20degrees_20_3e_413',['cyclic< float, degrees >',['../structmrs__lib_1_1geometry_1_1cyclic.html',1,'mrs_lib::geometry']]], + ['cylinder_414',['Cylinder',['../classmrs__lib_1_1geometry_1_1Cylinder.html',1,'mrs_lib::geometry']]] +]; diff --git a/search/classes_3.html b/search/classes_3.html new file mode 100644 index 00000000..21025456 --- /dev/null +++ b/search/classes_3.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_3.js b/search/classes_3.js new file mode 100644 index 00000000..daaee1b1 --- /dev/null +++ b/search/classes_3.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['degrees_415',['degrees',['../structmrs__lib_1_1geometry_1_1degrees.html',1,'mrs_lib::geometry::degrees'],['../structdegrees.html',1,'degrees']]], + ['dkf_416',['DKF',['../classmrs__lib_1_1DKF.html',1,'mrs_lib']]], + ['dynamicpublisher_417',['DynamicPublisher',['../classmrs__lib_1_1DynamicPublisher.html',1,'mrs_lib']]], + ['dynamicreconfiguremgr_418',['DynamicReconfigureMgr',['../classmrs__lib_1_1DynamicReconfigureMgr.html',1,'mrs_lib']]] +]; diff --git a/search/classes_4.html b/search/classes_4.html new file mode 100644 index 00000000..095ab595 --- /dev/null +++ b/search/classes_4.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_4.js b/search/classes_4.js new file mode 100644 index 00000000..7bfabbcb --- /dev/null +++ b/search/classes_4.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['eigenvector_5fexception_419',['eigenvector_exception',['../structmrs__lib_1_1eigenvector__exception.html',1,'mrs_lib']]], + ['ellipse_420',['Ellipse',['../classmrs__lib_1_1geometry_1_1Ellipse.html',1,'mrs_lib::geometry']]], + ['eulerattitude_421',['EulerAttitude',['../classmrs__lib_1_1EulerAttitude.html',1,'mrs_lib']]], + ['eulerformatexception_422',['EulerFormatException',['../structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException.html',1,'mrs_lib::AttitudeConverter']]], + ['extravertices_423',['ExtraVertices',['../structmrs__lib_1_1Polygon_1_1ExtraVertices.html',1,'mrs_lib::Polygon']]] +]; diff --git a/search/classes_5.html b/search/classes_5.html new file mode 100644 index 00000000..fc9cdc99 --- /dev/null +++ b/search/classes_5.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_5.js b/search/classes_5.js new file mode 100644 index 00000000..7f7dde7c --- /dev/null +++ b/search/classes_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['getheadingexception_424',['GetHeadingException',['../structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException.html',1,'mrs_lib::AttitudeConverter']]] +]; diff --git a/search/classes_6.html b/search/classes_6.html new file mode 100644 index 00000000..1ecfdddf --- /dev/null +++ b/search/classes_6.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_6.js b/search/classes_6.js new file mode 100644 index 00000000..822c7162 --- /dev/null +++ b/search/classes_6.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['iirfilter_425',['IirFilter',['../classmrs__lib_1_1IirFilter.html',1,'mrs_lib']]], + ['imagepubliserdata_426',['ImagePubliserData',['../structmrs__lib_1_1ImagePubliserData.html',1,'mrs_lib']]], + ['imagepublisher_427',['ImagePublisher',['../classmrs__lib_1_1ImagePublisher.html',1,'mrs_lib']]], + ['impl_428',['impl',['../classDynamicPublisher_1_1impl.html',1,'DynamicPublisher::impl'],['../classmrs__lib_1_1SubscribeHandler_1_1Impl.html',1,'mrs_lib::SubscribeHandler< MessageType >::Impl< MessageType >'],['../classThreadTimer_1_1Impl.html',1,'ThreadTimer::Impl']]], + ['implthreadsafe_429',['ImplThreadsafe',['../classmrs__lib_1_1SubscribeHandler_1_1ImplThreadsafe.html',1,'mrs_lib::SubscribeHandler']]], + ['intersection_430',['Intersection',['../structmrs__lib_1_1Intersection.html',1,'mrs_lib']]], + ['invalidattitudeexception_431',['InvalidAttitudeException',['../structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException.html',1,'mrs_lib::AttitudeConverter']]], + ['inverse_5fexception_432',['inverse_exception',['../structmrs__lib_1_1JLKF_1_1inverse__exception.html',1,'mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >::inverse_exception'],['../structmrs__lib_1_1UKF_1_1inverse__exception.html',1,'mrs_lib::UKF< n_states, n_inputs, n_measurements >::inverse_exception'],['../structmrs__lib_1_1LKF_1_1inverse__exception.html',1,'mrs_lib::LKF< n_states, n_inputs, n_measurements >::inverse_exception']]] +]; diff --git a/search/classes_7.html b/search/classes_7.html new file mode 100644 index 00000000..0fc6fc3e --- /dev/null +++ b/search/classes_7.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_7.js b/search/classes_7.js new file mode 100644 index 00000000..0f59728e --- /dev/null +++ b/search/classes_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['jlkf_433',['JLKF',['../classmrs__lib_1_1JLKF.html',1,'mrs_lib']]] +]; diff --git a/search/classes_8.html b/search/classes_8.html new file mode 100644 index 00000000..ac8af7dc --- /dev/null +++ b/search/classes_8.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_8.js b/search/classes_8.js new file mode 100644 index 00000000..58d8bb89 --- /dev/null +++ b/search/classes_8.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['kalmanfilter_434',['KalmanFilter',['../classmrs__lib_1_1KalmanFilter.html',1,'mrs_lib']]], + ['kalmanfilteraloamgarm_435',['KalmanFilterAloamGarm',['../classmrs__lib_1_1KalmanFilterAloamGarm.html',1,'mrs_lib']]] +]; diff --git a/search/classes_9.html b/search/classes_9.html new file mode 100644 index 00000000..86cad046 --- /dev/null +++ b/search/classes_9.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_9.js b/search/classes_9.js new file mode 100644 index 00000000..cd1cd260 --- /dev/null +++ b/search/classes_9.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['lkf_436',['LKF',['../classmrs__lib_1_1LKF.html',1,'mrs_lib']]], + ['lkf_3c_203_2c_20_2d1_2c_202_20_3e_437',['LKF< 3, -1, 2 >',['../classmrs__lib_1_1LKF.html',1,'mrs_lib']]], + ['lkf_3c_203_2c_201_2c_201_20_3e_438',['LKF< 3, 1, 1 >',['../classmrs__lib_1_1LKF.html',1,'mrs_lib']]], + ['lkf_5fmrs_5fodom_439',['LKF_MRS_odom',['../classmrs__lib_1_1LKF__MRS__odom.html',1,'mrs_lib']]] +]; diff --git a/search/classes_a.html b/search/classes_a.html new file mode 100644 index 00000000..4201e97e --- /dev/null +++ b/search/classes_a.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_a.js b/search/classes_a.js new file mode 100644 index 00000000..d4345e31 --- /dev/null +++ b/search/classes_a.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['matherrorexception_440',['MathErrorException',['../structmrs__lib_1_1AttitudeConverter_1_1MathErrorException.html',1,'mrs_lib::AttitudeConverter']]], + ['medianfilter_441',['MedianFilter',['../classmrs__lib_1_1MedianFilter.html',1,'mrs_lib']]], + ['motorparams_5ft_442',['MotorParams_t',['../structmrs__lib_1_1quadratic__throttle__model_1_1MotorParams__t.html',1,'mrs_lib::quadratic_throttle_model']]], + ['mrstimer_443',['MRSTimer',['../classmrs__lib_1_1MRSTimer.html',1,'mrs_lib']]], + ['mypoint_444',['MyPoint',['../structMyPoint.html',1,'']]] +]; diff --git a/search/classes_b.html b/search/classes_b.html new file mode 100644 index 00000000..f88a5780 --- /dev/null +++ b/search/classes_b.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_b.js b/search/classes_b.js new file mode 100644 index 00000000..eb840e2f --- /dev/null +++ b/search/classes_b.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['nclkf_445',['NCLKF',['../classmrs__lib_1_1NCLKF.html',1,'mrs_lib']]], + ['nclkf_5fpartial_446',['NCLKF_partial',['../classmrs__lib_1_1NCLKF__partial.html',1,'mrs_lib']]], + ['ncukf_447',['NCUKF',['../classmrs__lib_1_1NCUKF.html',1,'mrs_lib']]], + ['notchfilter_448',['NotchFilter',['../classmrs__lib_1_1NotchFilter.html',1,'mrs_lib']]] +]; diff --git a/search/classes_c.html b/search/classes_c.html new file mode 100644 index 00000000..fa0cf4d6 --- /dev/null +++ b/search/classes_c.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_c.js b/search/classes_c.js new file mode 100644 index 00000000..e2ccd4d1 --- /dev/null +++ b/search/classes_c.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['obj_5ft_449',['obj_t',['../structobj__t.html',1,'']]] +]; diff --git a/search/classes_d.html b/search/classes_d.html new file mode 100644 index 00000000..0b6b1371 --- /dev/null +++ b/search/classes_d.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_d.js b/search/classes_d.js new file mode 100644 index 00000000..717e75aa --- /dev/null +++ b/search/classes_d.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['paramloader_450',['ParamLoader',['../classmrs__lib_1_1ParamLoader.html',1,'mrs_lib']]], + ['paramprovider_451',['ParamProvider',['../classmrs__lib_1_1ParamProvider.html',1,'mrs_lib']]], + ['polygon_452',['Polygon',['../classmrs__lib_1_1Polygon.html',1,'mrs_lib']]], + ['profiler_453',['Profiler',['../classmrs__lib_1_1Profiler.html',1,'mrs_lib']]], + ['publisherhandler_454',['PublisherHandler',['../classmrs__lib_1_1PublisherHandler.html',1,'mrs_lib']]], + ['publisherhandler_5fimpl_455',['PublisherHandler_impl',['../classmrs__lib_1_1PublisherHandler__impl.html',1,'mrs_lib']]] +]; diff --git a/search/classes_e.html b/search/classes_e.html new file mode 100644 index 00000000..2e42779f --- /dev/null +++ b/search/classes_e.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_e.js b/search/classes_e.js new file mode 100644 index 00000000..0ba593d9 --- /dev/null +++ b/search/classes_e.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['radians_456',['radians',['../structmrs__lib_1_1geometry_1_1radians.html',1,'mrs_lib::geometry']]], + ['ray_457',['Ray',['../classmrs__lib_1_1geometry_1_1Ray.html',1,'mrs_lib::geometry']]], + ['rectangle_458',['Rectangle',['../classmrs__lib_1_1geometry_1_1Rectangle.html',1,'mrs_lib::geometry']]], + ['repredictor_459',['Repredictor',['../classmrs__lib_1_1Repredictor.html',1,'mrs_lib']]], + ['repredictor_3c_20model_20_3e_460',['Repredictor< Model >',['../classmrs__lib_1_1Repredictor.html',1,'mrs_lib']]], + ['repredictoraloamgarm_461',['RepredictorAloamgarm',['../classmrs__lib_1_1RepredictorAloamgarm.html',1,'mrs_lib']]], + ['rheiv_462',['RHEIV',['../classmrs__lib_1_1RHEIV.html',1,'mrs_lib']]], + ['rostimer_463',['ROSTimer',['../classmrs__lib_1_1ROSTimer.html',1,'mrs_lib']]], + ['routine_464',['Routine',['../classmrs__lib_1_1Routine.html',1,'mrs_lib']]] +]; diff --git a/search/classes_f.html b/search/classes_f.html new file mode 100644 index 00000000..e664ccd8 --- /dev/null +++ b/search/classes_f.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_f.js b/search/classes_f.js new file mode 100644 index 00000000..3c88c507 --- /dev/null +++ b/search/classes_f.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['safetyzone_465',['SafetyZone',['../classmrs__lib_1_1SafetyZone.html',1,'mrs_lib']]], + ['scopetimer_466',['ScopeTimer',['../classmrs__lib_1_1ScopeTimer.html',1,'mrs_lib']]], + ['scopetimerlogger_467',['ScopeTimerLogger',['../classmrs__lib_1_1ScopeTimerLogger.html',1,'mrs_lib']]], + ['sdegrees_468',['sdegrees',['../structmrs__lib_1_1geometry_1_1sdegrees.html',1,'mrs_lib::geometry']]], + ['serviceclienthandler_469',['ServiceClientHandler',['../classmrs__lib_1_1ServiceClientHandler.html',1,'mrs_lib']]], + ['serviceclienthandler_5fimpl_470',['ServiceClientHandler_impl',['../classmrs__lib_1_1ServiceClientHandler__impl.html',1,'mrs_lib']]], + ['setheadingexception_471',['SetHeadingException',['../structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException.html',1,'mrs_lib::AttitudeConverter']]], + ['square_5froot_5fexception_472',['square_root_exception',['../structmrs__lib_1_1UKF_1_1square__root__exception.html',1,'mrs_lib::UKF']]], + ['sradians_473',['sradians',['../structmrs__lib_1_1geometry_1_1sradians.html',1,'mrs_lib::geometry']]], + ['statecov_5ft_474',['statecov_t',['../structmrs__lib_1_1KalmanFilter_1_1statecov__t.html',1,'mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >::statecov_t'],['../structmrs__lib_1_1KalmanFilterAloamGarm_1_1statecov__t.html',1,'mrs_lib::KalmanFilterAloamGarm< n_states, n_inputs, n_measurements >::statecov_t']]], + ['subobject_475',['SubObject',['../classSubObject.html',1,'']]], + ['subscribehandler_476',['SubscribeHandler',['../classmrs__lib_1_1SubscribeHandler.html',1,'mrs_lib']]], + ['subscribehandleroptions_477',['SubscribeHandlerOptions',['../structmrs__lib_1_1SubscribeHandlerOptions.html',1,'mrs_lib']]] +]; diff --git a/search/close.png b/search/close.png new file mode 100644 index 0000000000000000000000000000000000000000..9342d3dfeea7b7c4ee610987e717804b5a42ceb9 GIT binary patch literal 273 zcmV+s0q*{ZP)4(RlMby96)VwnbG{ zbe&}^BDn7x>$<{ck4zAK-=nT;=hHG)kmplIF${xqm8db3oX6wT3bvp`TE@m0cg;b) zBuSL}5?N7O(iZLdAlz@)b)Rd~DnSsSX&P5qC`XwuFwcAYLC+d2>+1(8on;wpt8QIC X2MT$R4iQDd00000NkvXXu0mjfia~GN literal 0 HcmV?d00001 diff --git a/search/files_0.html b/search/files_0.html new file mode 100644 index 00000000..737608e1 --- /dev/null +++ b/search/files_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_0.js b/search/files_0.js new file mode 100644 index 00000000..53ea2f2d --- /dev/null +++ b/search/files_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['attitude_5fconverter_2eh_496',['attitude_converter.h',['../attitude__converter_8h.html',1,'']]] +]; diff --git a/search/files_1.html b/search/files_1.html new file mode 100644 index 00000000..f27a62de --- /dev/null +++ b/search/files_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_1.js b/search/files_1.js new file mode 100644 index 00000000..de5d469b --- /dev/null +++ b/search/files_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['batch_5fvisualizer_2eh_497',['batch_visualizer.h',['../batch__visualizer_8h.html',1,'']]] +]; diff --git a/search/files_2.html b/search/files_2.html new file mode 100644 index 00000000..a45066e9 --- /dev/null +++ b/search/files_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_2.js b/search/files_2.js new file mode 100644 index 00000000..c7debfd4 --- /dev/null +++ b/search/files_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['cyclic_2eh_498',['cyclic.h',['../cyclic_8h.html',1,'']]], + ['cyclic_5fexample_2ecpp_499',['cyclic_example.cpp',['../cyclic__example_8cpp.html',1,'']]] +]; diff --git a/search/files_3.html b/search/files_3.html new file mode 100644 index 00000000..1076bc5a --- /dev/null +++ b/search/files_3.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_3.js b/search/files_3.js new file mode 100644 index 00000000..f12cc501 --- /dev/null +++ b/search/files_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['dynamic_5fpublisher_2eh_500',['dynamic_publisher.h',['../dynamic__publisher_8h.html',1,'']]], + ['dynamic_5freconfigure_5fmgr_2eh_501',['dynamic_reconfigure_mgr.h',['../dynamic__reconfigure__mgr_8h.html',1,'']]] +]; diff --git a/search/files_4.html b/search/files_4.html new file mode 100644 index 00000000..e5cd7f43 --- /dev/null +++ b/search/files_4.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_4.js b/search/files_4.js new file mode 100644 index 00000000..d74c430e --- /dev/null +++ b/search/files_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['example_2ecpp_502',['example.cpp',['../dynamic__publisher_2example_8cpp.html',1,'(Global Namespace)'],['../lkf_2example_8cpp.html',1,'(Global Namespace)'],['../param__loader_2example_8cpp.html',1,'(Global Namespace)'],['../repredictor_2example_8cpp.html',1,'(Global Namespace)'],['../rheiv_2example_8cpp.html',1,'(Global Namespace)'],['../subscribe__handler_2example_8cpp.html',1,'(Global Namespace)'],['../ukf_2example_8cpp.html',1,'(Global Namespace)'],['../vector__converter_2example_8cpp.html',1,'(Global Namespace)']]] +]; diff --git a/search/files_5.html b/search/files_5.html new file mode 100644 index 00000000..2cc480f2 --- /dev/null +++ b/search/files_5.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_5.js b/search/files_5.js new file mode 100644 index 00000000..4e7d3080 --- /dev/null +++ b/search/files_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['gps_5fconversions_2eh_503',['gps_conversions.h',['../gps__conversions_8h.html',1,'']]] +]; diff --git a/search/files_6.html b/search/files_6.html new file mode 100644 index 00000000..6510245f --- /dev/null +++ b/search/files_6.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_6.js b/search/files_6.js new file mode 100644 index 00000000..78574822 --- /dev/null +++ b/search/files_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['iir_5ffilter_2eh_504',['iir_filter.h',['../iir__filter_8h.html',1,'']]] +]; diff --git a/search/files_7.html b/search/files_7.html new file mode 100644 index 00000000..819f7b86 --- /dev/null +++ b/search/files_7.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_7.js b/search/files_7.js new file mode 100644 index 00000000..8d48e41a --- /dev/null +++ b/search/files_7.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['kalman_5ffilter_2eh_505',['kalman_filter.h',['../kalman__filter_8h.html',1,'']]], + ['kalman_5ffilter_5faloamgarm_2eh_506',['kalman_filter_aloamgarm.h',['../kalman__filter__aloamgarm_8h.html',1,'']]] +]; diff --git a/search/files_8.html b/search/files_8.html new file mode 100644 index 00000000..fa1a27f7 --- /dev/null +++ b/search/files_8.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_8.js b/search/files_8.js new file mode 100644 index 00000000..33011dd9 --- /dev/null +++ b/search/files_8.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['math_2eh_507',['math.h',['../math_8h.html',1,'']]], + ['median_5ffilter_2eh_508',['median_filter.h',['../median__filter_8h.html',1,'']]], + ['misc_2eh_509',['misc.h',['../misc_8h.html',1,'']]], + ['msg_5fextractor_2eh_510',['msg_extractor.h',['../msg__extractor_8h.html',1,'']]], + ['mutex_2eh_511',['mutex.h',['../mutex_8h.html',1,'']]] +]; diff --git a/search/files_9.html b/search/files_9.html new file mode 100644 index 00000000..3af3e474 --- /dev/null +++ b/search/files_9.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_9.js b/search/files_9.js new file mode 100644 index 00000000..6714a402 --- /dev/null +++ b/search/files_9.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['nckf_5ftests_2ecpp_512',['nckf_tests.cpp',['../nckf__tests_8cpp.html',1,'']]], + ['notch_5ffilter_2eh_513',['notch_filter.h',['../notch__filter_8h.html',1,'']]] +]; diff --git a/search/files_a.html b/search/files_a.html new file mode 100644 index 00000000..17f65ad9 --- /dev/null +++ b/search/files_a.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_a.js b/search/files_a.js new file mode 100644 index 00000000..cca10245 --- /dev/null +++ b/search/files_a.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['param_5floader_2eh_514',['param_loader.h',['../param__loader_8h.html',1,'']]], + ['param_5fprovider_2eh_515',['param_provider.h',['../param__provider_8h.html',1,'']]], + ['profiler_2eh_516',['profiler.h',['../profiler_8h.html',1,'']]], + ['publisher_5fhandler_2eh_517',['publisher_handler.h',['../publisher__handler_8h.html',1,'']]] +]; diff --git a/search/files_b.html b/search/files_b.html new file mode 100644 index 00000000..aaa7731b --- /dev/null +++ b/search/files_b.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_b.js b/search/files_b.js new file mode 100644 index 00000000..79f5f4b8 --- /dev/null +++ b/search/files_b.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['rheiv_2eh_518',['rheiv.h',['../rheiv_8h.html',1,'']]] +]; diff --git a/search/files_c.html b/search/files_c.html new file mode 100644 index 00000000..79e79635 --- /dev/null +++ b/search/files_c.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_c.js b/search/files_c.js new file mode 100644 index 00000000..265b0471 --- /dev/null +++ b/search/files_c.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['scope_5ftimer_2eh_519',['scope_timer.h',['../scope__timer_8h.html',1,'']]], + ['service_5fclient_5fhandler_2eh_520',['service_client_handler.h',['../service__client__handler_8h.html',1,'']]], + ['shapes_2eh_521',['shapes.h',['../shapes_8h.html',1,'']]], + ['simple_5fexample_2ecpp_522',['simple_example.cpp',['../simple__example_8cpp.html',1,'']]], + ['subscribe_5fhandler_2eh_523',['subscribe_handler.h',['../subscribe__handler_8h.html',1,'']]] +]; diff --git a/search/files_d.html b/search/files_d.html new file mode 100644 index 00000000..94b2ff2d --- /dev/null +++ b/search/files_d.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_d.js b/search/files_d.js new file mode 100644 index 00000000..16a967b5 --- /dev/null +++ b/search/files_d.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['timeout_5fmanager_2eh_524',['timeout_manager.h',['../timeout__manager_8h.html',1,'']]] +]; diff --git a/search/files_e.html b/search/files_e.html new file mode 100644 index 00000000..cb205ad3 --- /dev/null +++ b/search/files_e.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_e.js b/search/files_e.js new file mode 100644 index 00000000..b7a2ec95 --- /dev/null +++ b/search/files_e.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['ukf_2eh_525',['ukf.h',['../ukf_8h.html',1,'']]], + ['ukf_2ehpp_526',['ukf.hpp',['../ukf_8hpp.html',1,'']]], + ['utils_2eh_527',['utils.h',['../utils_8h.html',1,'']]] +]; diff --git a/search/files_f.html b/search/files_f.html new file mode 100644 index 00000000..90cf7fd3 --- /dev/null +++ b/search/files_f.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_f.js b/search/files_f.js new file mode 100644 index 00000000..9faf2b54 --- /dev/null +++ b/search/files_f.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['vector_5fconverter_2eh_528',['vector_converter.h',['../vector__converter_8h.html',1,'']]], + ['vector_5fconverter_2ehpp_529',['vector_converter.hpp',['../vector__converter_8hpp.html',1,'']]], + ['visual_5fobject_2eh_530',['visual_object.h',['../visual__object_8h.html',1,'']]] +]; diff --git a/search/functions_0.html b/search/functions_0.html new file mode 100644 index 00000000..e17c7111 --- /dev/null +++ b/search/functions_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_0.js b/search/functions_0.js new file mode 100644 index 00000000..d4382b1c --- /dev/null +++ b/search/functions_0.js @@ -0,0 +1,28 @@ +var searchData= +[ + ['a_531',['a',['../classmrs__lib_1_1geometry_1_1Triangle.html#abd847d705725f4dffa10e6e00ba5f24c',1,'mrs_lib::geometry::Triangle::a()'],['../classmrs__lib_1_1geometry_1_1Rectangle.html#a5370711517c0449167cfd0efaee8e821',1,'mrs_lib::geometry::Rectangle::a()'],['../classmrs__lib_1_1geometry_1_1Ellipse.html#aee622887a91b50f8fa8bbd476614006e',1,'mrs_lib::geometry::Ellipse::a()']]], + ['add_532',['add',['../classmrs__lib_1_1MedianFilter.html#aaf3d8e3bab539001962f2b29dabd314d',1,'mrs_lib::MedianFilter']]], + ['addcheck_533',['addCheck',['../classmrs__lib_1_1MedianFilter.html#a234342f8780bce6019f5183f798fe348',1,'mrs_lib::MedianFilter']]], + ['addcone_534',['addCone',['../classmrs__lib_1_1BatchVisualizer.html#a937c831f9caac50bc84f671c3260f1a7',1,'mrs_lib::BatchVisualizer']]], + ['addcuboid_535',['addCuboid',['../classmrs__lib_1_1BatchVisualizer.html#ab5aba26d50dbe7fe22cd4c0549a99051',1,'mrs_lib::BatchVisualizer']]], + ['addcylinder_536',['addCylinder',['../classmrs__lib_1_1BatchVisualizer.html#abd2f9394a4cb63da0478ad1621ed7e79',1,'mrs_lib::BatchVisualizer']]], + ['addellipse_537',['addEllipse',['../classmrs__lib_1_1BatchVisualizer.html#ac03c515ed44761d88f43a2af446c26b7',1,'mrs_lib::BatchVisualizer']]], + ['addinputchange_538',['addInputChange',['../classmrs__lib_1_1Repredictor.html#a4db1b1896eb17c54bc906d0e9da1eee9',1,'mrs_lib::Repredictor::addInputChange(const u_t &u, const ros::Time &stamp, const ModelPtr &model=nullptr)'],['../classmrs__lib_1_1Repredictor.html#a2fa01fc3dbe7a557b80b6104466c8b7e',1,'mrs_lib::Repredictor::addInputChange(const u_t &u, [[maybe_unused]] const ros::Time &stamp, const ModelPtr &model=nullptr)']]], + ['addinputchangewithnoise_539',['addInputChangeWithNoise',['../classmrs__lib_1_1Repredictor.html#ac85faca4dca9e6f785078eac6819f10f',1,'mrs_lib::Repredictor::addInputChangeWithNoise(const u_t &u, const Q_t &Q, const ros::Time &stamp, const ModelPtr &model=nullptr)'],['../classmrs__lib_1_1Repredictor.html#a203a2fc80f2ab2d0caeb2b09e2c410a3',1,'mrs_lib::Repredictor::addInputChangeWithNoise(const u_t &u, const Q_t &Q, [[maybe_unused]] const ros::Time &stamp, const ModelPtr &model=nullptr)']]], + ['addmeasurement_540',['addMeasurement',['../classmrs__lib_1_1Repredictor.html#a5e1db8bec67cabd386b8924c5312f648',1,'mrs_lib::Repredictor::addMeasurement(const z_t &z, const R_t &R, const ros::Time &stamp, const ModelPtr &model=nullptr, const double &meas_id=-1)'],['../classmrs__lib_1_1Repredictor.html#a0aed856752f139230db775620b4b97da',1,'mrs_lib::Repredictor::addMeasurement(const z_t &z, const R_t &R, const ros::Time &stamp, const ModelPtr &model=nullptr, const double &meas_id=-1)']]], + ['addnullline_541',['addNullLine',['../classmrs__lib_1_1BatchVisualizer.html#a7f4d6d1ae967d6a5c15351969d9e4592',1,'mrs_lib::BatchVisualizer']]], + ['addnullpoint_542',['addNullPoint',['../classmrs__lib_1_1BatchVisualizer.html#a7556fd856cd4be7d0bdea9a4c0c6e1fc',1,'mrs_lib::BatchVisualizer']]], + ['addnulltriangle_543',['addNullTriangle',['../classmrs__lib_1_1BatchVisualizer.html#a6a844cdffd1474570988e8d1a87126cb',1,'mrs_lib::BatchVisualizer']]], + ['addpoint_544',['addPoint',['../classmrs__lib_1_1BatchVisualizer.html#ac9c76c18ef837dc7b87cf20f5e2511b9',1,'mrs_lib::BatchVisualizer']]], + ['addprocessnoisechange_545',['addProcessNoiseChange',['../classmrs__lib_1_1Repredictor.html#a1a409036d5c94ee2115b2e31465fd2c7',1,'mrs_lib::Repredictor::addProcessNoiseChange(const Q_t &Q, const ros::Time &stamp, const ModelPtr &model=nullptr)'],['../classmrs__lib_1_1Repredictor.html#ad07b1f478d926355157c46d93cde1b4b',1,'mrs_lib::Repredictor::addProcessNoiseChange(const Q_t &Q, [[maybe_unused]] const ros::Time &stamp, const ModelPtr &model=nullptr)']]], + ['addray_546',['addRay',['../classmrs__lib_1_1BatchVisualizer.html#ae3c2f932f592a0e61da8e51643cc686a',1,'mrs_lib::BatchVisualizer']]], + ['addrectangle_547',['addRectangle',['../classmrs__lib_1_1BatchVisualizer.html#a5a68c474ce18a4fccbc8f14066267d73',1,'mrs_lib::BatchVisualizer']]], + ['addtrajectory_548',['addTrajectory',['../classmrs__lib_1_1BatchVisualizer.html#a5dad7ddef02d959da350385544b98063',1,'mrs_lib::BatchVisualizer']]], + ['addtriangle_549',['addTriangle',['../classmrs__lib_1_1BatchVisualizer.html#ae2cf4d2a0578711a060f7f398179a677',1,'mrs_lib::BatchVisualizer']]], + ['addyamlfile_550',['addYamlFile',['../classmrs__lib_1_1ParamLoader.html#a7e0a9d3c3ca4e85692999f99b51e53e7',1,'mrs_lib::ParamLoader::addYamlFile()'],['../classmrs__lib_1_1ParamProvider.html#a137506901a03daeaaebcb5544de777f0',1,'mrs_lib::ParamProvider::addYamlFile()']]], + ['addyamlfilefromparam_551',['addYamlFileFromParam',['../classmrs__lib_1_1ParamLoader.html#a3ae6c294bc7bcf0fa17557ee36e04b31',1,'mrs_lib::ParamLoader']]], + ['angleaxisbetween_552',['angleaxisBetween',['../misc_8h.html#a3c40238e3620a619ddadf518321ccaae',1,'mrs_lib::geometry']]], + ['anglebetween_553',['angleBetween',['../misc_8h.html#a926f171b122a39c63ccb860666a7e254',1,'mrs_lib::geometry::angleBetween(const vec2_t &a, const vec2_t &b)'],['../misc_8h.html#a277dbfe7688635c28c5a1b34f32ed81e',1,'mrs_lib::geometry::angleBetween(const vec3_t &a, const vec3_t &b)']]], + ['atomicscopeflag_554',['AtomicScopeFlag',['../classmrs__lib_1_1AtomicScopeFlag.html#a168dc1d0a0ae38b254d89a84afdc4cab',1,'mrs_lib::AtomicScopeFlag']]], + ['attitudeconverter_555',['AttitudeConverter',['../classmrs__lib_1_1AttitudeConverter.html#a1a98367c2a004a298a2026d883cfc0eb',1,'mrs_lib::AttitudeConverter::AttitudeConverter(const double &roll, const double &pitch, const double &yaw, const RPY_convention_t &format=RPY_EXTRINSIC)'],['../classmrs__lib_1_1AttitudeConverter.html#a134453cd539536eea199763467690483',1,'mrs_lib::AttitudeConverter::AttitudeConverter(const tf::Quaternion quaternion)'],['../classmrs__lib_1_1AttitudeConverter.html#a9f00a180ebe802b8b7e30e08cc688f26',1,'mrs_lib::AttitudeConverter::AttitudeConverter(const geometry_msgs::Quaternion quaternion)'],['../classmrs__lib_1_1AttitudeConverter.html#a28987247a78e426e03eb37d51c7b6d82',1,'mrs_lib::AttitudeConverter::AttitudeConverter(const mrs_lib::EulerAttitude &euler_attitude)'],['../classmrs__lib_1_1AttitudeConverter.html#a15e411e1c06cd3af16d10f660656718b',1,'mrs_lib::AttitudeConverter::AttitudeConverter(const Eigen::Quaterniond quaternion)'],['../classmrs__lib_1_1AttitudeConverter.html#ad50e60f2d412b2253221c00fbbff2ead',1,'mrs_lib::AttitudeConverter::AttitudeConverter(const Eigen::Matrix3d matrix)'],['../classmrs__lib_1_1AttitudeConverter.html#a0046963fb6f70e1ecc1d50c9778fec44',1,'mrs_lib::AttitudeConverter::AttitudeConverter(const Eigen::AngleAxis< T > angle_axis)'],['../classmrs__lib_1_1AttitudeConverter.html#a7d3224c3f9b32c2a9c65f63f5a2644ea',1,'mrs_lib::AttitudeConverter::AttitudeConverter(const tf2::Quaternion quaternion)'],['../classmrs__lib_1_1AttitudeConverter.html#a24d9d274eb16af01c3630ecb32065652',1,'mrs_lib::AttitudeConverter::AttitudeConverter(const tf2::Matrix3x3 matrix)']]] +]; diff --git a/search/functions_1.html b/search/functions_1.html new file mode 100644 index 00000000..0ddac0a4 --- /dev/null +++ b/search/functions_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_1.js b/search/functions_1.js new file mode 100644 index 00000000..059d476e --- /dev/null +++ b/search/functions_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['b_556',['b',['../classmrs__lib_1_1geometry_1_1Triangle.html#a6ac4e01a62fbb343d177bf47b3d38219',1,'mrs_lib::geometry::Triangle::b()'],['../classmrs__lib_1_1geometry_1_1Rectangle.html#a82cb0598bd97e772d5fdbeeb5fde3657',1,'mrs_lib::geometry::Rectangle::b()'],['../classmrs__lib_1_1geometry_1_1Ellipse.html#ab42e4c580aeda44204c5854e1ccd4513',1,'mrs_lib::geometry::Ellipse::b()']]], + ['batchvisualizer_557',['BatchVisualizer',['../classmrs__lib_1_1BatchVisualizer.html#a2a426c62b02dec6430362920db0d6c80',1,'mrs_lib::BatchVisualizer::BatchVisualizer()'],['../classmrs__lib_1_1BatchVisualizer.html#a3a857713e5516bec553b5380eaa423f8',1,'mrs_lib::BatchVisualizer::BatchVisualizer(ros::NodeHandle &nh, std::string marker_topic_name, std::string parent_frame)']]], + ['bequiet_558',['beQuiet',['../classmrs__lib_1_1Transformer.html#ab1e3fff472e6c6320a41d6f6ca331ca0',1,'mrs_lib::Transformer']]] +]; diff --git a/search/functions_10.html b/search/functions_10.html new file mode 100644 index 00000000..09422e1e --- /dev/null +++ b/search/functions_10.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_10.js b/search/functions_10.js new file mode 100644 index 00000000..f10b8326 --- /dev/null +++ b/search/functions_10.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['r_694',['r',['../classmrs__lib_1_1geometry_1_1Cylinder.html#aa442455784da2246f8bc25aa0eccadbb',1,'mrs_lib::geometry::Cylinder']]], + ['ray_695',['Ray',['../classmrs__lib_1_1geometry_1_1Ray.html#aa0bff9427d14806607b5689f1d71604d',1,'mrs_lib::geometry::Ray::Ray()'],['../classmrs__lib_1_1geometry_1_1Ray.html#ab7466369083c82552f805fb20a16a8aa',1,'mrs_lib::geometry::Ray::Ray(Eigen::Vector3d p1, Eigen::Vector3d p2)']]], + ['rectangle_696',['Rectangle',['../classmrs__lib_1_1geometry_1_1Rectangle.html#af119a484beb0dbae7dd0a9a2d5f5123d',1,'mrs_lib::geometry::Rectangle::Rectangle()'],['../classmrs__lib_1_1geometry_1_1Rectangle.html#a3b85d8ba9c03a1b2962eda68293da077',1,'mrs_lib::geometry::Rectangle::Rectangle(std::vector< Eigen::Vector3d > points)'],['../classmrs__lib_1_1geometry_1_1Rectangle.html#a707a6df742b90d626e5321a4324d75fd',1,'mrs_lib::geometry::Rectangle::Rectangle(Eigen::Vector3d a, Eigen::Vector3d b, Eigen::Vector3d c, Eigen::Vector3d d)']]], + ['remove_5fconst_697',['remove_const',['../namespacemrs__lib.html#a006d8eb9265ad5e8b2f908df6deb55b5',1,'mrs_lib']]], + ['repredictor_698',['Repredictor',['../classmrs__lib_1_1Repredictor.html#a035888099138efba982bda818c5fe390',1,'mrs_lib::Repredictor::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)'],['../classmrs__lib_1_1Repredictor.html#a0245871abc8208f13b4b33a7c2ece708',1,'mrs_lib::Repredictor::Repredictor()'],['../classmrs__lib_1_1Repredictor.html#a6ffbce95c9194f159c203378845851d0',1,'mrs_lib::Repredictor::Repredictor(const x_t &x0, const P_t &P0, const Q_t &Q0, const ros::Time &t0, const ModelPtr &model, const unsigned hist_len)']]], + ['repredictoraloamgarm_699',['RepredictorAloamgarm',['../classmrs__lib_1_1RepredictorAloamgarm.html#a1e1d3245d8f2fd98c9f80d4795061395',1,'mrs_lib::RepredictorAloamgarm']]], + ['resolveframe_700',['resolveFrame',['../classmrs__lib_1_1Transformer.html#aa4cf06770b355a01c66f227363a4967f',1,'mrs_lib::Transformer']]], + ['retrylookupnewest_701',['retryLookupNewest',['../classmrs__lib_1_1Transformer.html#abef2a59ed83e09ab103c060abb31dbb1',1,'mrs_lib::Transformer']]], + ['rheiv_702',['RHEIV',['../classmrs__lib_1_1RHEIV.html#a057ffc158ceb64e933d3ae73e96bb033',1,'mrs_lib::RHEIV::RHEIV()'],['../classmrs__lib_1_1RHEIV.html#a4712a3306cdd759a73d2124b23bb388b',1,'mrs_lib::RHEIV::RHEIV(const f_z_t &f_z, const f_dzdx_t &f_dzdx, const double min_dtheta=1e-15, const unsigned max_its=100)'],['../classmrs__lib_1_1RHEIV.html#a8c8f7b9c1b3ea4daafc08e1a29941558',1,'mrs_lib::RHEIV::RHEIV(const f_z_t &f_z, const f_dzdx_t &f_dzdx, const double min_dtheta=1e-15, const unsigned max_its=100, const time_t &timeout=std::chrono::duration_cast< time_t >(ms_t::zero()), const int debug_nth_it=-1)'],['../classmrs__lib_1_1RHEIV.html#a66a840487d929607a3385e90b3c35ec5',1,'mrs_lib::RHEIV::RHEIV(const f_z_t &f_z, const dzdx_t &dzdx, const double min_dtheta=1e-15, const unsigned max_its=100)'],['../classmrs__lib_1_1RHEIV.html#a9c0c437bea8612516cb37d9503b6a852',1,'mrs_lib::RHEIV::RHEIV(const f_z_t &f_z, const dzdx_t &dzdx, const double min_dtheta=1e-15, const unsigned max_its=100, const time_t &timeout=std::chrono::duration_cast< time_t >(ms_t::zero()), const int debug_nth_it=-1)']]], + ['roll_703',['roll',['../classmrs__lib_1_1EulerAttitude.html#a7d62c8be0341555c3e03e124a617d765',1,'mrs_lib::EulerAttitude']]], + ['rostimer_704',['ROSTimer',['../classmrs__lib_1_1ROSTimer.html#aaf683893d28eca7f91e4b2333cf4eed5',1,'mrs_lib::ROSTimer::ROSTimer(const ros::NodeHandle &nh, const ros::Rate &rate, void(ObjectType::*const callback)(const ros::TimerEvent &), ObjectType *const obj, const bool oneshot=false, const bool autostart=true)'],['../classmrs__lib_1_1ROSTimer.html#ad4913fe0402a8be9b131ad5afb9d7d05',1,'mrs_lib::ROSTimer::ROSTimer(const ros::NodeHandle &nh, const ros::Duration &duration, void(ObjectType::*const callback)(const ros::TimerEvent &), ObjectType *const obj, const bool oneshot=false, const bool autostart=true)']]], + ['rotatecovariance_705',['rotateCovariance',['../misc_8h.html#acfda874d1843fd8c03fb309b5024818f',1,'mrs_lib::geometry']]], + ['rotationbetween_706',['rotationBetween',['../misc_8h.html#a59d7c7ddea21a014b2c831a0fc65fbb1',1,'mrs_lib::geometry']]], + ['running_707',['running',['../classmrs__lib_1_1MRSTimer.html#a54461ff4541da2848c3263e646ff928a',1,'mrs_lib::MRSTimer::running()'],['../classmrs__lib_1_1ROSTimer.html#af5074139258db68cf314b1bf4868243a',1,'mrs_lib::ROSTimer::running()'],['../classmrs__lib_1_1ThreadTimer.html#ab3ecdba649fd5c849acd94ce9ad0c824',1,'mrs_lib::ThreadTimer::running()']]] +]; diff --git a/search/functions_11.html b/search/functions_11.html new file mode 100644 index 00000000..1cde7b49 --- /dev/null +++ b/search/functions_11.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_11.js b/search/functions_11.js new file mode 100644 index 00000000..32353026 --- /dev/null +++ b/search/functions_11.js @@ -0,0 +1,36 @@ +var searchData= +[ + ['scopetimer_708',['ScopeTimer',['../classmrs__lib_1_1ScopeTimer.html#aebac3a7bad2d63f49d5777e08b504661',1,'mrs_lib::ScopeTimer::ScopeTimer(const std::string &label, const ros::Duration &throttle_period=ros::Duration(0), const bool enable=true, const std::shared_ptr< ScopeTimerLogger > scope_timer_logger=nullptr)'],['../classmrs__lib_1_1ScopeTimer.html#a8943aec6fbe491633b7f698eb3f0d131',1,'mrs_lib::ScopeTimer::ScopeTimer(const std::string &label, const time_point &tp0, const ros::Duration &throttle_period=ros::Duration(0), const bool enable=true, const std::shared_ptr< ScopeTimerLogger > scope_timer_logger=nullptr)'],['../classmrs__lib_1_1ScopeTimer.html#abdaf77484c74055916b8e491c8ffe318',1,'mrs_lib::ScopeTimer::ScopeTimer(const std::string &label, const std::shared_ptr< ScopeTimerLogger > scope_timer_logger, const bool enable=true)']]], + ['scopetimerlogger_709',['ScopeTimerLogger',['../classmrs__lib_1_1ScopeTimerLogger.html#a5369b8ec91eab0a06b87485bed5c130c',1,'mrs_lib::ScopeTimerLogger']]], + ['sendtransform_710',['sendTransform',['../classmrs__lib_1_1TransformBroadcaster.html#a93913661cb31baeedb7d4e1f72142b93',1,'mrs_lib::TransformBroadcaster::sendTransform(const geometry_msgs::TransformStamped &transform)'],['../classmrs__lib_1_1TransformBroadcaster.html#a2adf5bd449b5561323fb7d8633e04bf5',1,'mrs_lib::TransformBroadcaster::sendTransform(const std::vector< geometry_msgs::TransformStamped > &transforms)']]], + ['serviceclienthandler_711',['ServiceClientHandler',['../classmrs__lib_1_1ServiceClientHandler.html#a7d0e35cfbbe280ab0d739c23a26189de',1,'mrs_lib::ServiceClientHandler::ServiceClientHandler(void)'],['../classmrs__lib_1_1ServiceClientHandler.html#acf286dd2720d41fa05e98c7327d94413',1,'mrs_lib::ServiceClientHandler::ServiceClientHandler(const ServiceClientHandler &other)'],['../classmrs__lib_1_1ServiceClientHandler.html#a6da5592ce8388bd1aa08b63fd3d3d060',1,'mrs_lib::ServiceClientHandler::ServiceClientHandler(ros::NodeHandle &nh, const std::string &address)']]], + ['serviceclienthandler_5fimpl_712',['ServiceClientHandler_impl',['../classmrs__lib_1_1ServiceClientHandler__impl.html#ae1f6eb48630bf4d3eb9e92b95c6269c8',1,'mrs_lib::ServiceClientHandler_impl::ServiceClientHandler_impl(void)'],['../classmrs__lib_1_1ServiceClientHandler__impl.html#a4ae10aba33d5d46013bf25a61c005ac0',1,'mrs_lib::ServiceClientHandler_impl::ServiceClientHandler_impl(ros::NodeHandle &nh, const std::string &address)']]], + ['set_5fmutexed_713',['set_mutexed',['../namespacemrs__lib.html#afae3eb66a47b80bd8bae3b4a0c6a9368',1,'mrs_lib::set_mutexed(std::mutex &mut, const T what, T &where)'],['../namespacemrs__lib.html#aa09cacb136795c2831ed0499518a2b17',1,'mrs_lib::set_mutexed(std::mutex &mut, Args &... args)'],['../namespacemrs__lib.html#a953c3bb11623623e1daef402272e6833',1,'mrs_lib::set_mutexed(std::mutex &mut, const std::tuple< Args... > from, std::tuple< Args &... > to)']]], + ['set_5fmutexed_5fimpl_714',['set_mutexed_impl',['../namespacemrs__lib.html#acc32702fff28a4a1515a586a94f51e79',1,'mrs_lib::set_mutexed_impl(const T what, T &where)'],['../namespacemrs__lib.html#ad43e8bfd91df3dae404738c355b136e9',1,'mrs_lib::set_mutexed_impl(const T what, T &where, Args... args)']]], + ['setbufferlength_715',['setBufferLength',['../classmrs__lib_1_1MedianFilter.html#af2888fa7449ce3ebc82f3255a519fe6a',1,'mrs_lib::MedianFilter']]], + ['setconstants_716',['setConstants',['../classmrs__lib_1_1UKF.html#a646b7755aaa478bb86d89e1923d5ed2a',1,'mrs_lib::UKF']]], + ['setdefaultframe_717',['setDefaultFrame',['../classmrs__lib_1_1Transformer.html#a16a54cd35b1f071a80197cbccccfe9c0',1,'mrs_lib::Transformer']]], + ['setdefaultprefix_718',['setDefaultPrefix',['../classmrs__lib_1_1Transformer.html#a5d6f4288d53f09474c92bda26d0c9f55',1,'mrs_lib::Transformer']]], + ['setheading_719',['setHeading',['../classmrs__lib_1_1AttitudeConverter.html#ac818b4e515d614d5d473be95b5ee9024',1,'mrs_lib::AttitudeConverter']]], + ['setlatlon_720',['setLatLon',['../classmrs__lib_1_1Transformer.html#a54764308675cc6df1782954870e1f3c2',1,'mrs_lib::Transformer']]], + ['setlinesscale_721',['setLinesScale',['../classmrs__lib_1_1BatchVisualizer.html#af36566a7f7267a2cdb167a533e4cb856',1,'mrs_lib::BatchVisualizer']]], + ['setlookuptimeout_722',['setLookupTimeout',['../classmrs__lib_1_1Transformer.html#ac073019d60f1d9c6d48a0c207bafb678',1,'mrs_lib::Transformer']]], + ['setmaxdifference_723',['setMaxDifference',['../classmrs__lib_1_1MedianFilter.html#a82d854470b0920fac623472721b01601',1,'mrs_lib::MedianFilter']]], + ['setmaxvalue_724',['setMaxValue',['../classmrs__lib_1_1MedianFilter.html#a8162e19bd901f6dcd542d4c8615732f9',1,'mrs_lib::MedianFilter']]], + ['setminvalue_725',['setMinValue',['../classmrs__lib_1_1MedianFilter.html#a569e93d2d4be9632db2943fedb8133ba',1,'mrs_lib::MedianFilter']]], + ['setobservationmodel_726',['setObservationModel',['../classmrs__lib_1_1UKF.html#a272c7435d05b9a8867df4bd131f01177',1,'mrs_lib::UKF']]], + ['setparentframe_727',['setParentFrame',['../classmrs__lib_1_1BatchVisualizer.html#a284c94fdfec8f359704d92f9ef79cd74',1,'mrs_lib::BatchVisualizer']]], + ['setperiod_728',['setPeriod',['../classmrs__lib_1_1MRSTimer.html#acf818ea5cffe17b89ed00866ca7cbeff',1,'mrs_lib::MRSTimer::setPeriod()'],['../classmrs__lib_1_1ROSTimer.html#a7dd4d03428c7abe2de8ea260a9a4eeff',1,'mrs_lib::ROSTimer::setPeriod()'],['../classmrs__lib_1_1ThreadTimer.html#a038246468811544860d5d2d1c4091e2d',1,'mrs_lib::ThreadTimer::setPeriod()']]], + ['setpointsscale_729',['setPointsScale',['../classmrs__lib_1_1BatchVisualizer.html#ac613c22b8ed79cd169636e6aafacf2dc',1,'mrs_lib::BatchVisualizer']]], + ['setprefix_730',['setPrefix',['../classmrs__lib_1_1ParamLoader.html#a8ad978834d5d6d1745a96f1ecc65a759',1,'mrs_lib::ParamLoader']]], + ['settransitionmodel_731',['setTransitionModel',['../classmrs__lib_1_1UKF.html#a724d2e508dd45e4e6cb7b08b023cae34',1,'mrs_lib::UKF']]], + ['setyaw_732',['setYaw',['../classmrs__lib_1_1AttitudeConverter.html#a945e6c80d148df27897391bfd69c0505',1,'mrs_lib::AttitudeConverter']]], + ['shouldlog_733',['shouldLog',['../classmrs__lib_1_1ScopeTimerLogger.html#a8bb5c6453336967529f118a717f20825',1,'mrs_lib::ScopeTimerLogger']]], + ['solidangle_734',['solidAngle',['../misc_8h.html#a3f9294141cc559ae94b4c026ac47d05a',1,'mrs_lib::geometry']]], + ['solidanglerelativeto_735',['solidAngleRelativeTo',['../classmrs__lib_1_1geometry_1_1Rectangle.html#a803dbb3eb6f8a24146bd4c01877769ce',1,'mrs_lib::geometry::Rectangle']]], + ['sphericaltrianglearea_736',['sphericalTriangleArea',['../misc_8h.html#a8605d3a799002897f1d260cc4be95682',1,'mrs_lib::geometry']]], + ['start_737',['start',['../classmrs__lib_1_1SubscribeHandler.html#af8bc123e16de75e3b6c00724b817eaaf',1,'mrs_lib::SubscribeHandler::start()'],['../classmrs__lib_1_1MRSTimer.html#afda0c038cd360ccaa71b95227e413b44',1,'mrs_lib::MRSTimer::start()'],['../classmrs__lib_1_1ROSTimer.html#afd70b40e8e4b84b48215eeafc5e27520',1,'mrs_lib::ROSTimer::start()'],['../classmrs__lib_1_1ThreadTimer.html#a0425600320550d52408d1499ee3d7891',1,'mrs_lib::ThreadTimer::start()']]], + ['stop_738',['stop',['../classmrs__lib_1_1SubscribeHandler.html#a36a097cf480a16bf239885be6e35b5d0',1,'mrs_lib::SubscribeHandler::stop()'],['../classmrs__lib_1_1MRSTimer.html#aeda0660a5031f17bb57f55f4166e737e',1,'mrs_lib::MRSTimer::stop()'],['../classmrs__lib_1_1ROSTimer.html#a6a774123e3400848884fa83fe01e1955',1,'mrs_lib::ROSTimer::stop()'],['../classmrs__lib_1_1ThreadTimer.html#a26d89795a716aa2ae6d7f890626c0aaa',1,'mrs_lib::ThreadTimer::stop()']]], + ['subscribedtopicname_739',['subscribedTopicName',['../classmrs__lib_1_1SubscribeHandler.html#a2ee619f8b6fe5ce56599752e63161b51',1,'mrs_lib::SubscribeHandler']]], + ['subscribehandler_740',['SubscribeHandler',['../classmrs__lib_1_1SubscribeHandler.html#a13159347fe9f13d778d7c02f2d1b1a98',1,'mrs_lib::SubscribeHandler::SubscribeHandler()'],['../classmrs__lib_1_1SubscribeHandler.html#aaceb7739b06d44d7fe619418d5cecd4e',1,'mrs_lib::SubscribeHandler::SubscribeHandler(const SubscribeHandlerOptions &options, const std::string &topic_name, Types ... args)'],['../classmrs__lib_1_1SubscribeHandler.html#a40f16a8553532b9685feb4b33f342602',1,'mrs_lib::SubscribeHandler::SubscribeHandler(const SubscribeHandlerOptions &options, const message_callback_t &message_callback={})'],['../classmrs__lib_1_1SubscribeHandler.html#aa625f9d69548da72d92f7e8a25b078e3',1,'mrs_lib::SubscribeHandler::SubscribeHandler(const SubscribeHandlerOptions &options, const timeout_callback_t &timeout_callback, Types ... args)'],['../classmrs__lib_1_1SubscribeHandler.html#ab24f400bfd36d733366d25b63ec8889d',1,'mrs_lib::SubscribeHandler::SubscribeHandler(const SubscribeHandlerOptions &options, void(ObjectType1::*const timeout_callback)(const std::string &topic_name, const ros::Time &last_msg), ObjectType1 *const obj1, Types ... args)'],['../classmrs__lib_1_1SubscribeHandler.html#a27ac792b1dfa8a62d087b565bec33925',1,'mrs_lib::SubscribeHandler::SubscribeHandler(const SubscribeHandlerOptions &options, void(ObjectType2::*const message_callback)(typename MessageType::ConstPtr), ObjectType2 *const obj2, Types ... args)'],['../classmrs__lib_1_1SubscribeHandler.html#a14c1c92e119c047a3c40724f1152b7b9',1,'mrs_lib::SubscribeHandler::SubscribeHandler(const SubscribeHandlerOptions &options, void(ObjectType2::*const message_callback)(typename MessageType::ConstPtr), ObjectType2 *const obj2, void(ObjectType1::*const timeout_callback)(const std::string &topic_name, const ros::Time &last_msg), ObjectType1 *const obj1, Types ... args)'],['../classmrs__lib_1_1SubscribeHandler.html#a367e7245e60ee2a87f680a27c0e1a8e5',1,'mrs_lib::SubscribeHandler::SubscribeHandler(const SubscribeHandlerOptions &options, const ros::Duration &no_message_timeout, Types ... args)'],['../classmrs__lib_1_1SubscribeHandler.html#ab3499b8b5910450df90c905d1811e4a3',1,'mrs_lib::SubscribeHandler::SubscribeHandler(const SubscribeHandlerOptions &options, mrs_lib::TimeoutManager &timeout_manager, Types ... args)']]] +]; diff --git a/search/functions_12.html b/search/functions_12.html new file mode 100644 index 00000000..48e59155 --- /dev/null +++ b/search/functions_12.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_12.js b/search/functions_12.js new file mode 100644 index 00000000..3ea0ac43 --- /dev/null +++ b/search/functions_12.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['theta_741',['theta',['../classmrs__lib_1_1geometry_1_1Cone.html#a708721c0fde7cb53e7ba4e585a2d5743',1,'mrs_lib::geometry::Cone']]], + ['threadtimer_742',['ThreadTimer',['../classmrs__lib_1_1ThreadTimer.html#ac2e365201eccac6aae67400e4da4438f',1,'mrs_lib::ThreadTimer::ThreadTimer(const ros::NodeHandle &nh, const ros::Rate &rate, void(ObjectType::*const callback)(const ros::TimerEvent &), ObjectType *const obj, const bool oneshot=false, const bool autostart=true)'],['../classmrs__lib_1_1ThreadTimer.html#a2ccbea65e537f1f73da1fa75f37833fc',1,'mrs_lib::ThreadTimer::ThreadTimer(const ros::NodeHandle &nh, const ros::Duration &duration, void(ObjectType::*const callback)(const ros::TimerEvent &), ObjectType *const obj, bool oneshot=false, const bool autostart=true)']]], + ['timeoutmanager_743',['TimeoutManager',['../classmrs__lib_1_1TimeoutManager.html#a7627ccd5204a4f13c832db2cb558128f',1,'mrs_lib::TimeoutManager']]], + ['topicname_744',['topicName',['../classmrs__lib_1_1SubscribeHandler.html#a512ffa88a2164e420f1c4a6ae1823e68',1,'mrs_lib::SubscribeHandler']]], + ['transform_745',['transform',['../classmrs__lib_1_1Transformer.html#a8a66075edc7025976292ebd401d7de16',1,'mrs_lib::Transformer::transform(const T &what, const geometry_msgs::TransformStamped &tf)'],['../classmrs__lib_1_1Transformer.html#a8b05fe85c78f490b938bbf3d5884fce4',1,'mrs_lib::Transformer::transform(const boost::shared_ptr< const T > &what, const geometry_msgs::TransformStamped &tf)'],['../classmrs__lib_1_1Transformer.html#a6509524feeb70fe794964b7462f28409',1,'mrs_lib::Transformer::transform(const boost::shared_ptr< T > &what, const geometry_msgs::TransformStamped &tf)']]], + ['transformaspoint_746',['transformAsPoint',['../classmrs__lib_1_1Transformer.html#ae56ae48888d4fcaf21c912ed491b35d1',1,'mrs_lib::Transformer::transformAsPoint(const Eigen::Vector3d &what, const geometry_msgs::TransformStamped &tf)'],['../classmrs__lib_1_1Transformer.html#ab1533c559b6c94b406322bfbfc700ef7',1,'mrs_lib::Transformer::transformAsPoint(const std::string &from_frame, const Eigen::Vector3d &what, const std::string &to_frame, const ros::Time &time_stamp=ros::Time(0))']]], + ['transformasvector_747',['transformAsVector',['../classmrs__lib_1_1Transformer.html#af17729e67e82876f6bbce2d5cec55613',1,'mrs_lib::Transformer::transformAsVector(const Eigen::Vector3d &what, const geometry_msgs::TransformStamped &tf)'],['../classmrs__lib_1_1Transformer.html#a1c71e387e846a2591616e83a88071d24',1,'mrs_lib::Transformer::transformAsVector(const std::string &from_frame, const Eigen::Vector3d &what, const std::string &to_frame, const ros::Time &time_stamp=ros::Time(0))']]], + ['transformbroadcaster_748',['TransformBroadcaster',['../classmrs__lib_1_1TransformBroadcaster.html#ab8760c98f2d7111cc029f45b11e24bb9',1,'mrs_lib::TransformBroadcaster']]], + ['transformer_749',['Transformer',['../classmrs__lib_1_1Transformer.html#aca0408b710e4fa6e163ac23719d30fd1',1,'mrs_lib::Transformer::Transformer()'],['../classmrs__lib_1_1Transformer.html#ae1a34c10d53059f9dfaf4c8c05a4f617',1,'mrs_lib::Transformer::Transformer(const std::string &node_name, const ros::Duration &cache_time=ros::Duration(tf2_ros::Buffer::DEFAULT_CACHE_TIME))'],['../classmrs__lib_1_1Transformer.html#a561b0c5342c38dea6071ab400b8eaae4',1,'mrs_lib::Transformer::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))']]], + ['transformsingle_750',['transformSingle',['../classmrs__lib_1_1Transformer.html#a623af4e8100b71ac700ad5ffac96d2e2',1,'mrs_lib::Transformer::transformSingle(const T &what, const std::string &to_frame)'],['../classmrs__lib_1_1Transformer.html#a58e8e6d80098e192a0d415a14c6deec0',1,'mrs_lib::Transformer::transformSingle(const boost::shared_ptr< T > &what, const std::string &to_frame)'],['../classmrs__lib_1_1Transformer.html#a2c45ff29ac5f482ba9b9c2537d82b8fb',1,'mrs_lib::Transformer::transformSingle(const boost::shared_ptr< const T > &what, const std::string &to_frame)'],['../classmrs__lib_1_1Transformer.html#a7cea399425c4a51a676ba5aa285612d4',1,'mrs_lib::Transformer::transformSingle(const std::string &from_frame, const T &what, const std::string &to_frame, const ros::Time &time_stamp=ros::Time(0))'],['../classmrs__lib_1_1Transformer.html#a5afde5d58bc9a558cba5da9e0c2d4d1b',1,'mrs_lib::Transformer::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))'],['../classmrs__lib_1_1Transformer.html#a4d01ec1804bb492694d328704dada907',1,'mrs_lib::Transformer::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))']]], + ['triangle_751',['Triangle',['../classmrs__lib_1_1geometry_1_1Triangle.html#a14203384b0eb6d3a7ff01330ab24f679',1,'mrs_lib::geometry::Triangle::Triangle()'],['../classmrs__lib_1_1geometry_1_1Triangle.html#af765e8be7fef5ae4cfb972ec51c4a6e8',1,'mrs_lib::geometry::Triangle::Triangle(Eigen::Vector3d a, Eigen::Vector3d b, Eigen::Vector3d c)']]], + ['trianglearea_752',['triangleArea',['../misc_8h.html#a62f7d942a2445dc2c362678523966241',1,'mrs_lib::geometry']]], + ['triangles_753',['triangles',['../classmrs__lib_1_1geometry_1_1Rectangle.html#a4f2e1bce541675c91179b723aa4f9176',1,'mrs_lib::geometry::Rectangle']]], + ['twopointcast_754',['twopointCast',['../classmrs__lib_1_1geometry_1_1Ray.html#a4092f0d023b25fcf61fb426c7f0f6630',1,'mrs_lib::geometry::Ray']]] +]; diff --git a/search/functions_13.html b/search/functions_13.html new file mode 100644 index 00000000..f1fc553f --- /dev/null +++ b/search/functions_13.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_13.js b/search/functions_13.js new file mode 100644 index 00000000..a62620f8 --- /dev/null +++ b/search/functions_13.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['ukf_755',['UKF',['../classmrs__lib_1_1UKF.html#acf37d546ec0e03f1ef4c031f96057733',1,'mrs_lib::UKF::UKF()'],['../classmrs__lib_1_1UKF.html#a43f196bc0b8ef4dd75feba3b025576cb',1,'mrs_lib::UKF::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)']]], + ['unwrap_756',['unwrap',['../structmrs__lib_1_1geometry_1_1cyclic.html#a21d98e561a2d296e1d64b38a74883902',1,'mrs_lib::geometry::cyclic']]], + ['usedmsg_757',['usedMsg',['../classmrs__lib_1_1SubscribeHandler.html#ab027bb4a6edece35701e17ba0c137cfc',1,'mrs_lib::SubscribeHandler']]] +]; diff --git a/search/functions_14.html b/search/functions_14.html new file mode 100644 index 00000000..0302cd98 --- /dev/null +++ b/search/functions_14.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_14.js b/search/functions_14.js new file mode 100644 index 00000000..a848e61a --- /dev/null +++ b/search/functions_14.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['value_758',['value',['../structmrs__lib_1_1geometry_1_1cyclic.html#a064a156dd856871bf1b4acf22cba78e3',1,'mrs_lib::geometry::cyclic']]], + ['varsteplkf_759',['varstepLKF',['../classmrs__lib_1_1varstepLKF.html#afe2d9f3643f3f8e4c82879384a4a5eea',1,'mrs_lib::varstepLKF']]], + ['vector3converter_760',['Vector3Converter',['../classmrs__lib_1_1Vector3Converter.html#ac5cf91c41293661ea55749d55aec4d48',1,'mrs_lib::Vector3Converter::Vector3Converter(const tf2::Vector3 &vector3)'],['../classmrs__lib_1_1Vector3Converter.html#abf2c3e688787834522c8a99c374f656e',1,'mrs_lib::Vector3Converter::Vector3Converter(const Eigen::Vector3d &vector3)'],['../classmrs__lib_1_1Vector3Converter.html#aec2780b4e6f0b58ee2c465ab2338df17',1,'mrs_lib::Vector3Converter::Vector3Converter(const geometry_msgs::Vector3 &vector3)'],['../classmrs__lib_1_1Vector3Converter.html#a3936cad709ed1018aba1d05d47639c80',1,'mrs_lib::Vector3Converter::Vector3Converter(const double &x, const double &y, const double &z)']]], + ['vertices_761',['vertices',['../classmrs__lib_1_1geometry_1_1Triangle.html#ad873b5c4ba04613f24dd12348f898487',1,'mrs_lib::geometry::Triangle::vertices()'],['../classmrs__lib_1_1geometry_1_1Rectangle.html#a05fbbe3a262e09d5834431bc31f2648b',1,'mrs_lib::geometry::Rectangle::vertices()'],['../classmrs__lib_1_1geometry_1_1Cuboid.html#ae03413de879b1dd07df7a8f26b0a75f2',1,'mrs_lib::geometry::Cuboid::vertices()']]] +]; diff --git a/search/functions_15.html b/search/functions_15.html new file mode 100644 index 00000000..18cf76b2 --- /dev/null +++ b/search/functions_15.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_15.js b/search/functions_15.js new file mode 100644 index 00000000..6bbb1b8b --- /dev/null +++ b/search/functions_15.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['waitfornew_762',['waitForNew',['../classmrs__lib_1_1SubscribeHandler.html#a94f4bedf9229325ca6a14202f5cfbcc5',1,'mrs_lib::SubscribeHandler']]], + ['what_763',['what',['../structmrs__lib_1_1JLKF_1_1inverse__exception.html#a1f02bea6207ec02864a693067bcd499f',1,'mrs_lib::JLKF::inverse_exception::what()'],['../structmrs__lib_1_1LKF_1_1inverse__exception.html#a44d325f6cd975003b995d33bd78948ac',1,'mrs_lib::LKF::inverse_exception::what()'],['../structmrs__lib_1_1eigenvector__exception.html#ab825ec32cb055c8c0b3b8b59125e90b5',1,'mrs_lib::eigenvector_exception::what()']]], + ['wrap_764',['wrap',['../structmrs__lib_1_1geometry_1_1cyclic.html#ada5b55bcb4a01898fd9fdd9c393efd95',1,'mrs_lib::geometry::cyclic']]] +]; diff --git a/search/functions_16.html b/search/functions_16.html new file mode 100644 index 00000000..9182391d --- /dev/null +++ b/search/functions_16.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_16.js b/search/functions_16.js new file mode 100644 index 00000000..3d2e3086 --- /dev/null +++ b/search/functions_16.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['yaw_765',['yaw',['../classmrs__lib_1_1EulerAttitude.html#ab29c3b0fb567107c23eff485e8f2578d',1,'mrs_lib::EulerAttitude']]] +]; diff --git a/search/functions_17.html b/search/functions_17.html new file mode 100644 index 00000000..80795060 --- /dev/null +++ b/search/functions_17.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_17.js b/search/functions_17.js new file mode 100644 index 00000000..2a3a603b --- /dev/null +++ b/search/functions_17.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['_7eatomicscopeflag_766',['~AtomicScopeFlag',['../classmrs__lib_1_1AtomicScopeFlag.html#aafdf61c0af0bffada120eec2a8c858b1',1,'mrs_lib::AtomicScopeFlag']]], + ['_7ebatchvisualizer_767',['~BatchVisualizer',['../classmrs__lib_1_1BatchVisualizer.html#a83a3baa46f7a3c22079a1d80aaed4459',1,'mrs_lib::BatchVisualizer']]], + ['_7econe_768',['~Cone',['../classmrs__lib_1_1geometry_1_1Cone.html#ae687be891abfb2db67245cd2c13f8586',1,'mrs_lib::geometry::Cone']]], + ['_7ecuboid_769',['~Cuboid',['../classmrs__lib_1_1geometry_1_1Cuboid.html#a5a78508d282bd8d273d97f3055ae0357',1,'mrs_lib::geometry::Cuboid']]], + ['_7ecylinder_770',['~Cylinder',['../classmrs__lib_1_1geometry_1_1Cylinder.html#a9a558196740fd2be133a3c2df7173f4f',1,'mrs_lib::geometry::Cylinder']]], + ['_7eellipse_771',['~Ellipse',['../classmrs__lib_1_1geometry_1_1Ellipse.html#a973caa18f7b0c2e41b263a4267914650',1,'mrs_lib::geometry::Ellipse']]], + ['_7epublisherhandler_772',['~PublisherHandler',['../classmrs__lib_1_1PublisherHandler.html#a9acaa1ef56768636f2163c75dd9e307e',1,'mrs_lib::PublisherHandler']]], + ['_7epublisherhandler_5fimpl_773',['~PublisherHandler_impl',['../classmrs__lib_1_1PublisherHandler__impl.html#a685a159577dfe363423c58a91ba92ac6',1,'mrs_lib::PublisherHandler_impl']]], + ['_7eray_774',['~Ray',['../classmrs__lib_1_1geometry_1_1Ray.html#ad79e6fdb9416510694f14fd92ca41c7a',1,'mrs_lib::geometry::Ray']]], + ['_7erectangle_775',['~Rectangle',['../classmrs__lib_1_1geometry_1_1Rectangle.html#a66d9286f92d6f8ea5c7ebc7400cb29be',1,'mrs_lib::geometry::Rectangle']]], + ['_7escopetimer_776',['~ScopeTimer',['../classmrs__lib_1_1ScopeTimer.html#a243e048e46a8ef623b60c465dc7ee102',1,'mrs_lib::ScopeTimer']]], + ['_7escopetimerlogger_777',['~ScopeTimerLogger',['../classmrs__lib_1_1ScopeTimerLogger.html#a0152ea8087d16a05027e66c44d99662e',1,'mrs_lib::ScopeTimerLogger']]], + ['_7eserviceclienthandler_778',['~ServiceClientHandler',['../classmrs__lib_1_1ServiceClientHandler.html#ad796fc7f9044bdeeacdf549faa1d2f48',1,'mrs_lib::ServiceClientHandler']]], + ['_7eserviceclienthandler_5fimpl_779',['~ServiceClientHandler_impl',['../classmrs__lib_1_1ServiceClientHandler__impl.html#a2d906a4c237db032edfb7578d0eb2be1',1,'mrs_lib::ServiceClientHandler_impl']]], + ['_7ethreadtimer_780',['~ThreadTimer',['../classmrs__lib_1_1ThreadTimer.html#a175a2bcce428cfca8bbf3f4ef836f4ed',1,'mrs_lib::ThreadTimer']]], + ['_7etriangle_781',['~Triangle',['../classmrs__lib_1_1geometry_1_1Triangle.html#ad5cc0e9eb09f9f4900f94fa1908b60f3',1,'mrs_lib::geometry::Triangle']]] +]; diff --git a/search/functions_2.html b/search/functions_2.html new file mode 100644 index 00000000..2737c5ac --- /dev/null +++ b/search/functions_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_2.js b/search/functions_2.js new file mode 100644 index 00000000..5276cd1f --- /dev/null +++ b/search/functions_2.js @@ -0,0 +1,23 @@ +var searchData= +[ + ['c_559',['c',['../classmrs__lib_1_1geometry_1_1Triangle.html#aff6f8fb09fb5e7d4ebf2116142b85638',1,'mrs_lib::geometry::Triangle::c()'],['../classmrs__lib_1_1geometry_1_1Rectangle.html#a9cd35540a57a2b0663a2a4b360e02d8c',1,'mrs_lib::geometry::Rectangle::c()']]], + ['call_560',['call',['../classmrs__lib_1_1ServiceClientHandler__impl.html#a50394dc3190eafbce4c58b20823942d6',1,'mrs_lib::ServiceClientHandler_impl::call(ServiceType &srv)'],['../classmrs__lib_1_1ServiceClientHandler__impl.html#a35cc1c54991d1eb2801e2dfd205e1ef0',1,'mrs_lib::ServiceClientHandler_impl::call(ServiceType &srv, const int &attempts)'],['../classmrs__lib_1_1ServiceClientHandler__impl.html#aecd6585588ea75d444577651591fb847',1,'mrs_lib::ServiceClientHandler_impl::call(ServiceType &srv, const int &attempts, const double &repeat_delay)'],['../classmrs__lib_1_1ServiceClientHandler.html#acd827db26db5d8e1f310769509176fe2',1,'mrs_lib::ServiceClientHandler::call(ServiceType &srv)'],['../classmrs__lib_1_1ServiceClientHandler.html#a7eee51ebff7a805d425673ddc166d489',1,'mrs_lib::ServiceClientHandler::call(ServiceType &srv, const int &attempts)'],['../classmrs__lib_1_1ServiceClientHandler.html#afdf41e0cf6b2fa0941ee0ae703facc71',1,'mrs_lib::ServiceClientHandler::call(ServiceType &srv, const int &attempts, const double &repeat_delay)']]], + ['callasync_561',['callAsync',['../classmrs__lib_1_1ServiceClientHandler__impl.html#a39ed1a2c10f97d75447224bd9cb9e968',1,'mrs_lib::ServiceClientHandler_impl::callAsync(ServiceType &srv)'],['../classmrs__lib_1_1ServiceClientHandler__impl.html#acbc6113b775545e89e7fa4fd41cf15ed',1,'mrs_lib::ServiceClientHandler_impl::callAsync(ServiceType &srv, const int &attempts)'],['../classmrs__lib_1_1ServiceClientHandler__impl.html#ae15fc00b04219ae241e03c0973a00c5a',1,'mrs_lib::ServiceClientHandler_impl::callAsync(ServiceType &srv, const int &attempts, const double &repeat_delay)'],['../classmrs__lib_1_1ServiceClientHandler.html#aa7f3a5d1566aa2a361594797f162ca0d',1,'mrs_lib::ServiceClientHandler::callAsync(ServiceType &srv)'],['../classmrs__lib_1_1ServiceClientHandler.html#a390d8d24962c3efd849f44627b29387e',1,'mrs_lib::ServiceClientHandler::callAsync(ServiceType &srv, const int &attempts)'],['../classmrs__lib_1_1ServiceClientHandler.html#ac6babcda855d48bc3b8fc72f45f7672b',1,'mrs_lib::ServiceClientHandler::callAsync(ServiceType &srv, const int &attempts, const double &repeat_delay)']]], + ['center_562',['center',['../classmrs__lib_1_1geometry_1_1Triangle.html#a419f55d2c47dac6035495004fec746c9',1,'mrs_lib::geometry::Triangle::center()'],['../classmrs__lib_1_1geometry_1_1Rectangle.html#ab541a2748c4876234b4af0f3c220fb2d',1,'mrs_lib::geometry::Rectangle::center()'],['../classmrs__lib_1_1geometry_1_1Cuboid.html#a7ce6626c7018bdae2722073490c1729f',1,'mrs_lib::geometry::Cuboid::center()'],['../classmrs__lib_1_1geometry_1_1Ellipse.html#a058c83435e1cf0f393c1bde54e94f570',1,'mrs_lib::geometry::Ellipse::center()'],['../classmrs__lib_1_1geometry_1_1Cylinder.html#a766270eba57b916335ad0901fec74355',1,'mrs_lib::geometry::Cylinder::center()'],['../classmrs__lib_1_1geometry_1_1Cone.html#a2553c04b3dfef8dfceb938699e11f432',1,'mrs_lib::geometry::Cone::center()']]], + ['check_563',['check',['../classmrs__lib_1_1MedianFilter.html#a518d744f114ad6d0b2591d3804f6f095',1,'mrs_lib::MedianFilter']]], + ['checkpoint_564',['checkpoint',['../classmrs__lib_1_1ScopeTimer.html#acbb378343cba8f94ef228024d7a4b938',1,'mrs_lib::ScopeTimer']]], + ['clear_565',['clear',['../classmrs__lib_1_1MedianFilter.html#a533c6e194f991a9c11b9e2aadf7087a5',1,'mrs_lib::MedianFilter']]], + ['clearbuffers_566',['clearBuffers',['../classmrs__lib_1_1BatchVisualizer.html#a317a263d7a57b88805a3d264976b4c9f',1,'mrs_lib::BatchVisualizer']]], + ['clearvisuals_567',['clearVisuals',['../classmrs__lib_1_1BatchVisualizer.html#aacda752bbfd192279da0fe15f001b0bb',1,'mrs_lib::BatchVisualizer']]], + ['cone_568',['Cone',['../classmrs__lib_1_1geometry_1_1Cone.html#a27103a8552d930ae3a3a2513990d9399',1,'mrs_lib::geometry::Cone::Cone()'],['../classmrs__lib_1_1geometry_1_1Cone.html#a078bc613852240cbf2a0adb086d3d127',1,'mrs_lib::geometry::Cone::Cone(Eigen::Vector3d origin_point, double angle, double height, Eigen::Vector3d orientation)']]], + ['construct_5fobject_569',['construct_object',['../namespacemrs__lib.html#a6bd2a4b1c7a370ecf5abcb082d68f02f',1,'mrs_lib']]], + ['containertostring_570',['containerToString',['../namespacemrs__lib.html#adcd658b38c38786fa906e95b1252393a',1,'mrs_lib::containerToString(const Iterator begin, const Iterator end, const std::string &delimiter=", ")'],['../namespacemrs__lib.html#a10c2af0f8c317177ca6abca5fd80a52a',1,'mrs_lib::containerToString(const Iterator begin, const Iterator end, const char *delimiter)'],['../namespacemrs__lib.html#a1c0c2c8502894646615382a9134c866a',1,'mrs_lib::containerToString(const Container &cont, const std::string &delimiter=", ")'],['../namespacemrs__lib.html#ad5bd70829aedd3ff4a67d8902855eed9',1,'mrs_lib::containerToString(const Container &cont, const char *delimiter=", ")']]], + ['convert_571',['convert',['../structmrs__lib_1_1geometry_1_1cyclic.html#a872202b166f48d3759cd58cc57242f5f',1,'mrs_lib::geometry::cyclic::convert(const cyclic &what)'],['../structmrs__lib_1_1geometry_1_1cyclic.html#aa86da042144ee34330e4cef57b410f58',1,'mrs_lib::geometry::cyclic::convert() const'],['../namespacemrs__lib.html#a66ab536759b8cab264138c098008c9ca',1,'mrs_lib::convert()']]], + ['correct_572',['correct',['../classmrs__lib_1_1JLKF.html#a6aa1475ecb42a4ee97e8d7e93cb5c523',1,'mrs_lib::JLKF::correct()'],['../classmrs__lib_1_1KalmanFilter.html#a66c1e0d2e496f304a4f6166e7b894aac',1,'mrs_lib::KalmanFilter::correct()'],['../classmrs__lib_1_1KalmanFilterAloamGarm.html#a3e541e3ec53df99c77f8cc7031728d6f',1,'mrs_lib::KalmanFilterAloamGarm::correct()'],['../classmrs__lib_1_1LKF.html#a8ba4552b6fa909e5d899d2fe8c8fdaa5',1,'mrs_lib::LKF::correct()'],['../classmrs__lib_1_1NCUKF.html#ab12dfb8b6ad4c831c761327a3be2d814',1,'mrs_lib::NCUKF::correct()'],['../classmrs__lib_1_1UKF.html#ad31a0a6b6c1ea433daa0bae83e6fb6e4',1,'mrs_lib::UKF::correct()']]], + ['correctline_573',['correctLine',['../classmrs__lib_1_1DKF.html#a7e5d887496dea33a60b8cf2a0acc5fec',1,'mrs_lib::DKF']]], + ['createroutine_574',['createRoutine',['../classmrs__lib_1_1Profiler.html#aaf170ec3c6f67e11931cde978a5d3750',1,'mrs_lib::Profiler::createRoutine(std::string name, double expected_rate, double threshold, ros::TimerEvent event)'],['../classmrs__lib_1_1Profiler.html#a631e75be501cf4353dc8578bd9f66029',1,'mrs_lib::Profiler::createRoutine(std::string name)']]], + ['cross_575',['cross',['../misc_8h.html#aedd0e70cfd555703b53c469312d56293',1,'mrs_lib::geometry']]], + ['cuboid_576',['Cuboid',['../classmrs__lib_1_1geometry_1_1Cuboid.html#a31a698a34b8443596be58a06f3046c79',1,'mrs_lib::geometry::Cuboid::Cuboid()'],['../classmrs__lib_1_1geometry_1_1Cuboid.html#a1dfbd69913658cddfc2394d8cfed8215',1,'mrs_lib::geometry::Cuboid::Cuboid(Eigen::Vector3d p0, Eigen::Vector3d p1, Eigen::Vector3d p2, Eigen::Vector3d p3, Eigen::Vector3d p4, Eigen::Vector3d p5, Eigen::Vector3d p6, Eigen::Vector3d p7)'],['../classmrs__lib_1_1geometry_1_1Cuboid.html#adcacc925347e73dbfd81529842ff3c21',1,'mrs_lib::geometry::Cuboid::Cuboid(std::vector< Eigen::Vector3d > points)'],['../classmrs__lib_1_1geometry_1_1Cuboid.html#a34b3cc64de7244e0b3ac2f71cdb22d95',1,'mrs_lib::geometry::Cuboid::Cuboid(Eigen::Vector3d center, Eigen::Vector3d size, Eigen::Quaterniond orientation)']]], + ['cyclic_577',['cyclic',['../structmrs__lib_1_1geometry_1_1cyclic.html#ab366578641265f73655d1edc023cc2c7',1,'mrs_lib::geometry::cyclic::cyclic()'],['../structmrs__lib_1_1geometry_1_1cyclic.html#ae0cfbde43f9fa6a3f26f1e4cf8184d30',1,'mrs_lib::geometry::cyclic::cyclic(const flt val)'],['../structmrs__lib_1_1geometry_1_1cyclic.html#a9ca52b4d47969ec56057b8217f201ab9',1,'mrs_lib::geometry::cyclic::cyclic(const cyclic &other)'],['../structmrs__lib_1_1geometry_1_1cyclic.html#ad40f88cb0dab7a684335f3403a9df7b0',1,'mrs_lib::geometry::cyclic::cyclic(const spec &other)']]], + ['cylinder_578',['Cylinder',['../classmrs__lib_1_1geometry_1_1Cylinder.html#ae4b5f3500ae892f398ab88f5e545e0aa',1,'mrs_lib::geometry::Cylinder::Cylinder()'],['../classmrs__lib_1_1geometry_1_1Cylinder.html#a868fdc0baa204d3bf78d614b532aa32e',1,'mrs_lib::geometry::Cylinder::Cylinder(Eigen::Vector3d center, double radius, double height, Eigen::Quaterniond orientation)']]] +]; diff --git a/search/functions_3.html b/search/functions_3.html new file mode 100644 index 00000000..6da86e7d --- /dev/null +++ b/search/functions_3.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_3.js b/search/functions_3.js new file mode 100644 index 00000000..9bdffb92 --- /dev/null +++ b/search/functions_3.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['d_579',['d',['../classmrs__lib_1_1geometry_1_1Rectangle.html#aec6ae68b84c5a24580068fbc70a9452d',1,'mrs_lib::geometry::Rectangle']]], + ['diff_580',['diff',['../structmrs__lib_1_1geometry_1_1cyclic.html#aa5b1c6f8e1ab47b374f10a1a96de910b',1,'mrs_lib::geometry::cyclic']]], + ['direction_581',['direction',['../classmrs__lib_1_1geometry_1_1Ray.html#a01b7ff2bb88b61c178f4991c8cd847bf',1,'mrs_lib::geometry::Ray::direction()'],['../classmrs__lib_1_1geometry_1_1Cone.html#aa973eb3025776015d9e542af7aea730f',1,'mrs_lib::geometry::Cone::direction()']]], + ['directioncast_582',['directionCast',['../classmrs__lib_1_1geometry_1_1Ray.html#ab8ea82597cf6d0eb1e72105c13f41fed',1,'mrs_lib::geometry::Ray']]], + ['dist_583',['dist',['../structmrs__lib_1_1geometry_1_1cyclic.html#a9eb4b1ce4c4307d6bed9642bbf52133e',1,'mrs_lib::geometry::cyclic::dist()'],['../misc_8h.html#a53aed2b4889c7574f51b590d0a602722',1,'mrs_lib::geometry::dist(const vec2_t &a, const vec2_t &b)'],['../misc_8h.html#ae00d8eaf9c43e838e245454ef7c290f4',1,'mrs_lib::geometry::dist(const vec3_t &a, const vec3_t &b)']]], + ['dkf_584',['DKF',['../classmrs__lib_1_1DKF.html#a75bd345a8f4e3856d35d23d3b85b12cd',1,'mrs_lib::DKF::DKF()'],['../classmrs__lib_1_1DKF.html#a68c0d27c7ae1897c6b54cea9e75b95ec',1,'mrs_lib::DKF::DKF(const A_t &A, const B_t &B)']]], + ['dynamicpublisher_585',['DynamicPublisher',['../classmrs__lib_1_1DynamicPublisher.html#a2c671b4d99d4bb6bde12e7a1d8717687',1,'mrs_lib::DynamicPublisher::DynamicPublisher()'],['../classmrs__lib_1_1DynamicPublisher.html#a6a17d49f4d7203f8b8693c6ceb2fb1d9',1,'mrs_lib::DynamicPublisher::DynamicPublisher(const ros::NodeHandle &nh)']]] +]; diff --git a/search/functions_4.html b/search/functions_4.html new file mode 100644 index 00000000..911304e6 --- /dev/null +++ b/search/functions_4.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_4.js b/search/functions_4.js new file mode 100644 index 00000000..4850e054 --- /dev/null +++ b/search/functions_4.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ellipse_586',['Ellipse',['../classmrs__lib_1_1geometry_1_1Ellipse.html#ab891e8f86df11bb34f0571ebeb136c2a',1,'mrs_lib::geometry::Ellipse::Ellipse()'],['../classmrs__lib_1_1geometry_1_1Ellipse.html#ad64c67ccd7e0c21b5698a6791adf6831',1,'mrs_lib::geometry::Ellipse::Ellipse(Eigen::Vector3d center, Eigen::Quaterniond orientation, double a, double b)']]], + ['eulerattitude_587',['EulerAttitude',['../classmrs__lib_1_1EulerAttitude.html#ac4da09217c4956043801841737da8521',1,'mrs_lib::EulerAttitude']]] +]; diff --git a/search/functions_5.html b/search/functions_5.html new file mode 100644 index 00000000..61b920db --- /dev/null +++ b/search/functions_5.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_5.js b/search/functions_5.js new file mode 100644 index 00000000..9ff61567 --- /dev/null +++ b/search/functions_5.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['fit_588',['fit',['../classmrs__lib_1_1RHEIV.html#aad00da516e55bb60661b5cf234487932',1,'mrs_lib::RHEIV::fit(const xs_t &xs, const Ps_t &Ps)'],['../classmrs__lib_1_1RHEIV.html#a9eaa3b7a946a9c590326d3b47295d728',1,'mrs_lib::RHEIV::fit(const T_it1 &xs_begin, const T_it1 &xs_end, const T_it2 &Ps_begin, const T_it2 &Ps_end)']]], + ['fit_5fals_589',['fit_ALS',['../classmrs__lib_1_1RHEIV.html#a2123ee2ffa07063a8a50275b998874ca',1,'mrs_lib::RHEIV']]], + ['frame_5ffrom_590',['frame_from',['../classmrs__lib_1_1Transformer.html#a0a440d4cd248304525a05e8cfa9662f7',1,'mrs_lib::Transformer::frame_from(const geometry_msgs::TransformStamped &msg)'],['../classmrs__lib_1_1Transformer.html#a7a53d960ee4b76ea943d9c19d23f2e95',1,'mrs_lib::Transformer::frame_from(geometry_msgs::TransformStamped &msg)']]], + ['frame_5fto_591',['frame_to',['../classmrs__lib_1_1Transformer.html#a4f4befc33e5518afa01026b7955c1e2b',1,'mrs_lib::Transformer::frame_to(const geometry_msgs::TransformStamped &msg)'],['../classmrs__lib_1_1Transformer.html#a34792e38e397efc72701898ff22114cc',1,'mrs_lib::Transformer::frame_to(geometry_msgs::TransformStamped &msg)']]], + ['full_592',['full',['../classmrs__lib_1_1MedianFilter.html#acdd73f7ffc9868eb6a05e7b6aea35d85',1,'mrs_lib::MedianFilter']]] +]; diff --git a/search/functions_6.html b/search/functions_6.html new file mode 100644 index 00000000..dc70a4a0 --- /dev/null +++ b/search/functions_6.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_6.js b/search/functions_6.js new file mode 100644 index 00000000..fa068c7c --- /dev/null +++ b/search/functions_6.js @@ -0,0 +1,31 @@ +var searchData= +[ + ['get_5fals_5festimate_593',['get_ALS_estimate',['../classmrs__lib_1_1RHEIV.html#a96de075c76bf79a411606d762e4b9728',1,'mrs_lib::RHEIV']]], + ['get_5flast_5festimate_594',['get_last_estimate',['../classmrs__lib_1_1RHEIV.html#ac7f24b984bcfdee4f21de1206942f986',1,'mrs_lib::RHEIV']]], + ['get_5fmutexed_595',['get_mutexed',['../namespacemrs__lib.html#aaf62529e79b5d131ea5c0fedee10b9ca',1,'mrs_lib::get_mutexed(std::mutex &mut, Args &... args)'],['../namespacemrs__lib.html#aa3a541823230c37a69e51d4e90aa54e0',1,'mrs_lib::get_mutexed(std::mutex &mut, T &arg)']]], + ['get_5fset_5fmutexed_596',['get_set_mutexed',['../namespacemrs__lib.html#ae41b720a78b36db5ac51d8213972d001',1,'mrs_lib']]], + ['getcap_597',['getCap',['../classmrs__lib_1_1geometry_1_1Cylinder.html#a9730caea8c6bd44467038a8e04212fe6',1,'mrs_lib::geometry::Cylinder::getCap()'],['../classmrs__lib_1_1geometry_1_1Cone.html#a2e0546bb5ccb22ee88f1056dccc9a488',1,'mrs_lib::geometry::Cone::getCap()']]], + ['getextrinsicrpy_598',['getExtrinsicRPY',['../classmrs__lib_1_1AttitudeConverter.html#a0a9b9b0d146b4ccdc50c9a9037aec346',1,'mrs_lib::AttitudeConverter']]], + ['getheading_599',['getHeading',['../classmrs__lib_1_1AttitudeConverter.html#a6efdbb896bca9d52abdafb2eec0daf48',1,'mrs_lib::AttitudeConverter::getHeading()'],['../namespacemrs__lib.html#a193b468ac0f1b874af53c64ea0400236',1,'mrs_lib::getHeading(const geometry_msgs::Pose &data)'],['../namespacemrs__lib.html#a4c4a63d0de925cfa92316f6b5be78169',1,'mrs_lib::getHeading(const geometry_msgs::PoseConstPtr &data)'],['../namespacemrs__lib.html#ab57f24ac15517d030da375dfd6b27f2a',1,'mrs_lib::getHeading(const geometry_msgs::PoseWithCovariance &data)'],['../namespacemrs__lib.html#a0006b1926f70e598a4f22d0a4d0fd177',1,'mrs_lib::getHeading(const geometry_msgs::PoseWithCovarianceConstPtr &data)'],['../namespacemrs__lib.html#a482e880bcf945677389dcab02597e90f',1,'mrs_lib::getHeading(const nav_msgs::Odometry &data)'],['../namespacemrs__lib.html#aba8b3d81b8855577fbe90fc9a2f84fb6',1,'mrs_lib::getHeading(const nav_msgs::OdometryConstPtr &data)'],['../namespacemrs__lib.html#ad3594a3b11dd4b67c42c25e3caba896e',1,'mrs_lib::getHeading(const mrs_msgs::TrackerCommand &data)'],['../namespacemrs__lib.html#adfa03f341e40b1999bc66cdf066b714e',1,'mrs_lib::getHeading(const mrs_msgs::TrackerCommandConstPtr &data)'],['../namespacemrs__lib.html#af4481d1d612b63a2c63f9e2dac6aaa3c',1,'mrs_lib::getHeading(const mrs_msgs::Reference &data)'],['../namespacemrs__lib.html#a0285b59825283d220c6b3501853a2b28',1,'mrs_lib::getHeading(const mrs_msgs::ReferenceConstPtr &data)'],['../namespacemrs__lib.html#a58888855de6c5e0e9c0e9d9340299e54',1,'mrs_lib::getHeading(const mrs_msgs::ReferenceStamped &data)'],['../namespacemrs__lib.html#acfd8813200df68fad24ad3051f6b4a3d',1,'mrs_lib::getHeading(const mrs_msgs::ReferenceStampedConstPtr &data)']]], + ['getheadingrate_600',['getHeadingRate',['../classmrs__lib_1_1AttitudeConverter.html#ab3ac6086b34f743ac5e78249640eeddd',1,'mrs_lib::AttitudeConverter']]], + ['getintrinsicrpy_601',['getIntrinsicRPY',['../classmrs__lib_1_1AttitudeConverter.html#abe03466ce1c2aefb74d402a3f1433693',1,'mrs_lib::AttitudeConverter']]], + ['getlifetime_602',['getLifetime',['../classmrs__lib_1_1ScopeTimer.html#abe8dc75be918b3a2ca7bbb043a022106',1,'mrs_lib::ScopeTimer']]], + ['getlogfilepath_603',['getLogFilepath',['../classmrs__lib_1_1ScopeTimerLogger.html#addb114f39d72c3c3ee2ea8a4074cf455',1,'mrs_lib::ScopeTimerLogger']]], + ['getmsg_604',['getMsg',['../classmrs__lib_1_1SubscribeHandler.html#a19a708c3f200ccfac2695a649b9d6e77',1,'mrs_lib::SubscribeHandler']]], + ['getnumsubscribers_605',['getNumSubscribers',['../classmrs__lib_1_1PublisherHandler__impl.html#a2043d0a61e0ff0dbd0acd6a64f1e4bef',1,'mrs_lib::PublisherHandler_impl::getNumSubscribers()'],['../classmrs__lib_1_1PublisherHandler.html#acae5a82536022514c6a2cefa2f7980b1',1,'mrs_lib::PublisherHandler::getNumSubscribers()']]], + ['getparam_606',['getParam',['../classmrs__lib_1_1ParamProvider.html#a6b3be6133e7eecc3f15b3c898c0911e0',1,'mrs_lib::ParamProvider::getParam(const std::string &param_name, T &value_out) const'],['../classmrs__lib_1_1ParamProvider.html#aa3106f4d258195b890e8583d485c7547',1,'mrs_lib::ParamProvider::getParam(const std::string &param_name, XmlRpc::XmlRpcValue &value_out) const']]], + ['getpitch_607',['getPitch',['../classmrs__lib_1_1AttitudeConverter.html#a599afad1265aaa6fd32d518e4de7817f',1,'mrs_lib::AttitudeConverter']]], + ['getpose_608',['getPose',['../namespacemrs__lib.html#a1cd3887061c0b071a29dbbfe1b8a11dd',1,'mrs_lib::getPose(const nav_msgs::Odometry &data)'],['../namespacemrs__lib.html#acb6bfcfa0d9432d2184852b4f4d2694b',1,'mrs_lib::getPose(const nav_msgs::OdometryConstPtr &data)']]], + ['getposition_609',['getPosition',['../namespacemrs__lib.html#aafe68a11e627c33f976dac00f49edb03',1,'mrs_lib::getPosition(const geometry_msgs::Pose &data)'],['../namespacemrs__lib.html#a6ee4630b5dd76e9c67f00e7f4ce35806',1,'mrs_lib::getPosition(const geometry_msgs::PoseConstPtr &data)'],['../namespacemrs__lib.html#a4a813c8d2b7a92090ef94ed0ccc1f2d7',1,'mrs_lib::getPosition(const geometry_msgs::PoseWithCovariance &data)'],['../namespacemrs__lib.html#a2f32a3fa1e335cf1c33833ef33838f36',1,'mrs_lib::getPosition(const geometry_msgs::PoseWithCovarianceConstPtr &data)'],['../namespacemrs__lib.html#af2a47eec589a6a62199f9fa2b4879d5b',1,'mrs_lib::getPosition(const geometry_msgs::TwistConstPtr &data)'],['../namespacemrs__lib.html#addf482f99d48899ccf29a9e89eb5771e',1,'mrs_lib::getPosition(const geometry_msgs::TwistWithCovarianceConstPtr &data)'],['../namespacemrs__lib.html#a6beef9718623cdac64b8b5ea35c8be4a',1,'mrs_lib::getPosition(const nav_msgs::Odometry &data)'],['../namespacemrs__lib.html#a52981dc7eab7573aedf1d447cb40b1fb',1,'mrs_lib::getPosition(const nav_msgs::OdometryConstPtr &data)'],['../namespacemrs__lib.html#a4c51dc5a87098b8ecd7d7e78599be7b8',1,'mrs_lib::getPosition(const mrs_msgs::TrackerCommand &data)'],['../namespacemrs__lib.html#af85023d127c2383e6825ab7e4f7da1fb',1,'mrs_lib::getPosition(const mrs_msgs::TrackerCommandConstPtr &data)'],['../namespacemrs__lib.html#a8f78d985e8d87688482e5e30c948b067',1,'mrs_lib::getPosition(const mrs_msgs::Reference &data)'],['../namespacemrs__lib.html#aa767373d0d66e633d754d5fa4db1afca',1,'mrs_lib::getPosition(const mrs_msgs::ReferenceConstPtr &data)'],['../namespacemrs__lib.html#aa1c31d89c94806084e8da6fecd4ff575',1,'mrs_lib::getPosition(const mrs_msgs::ReferenceStamped &data)'],['../namespacemrs__lib.html#ae4a1dc71e3e48fa26fa8d2fed9211c8c',1,'mrs_lib::getPosition(const mrs_msgs::ReferenceStampedConstPtr &data)']]], + ['getprefix_610',['getPrefix',['../classmrs__lib_1_1ParamLoader.html#a68eb35df103229cd2de7416252723bf8',1,'mrs_lib::ParamLoader']]], + ['getrectangle_611',['getRectangle',['../classmrs__lib_1_1geometry_1_1Cuboid.html#a4279ad2916689b183e9647fbede9bcfb',1,'mrs_lib::geometry::Cuboid']]], + ['getroll_612',['getRoll',['../classmrs__lib_1_1AttitudeConverter.html#a82b32b4b7ff4de5bcf78b168f0c3c569',1,'mrs_lib::AttitudeConverter']]], + ['gettransform_613',['getTransform',['../classmrs__lib_1_1Transformer.html#a3a29dfb385f1b9c4deee695181880995',1,'mrs_lib::Transformer::getTransform(const std::string &from_frame, const std::string &to_frame, const ros::Time &time_stamp=ros::Time(0))'],['../classmrs__lib_1_1Transformer.html#a73ce6b60499d9ed491859a444f8d8afd',1,'mrs_lib::Transformer::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)']]], + ['getvectorx_614',['getVectorX',['../classmrs__lib_1_1AttitudeConverter.html#a131f7ba8484bd0c7465594625d19ae89',1,'mrs_lib::AttitudeConverter']]], + ['getvectory_615',['getVectorY',['../classmrs__lib_1_1AttitudeConverter.html#a901ca23ee140e6d42027b242f0dfac8b',1,'mrs_lib::AttitudeConverter']]], + ['getvectorz_616',['getVectorZ',['../classmrs__lib_1_1AttitudeConverter.html#a4853f4582b8af4f224726d15a18e9fbc',1,'mrs_lib::AttitudeConverter']]], + ['getvelocity_617',['getVelocity',['../namespacemrs__lib.html#a6e64da46123dd4cc793419585a66e54c',1,'mrs_lib::getVelocity(const geometry_msgs::Twist &data)'],['../namespacemrs__lib.html#a0669aa00311586cf9882f1bccff07d16',1,'mrs_lib::getVelocity(const geometry_msgs::TwistWithCovariance &data)'],['../namespacemrs__lib.html#aab2704bf692a6cfc5674272fc6ff06ca',1,'mrs_lib::getVelocity(const nav_msgs::Odometry &data)'],['../namespacemrs__lib.html#af8c731a97cd737d35d9524ec60f4ee2f',1,'mrs_lib::getVelocity(const nav_msgs::OdometryConstPtr &data)'],['../namespacemrs__lib.html#ade26d077c3e43c9f201a2e8d73dba2b7',1,'mrs_lib::getVelocity(const mrs_msgs::TrackerCommand &data)'],['../namespacemrs__lib.html#ad278e1089b273b3e0216977ee8df8ac5',1,'mrs_lib::getVelocity(const mrs_msgs::TrackerCommandConstPtr &data)']]], + ['getxyz_618',['getXYZ',['../namespacemrs__lib.html#a9ad821408d076d95467fc662b1dac1ab',1,'mrs_lib::getXYZ(const geometry_msgs::Point &data)'],['../namespacemrs__lib.html#a8fc9b477f93c9b8694fb8f90956ae830',1,'mrs_lib::getXYZ(const geometry_msgs::PointConstPtr &data)'],['../namespacemrs__lib.html#af79ccb18192e6ff1f1fc7fdafdee0a0b',1,'mrs_lib::getXYZ(const geometry_msgs::Vector3 &data)'],['../namespacemrs__lib.html#a32ae31e9589cb55806ec32edcf79f928',1,'mrs_lib::getXYZ(const geometry_msgs::Vector3ConstPtr &data)']]], + ['getyaw_619',['getYaw',['../classmrs__lib_1_1AttitudeConverter.html#ab2e8185898d05e5c2c9f7c7bf597f9a3',1,'mrs_lib::AttitudeConverter::getYaw()'],['../namespacemrs__lib.html#af1993419f7b19d38bdbfe3ceb5b7350f',1,'mrs_lib::getYaw(const geometry_msgs::Pose &data)'],['../namespacemrs__lib.html#acc3f167cadca01d5e92be7dc43078feb',1,'mrs_lib::getYaw(const geometry_msgs::PoseConstPtr &data)'],['../namespacemrs__lib.html#a13152460c1973b54f71f230340b20494',1,'mrs_lib::getYaw(const geometry_msgs::PoseWithCovariance &data)'],['../namespacemrs__lib.html#a2aa307f37eb6f60fc4d360adb8559946',1,'mrs_lib::getYaw(const geometry_msgs::PoseWithCovarianceConstPtr &data)'],['../namespacemrs__lib.html#af17cc11983807fb3d6bd17092fa30fc4',1,'mrs_lib::getYaw(const nav_msgs::Odometry &data)'],['../namespacemrs__lib.html#af62f21eed6f44954b6aefbf0afbbf2e0',1,'mrs_lib::getYaw(const nav_msgs::OdometryConstPtr &data)']]], + ['getyawrateintrinsic_620',['getYawRateIntrinsic',['../classmrs__lib_1_1AttitudeConverter.html#afa7a3ddc0e143fe90bd966a6ba9f2913',1,'mrs_lib::AttitudeConverter']]] +]; diff --git a/search/functions_7.html b/search/functions_7.html new file mode 100644 index 00000000..7de31067 --- /dev/null +++ b/search/functions_7.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_7.js b/search/functions_7.js new file mode 100644 index 00000000..5bcbe258 --- /dev/null +++ b/search/functions_7.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['h_621',['h',['../classmrs__lib_1_1geometry_1_1Cylinder.html#a730fee04b106aa4ec3fe08be6bb90751',1,'mrs_lib::geometry::Cylinder::h()'],['../classmrs__lib_1_1geometry_1_1Cone.html#a319fa2045f6d56c94f3fa198bd7ae7fc',1,'mrs_lib::geometry::Cone::h()']]], + ['hasmsg_622',['hasMsg',['../classmrs__lib_1_1SubscribeHandler.html#a9c6bcd07e10b60c70f02de2c6d5f632e',1,'mrs_lib::SubscribeHandler']]], + ['haversin_623',['haversin',['../misc_8h.html#a61d1dcf236aac255d384e35efd67370e',1,'mrs_lib::geometry']]], + ['headingfromrot_624',['headingFromRot',['../misc_8h.html#ac5072a0343d0cfe703ddce456e7c5756',1,'mrs_lib::geometry']]] +]; diff --git a/search/functions_8.html b/search/functions_8.html new file mode 100644 index 00000000..7422be24 --- /dev/null +++ b/search/functions_8.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_8.js b/search/functions_8.js new file mode 100644 index 00000000..db201cd3 --- /dev/null +++ b/search/functions_8.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['initialize_625',['initialize',['../classmrs__lib_1_1ServiceClientHandler.html#adff9526494a62051bf864ef6a7178450',1,'mrs_lib::ServiceClientHandler']]], + ['initialized_626',['initialized',['../classmrs__lib_1_1MedianFilter.html#a843ddc70b6daf92fa91f225fab5b36f7',1,'mrs_lib::MedianFilter']]], + ['inrange_627',['inRange',['../structmrs__lib_1_1geometry_1_1cyclic.html#ae7ff9988f0d3ef6cf3bd724f3e29273b',1,'mrs_lib::geometry::cyclic']]], + ['interp_628',['interp',['../structmrs__lib_1_1geometry_1_1cyclic.html#afe8344d8017f4ed883ecc28379465d99',1,'mrs_lib::geometry::cyclic']]], + ['interpunwrapped_629',['interpUnwrapped',['../structmrs__lib_1_1geometry_1_1cyclic.html#a1c2837eea4d0635833a786d571922d76',1,'mrs_lib::geometry::cyclic']]], + ['intersectionray_630',['intersectionRay',['../classmrs__lib_1_1geometry_1_1Triangle.html#a94238065a0e8d0c27135f55e1daa4ed3',1,'mrs_lib::geometry::Triangle::intersectionRay()'],['../classmrs__lib_1_1geometry_1_1Rectangle.html#a0b92252c39c755b3a7cba989fbb5c854',1,'mrs_lib::geometry::Rectangle::intersectionRay()'],['../classmrs__lib_1_1geometry_1_1Cuboid.html#adfde2a501c9806bd6e6e99dcf0cac6ff',1,'mrs_lib::geometry::Cuboid::intersectionRay()']]], + ['inverse_631',['inverse',['../classmrs__lib_1_1Transformer.html#a17440196c1c894e265f77b0b9112336a',1,'mrs_lib::Transformer']]], + ['invhaversin_632',['invHaversin',['../misc_8h.html#a600a2f5b7f1e654339f7177f9a64934c',1,'mrs_lib::geometry']]], + ['isfacing_633',['isFacing',['../classmrs__lib_1_1geometry_1_1Rectangle.html#a62a1b7d39bd141d4c38d8079d43ffe02',1,'mrs_lib::geometry::Rectangle']]] +]; diff --git a/search/functions_9.html b/search/functions_9.html new file mode 100644 index 00000000..befd4faa --- /dev/null +++ b/search/functions_9.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_9.js b/search/functions_9.js new file mode 100644 index 00000000..ee2bcb74 --- /dev/null +++ b/search/functions_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['jlkf_634',['JLKF',['../classmrs__lib_1_1JLKF.html#a0c21f3599fe8ccfb1164ee204a0ae606',1,'mrs_lib::JLKF']]] +]; diff --git a/search/functions_a.html b/search/functions_a.html new file mode 100644 index 00000000..a81e9633 --- /dev/null +++ b/search/functions_a.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_a.js b/search/functions_a.js new file mode 100644 index 00000000..82ae73c8 --- /dev/null +++ b/search/functions_a.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['lastmsgtime_635',['lastMsgTime',['../classmrs__lib_1_1SubscribeHandler.html#ab96777b29e74827ad109346504565f9b',1,'mrs_lib::SubscribeHandler']]], + ['lkf_636',['LKF',['../classmrs__lib_1_1LKF.html#aecd505e79c0102609c9e5ffbd91a7cc3',1,'mrs_lib::LKF::LKF()'],['../classmrs__lib_1_1LKF.html#a8bb9eee4045a176b56c28bc7e0113fa0',1,'mrs_lib::LKF::LKF(const A_t &A, const B_t &B, const H_t &H)']]], + ['loadedsuccessfully_637',['loadedSuccessfully',['../classmrs__lib_1_1ParamLoader.html#ad49130b893f09bc2247e2bc37a41f6d5',1,'mrs_lib::ParamLoader']]], + ['loadmatrixarray_638',['loadMatrixArray',['../classmrs__lib_1_1ParamLoader.html#af5397147ce0a3ecaf0e1f178a9435183',1,'mrs_lib::ParamLoader::loadMatrixArray(const std::string &name, std::vector< MatrixX< T >> &mat)'],['../classmrs__lib_1_1ParamLoader.html#aaeaec89a76f044b2e5fe2883ae768942',1,'mrs_lib::ParamLoader::loadMatrixArray(const std::string &name, std::vector< MatrixX< T >> &mat, const std::vector< MatrixX< T >> &default_value)']]], + ['loadmatrixarray2_639',['loadMatrixArray2',['../classmrs__lib_1_1ParamLoader.html#af7ffe39a26bd4a457ab01b83e5d5795d',1,'mrs_lib::ParamLoader::loadMatrixArray2(const std::string &name)'],['../classmrs__lib_1_1ParamLoader.html#a46bb91300eaa5c0d06d462b950f92897',1,'mrs_lib::ParamLoader::loadMatrixArray2(const std::string &name, const std::vector< MatrixX< T >> &default_value)']]], + ['loadmatrixdynamic_640',['loadMatrixDynamic',['../classmrs__lib_1_1ParamLoader.html#aabecb03ea3643752ddc3154e6c58d390',1,'mrs_lib::ParamLoader::loadMatrixDynamic(const std::string &name, MatrixX< T > &mat, int rows, int cols)'],['../classmrs__lib_1_1ParamLoader.html#a6b1fbdb2c1ed41ac533a67abad8638d9',1,'mrs_lib::ParamLoader::loadMatrixDynamic(const std::string &name, MatrixX< T > &mat, const Eigen::MatrixBase< Derived > &default_value, int rows, int cols)']]], + ['loadmatrixdynamic2_641',['loadMatrixDynamic2',['../classmrs__lib_1_1ParamLoader.html#a89bdbb61a1de508cc0f247f234d824d6',1,'mrs_lib::ParamLoader::loadMatrixDynamic2(const std::string &name, int rows, int cols)'],['../classmrs__lib_1_1ParamLoader.html#a99673cb2d8f39c18da5e6db967238ec9',1,'mrs_lib::ParamLoader::loadMatrixDynamic2(const std::string &name, const Eigen::MatrixBase< Derived > &default_value, int rows, int cols)']]], + ['loadmatrixstatic_642',['loadMatrixStatic',['../classmrs__lib_1_1ParamLoader.html#a03dc26f5fad92b0fb8b7437c074b23aa',1,'mrs_lib::ParamLoader::loadMatrixStatic(const std::string &name, Eigen::Matrix< T, rows, cols > &mat)'],['../classmrs__lib_1_1ParamLoader.html#a19bc5cbd5c3ee7d4614555dfe3d96001',1,'mrs_lib::ParamLoader::loadMatrixStatic(const std::string &name, Eigen::Matrix< T, rows, cols > &mat, const Eigen::MatrixBase< Derived > &default_value)'],['../classmrs__lib_1_1ParamLoader.html#aafc3bb716f3728d5a1b1cfc45b0d3ddf',1,'mrs_lib::ParamLoader::loadMatrixStatic(const std::string &name, MatrixX< T > &mat, int rows, int cols)'],['../classmrs__lib_1_1ParamLoader.html#af96b60fd7bce95d3e1d3aa351bccba9b',1,'mrs_lib::ParamLoader::loadMatrixStatic(const std::string &name, MatrixX< T > &mat, const Eigen::MatrixBase< Derived > &default_value, int rows, int cols)']]], + ['loadmatrixstatic2_643',['loadMatrixStatic2',['../classmrs__lib_1_1ParamLoader.html#a2a78e5b64d8681a46976a6e9d0486b1a',1,'mrs_lib::ParamLoader::loadMatrixStatic2(const std::string &name)'],['../classmrs__lib_1_1ParamLoader.html#ab6b1b2b00e8548b092893afcfbeee79f',1,'mrs_lib::ParamLoader::loadMatrixStatic2(const std::string &name, const Eigen::MatrixBase< Derived > &default_value)'],['../classmrs__lib_1_1ParamLoader.html#af06e1f2bdf94f8a18a19ae3e77a0f99a',1,'mrs_lib::ParamLoader::loadMatrixStatic2(const std::string &name, int rows, int cols)'],['../classmrs__lib_1_1ParamLoader.html#af8ab00da18479e583adf86983e77c577',1,'mrs_lib::ParamLoader::loadMatrixStatic2(const std::string &name, const Eigen::MatrixBase< Derived > &default_value, int rows, int cols)']]], + ['loadparam_644',['loadParam',['../classmrs__lib_1_1ParamLoader.html#a9e55225fa7d9de0e948b2e64494eb229',1,'mrs_lib::ParamLoader::loadParam(const std::string &name, T &out_value, const T &default_value)'],['../classmrs__lib_1_1ParamLoader.html#af5d9f2ac1549f9a7f03a04b9cebf9fed',1,'mrs_lib::ParamLoader::loadParam(const std::string &name, T &out_value)'],['../classmrs__lib_1_1ParamLoader.html#a5368f22f9c1eee287b39bcc91b8d8f42',1,'mrs_lib::ParamLoader::loadParam(const std::string &name, ros::Duration &out, const ros::Duration &default_value)'],['../classmrs__lib_1_1ParamLoader.html#ae4893dc129c5f6fd07fc26f6c03279cd',1,'mrs_lib::ParamLoader::loadParam(const std::string &name, ros::Duration &out)'],['../classmrs__lib_1_1ParamLoader.html#a472acaab459f4318dc20df8416b6023d',1,'mrs_lib::ParamLoader::loadParam(const std::string &name, std_msgs::ColorRGBA &out, const std_msgs::ColorRGBA &default_value={})'],['../classmrs__lib_1_1ParamLoader.html#a297d547c380c4ca1eab5903fcbbc5f42',1,'mrs_lib::ParamLoader::loadParam(const std::string &name, XmlRpc::XmlRpcValue &out, const XmlRpc::XmlRpcValue &default_value)'],['../classmrs__lib_1_1ParamLoader.html#a759df0d67059a44f87d1205782d4e4f7',1,'mrs_lib::ParamLoader::loadParam(const std::string &name, XmlRpc::XmlRpcValue &out)'],['../classmrs__lib_1_1ParamLoader.html#a6ee4d78d716c92045a38c40d6ae41c4d',1,'mrs_lib::ParamLoader::loadParam(const std::string &name, MatrixX< T > &mat, const MatrixX< T > &default_value)']]], + ['loadparam2_645',['loadParam2',['../classmrs__lib_1_1ParamLoader.html#a7b31603059669efa75b00d8e73bc163a',1,'mrs_lib::ParamLoader::loadParam2(const std::string &name, const T &default_value)'],['../classmrs__lib_1_1ParamLoader.html#ab8a37a3b88261e120d6ff36a6aebf960',1,'mrs_lib::ParamLoader::loadParam2(const std::string &name)'],['../classmrs__lib_1_1ParamLoader.html#a708d62a49386efe8334d8c13af2d8f85',1,'mrs_lib::ParamLoader::loadParam2(const std::string &name, const std_msgs::ColorRGBA &default_value={})'],['../classmrs__lib_1_1ParamLoader.html#a880ad3b0f30ecd7b7742766253422c6a',1,'mrs_lib::ParamLoader::loadParam2(const std::string &name, const XmlRpc::XmlRpcValue &default_value)'],['../classmrs__lib_1_1ParamLoader.html#a080f2c2605b42219c63d62d0fd8e0948',1,'mrs_lib::ParamLoader::loadParam2(const std::string &name, const MatrixX< T > &default_value)']]], + ['loadparamreusable_646',['loadParamReusable',['../classmrs__lib_1_1ParamLoader.html#add294058e4857eda6a8ece7e0b451390',1,'mrs_lib::ParamLoader::loadParamReusable(const std::string &name, T &out_value, const T &default_value)'],['../classmrs__lib_1_1ParamLoader.html#a31b36d7e1109d2c1d663122c689359c0',1,'mrs_lib::ParamLoader::loadParamReusable(const std::string &name, T &out_value)']]], + ['loadparamreusable2_647',['loadParamReusable2',['../classmrs__lib_1_1ParamLoader.html#ae3e15767c2e94a1f22a9205ae3f507f1',1,'mrs_lib::ParamLoader::loadParamReusable2(const std::string &name, const T &default_value)'],['../classmrs__lib_1_1ParamLoader.html#abe9a7f5aea80c8cdb2d624c12f098a90',1,'mrs_lib::ParamLoader::loadParamReusable2(const std::string &name)']]], + ['log_648',['log',['../classmrs__lib_1_1ScopeTimerLogger.html#a98f7fe29f151e4d0b88952530f40ef06',1,'mrs_lib::ScopeTimerLogger::log(const std::string &scope, const chrono_tp &time_start, const chrono_tp &time_end)'],['../classmrs__lib_1_1ScopeTimerLogger.html#a8f3794f5477960606a86543ddb708b1f',1,'mrs_lib::ScopeTimerLogger::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)']]], + ['loggingenabled_649',['loggingEnabled',['../classmrs__lib_1_1ScopeTimerLogger.html#aaf51a60a214ab18976a354c328fc9d09',1,'mrs_lib::ScopeTimerLogger']]] +]; diff --git a/search/functions_b.html b/search/functions_b.html new file mode 100644 index 00000000..345265d6 --- /dev/null +++ b/search/functions_b.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_b.js b/search/functions_b.js new file mode 100644 index 00000000..aa071092 --- /dev/null +++ b/search/functions_b.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['median_650',['median',['../classmrs__lib_1_1MedianFilter.html#a53562ea9addbf12ba3cd257cdede4af6',1,'mrs_lib::MedianFilter']]], + ['medianfilter_651',['MedianFilter',['../classmrs__lib_1_1MedianFilter.html#a6c6bd20d15d66535b900634396e99f51',1,'mrs_lib::MedianFilter::MedianFilter(const size_t buffer_length, const double min_value=-std::numeric_limits< double >::infinity(), const double max_value=std::numeric_limits< double >::infinity(), const double max_diff=std::numeric_limits< double >::infinity())'],['../classmrs__lib_1_1MedianFilter.html#ae810bd254e4fccfeb883b4585062f166',1,'mrs_lib::MedianFilter::MedianFilter()'],['../classmrs__lib_1_1MedianFilter.html#aa17291d605ef5364db2835745a2c669c',1,'mrs_lib::MedianFilter::MedianFilter(const MedianFilter &other)'],['../classmrs__lib_1_1MedianFilter.html#a46da8f440b739a1d01710104fc38611c',1,'mrs_lib::MedianFilter::MedianFilter(MedianFilter &&other)']]] +]; diff --git a/search/functions_c.html b/search/functions_c.html new file mode 100644 index 00000000..858bfd6c --- /dev/null +++ b/search/functions_c.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_c.js b/search/functions_c.js new file mode 100644 index 00000000..e12d7399 --- /dev/null +++ b/search/functions_c.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['nclkf_652',['NCLKF',['../classmrs__lib_1_1NCLKF.html#a5f970519deaccdbb021df412645f26d5',1,'mrs_lib::NCLKF::NCLKF()'],['../classmrs__lib_1_1NCLKF.html#aa4dcb47ceca9f506407e14858567ea09',1,'mrs_lib::NCLKF::NCLKF(const A_t &A, const B_t &B, const H_t &H, const double l)']]], + ['nclkf_5fpartial_653',['NCLKF_partial',['../classmrs__lib_1_1NCLKF__partial.html#aabe13461dda8a89463ce87888fd6e428',1,'mrs_lib::NCLKF_partial::NCLKF_partial()'],['../classmrs__lib_1_1NCLKF__partial.html#a1c6b3f2a9bd2d7cafe652d1bb24872e7',1,'mrs_lib::NCLKF_partial::NCLKF_partial(const A_t &A, const B_t &B, const H_t &H, const double l, const indices_t &norm_constrained_indices)']]], + ['newmsg_654',['newMsg',['../classmrs__lib_1_1SubscribeHandler.html#a46bde5660a9480814caa801e2baf3cd3',1,'mrs_lib::SubscribeHandler']]], + ['normal_655',['normal',['../classmrs__lib_1_1geometry_1_1Triangle.html#ac9b355e443d37f91d83ab76bbfa35aa6',1,'mrs_lib::geometry::Triangle::normal()'],['../classmrs__lib_1_1geometry_1_1Rectangle.html#a5cf41dfd6e82f02c8bcc18bc134d235b',1,'mrs_lib::geometry::Rectangle::normal()']]] +]; diff --git a/search/functions_d.html b/search/functions_d.html new file mode 100644 index 00000000..2f09f51b --- /dev/null +++ b/search/functions_d.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_d.js b/search/functions_d.js new file mode 100644 index 00000000..a4859527 --- /dev/null +++ b/search/functions_d.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['angleaxis_3c_20t_20_3e_656',['AngleAxis< T >',['../classmrs__lib_1_1AttitudeConverter.html#a10847ba4ce35fa86efbe5933ba488183',1,'mrs_lib::AttitudeConverter']]], + ['matrix3x3_657',['Matrix3x3',['../classmrs__lib_1_1AttitudeConverter.html#a123b85369560e858a9d3aba19a49227a',1,'mrs_lib::AttitudeConverter']]], + ['operator_20eulerattitude_658',['operator EulerAttitude',['../classmrs__lib_1_1AttitudeConverter.html#a03ef9a1c10a9963e650fa217f0f04707',1,'mrs_lib::AttitudeConverter']]], + ['operator_2b_3d_659',['operator+=',['../structmrs__lib_1_1geometry_1_1cyclic.html#a0d797e1245025227ede866ab08bcc19f',1,'mrs_lib::geometry::cyclic']]], + ['operator_2d_3d_660',['operator-=',['../structmrs__lib_1_1geometry_1_1cyclic.html#ad45609e5fa890a79729b100231e427da',1,'mrs_lib::geometry::cyclic']]], + ['operator_3c_661',['operator<',['../cyclic_8h.html#a8bb4c24541320f151f1781100c789cd3',1,'mrs_lib::geometry']]], + ['operator_3c_3c_662',['operator<<',['../cyclic_8h.html#aebc05b8cec59b7a37a72024e26a449f7',1,'mrs_lib::geometry']]], + ['operator_3d_663',['operator=',['../structmrs__lib_1_1geometry_1_1cyclic.html#a1ff6b499102b0eb290b6d121284c51ce',1,'mrs_lib::geometry::cyclic::operator=(const flt nval)'],['../structmrs__lib_1_1geometry_1_1cyclic.html#ace7e2ff831cf60311e28a70035114bcd',1,'mrs_lib::geometry::cyclic::operator=(const cyclic &other)'],['../structmrs__lib_1_1geometry_1_1cyclic.html#a8c81dca050a406b4225e8816a1955fb2',1,'mrs_lib::geometry::cyclic::operator=(cyclic &&other)'],['../classmrs__lib_1_1MedianFilter.html#ab30170b4f0d029c66e0a616936c7b693',1,'mrs_lib::MedianFilter::operator=(const MedianFilter &other)'],['../classmrs__lib_1_1MedianFilter.html#acc63d667e153c07ea9481eb0b3d74c54',1,'mrs_lib::MedianFilter::operator=(MedianFilter &&other)'],['../classmrs__lib_1_1Profiler.html#ae054cd2655538ee7b4a0dec35aa0cf16',1,'mrs_lib::Profiler::operator=()'],['../classmrs__lib_1_1PublisherHandler.html#a23a8578213fd78347ebaa259ee17c218',1,'mrs_lib::PublisherHandler::operator=()'],['../classmrs__lib_1_1ServiceClientHandler.html#a03d184432cd8b51f683746e87b071bdb',1,'mrs_lib::ServiceClientHandler::operator=()'],['../classmrs__lib_1_1Transformer.html#a6c4c846758bf173c7aeb488c8ff773b1',1,'mrs_lib::Transformer::operator=()']]], + ['operator_3e_664',['operator>',['../cyclic_8h.html#a60745f66bbc41c3cb323c8b1c3f050d7',1,'mrs_lib::geometry']]], + ['orientation_665',['orientation',['../classmrs__lib_1_1geometry_1_1Ellipse.html#a65f59ca228eea37a914ce0d6d6695b2d',1,'mrs_lib::geometry::Ellipse::orientation()'],['../classmrs__lib_1_1geometry_1_1Cylinder.html#aa7eccea15c92f1df02fc48684bb4d219',1,'mrs_lib::geometry::Cylinder::orientation()']]], + ['origin_666',['origin',['../classmrs__lib_1_1geometry_1_1Cone.html#a35b559777042218051ff46c3b7353232',1,'mrs_lib::geometry::Cone']]], + ['quaternion_667',['Quaternion',['../classmrs__lib_1_1AttitudeConverter.html#abc1686c5d27246a937c661f313ca13d0',1,'mrs_lib::AttitudeConverter::Quaternion() const'],['../classmrs__lib_1_1AttitudeConverter.html#a4dd088014d1f15da217c960e8a9dbd6f',1,'mrs_lib::AttitudeConverter::Quaternion() const'],['../classmrs__lib_1_1AttitudeConverter.html#a7b6d71e47ec12e76f25823ad408c704c',1,'mrs_lib::AttitudeConverter::Quaternion() const']]], + ['quaternion_3c_20t_20_3e_668',['Quaternion< T >',['../classmrs__lib_1_1AttitudeConverter.html#a6db421976b5060c086f495f00edca314',1,'mrs_lib::AttitudeConverter']]], + ['transform_669',['Transform',['../classmrs__lib_1_1AttitudeConverter.html#a09cd3459f52f9071db33c1ac7a5161de',1,'mrs_lib::AttitudeConverter']]], + ['tuple_3c_20double_20_26_2c_20double_20_26_2c_20double_20_26_20_3e_670',['tuple< double &, double &, double & >',['../classmrs__lib_1_1AttitudeConverter.html#a8f7e3a434632e7546149d64b2ab2e191',1,'mrs_lib::AttitudeConverter']]], + ['vector3_671',['Vector3',['../classmrs__lib_1_1Vector3Converter.html#a6f6edf59403aded9e3bffcd603cce5c0',1,'mrs_lib::Vector3Converter::Vector3() const'],['../classmrs__lib_1_1Vector3Converter.html#a96b9daae53786acb4f52e09e8fb7bc8a',1,'mrs_lib::Vector3Converter::Vector3() const']]], + ['vector3d_672',['Vector3d',['../classmrs__lib_1_1Vector3Converter.html#a69c3a9a8dbcff2876e40d28022c019e3',1,'mrs_lib::Vector3Converter']]] +]; diff --git a/search/functions_e.html b/search/functions_e.html new file mode 100644 index 00000000..ee5afa65 --- /dev/null +++ b/search/functions_e.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_e.js b/search/functions_e.js new file mode 100644 index 00000000..2f77fd48 --- /dev/null +++ b/search/functions_e.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['loadparam2_3c_20ros_3a_3aduration_20_3e_673',['loadParam2< ros::Duration >',['../namespacemrs__lib.html#a5edbd3a77e55f8ab165500ca05ad26f4',1,'mrs_lib::loadParam2< ros::Duration >(const std::string &name, const ros::Duration &default_value)'],['../namespacemrs__lib.html#a3b3a11cf5354658548afb9fd6f241d72',1,'mrs_lib::loadParam2< ros::Duration >(const std::string &name)']]], + ['p1_674',['p1',['../classmrs__lib_1_1geometry_1_1Ray.html#a8591c6b82a120832a7ed349fbd90163a',1,'mrs_lib::geometry::Ray']]], + ['p2_675',['p2',['../classmrs__lib_1_1geometry_1_1Ray.html#a7c830a43aa9550ef6d7b798dcb69f3f5',1,'mrs_lib::geometry::Ray']]], + ['paramloader_676',['ParamLoader',['../classmrs__lib_1_1ParamLoader.html#a26079fe045fe261add0548c40c5d3baa',1,'mrs_lib::ParamLoader::ParamLoader(const ros::NodeHandle &nh, bool printValues=true, std::string_view node_name=std::string())'],['../classmrs__lib_1_1ParamLoader.html#a09d03d4f79736e8269f66ba2f11356c5',1,'mrs_lib::ParamLoader::ParamLoader(const ros::NodeHandle &nh, std::string_view node_name)'],['../classmrs__lib_1_1ParamLoader.html#ac3de917c61f02060c4e28afb2765f71c',1,'mrs_lib::ParamLoader::ParamLoader(const std::string &filepath, const ros::NodeHandle &nh)']]], + ['paramprovider_677',['ParamProvider',['../classmrs__lib_1_1ParamProvider.html#aa6f38dd58d2fd1093d6646134a5d6e59',1,'mrs_lib::ParamProvider']]], + ['pdist_678',['pdist',['../structmrs__lib_1_1geometry_1_1cyclic.html#a51db20b50daabf98afae8bd77e3a3ac4',1,'mrs_lib::geometry::cyclic']]], + ['peekmsg_679',['peekMsg',['../classmrs__lib_1_1SubscribeHandler.html#a6638d8d589149edba21bf08fa571f18e',1,'mrs_lib::SubscribeHandler']]], + ['pinterp_680',['pinterp',['../structmrs__lib_1_1geometry_1_1cyclic.html#a9b314c2ffd8a73a5a944bcdb751fdeac',1,'mrs_lib::geometry::cyclic']]], + ['pinterpunwrapped_681',['pinterpUnwrapped',['../structmrs__lib_1_1geometry_1_1cyclic.html#a0d9809504c23cb0854df0b4ceb95f426',1,'mrs_lib::geometry::cyclic']]], + ['pitch_682',['pitch',['../classmrs__lib_1_1EulerAttitude.html#abbed482a509d21505dfd1e608cd362fe',1,'mrs_lib::EulerAttitude']]], + ['predict_683',['predict',['../classmrs__lib_1_1JLKF.html#acb856c6a2d7378bc6abd46af99efe580',1,'mrs_lib::JLKF::predict()'],['../classmrs__lib_1_1KalmanFilter.html#a7c8e64828a78d1a680d1ef467633d9d5',1,'mrs_lib::KalmanFilter::predict()'],['../classmrs__lib_1_1KalmanFilterAloamGarm.html#a139f8d4f64e9e45ca68b9141ecae8c99',1,'mrs_lib::KalmanFilterAloamGarm::predict()'],['../classmrs__lib_1_1LKF.html#af4027c4bef5dda2a12af1f728e92c45a',1,'mrs_lib::LKF::predict()'],['../classmrs__lib_1_1varstepLKF.html#ac1f671eb73017a1c05303e29ddf0c1f2',1,'mrs_lib::varstepLKF::predict()'],['../classmrs__lib_1_1UKF.html#a4c9c1e158bb4b6739b8bfdbdc1369c41',1,'mrs_lib::UKF::predict()']]], + ['predictto_684',['predictTo',['../classmrs__lib_1_1Repredictor.html#a018a96efcc5533e0e43b195cc23ee42e',1,'mrs_lib::Repredictor::predictTo(const ros::Time &to_stamp)'],['../classmrs__lib_1_1Repredictor.html#ac4bd7a77f3a9c73309108c35cad4936c',1,'mrs_lib::Repredictor::predictTo(const ros::Time &to_stamp)']]], + ['probit_685',['probit',['../namespacemrs__lib.html#a8b597ab1c70f0f92933e24e13f390bf5',1,'mrs_lib']]], + ['profiler_686',['Profiler',['../classmrs__lib_1_1Profiler.html#aeb0acb43639e4e29572b1ecbedf6029e',1,'mrs_lib::Profiler::Profiler()'],['../classmrs__lib_1_1Profiler.html#a1a61b447fb65e1d09a0bd6dab57c73eb',1,'mrs_lib::Profiler::Profiler(ros::NodeHandle &nh, std::string node_name, bool profiler_enabled)'],['../classmrs__lib_1_1Profiler.html#ac384b6aa30ce0f43ee8d38eaad93ca28',1,'mrs_lib::Profiler::Profiler(const Profiler &other)']]], + ['projectpoint_687',['projectPoint',['../classmrs__lib_1_1geometry_1_1Cone.html#a80223a2934d899aead407545c044e279',1,'mrs_lib::geometry::Cone']]], + ['publish_688',['publish',['../classmrs__lib_1_1BatchVisualizer.html#a3b7e6b602bdaf7d42e1c48ea511aa93b',1,'mrs_lib::BatchVisualizer::publish()'],['../classmrs__lib_1_1DynamicPublisher.html#a57946b630bcf2892658f754ecb6b735d',1,'mrs_lib::DynamicPublisher::publish()'],['../classmrs__lib_1_1PublisherHandler__impl.html#a4404a3234f548fe9184ec43ac18c9671',1,'mrs_lib::PublisherHandler_impl::publish(const TopicType &msg)'],['../classmrs__lib_1_1PublisherHandler__impl.html#ad41ed622292e537101a2dac779c08f34',1,'mrs_lib::PublisherHandler_impl::publish(const boost::shared_ptr< TopicType > &msg)'],['../classmrs__lib_1_1PublisherHandler__impl.html#a80c0caa745661936409fdc93277e7453',1,'mrs_lib::PublisherHandler_impl::publish(const boost::shared_ptr< TopicType const > &msg)'],['../classmrs__lib_1_1PublisherHandler.html#a0c5bebc2848b0547048edb1297833290',1,'mrs_lib::PublisherHandler::publish(const TopicType &msg)'],['../classmrs__lib_1_1PublisherHandler.html#a3201fd4703f7e9cec24de7bc189356a5',1,'mrs_lib::PublisherHandler::publish(const boost::shared_ptr< TopicType > &msg)'],['../classmrs__lib_1_1PublisherHandler.html#ace9906a5cf9ae33115fc44af0e078f3f',1,'mrs_lib::PublisherHandler::publish(const boost::shared_ptr< TopicType const > &msg)']]], + ['publisherhandler_689',['PublisherHandler',['../classmrs__lib_1_1PublisherHandler.html#aefafd64bd0d8a9b9717c94b76368fd0d',1,'mrs_lib::PublisherHandler::PublisherHandler(void)'],['../classmrs__lib_1_1PublisherHandler.html#a08abb836db076c390101880ff34b8fe8',1,'mrs_lib::PublisherHandler::PublisherHandler(const PublisherHandler &other)'],['../classmrs__lib_1_1PublisherHandler.html#a334376e25e8fb011ca27736cd2cf12b7',1,'mrs_lib::PublisherHandler::PublisherHandler(ros::NodeHandle &nh, const std::string &address, const unsigned int &buffer_size=1, const bool &latch=false, const double &rate=0)']]], + ['publisherhandler_5fimpl_690',['PublisherHandler_impl',['../classmrs__lib_1_1PublisherHandler__impl.html#ab6dfde5a454ce357957a2ea8618890fc',1,'mrs_lib::PublisherHandler_impl::PublisherHandler_impl(void)'],['../classmrs__lib_1_1PublisherHandler__impl.html#a9168a142f84bf96f73563fe5f3589ce7',1,'mrs_lib::PublisherHandler_impl::PublisherHandler_impl(ros::NodeHandle &nh, const std::string &address, const unsigned int &buffer_size=1, const bool &latch=false, const double &rate=0.0)']]] +]; diff --git a/search/functions_f.html b/search/functions_f.html new file mode 100644 index 00000000..f17c412c --- /dev/null +++ b/search/functions_f.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_f.js b/search/functions_f.js new file mode 100644 index 00000000..4f825b05 --- /dev/null +++ b/search/functions_f.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['quaternionbetween_691',['quaternionBetween',['../misc_8h.html#afc7674301c81fd347f26a2bc0bb96979',1,'mrs_lib::geometry']]], + ['quaternionfromeuler_692',['quaternionFromEuler',['../misc_8h.html#acbd2f281f58752d98b9482f3a9697363',1,'mrs_lib::geometry::quaternionFromEuler(double x, double y, double z)'],['../misc_8h.html#a105c80e76bac24eb3e2a16bed6609a80',1,'mrs_lib::geometry::quaternionFromEuler(const Eigen::Vector3d &euler)']]], + ['quaternionfromheading_693',['quaternionFromHeading',['../misc_8h.html#aac041627690bc6f377e60b99344b8b3a',1,'mrs_lib::geometry']]] +]; diff --git a/search/mag_sel.png b/search/mag_sel.png new file mode 100644 index 0000000000000000000000000000000000000000..39c0ed52a25dd9d080ee0d42ae6c6042bdfa04d7 GIT binary patch literal 465 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz6!2%?$TA$hhDVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~NU84L`?eGCi_EEpJ?t}-xGu`@87+QPtK?83kxQ`TapwHK(CDaqU2h2ejD|C#+j z9%q3^WHAE+w=f7ZGR&GI0Tg5}@$_|Nf5gMiEhFgvHvB$N=!mC_V~EE2vzPXI9ZnEo zd+1zHor@dYLod2Y{ z@R$7$Z!PXTbY$|@#T!bMzm?`b<(R`cbw(gxJHzu zB$lLFB^RXvDF!10LknF)BV7aY5JN*NBMU1-b8Q0yD+2>vd*|CI8glbfGSez?Ylunu RoetE%;OXk;vd$@?2>>CYplSdB literal 0 HcmV?d00001 diff --git a/search/namespaces_0.html b/search/namespaces_0.html new file mode 100644 index 00000000..76996d1c --- /dev/null +++ b/search/namespaces_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/namespaces_0.js b/search/namespaces_0.js new file mode 100644 index 00000000..d437f8c9 --- /dev/null +++ b/search/namespaces_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['mrs_5flib_495',['mrs_lib',['../namespacemrs__lib.html',1,'']]] +]; diff --git a/search/nomatches.html b/search/nomatches.html new file mode 100644 index 00000000..43773208 --- /dev/null +++ b/search/nomatches.html @@ -0,0 +1,12 @@ + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/search/pages_0.html b/search/pages_0.html new file mode 100644 index 00000000..9a6a29ad --- /dev/null +++ b/search/pages_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/pages_0.js b/search/pages_0.js new file mode 100644 index 00000000..50ce8c17 --- /dev/null +++ b/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['bibliography_846',['Bibliography',['../citelist.html',1,'']]] +]; diff --git a/search/pages_1.html b/search/pages_1.html new file mode 100644 index 00000000..132ee038 --- /dev/null +++ b/search/pages_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/pages_1.js b/search/pages_1.js new file mode 100644 index 00000000..c38436bd --- /dev/null +++ b/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['mrs_20libraries_847',['MRS libraries',['../index.html',1,'']]] +]; diff --git a/search/related_0.html b/search/related_0.html new file mode 100644 index 00000000..bbe15faa --- /dev/null +++ b/search/related_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/related_0.js b/search/related_0.js new file mode 100644 index 00000000..166fe80d --- /dev/null +++ b/search/related_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['operator_2b_844',['operator+',['../structmrs__lib_1_1geometry_1_1cyclic.html#a58ca734b0e19c5f25da90761303451b7',1,'mrs_lib::geometry::cyclic']]], + ['operator_2d_845',['operator-',['../structmrs__lib_1_1geometry_1_1cyclic.html#a9d401b110dd9e5372ffa4951f073e794',1,'mrs_lib::geometry::cyclic']]] +]; diff --git a/search/search.css b/search/search.css new file mode 100644 index 00000000..3cf9df94 --- /dev/null +++ b/search/search.css @@ -0,0 +1,271 @@ +/*---------------- Search Box */ + +#FSearchBox { + float: left; +} + +#MSearchBox { + white-space : nowrap; + float: none; + margin-top: 8px; + right: 0px; + width: 170px; + height: 24px; + z-index: 102; +} + +#MSearchBox .left +{ + display:block; + position:absolute; + left:10px; + width:20px; + height:19px; + background:url('search_l.png') no-repeat; + background-position:right; +} + +#MSearchSelect { + display:block; + position:absolute; + width:20px; + height:19px; +} + +.left #MSearchSelect { + left:4px; +} + +.right #MSearchSelect { + right:5px; +} + +#MSearchField { + display:block; + position:absolute; + height:19px; + background:url('search_m.png') repeat-x; + border:none; + width:115px; + margin-left:20px; + padding-left:4px; + color: #909090; + outline: none; + font: 9pt Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; +} + +#FSearchBox #MSearchField { + margin-left:15px; +} + +#MSearchBox .right { + display:block; + position:absolute; + right:10px; + top:8px; + width:20px; + height:19px; + background:url('search_r.png') no-repeat; + background-position:left; +} + +#MSearchClose { + display: none; + position: absolute; + top: 4px; + background : none; + border: none; + margin: 0px 4px 0px 0px; + padding: 0px 0px; + outline: none; +} + +.left #MSearchClose { + left: 6px; +} + +.right #MSearchClose { + right: 2px; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + width: 60ex; + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; +} + +.SRResult { + display: none; +} + +DIV.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/search/search.js b/search/search.js new file mode 100644 index 00000000..a554ab9c --- /dev/null +++ b/search/search.js @@ -0,0 +1,814 @@ +/* + @licstart The following is the entire license notice for the + JavaScript code in this file. + + Copyright (C) 1997-2017 by Dimitri van Heesch + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + @licend The above is the entire license notice + for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html'; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches.html'; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName == 'DIV' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName == 'DIV' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + parent.document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e(R!W8j_r#qQ#gnr4kAxdU#F0+OBry$Z+ z_0PMi;P|#{d%mw(dnw=jM%@$onTJa%@6Nm3`;2S#nwtVFJI#`U@2Q@@JCCctagvF- z8H=anvo~dTmJ2YA%wA6IHRv%{vxvUm|R)kgZeo zmX%Zb;mpflGZdXCTAgit`||AFzkI#z&(3d4(htA?U2FOL4WF6wY&TB#n3n*I4+hl| z*NBpo#FA92vEu822WQ%mvv4FO#qs` BFGc_W literal 0 HcmV?d00001 diff --git a/search/search_r.png b/search/search_r.png new file mode 100644 index 0000000000000000000000000000000000000000..1af5d21ee13e070d7600f1c4657fde843b953a69 GIT binary patch literal 553 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9c!2%@BXHTsJQY`6?zK#qG8~eHcB(ehe3dtTp zz6=bxGZ+|(`xqD=STHa&U1eaXVrO7DwS|Gf*oA>XrmV$GYcEhOQT(QLuS{~ooZ2P@v=Xc@RKW@Irliv8_;wroU0*)0O?temdsA~70jrdux+`@W7 z-N(<(C)L?hOO?KV{>8(jC{hpKsws)#Fh zvsO>IB+gb@b+rGWaO&!a9Z{!U+fV*s7TS>fdt&j$L%^U@Epd$~Nl7e8wMs5Z1yT$~ z28I^8hDN#u<{^fLRz?<9hUVG^237_Jy7tbuQ8eV{r(~v8;?@w8^gA7>fx*+&&t;uc GLK6VEQpiUD literal 0 HcmV?d00001 diff --git a/search/searchdata.js b/search/searchdata.js new file mode 100644 index 00000000..4d14379e --- /dev/null +++ b/search/searchdata.js @@ -0,0 +1,39 @@ +var indexSectionsWithContent = +{ + 0: "abcdefghijklmnopqrstuvwxyz~", + 1: "abcdegijklmnoprstuvw", + 2: "m", + 3: "abcdegikmnprstuv", + 4: "abcdefghijlmnopqrstuvwy~", + 5: "abhklmnpqrstwx", + 6: "abcdefhikmopqrstuwxz", + 7: "o", + 8: "bm" +}; + +var indexSectionNames = +{ + 0: "all", + 1: "classes", + 2: "namespaces", + 3: "files", + 4: "functions", + 5: "variables", + 6: "typedefs", + 7: "related", + 8: "pages" +}; + +var indexSectionLabels = +{ + 0: "All", + 1: "Classes", + 2: "Namespaces", + 3: "Files", + 4: "Functions", + 5: "Variables", + 6: "Typedefs", + 7: "Friends", + 8: "Pages" +}; + diff --git a/search/typedefs_0.html b/search/typedefs_0.html new file mode 100644 index 00000000..376db479 --- /dev/null +++ b/search/typedefs_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/typedefs_0.js b/search/typedefs_0.js new file mode 100644 index 00000000..43240dbd --- /dev/null +++ b/search/typedefs_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['a_5ft_809',['A_t',['../classmrs__lib_1_1DKF.html#a1d615e5b5aef4c5a00de9b42eef43c1b',1,'mrs_lib::DKF::A_t()'],['../classmrs__lib_1_1JLKF.html#a72ceb375903022d0dfc396b6f1ead479',1,'mrs_lib::JLKF::A_t()'],['../classmrs__lib_1_1LKF.html#aa5c83985c5c7685ebe2af0e445fbc0ad',1,'mrs_lib::LKF::A_t()'],['../classmrs__lib_1_1NCLKF.html#aa7b38a32abe6a319930d6392178d5e3e',1,'mrs_lib::NCLKF::A_t()'],['../classmrs__lib_1_1NCLKF__partial.html#a6d62f542c4ee39019c9466e82ed0cd51',1,'mrs_lib::NCLKF_partial::A_t()']]] +]; diff --git a/search/typedefs_1.html b/search/typedefs_1.html new file mode 100644 index 00000000..9b8bf72f --- /dev/null +++ b/search/typedefs_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/typedefs_1.js b/search/typedefs_1.js new file mode 100644 index 00000000..40e9025b --- /dev/null +++ b/search/typedefs_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['b_5ft_810',['B_t',['../classmrs__lib_1_1DKF.html#a5de2bdb0aa87e268361e19206849bb22',1,'mrs_lib::DKF::B_t()'],['../classmrs__lib_1_1JLKF.html#ac8971eebc826cd62aadd45d4b64d216c',1,'mrs_lib::JLKF::B_t()'],['../classmrs__lib_1_1LKF.html#a5ca7805e401bd7b718b510269a6ce7bf',1,'mrs_lib::LKF::B_t()'],['../classmrs__lib_1_1NCLKF.html#af283625e8caefbccb8ca64072dab91a8',1,'mrs_lib::NCLKF::B_t()'],['../classmrs__lib_1_1NCLKF__partial.html#a749bb8222899e2b056e27875c0f951f6',1,'mrs_lib::NCLKF_partial::B_t()']]], + ['base_5fclass_811',['Base_class',['../classmrs__lib_1_1DKF.html#ad7e6756be6a89592151d092f20d19811',1,'mrs_lib::DKF::Base_class()'],['../classmrs__lib_1_1LKF.html#ae54a2cc807bafeee1777ffdbd37e3c02',1,'mrs_lib::LKF::Base_class()'],['../classmrs__lib_1_1NCLKF.html#aa670be9fba29c7d8d8c7c849d9d844d1',1,'mrs_lib::NCLKF::Base_class()'],['../classmrs__lib_1_1NCLKF__partial.html#a13dac50b4906535f6ff5837b1057597f',1,'mrs_lib::NCLKF_partial::Base_class()'],['../classmrs__lib_1_1UKF.html#ae5a0eb2f31131ed4cec117d4a1000080',1,'mrs_lib::UKF::Base_class()']]] +]; diff --git a/search/typedefs_10.html b/search/typedefs_10.html new file mode 100644 index 00000000..bbfbcf0b --- /dev/null +++ b/search/typedefs_10.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/typedefs_10.js b/search/typedefs_10.js new file mode 100644 index 00000000..ea0dd39d --- /dev/null +++ b/search/typedefs_10.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['u_5ft_837',['u_t',['../classmrs__lib_1_1DKF.html#a5998af081256d469dbd4ac5a1d4d7fd7',1,'mrs_lib::DKF::u_t()'],['../classmrs__lib_1_1KalmanFilter.html#ad92ac4f280e849986554bc593e5ab96e',1,'mrs_lib::KalmanFilter::u_t()'],['../classmrs__lib_1_1KalmanFilterAloamGarm.html#ae680d65b40883e1678e0365ed3924c16',1,'mrs_lib::KalmanFilterAloamGarm::u_t()'],['../classmrs__lib_1_1LKF.html#a98e130a3d14cd93b01b0b942de8af10c',1,'mrs_lib::LKF::u_t()'],['../classmrs__lib_1_1NCLKF.html#a8992c34838e430a64b070929e92c263a',1,'mrs_lib::NCLKF::u_t()'],['../classmrs__lib_1_1NCLKF__partial.html#a5718270798d8227ccaf76a5d3b97fda5',1,'mrs_lib::NCLKF_partial::u_t()'],['../classmrs__lib_1_1Repredictor.html#a19532d9b875ac33f80ffe313dfb26e6d',1,'mrs_lib::Repredictor::u_t()'],['../classmrs__lib_1_1RepredictorAloamgarm.html#acf7e98ab597eeeb4766b9794cf861f13',1,'mrs_lib::RepredictorAloamgarm::u_t()'],['../classmrs__lib_1_1RHEIV.html#a3bc18fd815c8f09123b0a9083ca3b959',1,'mrs_lib::RHEIV::u_t()'],['../classmrs__lib_1_1UKF.html#a6589d6a1f5eba355f1bec91e99826b71',1,'mrs_lib::UKF::u_t()']]] +]; diff --git a/search/typedefs_11.html b/search/typedefs_11.html new file mode 100644 index 00000000..98de1ae1 --- /dev/null +++ b/search/typedefs_11.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/typedefs_11.js b/search/typedefs_11.js new file mode 100644 index 00000000..8e63b977 --- /dev/null +++ b/search/typedefs_11.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['w_5ft_838',['W_t',['../classmrs__lib_1_1UKF.html#aca628bd6d14b59b9d0a10652a2665a32',1,'mrs_lib::UKF']]] +]; diff --git a/search/typedefs_12.html b/search/typedefs_12.html new file mode 100644 index 00000000..40ed3476 --- /dev/null +++ b/search/typedefs_12.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/typedefs_12.js b/search/typedefs_12.js new file mode 100644 index 00000000..2fc21b28 --- /dev/null +++ b/search/typedefs_12.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['x_5ft_839',['X_t',['../classmrs__lib_1_1UKF.html#a1435f2ed4e333151990355813cee95ba',1,'mrs_lib::UKF::X_t()'],['../classmrs__lib_1_1DKF.html#a094cf9bcb768de6db47e4c2703bede20',1,'mrs_lib::DKF::x_t()'],['../classmrs__lib_1_1KalmanFilter.html#a5b8f47081daf208496a19a4364e6509c',1,'mrs_lib::KalmanFilter::x_t()'],['../classmrs__lib_1_1KalmanFilterAloamGarm.html#a0e19e15226a8e251452cd486153fba12',1,'mrs_lib::KalmanFilterAloamGarm::x_t()'],['../classmrs__lib_1_1LKF.html#abfad09fe2386fb87eaea7b4dd8b24409',1,'mrs_lib::LKF::x_t()'],['../classmrs__lib_1_1NCLKF.html#a8fa90de14ea4fa4125882bd49d101888',1,'mrs_lib::NCLKF::x_t()'],['../classmrs__lib_1_1NCLKF__partial.html#afaae66f623e768b19c0160fb21be9373',1,'mrs_lib::NCLKF_partial::x_t()'],['../classmrs__lib_1_1Repredictor.html#ac9550981d03dc3c898dcbd39c4bc461f',1,'mrs_lib::Repredictor::x_t()'],['../classmrs__lib_1_1RepredictorAloamgarm.html#a5c2992c6bde2dd8f3bdc7673fc3977da',1,'mrs_lib::RepredictorAloamgarm::x_t()'],['../classmrs__lib_1_1RHEIV.html#a6482f5ff13cbfaef9f8dc86912c1258d',1,'mrs_lib::RHEIV::x_t()'],['../classmrs__lib_1_1UKF.html#a5ab9d25f7b2470c7abeacda7f8b80630',1,'mrs_lib::UKF::x_t()']]], + ['xq_5ft_840',['xq_t',['../classmrs__lib_1_1NCLKF__partial.html#a50092f2c99a521668dfd3211c999441c',1,'mrs_lib::NCLKF_partial']]], + ['xs_5ft_841',['xs_t',['../classmrs__lib_1_1RHEIV.html#aee3df85ac46e5b29259f8898388324ec',1,'mrs_lib::RHEIV']]] +]; diff --git a/search/typedefs_13.html b/search/typedefs_13.html new file mode 100644 index 00000000..17938c1c --- /dev/null +++ b/search/typedefs_13.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/typedefs_13.js b/search/typedefs_13.js new file mode 100644 index 00000000..86c944fa --- /dev/null +++ b/search/typedefs_13.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['z_5ft_842',['z_t',['../classmrs__lib_1_1DKF.html#ad919f1d7a6f5d8be7361a8336aa6fd85',1,'mrs_lib::DKF::z_t()'],['../classmrs__lib_1_1KalmanFilter.html#a0825f38a6a4ddc522239bb7bf6279737',1,'mrs_lib::KalmanFilter::z_t()'],['../classmrs__lib_1_1KalmanFilterAloamGarm.html#ae7fc4baaa223bf1ccebebc20c4b02bcc',1,'mrs_lib::KalmanFilterAloamGarm::z_t()'],['../classmrs__lib_1_1LKF.html#af4318056f5e0c024651bb882b60ec640',1,'mrs_lib::LKF::z_t()'],['../classmrs__lib_1_1NCLKF.html#a80db36613d09068f8daa0dc7e735dc64',1,'mrs_lib::NCLKF::z_t()'],['../classmrs__lib_1_1NCLKF__partial.html#ad5308432a3010edabc4598a92786fad5',1,'mrs_lib::NCLKF_partial::z_t()'],['../classmrs__lib_1_1Repredictor.html#a4f12cadd7f0377eccb70b8d61e7ee8e3',1,'mrs_lib::Repredictor::z_t()'],['../classmrs__lib_1_1RepredictorAloamgarm.html#a3e265f15f9b8b031af819d1d2045909b',1,'mrs_lib::RepredictorAloamgarm::z_t()'],['../classmrs__lib_1_1RHEIV.html#a8e01ed1580572ec20f0230d9bfe5273f',1,'mrs_lib::RHEIV::z_t()'],['../classmrs__lib_1_1UKF.html#a7a68877ffa7bd8bb10f16d1f104e0a73',1,'mrs_lib::UKF::z_t()'],['../classmrs__lib_1_1UKF.html#a06a3fae37e8a0613d8169b638c4c0001',1,'mrs_lib::UKF::Z_t()']]], + ['zs_5ft_843',['zs_t',['../classmrs__lib_1_1RHEIV.html#a3b4e40932aae907ae8185df7703d5677',1,'mrs_lib::RHEIV']]] +]; diff --git a/search/typedefs_2.html b/search/typedefs_2.html new file mode 100644 index 00000000..d18982f5 --- /dev/null +++ b/search/typedefs_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/typedefs_2.js b/search/typedefs_2.js new file mode 100644 index 00000000..673c6948 --- /dev/null +++ b/search/typedefs_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['c_5ft_812',['C_t',['../classmrs__lib_1_1JLKF.html#af34d34f55cb8804bd4e873a16c9e9a08',1,'mrs_lib::JLKF']]] +]; diff --git a/search/typedefs_3.html b/search/typedefs_3.html new file mode 100644 index 00000000..8941740c --- /dev/null +++ b/search/typedefs_3.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/typedefs_3.js b/search/typedefs_3.js new file mode 100644 index 00000000..8e4841d4 --- /dev/null +++ b/search/typedefs_3.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['d_5ft_813',['D_t',['../classmrs__lib_1_1JLKF.html#ac047c1625da963988acfc47edc200a57',1,'mrs_lib::JLKF']]], + ['dzdx_5ft_814',['dzdx_t',['../classmrs__lib_1_1RHEIV.html#abec4cb102b681ff3ec39786dc1d2bd4b',1,'mrs_lib::RHEIV']]], + ['dzdxs_5ft_815',['dzdxs_t',['../classmrs__lib_1_1RHEIV.html#ad85f14fb415e2fbe69ad05db0dc56e7b',1,'mrs_lib::RHEIV']]] +]; diff --git a/search/typedefs_4.html b/search/typedefs_4.html new file mode 100644 index 00000000..933bd3b9 --- /dev/null +++ b/search/typedefs_4.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/typedefs_4.js b/search/typedefs_4.js new file mode 100644 index 00000000..1ef7abee --- /dev/null +++ b/search/typedefs_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['eta_5ft_816',['eta_t',['../classmrs__lib_1_1RHEIV.html#a238b7a1a44cb7711756bd7b94a11797d',1,'mrs_lib::RHEIV']]] +]; diff --git a/search/typedefs_5.html b/search/typedefs_5.html new file mode 100644 index 00000000..7712e6f8 --- /dev/null +++ b/search/typedefs_5.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/typedefs_5.js b/search/typedefs_5.js new file mode 100644 index 00000000..ab538f1e --- /dev/null +++ b/search/typedefs_5.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['f_5fdzdx_5ft_817',['f_dzdx_t',['../classmrs__lib_1_1RHEIV.html#ac5b425f7782114173db5a275bea2c871',1,'mrs_lib::RHEIV']]], + ['f_5fz_5ft_818',['f_z_t',['../classmrs__lib_1_1RHEIV.html#abfea65ce9c912fcde3e805a66dc8ca42',1,'mrs_lib::RHEIV']]] +]; diff --git a/search/typedefs_6.html b/search/typedefs_6.html new file mode 100644 index 00000000..25aa6dd4 --- /dev/null +++ b/search/typedefs_6.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/typedefs_6.js b/search/typedefs_6.js new file mode 100644 index 00000000..869cb580 --- /dev/null +++ b/search/typedefs_6.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['h_5ft_819',['H_t',['../classmrs__lib_1_1DKF.html#aaee9d5c96d921fa7854f24460edf58ab',1,'mrs_lib::DKF::H_t()'],['../classmrs__lib_1_1JLKF.html#a7599ec962b434fe92534a58d48cdfacb',1,'mrs_lib::JLKF::H_t()'],['../classmrs__lib_1_1LKF.html#a78733a13f277480c5c8c42228d440df7',1,'mrs_lib::LKF::H_t()'],['../classmrs__lib_1_1NCLKF.html#a92eb1e6f9fe04297bb54fdfbdc74d460',1,'mrs_lib::NCLKF::H_t()'],['../classmrs__lib_1_1NCLKF__partial.html#a12079d59b1f0e949c535e478d8e1d88c',1,'mrs_lib::NCLKF_partial::H_t()']]], + ['hq_5ft_820',['Hq_t',['../classmrs__lib_1_1NCLKF__partial.html#a6f311605a0470b290c6917d555bb4c9a',1,'mrs_lib::NCLKF_partial']]] +]; diff --git a/search/typedefs_7.html b/search/typedefs_7.html new file mode 100644 index 00000000..6cb2ddea --- /dev/null +++ b/search/typedefs_7.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/typedefs_7.js b/search/typedefs_7.js new file mode 100644 index 00000000..6f93e5ff --- /dev/null +++ b/search/typedefs_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['indices_5ft_821',['indices_t',['../classmrs__lib_1_1NCLKF__partial.html#a93afd8063033124c0698426cd03d4507',1,'mrs_lib::NCLKF_partial']]] +]; diff --git a/search/typedefs_8.html b/search/typedefs_8.html new file mode 100644 index 00000000..52ab5aa2 --- /dev/null +++ b/search/typedefs_8.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/typedefs_8.js b/search/typedefs_8.js new file mode 100644 index 00000000..a531fafa --- /dev/null +++ b/search/typedefs_8.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['k_5ft_822',['K_t',['../classmrs__lib_1_1DKF.html#a87d3b7863fbd0b392f9c831fcaf8e345',1,'mrs_lib::DKF::K_t()'],['../classmrs__lib_1_1JLKF.html#a20be98f26b355640d078f196f9495fd5',1,'mrs_lib::JLKF::K_t()'],['../classmrs__lib_1_1LKF.html#a33b80f4e1b9b7eb7243b71a4ae6d99c6',1,'mrs_lib::LKF::K_t()'],['../classmrs__lib_1_1NCLKF.html#ae2d30fe948b17723e0a89450044f8f93',1,'mrs_lib::NCLKF::K_t()'],['../classmrs__lib_1_1NCLKF__partial.html#a47b90d150c6147ab30ae1866b66ea49c',1,'mrs_lib::NCLKF_partial::K_t()'],['../classmrs__lib_1_1UKF.html#ace5416fd8ac52fba822337bceaf751a7',1,'mrs_lib::UKF::K_t()']]], + ['kq_5ft_823',['Kq_t',['../classmrs__lib_1_1NCLKF__partial.html#a459ce71ac559eb881415485df4d622fa',1,'mrs_lib::NCLKF_partial']]] +]; diff --git a/search/typedefs_9.html b/search/typedefs_9.html new file mode 100644 index 00000000..7b6dd851 --- /dev/null +++ b/search/typedefs_9.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/typedefs_9.js b/search/typedefs_9.js new file mode 100644 index 00000000..abf9c83c --- /dev/null +++ b/search/typedefs_9.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['message_5fcallback_5ft_824',['message_callback_t',['../classmrs__lib_1_1SubscribeHandler.html#a38b7371b24896e5ea21f5a8dd2821cf6',1,'mrs_lib::SubscribeHandler']]], + ['message_5ftype_825',['message_type',['../classmrs__lib_1_1SubscribeHandler.html#aab546ccb302e3e05d8e97e9085f62b9a',1,'mrs_lib::SubscribeHandler::message_type()'],['../namespacemrs__lib.html#afe10d9f91cc2173fa3c30021514a5c12',1,'mrs_lib::message_type()']]], + ['modelptr_826',['ModelPtr',['../classmrs__lib_1_1Repredictor.html#acb4a34d97aab3896de9565012a890381',1,'mrs_lib::Repredictor::ModelPtr()'],['../classmrs__lib_1_1RepredictorAloamgarm.html#a7766d3dbccd04fcbe584cca6730153ca',1,'mrs_lib::RepredictorAloamgarm::ModelPtr()']]] +]; diff --git a/search/typedefs_a.html b/search/typedefs_a.html new file mode 100644 index 00000000..ba5e6689 --- /dev/null +++ b/search/typedefs_a.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/typedefs_a.js b/search/typedefs_a.js new file mode 100644 index 00000000..5da02404 --- /dev/null +++ b/search/typedefs_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['observation_5fmodel_5ft_827',['observation_model_t',['../classmrs__lib_1_1UKF.html#ac515ea8c688d7ee67250c384417f9ab9',1,'mrs_lib::UKF']]] +]; diff --git a/search/typedefs_b.html b/search/typedefs_b.html new file mode 100644 index 00000000..9b598551 --- /dev/null +++ b/search/typedefs_b.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/typedefs_b.js b/search/typedefs_b.js new file mode 100644 index 00000000..3de548d6 --- /dev/null +++ b/search/typedefs_b.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['p_5ft_828',['P_t',['../classmrs__lib_1_1DKF.html#aa351bed9f3bdac26c6ed2526a5b2ac01',1,'mrs_lib::DKF::P_t()'],['../classmrs__lib_1_1KalmanFilter.html#a8f5e50ea6668129218bd4113f4ffdf6f',1,'mrs_lib::KalmanFilter::P_t()'],['../classmrs__lib_1_1KalmanFilterAloamGarm.html#a9b8488ef81812059a366fcc2e92e04f6',1,'mrs_lib::KalmanFilterAloamGarm::P_t()'],['../classmrs__lib_1_1LKF.html#a5d5cee075e30da36ffb946cffcfca688',1,'mrs_lib::LKF::P_t()'],['../classmrs__lib_1_1NCLKF.html#a1448842265f0b39d5da536488d146db3',1,'mrs_lib::NCLKF::P_t()'],['../classmrs__lib_1_1NCLKF__partial.html#aef875cb026a1a0d8df31a8fc3f02e63b',1,'mrs_lib::NCLKF_partial::P_t()'],['../classmrs__lib_1_1Repredictor.html#aca5fb76c2e698ed1dd2c58e340adca58',1,'mrs_lib::Repredictor::P_t()'],['../classmrs__lib_1_1RepredictorAloamgarm.html#a1f2bffb8cbea233b14036e016e8bb654',1,'mrs_lib::RepredictorAloamgarm::P_t()'],['../classmrs__lib_1_1RHEIV.html#a9adfedc8dfbe38ccf06f556481a6c5c9',1,'mrs_lib::RHEIV::P_t()'],['../classmrs__lib_1_1UKF.html#ac1128f5d7fa36305a52859a752a97fda',1,'mrs_lib::UKF::P_t()']]], + ['ps_5ft_829',['Ps_t',['../classmrs__lib_1_1RHEIV.html#aab24b461160051b3537f76e633d47d8d',1,'mrs_lib::RHEIV']]], + ['pzz_5ft_830',['Pzz_t',['../classmrs__lib_1_1UKF.html#af11dc75b608a43930e8289c51e8ab7c6',1,'mrs_lib::UKF']]] +]; diff --git a/search/typedefs_c.html b/search/typedefs_c.html new file mode 100644 index 00000000..1924d704 --- /dev/null +++ b/search/typedefs_c.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/typedefs_c.js b/search/typedefs_c.js new file mode 100644 index 00000000..a87e22f9 --- /dev/null +++ b/search/typedefs_c.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['q_5ft_831',['Q_t',['../classmrs__lib_1_1DKF.html#a59afcc2127ecd2a9dba8a53ca505f97a',1,'mrs_lib::DKF::Q_t()'],['../classmrs__lib_1_1KalmanFilter.html#ab2c5ddabe3fc919334595ec1e535c848',1,'mrs_lib::KalmanFilter::Q_t()'],['../classmrs__lib_1_1KalmanFilterAloamGarm.html#ab9efcd795fc6c47ef94c20f9ff9547dc',1,'mrs_lib::KalmanFilterAloamGarm::Q_t()'],['../classmrs__lib_1_1LKF.html#a5df2fd299b9da75a872e8d9194da1ca9',1,'mrs_lib::LKF::Q_t()'],['../classmrs__lib_1_1NCLKF.html#aab7df7efe1e8e70d0e79ad374c6674a0',1,'mrs_lib::NCLKF::Q_t()'],['../classmrs__lib_1_1NCLKF__partial.html#a2ba0fce7ba12825a0c498f7676848fce',1,'mrs_lib::NCLKF_partial::Q_t()'],['../classmrs__lib_1_1Repredictor.html#af0b9dfd5f21b220e87c79298b061f63d',1,'mrs_lib::Repredictor::Q_t()'],['../classmrs__lib_1_1RepredictorAloamgarm.html#aa031cc536ee7a46c3e79287c65fc1fa7',1,'mrs_lib::RepredictorAloamgarm::Q_t()'],['../classmrs__lib_1_1UKF.html#abd8f845f1b3f138949bd95c7dc12e011',1,'mrs_lib::UKF::Q_t()']]] +]; diff --git a/search/typedefs_d.html b/search/typedefs_d.html new file mode 100644 index 00000000..1b480876 --- /dev/null +++ b/search/typedefs_d.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/typedefs_d.js b/search/typedefs_d.js new file mode 100644 index 00000000..7fdcca40 --- /dev/null +++ b/search/typedefs_d.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['r_5ft_832',['R_t',['../classmrs__lib_1_1DKF.html#a6c1a5e6a6cdcb52271774b566957f948',1,'mrs_lib::DKF::R_t()'],['../classmrs__lib_1_1KalmanFilter.html#a1e4c8aa79cfcea707876d85950132450',1,'mrs_lib::KalmanFilter::R_t()'],['../classmrs__lib_1_1KalmanFilterAloamGarm.html#ab6bf1e91bfeb633b08038f54b2b5d0fa',1,'mrs_lib::KalmanFilterAloamGarm::R_t()'],['../classmrs__lib_1_1LKF.html#a5d2cb5ed042b660f1a44bdb9f4d2612f',1,'mrs_lib::LKF::R_t()'],['../classmrs__lib_1_1NCLKF.html#a4b6b964e9491ca80fdfc1afacc9b23fc',1,'mrs_lib::NCLKF::R_t()'],['../classmrs__lib_1_1NCLKF__partial.html#a7754b24176416b24869450c88a1328aa',1,'mrs_lib::NCLKF_partial::R_t()'],['../classmrs__lib_1_1Repredictor.html#aac7c07ba0237230fa7346932fb542ae9',1,'mrs_lib::Repredictor::R_t()'],['../classmrs__lib_1_1RepredictorAloamgarm.html#afa36b8b183f868a84dc182e4ac562d44',1,'mrs_lib::RepredictorAloamgarm::R_t()'],['../classmrs__lib_1_1UKF.html#a0af0d9a246df0798b1cb1308cec82fd2',1,'mrs_lib::UKF::R_t()']]] +]; diff --git a/search/typedefs_e.html b/search/typedefs_e.html new file mode 100644 index 00000000..fed948df --- /dev/null +++ b/search/typedefs_e.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/typedefs_e.js b/search/typedefs_e.js new file mode 100644 index 00000000..cc8f75f1 --- /dev/null +++ b/search/typedefs_e.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['statecov_5ft_833',['statecov_t',['../classmrs__lib_1_1DKF.html#a1408b975fe2e4bd3fc5009c80d43f06b',1,'mrs_lib::DKF::statecov_t()'],['../classmrs__lib_1_1LKF.html#a54b2b4a3932510daad92da5a2b1274c1',1,'mrs_lib::LKF::statecov_t()'],['../classmrs__lib_1_1NCLKF.html#abac1b51597611226f2c0642230207e71',1,'mrs_lib::NCLKF::statecov_t()'],['../classmrs__lib_1_1NCLKF__partial.html#a2bc4e99acb7f38dc41d6e63cdce5e805',1,'mrs_lib::NCLKF_partial::statecov_t()'],['../classmrs__lib_1_1Repredictor.html#a794952d1627187223300848cd3e1bf66',1,'mrs_lib::Repredictor::statecov_t()'],['../classmrs__lib_1_1RepredictorAloamgarm.html#a4d5da8a5d296bf98bff6f99eaf550ae7',1,'mrs_lib::RepredictorAloamgarm::statecov_t()'],['../classmrs__lib_1_1UKF.html#a604c0bfee69ee5a34dc4412af3cc6e53',1,'mrs_lib::UKF::statecov_t()']]] +]; diff --git a/search/typedefs_f.html b/search/typedefs_f.html new file mode 100644 index 00000000..fe33f52d --- /dev/null +++ b/search/typedefs_f.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/typedefs_f.js b/search/typedefs_f.js new file mode 100644 index 00000000..39b320d9 --- /dev/null +++ b/search/typedefs_f.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['theta_5ft_834',['theta_t',['../classmrs__lib_1_1RHEIV.html#af6d8212b941ad45ce6b53bc4e8449de1',1,'mrs_lib::RHEIV']]], + ['timeout_5fcallback_5ft_835',['timeout_callback_t',['../classmrs__lib_1_1SubscribeHandler.html#a6f12a82506c6967a8af9c2c878a1803a',1,'mrs_lib::SubscribeHandler']]], + ['transition_5fmodel_5ft_836',['transition_model_t',['../classmrs__lib_1_1UKF.html#a986f17f015282a33b140af4adabce091',1,'mrs_lib::UKF']]] +]; diff --git a/search/variables_0.html b/search/variables_0.html new file mode 100644 index 00000000..bf3eba5c --- /dev/null +++ b/search/variables_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_0.js b/search/variables_0.js new file mode 100644 index 00000000..af8494aa --- /dev/null +++ b/search/variables_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['a_782',['A',['../classmrs__lib_1_1LKF.html#a0926533d35a53410b4302fda99a45321',1,'mrs_lib::LKF']]], + ['autostart_783',['autostart',['../structmrs__lib_1_1SubscribeHandlerOptions.html#aab7865b63b3dd44b61dba06c54f981c8',1,'mrs_lib::SubscribeHandlerOptions']]] +]; diff --git a/search/variables_1.html b/search/variables_1.html new file mode 100644 index 00000000..49fe59a1 --- /dev/null +++ b/search/variables_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_1.js b/search/variables_1.js new file mode 100644 index 00000000..f85db9d1 --- /dev/null +++ b/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['b_784',['B',['../classmrs__lib_1_1LKF.html#a2d88249f1992d772631026387a45445a',1,'mrs_lib::LKF']]] +]; diff --git a/search/variables_2.html b/search/variables_2.html new file mode 100644 index 00000000..0c8a18cf --- /dev/null +++ b/search/variables_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_2.js b/search/variables_2.js new file mode 100644 index 00000000..4c7469f4 --- /dev/null +++ b/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['h_785',['H',['../classmrs__lib_1_1LKF.html#a552fedb99ce43148c212c809dcd8191f',1,'mrs_lib::LKF']]], + ['half_5frange_786',['half_range',['../structmrs__lib_1_1geometry_1_1cyclic.html#a78cd52e438886de479af6455e97da2b6',1,'mrs_lib::geometry::cyclic']]] +]; diff --git a/search/variables_3.html b/search/variables_3.html new file mode 100644 index 00000000..19a31fc2 --- /dev/null +++ b/search/variables_3.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_3.js b/search/variables_3.js new file mode 100644 index 00000000..2a41f26d --- /dev/null +++ b/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['k_787',['k',['../classmrs__lib_1_1RHEIV.html#a8d5b4a0df9a65eaf7127a6d93b38bf5e',1,'mrs_lib::RHEIV']]] +]; diff --git a/search/variables_4.html b/search/variables_4.html new file mode 100644 index 00000000..bdc37be7 --- /dev/null +++ b/search/variables_4.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_4.js b/search/variables_4.js new file mode 100644 index 00000000..49fd69c8 --- /dev/null +++ b/search/variables_4.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['l_788',['l',['../classmrs__lib_1_1RHEIV.html#a1495045a8f4fca1f045da6866f5e62b0',1,'mrs_lib::RHEIV']]], + ['lr_789',['lr',['../classmrs__lib_1_1RHEIV.html#af267a00d1631e4685e5a1451f2510ac0',1,'mrs_lib::RHEIV']]] +]; diff --git a/search/variables_5.html b/search/variables_5.html new file mode 100644 index 00000000..6aa2249b --- /dev/null +++ b/search/variables_5.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_5.js b/search/variables_5.js new file mode 100644 index 00000000..cd1280b6 --- /dev/null +++ b/search/variables_5.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['m_790',['m',['../classmrs__lib_1_1DKF.html#a266b963fd1ed94246fc413ecfa510e54',1,'mrs_lib::DKF::m()'],['../classmrs__lib_1_1KalmanFilter.html#a472b37319b5dabb8cd4e4146bd86b8bf',1,'mrs_lib::KalmanFilter::m()'],['../classmrs__lib_1_1KalmanFilterAloamGarm.html#a336bd0445bfa4ca091dda05d0f83757b',1,'mrs_lib::KalmanFilterAloamGarm::m()'],['../classmrs__lib_1_1LKF.html#ab2132e00d769c35bf4c89760b1f7da2f',1,'mrs_lib::LKF::m()'],['../classmrs__lib_1_1NCLKF.html#a4b3f2c1a84f0e0000d3d191c9f337306',1,'mrs_lib::NCLKF::m()'],['../classmrs__lib_1_1NCLKF__partial.html#a748e915398e1ff3c09675bfcb1af7985',1,'mrs_lib::NCLKF_partial::m()'],['../classmrs__lib_1_1UKF.html#a81c0e0d290f9eb1aecd28b0e0fa3b7ce',1,'mrs_lib::UKF::m()']]], + ['minimum_791',['minimum',['../structmrs__lib_1_1geometry_1_1cyclic.html#ada8bf8d17bfa81025b75d5a4e1da8ac0',1,'mrs_lib::geometry::cyclic']]] +]; diff --git a/search/variables_6.html b/search/variables_6.html new file mode 100644 index 00000000..ce4a9063 --- /dev/null +++ b/search/variables_6.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_6.js b/search/variables_6.js new file mode 100644 index 00000000..9e1f337c --- /dev/null +++ b/search/variables_6.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['n_792',['n',['../classmrs__lib_1_1DKF.html#a1c8d43906017aca20230464f87c0a28c',1,'mrs_lib::DKF::n()'],['../classmrs__lib_1_1KalmanFilter.html#a33bade5cb8e189919bd7c5c7d81a75fd',1,'mrs_lib::KalmanFilter::n()'],['../classmrs__lib_1_1KalmanFilterAloamGarm.html#a7b9714f54a6ec03679cf3af571e4219a',1,'mrs_lib::KalmanFilterAloamGarm::n()'],['../classmrs__lib_1_1LKF.html#a23db0a12382876c56c4f696119a38dfb',1,'mrs_lib::LKF::n()'],['../classmrs__lib_1_1NCLKF.html#a8e0f671100fb36a431a1d2f6ed1df7b9',1,'mrs_lib::NCLKF::n()'],['../classmrs__lib_1_1NCLKF__partial.html#afa31bda8d042554992676389d464cfd9',1,'mrs_lib::NCLKF_partial::n()'],['../classmrs__lib_1_1UKF.html#a42270573cc14c2339a46841a5d3e264e',1,'mrs_lib::UKF::n()']]], + ['nh_793',['nh',['../structmrs__lib_1_1SubscribeHandlerOptions.html#ac5f6fabbc933d7e3f9beba07b166c054',1,'mrs_lib::SubscribeHandlerOptions']]], + ['no_5fmessage_5ftimeout_794',['no_message_timeout',['../structmrs__lib_1_1SubscribeHandlerOptions.html#a5702cb78ed291f5e36c960d0f90bb35c',1,'mrs_lib::SubscribeHandlerOptions']]], + ['node_5fname_795',['node_name',['../structmrs__lib_1_1SubscribeHandlerOptions.html#a3d31e2d693f41df180cd6911a3fb8310',1,'mrs_lib::SubscribeHandlerOptions']]], + ['nq_796',['nq',['../classmrs__lib_1_1NCLKF__partial.html#a139afd8f356f87aa0faadea3e8878649',1,'mrs_lib::NCLKF_partial']]] +]; diff --git a/search/variables_7.html b/search/variables_7.html new file mode 100644 index 00000000..39ffd474 --- /dev/null +++ b/search/variables_7.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_7.js b/search/variables_7.js new file mode 100644 index 00000000..d6398db5 --- /dev/null +++ b/search/variables_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['p_797',['P',['../structmrs__lib_1_1KalmanFilter_1_1statecov__t.html#aa2747c6fd07bc3a4d9b2c153e38c11ff',1,'mrs_lib::KalmanFilter::statecov_t::P()'],['../structmrs__lib_1_1KalmanFilterAloamGarm_1_1statecov__t.html#a876ae3c9d4dafac63ddd0723fe351874',1,'mrs_lib::KalmanFilterAloamGarm::statecov_t::P()'],['../classmrs__lib_1_1DKF.html#afffd4a1421cb0ca08f75cd10c7cc2c78',1,'mrs_lib::DKF::p()'],['../classmrs__lib_1_1KalmanFilter.html#a72ed6c241094ce2b25fca0a97679a4c7',1,'mrs_lib::KalmanFilter::p()'],['../classmrs__lib_1_1KalmanFilterAloamGarm.html#aade8833d5835d0ee12be558e16fe595a',1,'mrs_lib::KalmanFilterAloamGarm::p()'],['../classmrs__lib_1_1LKF.html#a87db95f28f4834e801cd7fbd0e98e388',1,'mrs_lib::LKF::p()'],['../classmrs__lib_1_1NCLKF.html#adc5fb114b6abc3e2a72fbe4ed3ba0753',1,'mrs_lib::NCLKF::p()'],['../classmrs__lib_1_1NCLKF__partial.html#a2048d62a3e243b91802f6e85fcdcf2b3',1,'mrs_lib::NCLKF_partial::p()'],['../classmrs__lib_1_1UKF.html#a0042b2b7c0deb10b5bb2825f10c5d769',1,'mrs_lib::UKF::p()']]] +]; diff --git a/search/variables_8.html b/search/variables_8.html new file mode 100644 index 00000000..37a2eddf --- /dev/null +++ b/search/variables_8.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_8.js b/search/variables_8.js new file mode 100644 index 00000000..c6f7b6f9 --- /dev/null +++ b/search/variables_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['queue_5fsize_798',['queue_size',['../structmrs__lib_1_1SubscribeHandlerOptions.html#a5abe6590d88b396d94cce7a7ae652e09',1,'mrs_lib::SubscribeHandlerOptions']]] +]; diff --git a/search/variables_9.html b/search/variables_9.html new file mode 100644 index 00000000..21e5a4f3 --- /dev/null +++ b/search/variables_9.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_9.js b/search/variables_9.js new file mode 100644 index 00000000..d62a1ca0 --- /dev/null +++ b/search/variables_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['range_799',['range',['../structmrs__lib_1_1geometry_1_1cyclic.html#a406dfc057fd17b5935add5a7bf9fe325',1,'mrs_lib::geometry::cyclic']]] +]; diff --git a/search/variables_a.html b/search/variables_a.html new file mode 100644 index 00000000..1f650553 --- /dev/null +++ b/search/variables_a.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_a.js b/search/variables_a.js new file mode 100644 index 00000000..5c11e729 --- /dev/null +++ b/search/variables_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['stamp_800',['stamp',['../structmrs__lib_1_1KalmanFilter_1_1statecov__t.html#ab576efb895b5def90a7aab738c610f83',1,'mrs_lib::KalmanFilter::statecov_t']]], + ['supremum_801',['supremum',['../structmrs__lib_1_1geometry_1_1cyclic.html#adf3f559f3099bf6002a8f1331df42142',1,'mrs_lib::geometry::cyclic']]] +]; diff --git a/search/variables_b.html b/search/variables_b.html new file mode 100644 index 00000000..c02d066f --- /dev/null +++ b/search/variables_b.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_b.js b/search/variables_b.js new file mode 100644 index 00000000..c4668004 --- /dev/null +++ b/search/variables_b.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['threadsafe_802',['threadsafe',['../structmrs__lib_1_1SubscribeHandlerOptions.html#a7c924f3581ff84d571b825d7e77b9511',1,'mrs_lib::SubscribeHandlerOptions']]], + ['timeout_5fcallback_803',['timeout_callback',['../structmrs__lib_1_1SubscribeHandlerOptions.html#aba6f6f262bfeae0d1f6f39bb778d04af',1,'mrs_lib::SubscribeHandlerOptions']]], + ['timeout_5fmanager_804',['timeout_manager',['../structmrs__lib_1_1SubscribeHandlerOptions.html#a50dd6637eb0800d0ee53c1cd6cee058e',1,'mrs_lib::SubscribeHandlerOptions']]], + ['topic_5fname_805',['topic_name',['../structmrs__lib_1_1SubscribeHandlerOptions.html#a374f745d46497064c62909412ebdf266',1,'mrs_lib::SubscribeHandlerOptions']]], + ['transport_5fhints_806',['transport_hints',['../structmrs__lib_1_1SubscribeHandlerOptions.html#a41f19ca415439152b934b3633933ec25',1,'mrs_lib::SubscribeHandlerOptions']]] +]; diff --git a/search/variables_c.html b/search/variables_c.html new file mode 100644 index 00000000..4b866c6c --- /dev/null +++ b/search/variables_c.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_c.js b/search/variables_c.js new file mode 100644 index 00000000..590378fa --- /dev/null +++ b/search/variables_c.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['w_807',['w',['../classmrs__lib_1_1UKF.html#a2bbb3c02f086402351601ca3c3a4c52f',1,'mrs_lib::UKF']]] +]; diff --git a/search/variables_d.html b/search/variables_d.html new file mode 100644 index 00000000..84d878b8 --- /dev/null +++ b/search/variables_d.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_d.js b/search/variables_d.js new file mode 100644 index 00000000..5102fe05 --- /dev/null +++ b/search/variables_d.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['x_808',['x',['../structmrs__lib_1_1KalmanFilter_1_1statecov__t.html#a725b61d95901486bbc17cf79e45bd5e4',1,'mrs_lib::KalmanFilter::statecov_t::x()'],['../structmrs__lib_1_1KalmanFilterAloamGarm_1_1statecov__t.html#a78cb90ec0a35a04f7f4abe69847979ec',1,'mrs_lib::KalmanFilterAloamGarm::statecov_t::x()']]] +]; diff --git a/service__client__handler_8h.html b/service__client__handler_8h.html new file mode 100644 index 00000000..6f233556 --- /dev/null +++ b/service__client__handler_8h.html @@ -0,0 +1,151 @@ + + + + + + + +mrs_lib: include/mrs_lib/service_client_handler.h File Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    service_client_handler.h File Reference
    +
    +
    + +

    Defines ServiceClientHandler and related convenience classes for upgrading the ROS service client. +More...

    +
    #include <ros/ros.h>
    +#include <ros/package.h>
    +#include <string>
    +#include <future>
    +#include <mutex>
    +#include <mrs_lib/impl/service_client_handler.hpp>
    +
    + + Include dependency graph for service_client_handler.h:
    +
    +
    + +
    +

    Go to the source code of this file.

    + + + + + + + + +

    +Classes

    class  mrs_lib::ServiceClientHandler_impl< ServiceType >
     implementation of the service client handler More...
     
    class  mrs_lib::ServiceClientHandler< ServiceType >
     user wrapper of the service client handler implementation More...
     
    + + + + +

    +Namespaces

     mrs_lib
     All mrs_lib functions, classes, variables and definitions are contained in this namespace.
     
    +

    Detailed Description

    +

    Defines ServiceClientHandler and related convenience classes for upgrading the ROS service client.

    +
    Author
    Tomas Baca - tomas.nosp@m..bac.nosp@m.a@fel.nosp@m..cvu.nosp@m.t.cz
    +
    +
    + + + + diff --git a/service__client__handler_8h__incl.map b/service__client__handler_8h__incl.map new file mode 100644 index 00000000..35ecf68b --- /dev/null +++ b/service__client__handler_8h__incl.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/service__client__handler_8h__incl.md5 b/service__client__handler_8h__incl.md5 new file mode 100644 index 00000000..10abe3de --- /dev/null +++ b/service__client__handler_8h__incl.md5 @@ -0,0 +1 @@ +540cc6548715584d173546cf1c63e663 \ No newline at end of file diff --git a/service__client__handler_8h__incl.png b/service__client__handler_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..528668f8515f41c28cc90059b229cfda5137fd11 GIT binary patch literal 16525 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 + + + + + + +mrs_lib: include/mrs_lib/service_client_handler.h Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    service_client_handler.h
    +
    +
    +Go to the documentation of this file.
    1 
    +
    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 
    +
    23 template <class ServiceType>
    + +
    25 
    +
    26 public:
    + +
    31 
    + +
    36 
    +
    43  ServiceClientHandler_impl(ros::NodeHandle& nh, const std::string& address);
    +
    44 
    +
    52  bool call(ServiceType& srv);
    +
    53 
    +
    62  bool call(ServiceType& srv, const int& attempts);
    +
    63 
    +
    73  bool call(ServiceType& srv, const int& attempts, const double& repeat_delay);
    +
    74 
    +
    82  std::future<ServiceType> callAsync(ServiceType& srv);
    +
    83 
    +
    92  std::future<ServiceType> callAsync(ServiceType& srv, const int& attempts);
    +
    93 
    +
    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 
    +
    127 template <class ServiceType>
    + +
    129 
    +
    130 public:
    + +
    135 
    + +
    140 
    + +
    149 
    + +
    156 
    +
    163  ServiceClientHandler(ros::NodeHandle& nh, const std::string& address);
    +
    164 
    +
    171  void initialize(ros::NodeHandle& nh, const std::string& address);
    +
    172 
    +
    180  bool call(ServiceType& srv);
    +
    181 
    +
    190  bool call(ServiceType& srv, const int& attempts);
    +
    191 
    +
    201  bool call(ServiceType& srv, const int& attempts, const double& repeat_delay);
    +
    202 
    +
    210  std::future<ServiceType> callAsync(ServiceType& srv);
    +
    211 
    +
    220  std::future<ServiceType> callAsync(ServiceType& srv, const int& attempts);
    +
    221 
    +
    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
    +
    +
    +
    ~ServiceClientHandler(void)
    generic destructor
    Definition: service_client_handler.h:139
    +
    user wrapper of the service client handler implementation
    Definition: service_client_handler.h:128
    +
    implementation of the service client handler
    Definition: service_client_handler.h:24
    +
    ServiceClientHandler_impl(void)
    default constructor
    Definition: service_client_handler.hpp:14
    +
    ServiceClientHandler(void)
    generic constructor
    Definition: service_client_handler.h:134
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    +
    std::future< ServiceType > callAsync(ServiceType &srv)
    asynchronous call
    Definition: service_client_handler.hpp:284
    +
    std::future< ServiceType > callAsync(ServiceType &srv)
    asynchronous service call
    Definition: service_client_handler.hpp:123
    +
    ~ServiceClientHandler_impl(void)
    default destructor
    Definition: service_client_handler.h:35
    +
    void initialize(ros::NodeHandle &nh, const std::string &address)
    initializer
    Definition: service_client_handler.hpp:244
    +
    bool call(ServiceType &srv)
    "classic" synchronous service call
    Definition: service_client_handler.hpp:43
    +
    bool call(ServiceType &srv)
    "standard" synchronous call
    Definition: service_client_handler.hpp:254
    +
    ServiceClientHandler & operator=(const ServiceClientHandler &other)
    operator=
    Definition: service_client_handler.hpp:204
    + + + + diff --git a/service__client__handler_8hpp_source.html b/service__client__handler_8hpp_source.html new file mode 100644 index 00000000..7859cfd6 --- /dev/null +++ b/service__client__handler_8hpp_source.html @@ -0,0 +1,432 @@ + + + + + + + +mrs_lib: include/mrs_lib/impl/service_client_handler.hpp Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    service_client_handler.hpp
    +
    +
    +
    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>
    + +
    15 }
    +
    16 
    +
    17 //}
    +
    18 
    +
    19 /* ServiceClientHandler_impl(ros::NodeHandle& nh, const std::string& address) //{ */
    +
    20 
    +
    21 template <class ServiceType>
    +
    22 ServiceClientHandler_impl<ServiceType>::ServiceClientHandler_impl(ros::NodeHandle& nh, const std::string& address) {
    +
    23 
    +
    24  {
    +
    25  std::scoped_lock lock(mutex_service_client_);
    +
    26 
    +
    27  service_client_ = nh.serviceClient<ServiceType>(address);
    +
    28  }
    +
    29 
    +
    30  _address_ = address;
    +
    31  async_attempts_ = 1;
    +
    32 
    +
    33  /* thread_oneshot_ = std::make_shared<std::thread>(std::thread(&ServiceClientHandler_impl::threadOneshot, this, true, false)); */
    +
    34 
    +
    35  service_initialized_ = true;
    +
    36 }
    +
    37 
    +
    38 //}
    +
    39 
    +
    40 /* call(ServiceType& srv) //{ */
    +
    41 
    +
    42 template <class ServiceType>
    + +
    44 
    +
    45  if (!service_initialized_) {
    +
    46  return false;
    +
    47  }
    +
    48 
    +
    49  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 bool ServiceClientHandler_impl<ServiceType>::call(ServiceType& srv, const int& attempts, const double& repeat_delay) {
    +
    90 
    +
    91  if (!service_initialized_) {
    +
    92  return false;
    +
    93  }
    +
    94 
    +
    95  std::scoped_lock lock(mutex_service_client_);
    +
    96 
    +
    97  bool success = false;
    +
    98  int counter = 0;
    +
    99 
    +
    100  while (!success && ros::ok()) {
    +
    101 
    +
    102  success = service_client_.call(srv);
    +
    103 
    +
    104  if (!success) {
    +
    105  ROS_ERROR("[%s]: failed to call service to '%s'", ros::this_node::getName().c_str(), _address_.c_str());
    +
    106  }
    +
    107 
    +
    108  if (++counter >= attempts) {
    +
    109  break;
    +
    110  }
    +
    111 
    +
    112  ros::Duration(repeat_delay).sleep();
    +
    113  }
    +
    114 
    +
    115  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 std::future<ServiceType> ServiceClientHandler_impl<ServiceType>::callAsync(ServiceType& srv, const int& attempts) {
    +
    142 
    +
    143  {
    +
    144  std::scoped_lock lock(mutex_async_);
    +
    145 
    +
    146  async_data_ = srv;
    +
    147  async_attempts_ = attempts;
    +
    148  async_repeat_delay_ = 0;
    +
    149  }
    +
    150 
    +
    151  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>
    + +
    178 
    +
    179  ServiceType async_data;
    +
    180  int async_attempts;
    +
    181 
    +
    182  {
    +
    183  std::scoped_lock lock(mutex_async_);
    +
    184 
    +
    185  async_data = async_data_;
    +
    186  async_attempts = async_attempts_;
    +
    187  async_repeat_delay_ = async_repeat_delay_;
    +
    188  }
    +
    189 
    +
    190  call(async_data, async_attempts, async_repeat_delay_);
    +
    191 
    +
    192  return async_data;
    +
    193 }
    +
    194 
    +
    195 //}
    +
    196 
    +
    197 // --------------------------------------------------------------
    +
    198 // | ServiceClientHandler |
    +
    199 // --------------------------------------------------------------
    +
    200 
    +
    201 /* operator= //{ */
    +
    202 
    +
    203 template <class ServiceType>
    + +
    205 
    +
    206  if (this == &other) {
    +
    207  return *this;
    +
    208  }
    +
    209 
    +
    210  if (other.impl_) {
    +
    211  this->impl_ = other.impl_;
    +
    212  }
    +
    213 
    +
    214  return *this;
    +
    215 }
    +
    216 
    +
    217 //}
    +
    218 
    +
    219 /* copy constructor //{ */
    +
    220 
    +
    221 template <class ServiceType>
    + +
    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 ServiceClientHandler<ServiceType>::ServiceClientHandler(ros::NodeHandle& nh, const std::string& address) {
    +
    235 
    +
    236  impl_ = std::make_shared<ServiceClientHandler_impl<ServiceType>>(nh, address);
    +
    237 }
    +
    238 
    +
    239 //}
    +
    240 
    +
    241 /* initialize(ros::NodeHandle& nh, const std::string& address) //{ */
    +
    242 
    +
    243 template <class ServiceType>
    +
    244 void ServiceClientHandler<ServiceType>::initialize(ros::NodeHandle& nh, const std::string& address) {
    +
    245 
    +
    246  impl_ = std::make_shared<ServiceClientHandler_impl<ServiceType>>(nh, address);
    +
    247 }
    +
    248 
    +
    249 //}
    +
    250 
    +
    251 /* call(ServiceType& srv) //{ */
    +
    252 
    +
    253 template <class ServiceType>
    + +
    255 
    +
    256  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 std::future<ServiceType> ServiceClientHandler<ServiceType>::callAsync(ServiceType& srv, const int& attempts) {
    +
    297 
    +
    298  std::future<ServiceType> res = impl_->callAsync(srv, attempts);
    +
    299 
    +
    300  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
    +
    +
    +
    user wrapper of the service client handler implementation
    Definition: service_client_handler.h:128
    +
    implementation of the service client handler
    Definition: service_client_handler.h:24
    +
    ServiceClientHandler_impl(void)
    default constructor
    Definition: service_client_handler.hpp:14
    +
    ServiceClientHandler(void)
    generic constructor
    Definition: service_client_handler.h:134
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    +
    std::future< ServiceType > callAsync(ServiceType &srv)
    asynchronous call
    Definition: service_client_handler.hpp:284
    +
    std::future< ServiceType > callAsync(ServiceType &srv)
    asynchronous service call
    Definition: service_client_handler.hpp:123
    +
    void initialize(ros::NodeHandle &nh, const std::string &address)
    initializer
    Definition: service_client_handler.hpp:244
    +
    bool call(ServiceType &srv)
    "classic" synchronous service call
    Definition: service_client_handler.hpp:43
    +
    bool call(ServiceType &srv)
    "standard" synchronous call
    Definition: service_client_handler.hpp:254
    +
    ServiceClientHandler & operator=(const ServiceClientHandler &other)
    operator=
    Definition: service_client_handler.hpp:204
    + + + + diff --git a/shapes_8h.html b/shapes_8h.html new file mode 100644 index 00000000..deb7c369 --- /dev/null +++ b/shapes_8h.html @@ -0,0 +1,172 @@ + + + + + + + +mrs_lib: include/mrs_lib/geometry/shapes.h File Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    shapes.h File Reference
    +
    +
    + +

    Defines various geometrical shapes and their relations. +More...

    +
    #include <boost/optional.hpp>
    +#include <Eigen/Dense>
    +
    + + Include dependency graph for shapes.h:
    +
    +
    + +
    + + This graph shows which files directly or indirectly include this file:
    +
    +
    + +
    +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + + + + + + + + +

    +Classes

    class  mrs_lib::geometry::Ray
     geometric representation of a ray. Instantiate it by two input Vector3. Use static methods for from-to raycast, or a point-direction raycast. More...
     
    class  mrs_lib::geometry::Triangle
     geometric representation of a triangle. Instantiate a new triangle by providing three vertices More...
     
    class  mrs_lib::geometry::Rectangle
     geometric representation of a rectangle (can represent any quadrilateral) More...
     
    class  mrs_lib::geometry::Cuboid
     geometric representation of a cuboid More...
     
    class  mrs_lib::geometry::Ellipse
     geometric representation of an ellipse More...
     
    class  mrs_lib::geometry::Cylinder
     geometric representation of a cylinder More...
     
    class  mrs_lib::geometry::Cone
     geometric representaiton of a cone More...
     
    + + + + +

    +Namespaces

     mrs_lib
     All mrs_lib functions, classes, variables and definitions are contained in this namespace.
     
    +

    Detailed Description

    +

    Defines various geometrical shapes and their relations.

    +
    Author
    Petr Štibinger - stibi.nosp@m.pet@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz
    +
    +Matouš Vrba - vrbam.nosp@m.ato@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz
    +
    +
    + + + + diff --git a/shapes_8h__dep__incl.map b/shapes_8h__dep__incl.map new file mode 100644 index 00000000..2be432da --- /dev/null +++ b/shapes_8h__dep__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/shapes_8h__dep__incl.md5 b/shapes_8h__dep__incl.md5 new file mode 100644 index 00000000..dca1de03 --- /dev/null +++ b/shapes_8h__dep__incl.md5 @@ -0,0 +1 @@ +bf8f78553be13a71b7fe8ee8fc41dd5a \ No newline at end of file diff --git a/shapes_8h__dep__incl.png b/shapes_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..877f2de4a4cea2894323c335f4b54fa5389202d8 GIT binary patch literal 11793 zcmZXabyQW+7VeKANJvO`m$WoUcbAlONOvRB9U=k}0ul%5?(P;4knS#Nr1PzF@4Msu z@rFa<9M0ZruQk_P^ZU&&QdL<74TT5=0)e2($x5n&?^ode4iX~x+NIku0KOrbD#%De zo?!p7TJsYi5DJK#q?m?R`r(qN&O6Jy7bnMZv((18-zbALo=--J;=aNxtwz*V`>7F? zWMhPnR~pe`Q(COcVxuRs<*r(aBGS*K&uq47>ipj}ElH{n9ynnzzL+ky{X^BJdD!XVie$ie@R$QRUE^<0v!NqZ@3D>Oe zb6kH30jK+4jr)hI6~*vzS=;2&s>^(Si{I&yKY!BXb*p}quh;t>vbd=KEitikZtnY@ z>ZbV8twhb2$(2Su)9I4;1e_M1tx&Ovh)`5iR0O?FAccj6UdOFhn0R=Io}Qi%Q7I{e z$A6hmtAD488JL)Y%gfm;Ml;Zagj%KlWpG(z;jtOMLf3;9&Ue-#?Ixf{jW<*>(XdwTpt z!si4L`gGZ2)9jSVA>$6j1tpTy42uEK3k zeUiQFnjqU$RDS`Rw z)idEtwn`But&)K3Y|6{yl~^zy9sxpn+Z&&|!+H=O5{im1Jq~6Ap-?LDaJqJ6ECz;3 zwT*Uj9DICy6jW4jgM)*!P42}#<}DtFx;S`v>z%#*7zjbEy3IP#wU&!kbGyFICh9|?p4 z6Y1->Z_inind-Mn{%%(3u||SDx?5XT#tO+QDnem1Y=K1g2Ic0Or!6orG6rR2Wa#K! z?4)I8Vq{&CD@hvopvf>)o`~Zvm4^nqyTS{l29p_uzyC z?D+V2C$OVF6LF*H>Y_Z!GqHqbvVeTo-w_C3>G$Bhxw)Cu(n10zqQT=ZwdWMb)^)Ywk3kk2UR1;==yy*5 z0yb2XLR3i!4J_8{tEbC)hb3{ap}_D|4Ghq-RU_&hSHu}`ewjb^$CCHAe!5asQwx*` zN6#)OKr%EmjJY*4HxD&z^)?wwVky-X#>2zAUJb^mu%4hBr<_s|c?fw1j~G!m&q7_uiw8%rlt~o|3@t1Cx}kM7tsFnsJG?+C6QO!4+SiB(2pOacr3ahAZC8%=4KnU z`(gF};CH2ymzQ5XK8_t2koEfXDH_eF&4-_niRl#%P6&AEGYP-Co!5sCG_dSsHBR-J zT!c)o&aSgSEhnqAltmy|-@pDHnZCZh@rMr~AiZDT+)#qlJ(SEA-qzNpzkR&36P}Vn zaD8{TaWGe{)9k^bsH8-DX*pMA4ofhqs+h1d$H>SC5>Qvi6OfmT0a05t@;OC-oqEbY z1SmN;s+3NLY&hB3F?k&pI|kyY-`Gx<(Cut(Z6V-ABjDpFTO1?_`@&{Cl0lOm6X|4-KGXQ|{)Rxn%_=&- zoasiRI}KucxujBV(4415Z%lJR&(BYY&t@nI&ddzKk3nE_*DxY~d!;l13tTsM_qC0U zZZ|%8nVeDK`^yDK6#Me5EJ$ErAXaz`2|pG{a}E>tv={v&BWNJOcZH!5XXWR=aCCI6 z%%)F{x<0IBaXIue4B6gC;k%>oxT7?#?RnA)NUD z<0ADE$%X$E8dCAi$VK`*a+oxYxfJFJAw|^mlRpcLcs_0p#L*4$y1Kf8bCtESg`0x| z3na%EQfj-4jhw=d*JeJKbCxl`q~58k(dtwme<(Tv?kee8=Z`ls3-A7u^br;#dN+`+GYB$i0Mj0-f4aOU@NbXhRu{sHsH|s{9=d>?d8i4NsjVN zjtDkvj<8xME-fvZ*KrvVFl+D*vPYX<^^00aNJvj#cV43;#G7)EMXZ}+Y&yxY&HDm{ zNxQ5ElwYfV|DyQ%`jQCyG>khm)?oeK{w7mrY5h8Te!$@)JlYW5f_mF~O-+Q%L7!{Y^$D8XMDWzH-*6W&MD7C+Q1J#lpS@xXwreD|(&5=#Ul02H`K6?!WELnV zrl+SzSXU1IS}vHGnN@?04|As#k%w;NJODpm6qC{|@%u)&Z2tzbRh78PLD?BAoJ{915-46#Y@7C&5Y zY}Yg<_#2uR2&J+mApVzKZZz$1*y3dpnM%YnJbWgqcJ^^KFt6~_%LDOpP!%u<8sKBece?-l!Krs(ah$n)9z?{)&mtz(tGByrWpeR15($M0e-#rlfNOK+ z`Xr3e9cJH=KtC#`hI4yaYkkF2TRTUpR@#i6>L^@=0xhfKz2XC*C+S>M=Hl*{!=jp%U%N_AV zMK(qhzVq)*l51}W4nrwD4;iu12WPH#cEqUtZj<#$zC35K7Q))Rz^>DQcR|8CUt z=q3r}jXp^1CbsQB({Q3amY^$B5~;@p?`coYq71>vNrX^YpJiXVM5GLD0LP345z$`+bu zt9MXl?Rd1x(z6Cmkix#Qcyi|E;dP8UVn;~T> zHOsUg%MFv%J!2Q%t+W}K*p946H{+s{wFKs?7=Z)fm6J6ho7KZsJc%$q(?i|UKeI(eHX5499cv6T z63>c?LkZq`aE6EzAtRe$v3XHWq8Fmr7S7HxF)%ZCwtVa+LYtVHQg7-(w2AHHb$rCJ zwnn(#O3oucRVcs!6MV8A18Ki^L8qiNtf*j56bi)J8_(gSqV8YqCs$c3Z_nT$MbC!N zH0l}8lqoQ<}`eNRxYG{OU+hTo354W+N1I#yOlf4p@~L6>m=l@cbY5Q0qX za_8xW{~J>DadcUiA*b8(m4N}TFNBq@d>-FdGS@{}3Qt+b_q6U&rDGOO5P#EZjSi_WgRMJ&c`HzIl9RhO(CyKmt!} zznd)*u(T)`7@zVathIkOND9SmCav#H;LFN4l~-x!)M|KL%btTxQf=`ty=ngwX-X_! zFUrWj6~a`Eeto@xk%BHo`4>O={+{zStJ({iM%scBpXlyzM{1fLRJ*!uW@yuT{H~R{ zJ`|m6Cv5?)|I3n?`Ieqy>gI1Z1{9eng~=Ck4#<9YheQpFZM(DM5qqjQUvQFP0e}V$ zu$Qo*PZnk^j(+<;N*6!?SeO8pU40MHCq+^qx3vd=3ua6h1zwW*;1!D+P^wJiE(eT=^@wR%s!OfAe?Q`EOm5Nf(K$UZV z3=YPgf*_}sKDPkFlK#K1<|_*YG&hqDk7)k$+l-pbk+Ecc-$mO?%P6{$kOqzfktc%g z@V6iqeqFDlI)Yh&;}UKp7x^utHg4M z@=phS_tc46TD${#pY ztSaP8zgyvnHLH@r1bW`buhYh!N1J1Kc>ng!&$}#CTzAJPi6A${SNS<+QnuEu{az%g z_w-`v(vFQ!_nfGt0t8*l%O$-Ne>RD1#gTh@dnqX>MAzA4gts66jWRbhF9bmcPIzW;-^^@Kk(kOXZB_#x)@B^N~gUMu_EEV}<^}$8N_ZAC8&sct}Y26~4 z=ONGvFj@MNQ~-wr{RIq<>`mlLbt@<+yaJT!?c29*yJOEdEq_aX{Mgv@QBO|~CLEww zf@BytQh}r8t=~=j{Dd3yS@}rN(|`PMzCJOj+#CA!3m~pAhoz>@$w?f2R(yVbe$x#a z8X99DQ;jQioSdD-yuA2YT3by%e0XkYX}Q?o3=brF2*3i0ii+%JeJ_zh#Va4BrKCD% zX7Ky^`uMy~DC+Fy;J|nYh={rt7KlBM7UPDh5CXz6$YH;Nv6q#VHMnd=^*jPvg!^zC zxw6N@#Dr?cLp(P(hqbe!u~;>YkUWGSr3OY&QC;0#q**+F;f)-lc=Q6p%eeYIIBATT z!)9l7e4ZYz7#J8tot)V7lz%Ylj=#%S?gcQ-X}t&egSmMpkPv{hl-kf!P(ZxBy$1#c zM8(D70NJ4C5#-||0Q#NJ|4}eQ*cU}cMn*A(U5uF@8w(3C6{+J`GNCA?G@fh_4P<0w z1j0Ui>hIpg#m5Kf)jLp9Qf7~f#DT)lWF(b)_1}$?yL)d}C~BqSig1h9DV)gt2|Un| zV?~d0Rlau~CHjq6U=^M{dj?WnteVF8(X^`j12PIqSB^}q)76o|cm-I^4lsXpb#*b@ zX-P@bc@5au*kTi0&*7eZA>j`K8uwT2O3c6phq5L%sc+Qfx&Bg-^**bJeI(GbV{bi= za9WQS>e*VIH>Ah!0CM>Qu_B9=+1cD2gY2H4pIeN8g^m(--Tu7m>)^nO7T|aB7xzb8 zoEUr-D(Z@X;it=k_e2l_4GkJ1UN$xru9m#Kux%$kH+lIe1|Gn2nrdn^aPDG79vO&4 z`1!x*F+{O4F=6}S;owLD?xIuDUaVD$)jB#n{1XigP0GGTving%w=OO&&UAv0pMM-M zx39CAV8>4YDv@KInincgxm2ph>kal5)(#ufQQmYYO&YIb9y}b}&&yo?)NA2B>&>LQ zy@}+CN|Vdw&F$@N=*;bHEw6b=Nr|L~2M?&*4h|0&77=6ngMm=}59vuvM1WLORl!NA zWigv6U8%#4m= z$jQkyeEdfjhE9q?PEM|&F_3RpbCjv|11Jt1y_pOn>)Fg#)Y76VDi{F8%vM`siI2xRSZu_OjEq0_S_dL;so4|8Zs_S>000R!xxBn2;IhKp9{wH-K<5Vw3n~r{ z^^#HmkEv*Ao&zonW7V1dkCDjObTC9WH8mwGFOT(hIVl{ZDdWL-TCgDl{)>75IO+ZJ zZ^88L^02{a4bHILF9wa6C!l}Bq$>m&>#p0h5|f1FGmBo`DgYT^eBQ+y4mJjpF_xyL zaHOQ9`t5$C;Avd;%DIS=7pJDgH+TLe-o}Z6%SmJk`@$%*+wn3f07rcQ;nI9*c32X? z!N>0gEL@+pew=kHTOwRlOAGPSr%z6e`p;jyh(?Qzi3!cgp_Yy%Ljzo3_{Up(u z6N$~v$(b;pX+4p*22uq`YZ8EG>ydiC+wYp5#@nAMmoYY`0J*uVyF2&jaR^mvB2}~b z`mZLx_r)#m`npBuP_Yb*w^UAq^wt@7!tMV3YYMUtjM4m^CeIo?Hf!m#ZyXw0frGq6 zb0_>FdBc5=tT@ zVQLaloM^Be+OJ!rX-teQEiIKMIbw(c7exq~&m?nmn|&z*75-K_tUkAH64ggr-{yCS z*IX4Z_*z0uqtQ-1(OTbS=7(%?f!B}|P3p$ @mTH;X4;?fea0lA87p7WrAXNiHQ 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 + + + + diff --git a/shapes_8h__incl.md5 b/shapes_8h__incl.md5 new file mode 100644 index 00000000..54ceae1f --- /dev/null +++ b/shapes_8h__incl.md5 @@ -0,0 +1 @@ +49986c82dee51ade50ac44d0a7987dd3 \ No newline at end of file diff --git a/shapes_8h__incl.png b/shapes_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..e2ab2c6c8a8de9f4c7193e0ac484713de007f678 GIT binary patch literal 7598 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 + + + + + + +mrs_lib: include/mrs_lib/geometry/shapes.h Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    shapes.h
    +
    +
    +Go to the documentation of this file.
    1 // clang: MatousFormat
    +
    8 #ifndef SHAPES_H
    +
    9 #define SHAPES_H
    +
    10 
    +
    11 #include <boost/optional.hpp>
    +
    12 #include <Eigen/Dense>
    +
    13 
    +
    14 namespace mrs_lib
    +
    15 {
    +
    16  namespace geometry
    +
    17  {
    +
    18 
    +
    19  /* class Ray //{ */
    +
    20 
    +
    24  class Ray
    +
    25  {
    +
    26  public:
    +
    30  Ray();
    +
    31 
    +
    35  ~Ray();
    +
    36 
    +
    43  Ray(Eigen::Vector3d p1, Eigen::Vector3d p2);
    +
    44 
    +
    45  private:
    +
    46  Eigen::Vector3d point1;
    +
    47  Eigen::Vector3d point2;
    +
    48 
    +
    49  public:
    +
    55  const Eigen::Vector3d p1() const;
    +
    61  const Eigen::Vector3d p2() const;
    +
    62 
    +
    68  const Eigen::Vector3d direction() const;
    +
    69 
    +
    70  public:
    +
    79  static Ray twopointCast(Eigen::Vector3d pointFrom, Eigen::Vector3d pointTo);
    +
    80 
    +
    89  static Ray directionCast(Eigen::Vector3d origin, Eigen::Vector3d direction);
    +
    90  };
    +
    91 
    +
    92  //}
    +
    93 
    +
    94  /* class Triangle //{ */
    +
    98  class Triangle
    +
    99  {
    +
    100  public:
    +
    104  Triangle();
    +
    105 
    +
    109  ~Triangle();
    +
    110 
    +
    118  Triangle(Eigen::Vector3d a, Eigen::Vector3d b, Eigen::Vector3d c);
    +
    119 
    +
    120  private:
    +
    121  Eigen::Vector3d point1;
    +
    122  Eigen::Vector3d point2;
    +
    123  Eigen::Vector3d point3;
    +
    124 
    +
    125  public:
    +
    131  const Eigen::Vector3d a() const;
    +
    132 
    +
    138  const Eigen::Vector3d b() const;
    +
    139 
    +
    145  const Eigen::Vector3d c() const;
    +
    146 
    +
    152  const Eigen::Vector3d center() const;
    +
    153 
    +
    160  const Eigen::Vector3d normal() const;
    +
    161 
    +
    167  const std::vector<Eigen::Vector3d> vertices() const;
    +
    168 
    +
    169  public:
    +
    178  const boost::optional<Eigen::Vector3d> intersectionRay(Ray r, double epsilon = 1e-4) const;
    +
    179  };
    +
    180  //}
    +
    181 
    +
    182  /* class Rectangle //{ */
    +
    183 
    +
    187  class Rectangle
    +
    188  {
    +
    189  public:
    +
    193  Rectangle();
    +
    194 
    +
    198  ~Rectangle();
    +
    199 
    +
    205  Rectangle(std::vector<Eigen::Vector3d> points);
    +
    206 
    +
    215  Rectangle(Eigen::Vector3d a, Eigen::Vector3d b, Eigen::Vector3d c, Eigen::Vector3d d);
    +
    216 
    +
    217  private:
    +
    218  Eigen::Vector3d point1;
    +
    219  Eigen::Vector3d point2;
    +
    220  Eigen::Vector3d point3;
    +
    221  Eigen::Vector3d point4;
    +
    222 
    +
    223  public:
    +
    229  const Eigen::Vector3d a() const;
    +
    230 
    +
    236  const Eigen::Vector3d b() const;
    +
    237 
    +
    243  const Eigen::Vector3d c() const;
    +
    244 
    +
    250  const Eigen::Vector3d d() const;
    +
    251 
    +
    257  const Eigen::Vector3d center() const;
    +
    258 
    +
    265  const Eigen::Vector3d normal() const;
    +
    266 
    +
    272  const std::vector<Eigen::Vector3d> vertices() const;
    +
    273 
    +
    279  const std::vector<Triangle> triangles() const;
    +
    280 
    +
    289  const boost::optional<Eigen::Vector3d> intersectionRay(Ray r, double epsilon = 1e-4) const;
    +
    290 
    +
    298  bool isFacing(Eigen::Vector3d point) const;
    +
    299 
    +
    300 
    +
    308  double solidAngleRelativeTo(Eigen::Vector3d point) const;
    +
    309  };
    +
    310 
    +
    311  //}
    +
    312 
    +
    313  /* class Cuboid //{ */
    +
    317  class Cuboid
    +
    318  {
    +
    319  public:
    +
    323  Cuboid();
    +
    324 
    +
    328  ~Cuboid();
    +
    329 
    +
    342  Cuboid(Eigen::Vector3d p0, Eigen::Vector3d p1, Eigen::Vector3d p2, Eigen::Vector3d p3, Eigen::Vector3d p4, Eigen::Vector3d p5, Eigen::Vector3d p6,
    +
    343  Eigen::Vector3d p7);
    +
    349  Cuboid(std::vector<Eigen::Vector3d> points);
    +
    350 
    +
    358  Cuboid(Eigen::Vector3d center, Eigen::Vector3d size, Eigen::Quaterniond orientation);
    +
    359 
    +
    360  private:
    +
    364  enum
    +
    365  {
    +
    366  FRONT = 0,
    +
    367  BACK = 1,
    +
    368  LEFT = 2,
    +
    369  RIGHT = 3,
    +
    370  BOTTOM = 4,
    +
    371  TOP = 5,
    +
    372  };
    +
    373 
    +
    374  private:
    +
    375  std::vector<Eigen::Vector3d> points;
    +
    376 
    +
    384  std::vector<Eigen::Vector3d> lookupPoints(int face_idx) const;
    +
    385 
    +
    386  public:
    +
    392  const std::vector<Eigen::Vector3d> vertices() const;
    +
    393 
    +
    399  const Eigen::Vector3d center() const;
    +
    400 
    +
    408  const Rectangle getRectangle(int face_idx) const;
    +
    409 
    +
    418  const std::vector<Eigen::Vector3d> intersectionRay(Ray r, double epsilon = 1e-4) const;
    +
    419  };
    +
    420  //}
    +
    421 
    +
    422  /* class Ellipse //{ */
    +
    426  class Ellipse
    +
    427  {
    +
    428  public:
    +
    432  Ellipse();
    +
    433 
    +
    437  ~Ellipse();
    +
    438 
    +
    447  Ellipse(Eigen::Vector3d center, Eigen::Quaterniond orientation, double a, double b);
    +
    448 
    +
    449  private:
    +
    450  double major_semi;
    +
    451  double minor_semi;
    +
    452  Eigen::Vector3d center_point;
    +
    453  Eigen::Quaterniond absolute_orientation;
    +
    454 
    +
    455  public:
    +
    461  double a() const;
    +
    462 
    +
    468  double b() const;
    +
    469 
    +
    475  const Eigen::Vector3d center() const;
    +
    476 
    +
    482  const Eigen::Quaterniond orientation() const;
    +
    483  };
    +
    484  //}
    +
    485 
    +
    486  /* class Cylinder //{ */
    +
    490  class Cylinder
    +
    491  {
    +
    492  public:
    +
    496  Cylinder();
    +
    497 
    +
    501  ~Cylinder();
    +
    502 
    +
    511  Cylinder(Eigen::Vector3d center, double radius, double height, Eigen::Quaterniond orientation);
    +
    512 
    +
    513  private:
    +
    514  Eigen::Vector3d center_point;
    +
    515  double radius;
    +
    516  double height;
    +
    517  Eigen::Quaterniond absolute_orientation;
    +
    518 
    +
    519  public:
    +
    523  enum
    +
    524  {
    +
    525  BOTTOM = 0,
    +
    526  TOP = 1,
    +
    527  };
    +
    528 
    +
    529  public:
    +
    535  const Eigen::Vector3d center() const;
    +
    536 
    +
    542  const Eigen::Quaterniond orientation() const;
    +
    543 
    +
    549  double r() const;
    +
    550 
    +
    556  double h() const;
    +
    557 
    +
    565  const Ellipse getCap(int index) const;
    +
    566  };
    +
    567  //}
    +
    568 
    +
    569  /* class Cone //{ */
    +
    573  class Cone
    +
    574  {
    +
    575  public:
    +
    579  Cone();
    +
    580 
    +
    584  ~Cone();
    +
    585 
    +
    594  Cone(Eigen::Vector3d origin_point, double angle, double height, Eigen::Vector3d orientation);
    +
    595 
    +
    596  private:
    +
    597  Eigen::Vector3d origin_point;
    +
    598  double angle;
    +
    599  double height;
    +
    600  Eigen::Vector3d absolute_direction;
    +
    601 
    +
    602  public:
    +
    608  const Eigen::Vector3d origin() const;
    +
    609 
    +
    615  const Eigen::Vector3d direction() const;
    +
    616 
    +
    622  const Eigen::Vector3d center() const;
    +
    623 
    +
    629  double theta() const;
    +
    630 
    +
    636  double h() const;
    +
    637 
    +
    643  const Ellipse getCap() const;
    +
    644 
    +
    652  const std::optional<Eigen::Vector3d> projectPoint(const Eigen::Vector3d& point) const;
    +
    653  };
    +
    654  //}
    +
    655  } // namespace geometry
    +
    656 } // namespace mrs_lib
    +
    657 
    +
    658 #endif // SHAPES_H
    +
    +
    +
    Ray()
    constructor without initialization of internal variables
    Definition: shapes.cpp:13
    +
    ~Cylinder()
    destructor
    Definition: shapes.cpp:498
    +
    const Ellipse getCap() const
    getter for the cap of the cone
    Definition: shapes.cpp:600
    +
    const Eigen::Quaterniond orientation() const
    getter for the orientation
    Definition: shapes.cpp:517
    +
    Ellipse()
    constructor for initialization without setting internal variables
    Definition: shapes.cpp:449
    +
    const boost::optional< Eigen::Vector3d > intersectionRay(Ray r, double epsilon=1e-4) const
    calculate an intersection of this triangle with a given ray with given tolerance
    Definition: shapes.cpp:122
    +
    const std::vector< Eigen::Vector3d > vertices() const
    get a vector of all vertices
    Definition: shapes.cpp:111
    +
    const boost::optional< Eigen::Vector3d > intersectionRay(Ray r, double epsilon=1e-4) const
    calculate an intersection of this rectangle with a given ray with given tolerance
    Definition: shapes.cpp:247
    +
    ~Cone()
    destructor
    Definition: shapes.cpp:561
    +
    double b() const
    getter for minor semi-axis
    Definition: shapes.cpp:472
    +
    const Eigen::Vector3d center() const
    getter for the center point
    Definition: shapes.cpp:512
    +
    const Eigen::Vector3d center() const
    getter for the center point. Center point lies in half of the body height
    Definition: shapes.cpp:585
    +
    const Eigen::Vector3d c() const
    getter for third point
    Definition: shapes.cpp:94
    +
    Cylinder()
    constructor without setting the internal variables
    Definition: shapes.cpp:494
    +
    Triangle()
    constructor for initialization with default values (points [0,0,0], [1,0,0] and [0,...
    Definition: shapes.cpp:64
    +
    const std::vector< Triangle > triangles() const
    getter for the triangles forming this rectangle
    Definition: shapes.cpp:234
    +
    const Eigen::Vector3d p2() const
    get the end point
    Definition: shapes.cpp:36
    +
    double h() const
    getter for body height
    Definition: shapes.cpp:595
    +
    const Eigen::Vector3d center() const
    get position on the triangle center
    Definition: shapes.cpp:106
    +
    geometric representation of a ray. Instantiate it by two input Vector3. Use static methods for from-t...
    Definition: shapes.h:24
    +
    double a() const
    getter for major semi-axis
    Definition: shapes.cpp:467
    +
    geometric representation of a cuboid
    Definition: shapes.h:317
    +
    const Eigen::Vector3d d() const
    getter for the fourth point
    Definition: shapes.cpp:207
    +
    const std::vector< Eigen::Vector3d > vertices() const
    getter for all vertices (vector3) of this cuboid
    Definition: shapes.cpp:406
    +
    const Eigen::Vector3d origin() const
    getter for the tip point
    Definition: shapes.cpp:575
    +
    Cuboid()
    constructor for initialization with all points set to [0,0,0]
    Definition: shapes.cpp:295
    +
    double theta() const
    getter for angle between body height and body side
    Definition: shapes.cpp:590
    +
    const Eigen::Vector3d center() const
    getter for center point
    Definition: shapes.cpp:212
    +
    Rectangle()
    constructor for initialization with points set to [0,0,0], [1,0,0], [1,1,0] and [0,...
    Definition: shapes.cpp:162
    +
    const Eigen::Vector3d b() const
    getter for second point
    Definition: shapes.cpp:89
    +
    ~Triangle()
    destructor
    Definition: shapes.cpp:78
    +
    const Eigen::Vector3d a() const
    getter for first point
    Definition: shapes.cpp:192
    +
    const Eigen::Vector3d p1() const
    get the origin point
    Definition: shapes.cpp:31
    +
    geometric representation of an ellipse
    Definition: shapes.h:426
    +
    const Ellipse getCap(int index) const
    getter for a cap corresponding to a provided index
    Definition: shapes.cpp:532
    +
    double r() const
    getter for cap radius
    Definition: shapes.cpp:522
    +
    const Eigen::Vector3d center() const
    getter for the center point
    Definition: shapes.cpp:477
    +
    const Eigen::Vector3d b() const
    getter for the second point
    Definition: shapes.cpp:197
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    +
    const Eigen::Vector3d a() const
    getter for first point
    Definition: shapes.cpp:84
    +
    Cone()
    constructor without setting the internal variables
    Definition: shapes.cpp:557
    +
    const Rectangle getRectangle(int face_idx) const
    getter for one side corresponding to a provided index
    Definition: shapes.cpp:411
    +
    geometric representation of a rectangle (can represent any quadrilateral)
    Definition: shapes.h:187
    +
    const std::vector< Eigen::Vector3d > vertices() const
    getter for all the points of this rectangle provided as std::vector
    Definition: shapes.cpp:224
    +
    double h() const
    getter for the body height
    Definition: shapes.cpp:527
    +
    ~Ray()
    destructor
    Definition: shapes.cpp:25
    +
    const Eigen::Vector3d normal() const
    getter for the normal vector. It originates in the center of the Rectangle, length is normalized,...
    Definition: shapes.cpp:217
    +
    const Eigen::Vector3d direction() const
    getter for the direction. Normalized direction from origin towards base
    Definition: shapes.cpp:580
    +
    double solidAngleRelativeTo(Eigen::Vector3d point) const
    compute the solid angle of this rectangle relative to a given sphere center
    Definition: shapes.cpp:271
    +
    const Eigen::Vector3d normal() const
    get normal vector of this triangle. The vector origin is placed at triangle center,...
    Definition: shapes.cpp:99
    +
    static Ray twopointCast(Eigen::Vector3d pointFrom, Eigen::Vector3d pointTo)
    static method for generating new rays by raycasting from-to
    Definition: shapes.cpp:48
    +
    geometric representation of a triangle. Instantiate a new triangle by providing three vertices
    Definition: shapes.h:98
    +
    const Eigen::Vector3d center() const
    getter for the center point
    Definition: shapes.cpp:416
    +
    ~Ellipse()
    destructor
    Definition: shapes.cpp:453
    +
    ~Rectangle()
    destructor
    Definition: shapes.cpp:186
    +
    const Eigen::Quaterniond orientation() const
    getter for the orientation
    Definition: shapes.cpp:482
    +
    const Eigen::Vector3d direction() const
    get the direction of ray (normalized)
    Definition: shapes.cpp:41
    +
    const std::optional< Eigen::Vector3d > projectPoint(const Eigen::Vector3d &point) const
    Project a 3D point orthogonally onto the Cone surface.
    Definition: shapes.cpp:609
    +
    geometric representation of a cylinder
    Definition: shapes.h:490
    +
    static Ray directionCast(Eigen::Vector3d origin, Eigen::Vector3d direction)
    static method for generating new rays by raycasting origin-direction
    Definition: shapes.cpp:53
    +
    ~Cuboid()
    virtual destructor
    Definition: shapes.cpp:353
    +
    bool isFacing(Eigen::Vector3d point) const
    check if the normal is facing a given point, i.e. if the point lies in the same half-space as the rec...
    Definition: shapes.cpp:261
    +
    const Eigen::Vector3d c() const
    getter for the third point
    Definition: shapes.cpp:202
    +
    geometric representaiton of a cone
    Definition: shapes.h:573
    +
    const std::vector< Eigen::Vector3d > intersectionRay(Ray r, double epsilon=1e-4) const
    calculate the intersection between this cuboid and a provided ray within a given tolerance....
    Definition: shapes.cpp:428
    + + + + diff --git a/simple__example_8cpp.html b/simple__example_8cpp.html new file mode 100644 index 00000000..cedb10be --- /dev/null +++ b/simple__example_8cpp.html @@ -0,0 +1,143 @@ + + + + + + + +mrs_lib: src/subscribe_handler/simple_example.cpp File Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    simple_example.cpp File Reference
    +
    +
    + +

    Example file for the SubscribeHandler convenience class. +More...

    +
    #include <mrs_lib/subscribe_handler.h>
    +#include <std_msgs/String.h>
    +
    + + Include dependency graph for simple_example.cpp:
    +
    +
    + +
    + + + +

    +Functions

    +int main (int argc, char **argv)
     
    +

    Detailed Description

    +

    Example file for the SubscribeHandler convenience class.

    +
    Author
    Matouš Vrba - vrbam.nosp@m.ato@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz
    +

    A simple example demonstrating basic usage of the SubscribeHandler class. This example may be run after building mrs_lib by executing rosrun mrs_lib subscribe_handler_simple_example.

    +

    See subscribe_handler/simple_example.cpp.

    +
    +
    + + + + diff --git a/simple__example_8cpp.js b/simple__example_8cpp.js new file mode 100644 index 00000000..2a171865 --- /dev/null +++ b/simple__example_8cpp.js @@ -0,0 +1,4 @@ +var simple__example_8cpp = +[ + [ "main", "simple__example_8cpp.html#a3c04138a5bfe5d72780bb7e82a18e627", null ] +]; \ No newline at end of file diff --git a/simple__example_8cpp__incl.map b/simple__example_8cpp__incl.map new file mode 100644 index 00000000..d82d6b50 --- /dev/null +++ b/simple__example_8cpp__incl.map @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/simple__example_8cpp__incl.md5 b/simple__example_8cpp__incl.md5 new file mode 100644 index 00000000..283fc1b3 --- /dev/null +++ b/simple__example_8cpp__incl.md5 @@ -0,0 +1 @@ +62f57ad1462bccbf7d6970222bb9880c \ No newline at end of file diff --git a/simple__example_8cpp__incl.png b/simple__example_8cpp__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..ebe5f84839ef3fdf637f6e4f13db4cb857adc1d0 GIT binary patch literal 50194 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 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T literal 0 HcmV?d00001 diff --git a/structMyPoint-members.html b/structMyPoint-members.html new file mode 100644 index 00000000..a6bd17cd --- /dev/null +++ b/structMyPoint-members.html @@ -0,0 +1,107 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +

    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    MyPoint Member List
    +
    +
    + +

    This is the complete list of members for MyPoint, including all inherited members.

    + + + + +
    e1 (defined in MyPoint)MyPoint
    e2 (defined in MyPoint)MyPoint
    e3 (defined in MyPoint)MyPoint
    +
    + + + + diff --git a/structMyPoint.html b/structMyPoint.html new file mode 100644 index 00000000..175a101e --- /dev/null +++ b/structMyPoint.html @@ -0,0 +1,124 @@ + + + + + + + +mrs_lib: MyPoint Struct Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    MyPoint Struct Reference
    +
    +
    + + + + + + + + +

    +Public Attributes

    +double e1
     
    +double e2
     
    +double e3
     
    +

    Detailed Description

    +
    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/structMyPoint.js b/structMyPoint.js new file mode 100644 index 00000000..4855d3d7 --- /dev/null +++ b/structMyPoint.js @@ -0,0 +1,6 @@ +var structMyPoint = +[ + [ "e1", "structMyPoint.html#af05a7b1e25b260ab521d15dd7b1992bc", null ], + [ "e2", "structMyPoint.html#a57a729c54a388896f9502cb49d91596e", null ], + [ "e3", "structMyPoint.html#a9d2ceea3609452e2d3f880c6f8690733", null ] +]; \ No newline at end of file diff --git a/structdegrees-members.html b/structdegrees-members.html new file mode 100644 index 00000000..6357952e --- /dev/null +++ b/structdegrees-members.html @@ -0,0 +1,138 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    degrees Member List
    +
    +
    + +

    This is the complete list of members for degrees, including all inherited members.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    convert(const cyclic &what)mrs_lib::geometry::cyclic< float, degrees >inlinestatic
    convert() constmrs_lib::geometry::cyclic< float, degrees >inline
    cyclic()mrs_lib::geometry::cyclic< float, degrees >inline
    cyclic(const float val)mrs_lib::geometry::cyclic< float, degrees >inline
    cyclic(const cyclic &other)mrs_lib::geometry::cyclic< float, degrees >inline
    cyclic(const degrees &other)mrs_lib::geometry::cyclic< float, degrees >inline
    diff(const float minuend, const float subtrahend)mrs_lib::geometry::cyclic< float, degrees >inlinestatic
    diff(const cyclic minuend, const cyclic subtrahend) (defined in mrs_lib::geometry::cyclic< float, degrees >)mrs_lib::geometry::cyclic< float, degrees >inlinestatic
    dist(const float from, const float to)mrs_lib::geometry::cyclic< float, degrees >inlinestatic
    dist(const cyclic from, const cyclic to) (defined in mrs_lib::geometry::cyclic< float, degrees >)mrs_lib::geometry::cyclic< float, degrees >inlinestatic
    half_rangemrs_lib::geometry::cyclic< float, degrees >static
    inRange(const float val)mrs_lib::geometry::cyclic< float, degrees >inlinestatic
    interp(const float from, const float to, const float coeff)mrs_lib::geometry::cyclic< float, degrees >inlinestatic
    interp(const cyclic from, const cyclic to, const float coeff) (defined in mrs_lib::geometry::cyclic< float, degrees >)mrs_lib::geometry::cyclic< float, degrees >inlinestatic
    interpUnwrapped(const float from, const float to, const float coeff)mrs_lib::geometry::cyclic< float, degrees >inlinestatic
    interpUnwrapped(const cyclic from, const cyclic to, const float coeff) (defined in mrs_lib::geometry::cyclic< float, degrees >)mrs_lib::geometry::cyclic< float, degrees >inlinestatic
    minimum (defined in degrees)degreesstatic
    operator+=(const cyclic &other)mrs_lib::geometry::cyclic< float, degrees >inline
    operator-=(const cyclic &other)mrs_lib::geometry::cyclic< float, degrees >inline
    operator=(const float nval)mrs_lib::geometry::cyclic< float, degrees >inline
    operator=(const cyclic &other)mrs_lib::geometry::cyclic< float, degrees >inline
    operator=(cyclic &&other)mrs_lib::geometry::cyclic< float, degrees >inline
    pdist(const float from, const float to)mrs_lib::geometry::cyclic< float, degrees >inlinestatic
    pdist(const cyclic from, const cyclic to) (defined in mrs_lib::geometry::cyclic< float, degrees >)mrs_lib::geometry::cyclic< float, degrees >inlinestatic
    pinterp(const float from, const float to, const float coeff)mrs_lib::geometry::cyclic< float, degrees >inlinestatic
    pinterp(const cyclic from, const cyclic to, const float coeff) (defined in mrs_lib::geometry::cyclic< float, degrees >)mrs_lib::geometry::cyclic< float, degrees >inlinestatic
    pinterpUnwrapped(const float from, const float to, const float coeff)mrs_lib::geometry::cyclic< float, degrees >inlinestatic
    pinterpUnwrapped(const cyclic from, const cyclic to, const float coeff) (defined in mrs_lib::geometry::cyclic< float, degrees >)mrs_lib::geometry::cyclic< float, degrees >inlinestatic
    rangemrs_lib::geometry::cyclic< float, degrees >static
    supremum (defined in degrees)degreesstatic
    unwrap(const float what, const float from)mrs_lib::geometry::cyclic< float, degrees >inlinestatic
    val (defined in mrs_lib::geometry::cyclic< float, degrees >)mrs_lib::geometry::cyclic< float, degrees >protected
    value() constmrs_lib::geometry::cyclic< float, degrees >inline
    wrap(const float val)mrs_lib::geometry::cyclic< float, degrees >inlinestatic
    +
    + + + + diff --git a/structdegrees.html b/structdegrees.html new file mode 100644 index 00000000..5c56be1a --- /dev/null +++ b/structdegrees.html @@ -0,0 +1,256 @@ + + + + + + + +mrs_lib: degrees Struct Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    degrees Struct Reference
    +
    +
    +
    + + Inheritance diagram for degrees:
    +
    +
    + +
    + + Collaboration diagram for degrees:
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Static Public Attributes

    +static constexpr double minimum = -180
     
    +static constexpr double supremum = 180
     
    - Static Public Attributes inherited from mrs_lib::geometry::cyclic< float, degrees >
    +static constexpr float minimum
     Minimum of the valid interval of wrapped values $ m $.
     
    +static constexpr float supremum
     Supremum of the valid interval of wrapped values $ s $.
     
    +static constexpr float range
     Range of the valid interval of wrapped values $ r $ (also the period of the cyclic quantity).
     
    +static constexpr float half_range
     Half of the range of the valid interval of wrapped values $ r/2 $ (used for some calculations).
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Additional Inherited Members

    - Public Member Functions inherited from mrs_lib::geometry::cyclic< float, degrees >
     cyclic ()
     Default constructor. More...
     
     cyclic (const float val)
     Constructor overload. More...
     
     cyclic (const cyclic &other)
     Copy constructor. More...
     
     cyclic (const degrees &other)
     Copy constructor. More...
     
    float value () const
     Getter for val. More...
     
    other_t convert () const
     Conversion between two different circular quantities. More...
     
    cyclicoperator= (const float nval)
     Assignment operator. More...
     
    cyclicoperator= (const cyclic &other)
     Assignment operator. More...
     
    cyclicoperator= (cyclic &&other)
     Move operator. More...
     
    cyclicoperator+= (const cyclic &other)
     Addition compound operator. More...
     
    cyclicoperator-= (const cyclic &other)
     Subtraction compound operator. More...
     
    - Static Public Member Functions inherited from mrs_lib::geometry::cyclic< float, degrees >
    static bool inRange (const float val)
     Checks if val is within the valid interval of wrapped values. More...
     
    static float wrap (const float val)
     Returns val, converted to the valid interval of values. More...
     
    static float unwrap (const float what, const float from)
     Returns value of the parameter what modified so that there is no "jump" between from and \t what. More...
     
    static float pdist (const float from, const float to)
     Returns length of the shortest walk in the positive direction from the first parameter to the second one. More...
     
    +static float pdist (const cyclic from, const cyclic to)
     
    static float diff (const float minuend, const float subtrahend)
     Returns the difference between the two circular values. More...
     
    +static float diff (const cyclic minuend, const cyclic subtrahend)
     
    static float dist (const float from, const float to)
     Returns the distance between the two circular values. More...
     
    +static float dist (const cyclic from, const cyclic to)
     
    static float interpUnwrapped (const float from, const float to, const float coeff)
     Interpolation between two circular quantities without wrapping of the result. More...
     
    +static float interpUnwrapped (const cyclic from, const cyclic to, const float coeff)
     
    static float interp (const float from, const float to, const float coeff)
     Interpolation between two circular quantities. More...
     
    +static float interp (const cyclic from, const cyclic to, const float coeff)
     
    static float pinterpUnwrapped (const float from, const float to, const float coeff)
     Interpolation between two circular quantities in the positive direction without wrapping of the result. More...
     
    +static float pinterpUnwrapped (const cyclic from, const cyclic to, const float coeff)
     
    static float pinterp (const float from, const float to, const float coeff)
     Interpolation between two circular quantities in the positive direction. More...
     
    +static float pinterp (const cyclic from, const cyclic to, const float coeff)
     
    static other_t convert (const cyclic &what)
     Conversion between two different circular quantities. More...
     
    - Protected Attributes inherited from mrs_lib::geometry::cyclic< float, degrees >
    +float val
     
    +

    Detailed Description

    +
    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/structdegrees__coll__graph.map b/structdegrees__coll__graph.map new file mode 100644 index 00000000..5e947cde --- /dev/null +++ b/structdegrees__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structdegrees__coll__graph.md5 b/structdegrees__coll__graph.md5 new file mode 100644 index 00000000..f90b4174 --- /dev/null +++ b/structdegrees__coll__graph.md5 @@ -0,0 +1 @@ +b3e6316aef96ac0c93d4901b70325b14 \ No newline at end of file diff --git a/structdegrees__coll__graph.png b/structdegrees__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..2adc2f3a38ef7c5d24a780eb99e5993463279ac0 GIT binary patch literal 4944 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 literal 0 HcmV?d00001 diff --git a/structdegrees__inherit__graph.map b/structdegrees__inherit__graph.map new file mode 100644 index 00000000..5e947cde --- /dev/null +++ b/structdegrees__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structdegrees__inherit__graph.md5 b/structdegrees__inherit__graph.md5 new file mode 100644 index 00000000..f90b4174 --- /dev/null +++ b/structdegrees__inherit__graph.md5 @@ -0,0 +1 @@ +b3e6316aef96ac0c93d4901b70325b14 \ No newline at end of file diff --git a/structdegrees__inherit__graph.png b/structdegrees__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..2adc2f3a38ef7c5d24a780eb99e5993463279ac0 GIT binary patch literal 4944 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 literal 0 HcmV?d00001 diff --git a/structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException-members.html b/structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException-members.html new file mode 100644 index 00000000..98fd808c --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException-members.html @@ -0,0 +1,105 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    mrs_lib::AttitudeConverter::EulerFormatException Member List
    +
    +
    + +

    This is the complete list of members for mrs_lib::AttitudeConverter::EulerFormatException, including all inherited members.

    + + +
    what() const (defined in mrs_lib::AttitudeConverter::EulerFormatException)mrs_lib::AttitudeConverter::EulerFormatExceptioninline
    +
    + + + + diff --git a/structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException.html b/structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException.html new file mode 100644 index 00000000..6047c98e --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException.html @@ -0,0 +1,144 @@ + + + + + + + +mrs_lib: mrs_lib::AttitudeConverter::EulerFormatException Struct Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    mrs_lib::AttitudeConverter::EulerFormatException Struct Reference
    +
    +
    + +

    is thrown when the Euler angle format is set wrongly + More...

    + +

    #include <attitude_converter.h>

    +
    + + Inheritance diagram for mrs_lib::AttitudeConverter::EulerFormatException:
    +
    +
    + +
    + + Collaboration diagram for mrs_lib::AttitudeConverter::EulerFormatException:
    +
    +
    + + + + + +

    +Public Member Functions

    +const char * what () const throw ()
     
    +

    Detailed Description

    +

    is thrown when the Euler angle format is set wrongly

    +

    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException.js b/structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException.js new file mode 100644 index 00000000..3c283237 --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException.js @@ -0,0 +1,4 @@ +var structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException = +[ + [ "what", "structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException.html#a90bf91f9cf25539f57aea2103abe5b5e", null ] +]; \ No newline at end of file diff --git a/structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException__coll__graph.map b/structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException__coll__graph.map new file mode 100644 index 00000000..8e808907 --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException__coll__graph.md5 b/structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException__coll__graph.md5 new file mode 100644 index 00000000..0d769c32 --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException__coll__graph.md5 @@ -0,0 +1 @@ +f3803f2788b35b56e2ed6e7ab43bacb8 \ No newline at end of file diff --git a/structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException__coll__graph.png b/structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..9c2ef322ec79885f68d48d29f66a502f09ee2293 GIT binary patch literal 5354 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 C%0Act literal 0 HcmV?d00001 diff --git a/structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException__inherit__graph.map b/structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException__inherit__graph.map new file mode 100644 index 00000000..8e808907 --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException__inherit__graph.md5 b/structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException__inherit__graph.md5 new file mode 100644 index 00000000..0d769c32 --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException__inherit__graph.md5 @@ -0,0 +1 @@ +f3803f2788b35b56e2ed6e7ab43bacb8 \ No newline at end of file diff --git a/structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException__inherit__graph.png b/structmrs__lib_1_1AttitudeConverter_1_1EulerFormatException__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..9c2ef322ec79885f68d48d29f66a502f09ee2293 GIT binary patch literal 5354 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 C%0Act literal 0 HcmV?d00001 diff --git a/structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException-members.html b/structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException-members.html new file mode 100644 index 00000000..d8484c8e --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException-members.html @@ -0,0 +1,105 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    mrs_lib::AttitudeConverter::GetHeadingException Member List
    +
    +
    + +

    This is the complete list of members for mrs_lib::AttitudeConverter::GetHeadingException, including all inherited members.

    + + +
    what() const (defined in mrs_lib::AttitudeConverter::GetHeadingException)mrs_lib::AttitudeConverter::GetHeadingExceptioninline
    +
    + + + + diff --git a/structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException.html b/structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException.html new file mode 100644 index 00000000..3c8656f5 --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException.html @@ -0,0 +1,144 @@ + + + + + + + +mrs_lib: mrs_lib::AttitudeConverter::GetHeadingException Struct Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    mrs_lib::AttitudeConverter::GetHeadingException Struct Reference
    +
    +
    + +

    is thrown when calculating of heading is not possible due to atan2 exception + More...

    + +

    #include <attitude_converter.h>

    +
    + + Inheritance diagram for mrs_lib::AttitudeConverter::GetHeadingException:
    +
    +
    + +
    + + Collaboration diagram for mrs_lib::AttitudeConverter::GetHeadingException:
    +
    +
    + + + + + +

    +Public Member Functions

    +const char * what () const throw ()
     
    +

    Detailed Description

    +

    is thrown when calculating of heading is not possible due to atan2 exception

    +

    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException.js b/structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException.js new file mode 100644 index 00000000..a1740afe --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException.js @@ -0,0 +1,4 @@ +var structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException = +[ + [ "what", "structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException.html#ae4993f4da84447fc6165b0ba85b9fcf1", null ] +]; \ No newline at end of file diff --git a/structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException__coll__graph.map b/structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException__coll__graph.map new file mode 100644 index 00000000..dc1778b9 --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException__coll__graph.md5 b/structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException__coll__graph.md5 new file mode 100644 index 00000000..fee5a872 --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException__coll__graph.md5 @@ -0,0 +1 @@ +150fdc740f9d80c1007a346abfdf6c19 \ No newline at end of file diff --git a/structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException__coll__graph.png b/structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..c8b1b565e35fd5e331f474376d4bb30f7b9e520d GIT binary patch literal 5615 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 nQ_z3LNgQa^DV-zQ + + + diff --git a/structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException__inherit__graph.md5 b/structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException__inherit__graph.md5 new file mode 100644 index 00000000..fee5a872 --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException__inherit__graph.md5 @@ -0,0 +1 @@ +150fdc740f9d80c1007a346abfdf6c19 \ No newline at end of file diff --git a/structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException__inherit__graph.png b/structmrs__lib_1_1AttitudeConverter_1_1GetHeadingException__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..c8b1b565e35fd5e331f474376d4bb30f7b9e520d GIT binary patch literal 5615 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 nQ_z3LNgQa^DV-zQ + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    mrs_lib::AttitudeConverter::InvalidAttitudeException Member List
    +
    +
    + +

    This is the complete list of members for mrs_lib::AttitudeConverter::InvalidAttitudeException, including all inherited members.

    + + +
    what() const (defined in mrs_lib::AttitudeConverter::InvalidAttitudeException)mrs_lib::AttitudeConverter::InvalidAttitudeExceptioninline
    +
    + + + + diff --git a/structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException.html b/structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException.html new file mode 100644 index 00000000..1bea45ea --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException.html @@ -0,0 +1,144 @@ + + + + + + + +mrs_lib: mrs_lib::AttitudeConverter::InvalidAttitudeException Struct Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    mrs_lib::AttitudeConverter::InvalidAttitudeException Struct Reference
    +
    +
    + +

    is thrown when the internal attitude becomes invalid + More...

    + +

    #include <attitude_converter.h>

    +
    + + Inheritance diagram for mrs_lib::AttitudeConverter::InvalidAttitudeException:
    +
    +
    + +
    + + Collaboration diagram for mrs_lib::AttitudeConverter::InvalidAttitudeException:
    +
    +
    + + + + + +

    +Public Member Functions

    +const char * what () const throw ()
     
    +

    Detailed Description

    +

    is thrown when the internal attitude becomes invalid

    +

    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException.js b/structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException.js new file mode 100644 index 00000000..e88e45d0 --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException.js @@ -0,0 +1,4 @@ +var structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException = +[ + [ "what", "structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException.html#aec35a6c521fdfe0e2afae636d24f7849", null ] +]; \ No newline at end of file diff --git a/structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException__coll__graph.map b/structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException__coll__graph.map new file mode 100644 index 00000000..93f860ae --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException__coll__graph.md5 b/structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException__coll__graph.md5 new file mode 100644 index 00000000..8df1a836 --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException__coll__graph.md5 @@ -0,0 +1 @@ +14c62a6e7a6f35af73544b5a593c27d7 \ No newline at end of file diff --git a/structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException__coll__graph.png b/structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..15fa859c0a82a1461d9e3dadd65f7e76ad67772e GIT binary patch literal 5232 zcmcJTcQjn@*2hN)qW7qg=tLVeL<^!vCnAy%L?1+NK^USFQAUg2dl@a-U?RFGQAUdz zEhLEUK7RMUYu$Iff4^&tV;$!_^UU7gy+7Z5!gaJ%NC+7SArJ_OnyQi>I1Yk$00AEO zt=Xo03mouXX{abcuC8BMt%V5?2sMYA(nABU^qo0R1O2~e_P!z?i$c}T%5WepPktkX5ob>C=zH>r!uUpuUo7QAZ%ul{HbF0c!Gk0 zc?AX75MdD!b1N&j+~sj_+S_k=YUJTcas8{1zWIYRNmtJ8ot@Fo-mbW~xLH|Q@~bsi z9X&la{;Uluw!ghFgTZ2U=USHg67N9*M{`w{hcX_d+;?Hc#m4eE+`N&s`SYoVhd4Tl z9w%Fe;NHD^Q7m$|!FKhGRlL0JW9H_}!Ts8@C%9bNndiyK*D@%E_qPOJRJpDX?WcbE z{ymxGwsZ;y7gsF?V|p~EEmsYjYlb$N4$)a`j~D9?3=BkZaB|i>Z}EVFwK?Ne8&CZG z{EQdc{HKHQ$)>ixS57DKKbu~`a#QgL$qTY5abgt1Q zn1-6V%BnvJnyu5TuA$-WSQrw5n-mw2{bA< zd3c9h9{jv~$>Qzp?RB(GFERI#M?Wq#H3EdNb8aq!@p5}wWMgY9*Z=IO{sl5PI2h$e zN=mA#t^K6*66lnUjxGxX7E?vaEakl1cN4C#>q$jL1(Da)jW^k{DdHBLxR%ku!NK0| zRgJ0|HsQa^J3Ay0Zhror-503Jc;C7&~)`fLc(aX zyFDZ@^TnWcMn(p+y1M!vh%#&{flIs5CGY5Z^|1mHKR-Vqa}=)h+jBZN9Ny@@MeFD9 zuWM>b3^7JJ(0}{(ZSU+?yTx#(Op2I2EhQyo<4No1&wE{Da*Lk=E+4{R0!YW%P&SpA zqIw6&)MsxI0n^4n38#6p!_5isMZ+p91tA@1G~WLHJ~t1Ku1R}vFizX~Zw<{faT3aK zT#!HlLPFGHXRx`2#UDYZRv#^2>rnSnaS3ctsK%|g1^u$k4u0tHqJ1TCzgp&<^#+~-VG zrkjk}BgQ*-2IIFzz}QPu<>jVCUq_3AnnP5qQKeARs_+^JZtG%W~cG z2=!GK5*u!omaH+6e>W2S;IoyrFF$^@Url=4%wurN`%l}_wINsvSIEuP)7#i8a5D^U zp@_@KDBqzRr=L9`Q-d4cK|?Rjel1@3dMCOd5W<+≫l8N{rw? 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 literal 0 HcmV?d00001 diff --git a/structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException__inherit__graph.map b/structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException__inherit__graph.map new file mode 100644 index 00000000..93f860ae --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException__inherit__graph.md5 b/structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException__inherit__graph.md5 new file mode 100644 index 00000000..8df1a836 --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException__inherit__graph.md5 @@ -0,0 +1 @@ +14c62a6e7a6f35af73544b5a593c27d7 \ No newline at end of file diff --git a/structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException__inherit__graph.png b/structmrs__lib_1_1AttitudeConverter_1_1InvalidAttitudeException__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..15fa859c0a82a1461d9e3dadd65f7e76ad67772e GIT binary patch literal 5232 zcmcJTcQjn@*2hN)qW7qg=tLVeL<^!vCnAy%L?1+NK^USFQAUg2dl@a-U?RFGQAUdz zEhLEUK7RMUYu$Iff4^&tV;$!_^UU7gy+7Z5!gaJ%NC+7SArJ_OnyQi>I1Yk$00AEO zt=Xo03mouXX{abcuC8BMt%V5?2sMYA(nABU^qo0R1O2~e_P!z?i$c}T%5WepPktkX5ob>C=zH>r!uUpuUo7QAZ%ul{HbF0c!Gk0 zc?AX75MdD!b1N&j+~sj_+S_k=YUJTcas8{1zWIYRNmtJ8ot@Fo-mbW~xLH|Q@~bsi z9X&la{;Uluw!ghFgTZ2U=USHg67N9*M{`w{hcX_d+;?Hc#m4eE+`N&s`SYoVhd4Tl z9w%Fe;NHD^Q7m$|!FKhGRlL0JW9H_}!Ts8@C%9bNndiyK*D@%E_qPOJRJpDX?WcbE z{ymxGwsZ;y7gsF?V|p~EEmsYjYlb$N4$)a`j~D9?3=BkZaB|i>Z}EVFwK?Ne8&CZG z{EQdc{HKHQ$)>ixS57DKKbu~`a#QgL$qTY5abgt1Q zn1-6V%BnvJnyu5TuA$-WSQrw5n-mw2{bA< zd3c9h9{jv~$>Qzp?RB(GFERI#M?Wq#H3EdNb8aq!@p5}wWMgY9*Z=IO{sl5PI2h$e zN=mA#t^K6*66lnUjxGxX7E?vaEakl1cN4C#>q$jL1(Da)jW^k{DdHBLxR%ku!NK0| zRgJ0|HsQa^J3Ay0Zhror-503Jc;C7&~)`fLc(aX zyFDZ@^TnWcMn(p+y1M!vh%#&{flIs5CGY5Z^|1mHKR-Vqa}=)h+jBZN9Ny@@MeFD9 zuWM>b3^7JJ(0}{(ZSU+?yTx#(Op2I2EhQyo<4No1&wE{Da*Lk=E+4{R0!YW%P&SpA zqIw6&)MsxI0n^4n38#6p!_5isMZ+p91tA@1G~WLHJ~t1Ku1R}vFizX~Zw<{faT3aK zT#!HlLPFGHXRx`2#UDYZRv#^2>rnSnaS3ctsK%|g1^u$k4u0tHqJ1TCzgp&<^#+~-VG zrkjk}BgQ*-2IIFzz}QPu<>jVCUq_3AnnP5qQKeARs_+^JZtG%W~cG z2=!GK5*u!omaH+6e>W2S;IoyrFF$^@Url=4%wurN`%l}_wINsvSIEuP)7#i8a5D^U zp@_@KDBqzRr=L9`Q-d4cK|?Rjel1@3dMCOd5W<+≫l8N{rw? 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 literal 0 HcmV?d00001 diff --git a/structmrs__lib_1_1AttitudeConverter_1_1MathErrorException-members.html b/structmrs__lib_1_1AttitudeConverter_1_1MathErrorException-members.html new file mode 100644 index 00000000..0bc5ac4e --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1MathErrorException-members.html @@ -0,0 +1,105 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    mrs_lib::AttitudeConverter::MathErrorException Member List
    +
    +
    + +

    This is the complete list of members for mrs_lib::AttitudeConverter::MathErrorException, including all inherited members.

    + + +
    what() const (defined in mrs_lib::AttitudeConverter::MathErrorException)mrs_lib::AttitudeConverter::MathErrorExceptioninline
    +
    + + + + diff --git a/structmrs__lib_1_1AttitudeConverter_1_1MathErrorException.html b/structmrs__lib_1_1AttitudeConverter_1_1MathErrorException.html new file mode 100644 index 00000000..c2ee0792 --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1MathErrorException.html @@ -0,0 +1,144 @@ + + + + + + + +mrs_lib: mrs_lib::AttitudeConverter::MathErrorException Struct Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    mrs_lib::AttitudeConverter::MathErrorException Struct Reference
    +
    +
    + +

    is thrown when math breaks + More...

    + +

    #include <attitude_converter.h>

    +
    + + Inheritance diagram for mrs_lib::AttitudeConverter::MathErrorException:
    +
    +
    + +
    + + Collaboration diagram for mrs_lib::AttitudeConverter::MathErrorException:
    +
    +
    + + + + + +

    +Public Member Functions

    +const char * what () const throw ()
     
    +

    Detailed Description

    +

    is thrown when math breaks

    +

    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/structmrs__lib_1_1AttitudeConverter_1_1MathErrorException.js b/structmrs__lib_1_1AttitudeConverter_1_1MathErrorException.js new file mode 100644 index 00000000..862d9803 --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1MathErrorException.js @@ -0,0 +1,4 @@ +var structmrs__lib_1_1AttitudeConverter_1_1MathErrorException = +[ + [ "what", "structmrs__lib_1_1AttitudeConverter_1_1MathErrorException.html#abbcf2cf961b24158e9b4f4a6655ae42f", null ] +]; \ No newline at end of file diff --git a/structmrs__lib_1_1AttitudeConverter_1_1MathErrorException__coll__graph.map b/structmrs__lib_1_1AttitudeConverter_1_1MathErrorException__coll__graph.map new file mode 100644 index 00000000..663c8b73 --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1MathErrorException__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1AttitudeConverter_1_1MathErrorException__coll__graph.md5 b/structmrs__lib_1_1AttitudeConverter_1_1MathErrorException__coll__graph.md5 new file mode 100644 index 00000000..bf359346 --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1MathErrorException__coll__graph.md5 @@ -0,0 +1 @@ +78a66fff742a006c817afd90ac2e632c \ No newline at end of file diff --git a/structmrs__lib_1_1AttitudeConverter_1_1MathErrorException__coll__graph.png b/structmrs__lib_1_1AttitudeConverter_1_1MathErrorException__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..8e5503225e9e315d2fe2055d4ed36590a6d9c979 GIT binary patch literal 5444 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 literal 0 HcmV?d00001 diff --git a/structmrs__lib_1_1AttitudeConverter_1_1MathErrorException__inherit__graph.map b/structmrs__lib_1_1AttitudeConverter_1_1MathErrorException__inherit__graph.map new file mode 100644 index 00000000..663c8b73 --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1MathErrorException__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1AttitudeConverter_1_1MathErrorException__inherit__graph.md5 b/structmrs__lib_1_1AttitudeConverter_1_1MathErrorException__inherit__graph.md5 new file mode 100644 index 00000000..bf359346 --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1MathErrorException__inherit__graph.md5 @@ -0,0 +1 @@ +78a66fff742a006c817afd90ac2e632c \ No newline at end of file diff --git a/structmrs__lib_1_1AttitudeConverter_1_1MathErrorException__inherit__graph.png b/structmrs__lib_1_1AttitudeConverter_1_1MathErrorException__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..8e5503225e9e315d2fe2055d4ed36590a6d9c979 GIT binary patch literal 5444 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 literal 0 HcmV?d00001 diff --git a/structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException-members.html b/structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException-members.html new file mode 100644 index 00000000..81d176aa --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException-members.html @@ -0,0 +1,105 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + + + + diff --git a/structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException.html b/structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException.html new file mode 100644 index 00000000..9834993c --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException.html @@ -0,0 +1,144 @@ + + + + + + + +mrs_lib: mrs_lib::AttitudeConverter::SetHeadingException Struct Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    mrs_lib::AttitudeConverter::SetHeadingException Struct Reference
    +
    +
    + +

    is thrown when the heading cannot be set to an existing attitude + More...

    + +

    #include <attitude_converter.h>

    +
    + + Inheritance diagram for mrs_lib::AttitudeConverter::SetHeadingException:
    +
    +
    + +
    + + Collaboration diagram for mrs_lib::AttitudeConverter::SetHeadingException:
    +
    +
    + + + + + +

    +Public Member Functions

    +const char * what () const throw ()
     
    +

    Detailed Description

    +

    is thrown when the heading cannot be set to an existing attitude

    +

    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException.js b/structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException.js new file mode 100644 index 00000000..af00fb6d --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException.js @@ -0,0 +1,4 @@ +var structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException = +[ + [ "what", "structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException.html#a32d0564ba5616e6579cf8a2dd98592ca", null ] +]; \ No newline at end of file diff --git a/structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException__coll__graph.map b/structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException__coll__graph.map new file mode 100644 index 00000000..d9b88acb --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException__coll__graph.md5 b/structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException__coll__graph.md5 new file mode 100644 index 00000000..028cf46d --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException__coll__graph.md5 @@ -0,0 +1 @@ +f70d875c07165591e0f806a0fe11b167 \ No newline at end of file diff --git a/structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException__coll__graph.png b/structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..217d98a6befd7c0bf2c584eca6eca25742b6bd71 GIT binary patch literal 5732 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 Q#>UW7MGb||a+ab00X3EvrvLx| literal 0 HcmV?d00001 diff --git a/structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException__inherit__graph.map b/structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException__inherit__graph.map new file mode 100644 index 00000000..d9b88acb --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException__inherit__graph.md5 b/structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException__inherit__graph.md5 new file mode 100644 index 00000000..028cf46d --- /dev/null +++ b/structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException__inherit__graph.md5 @@ -0,0 +1 @@ +f70d875c07165591e0f806a0fe11b167 \ No newline at end of file diff --git a/structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException__inherit__graph.png b/structmrs__lib_1_1AttitudeConverter_1_1SetHeadingException__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..217d98a6befd7c0bf2c584eca6eca25742b6bd71 GIT binary patch literal 5732 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 Q#>UW7MGb||a+ab00X3EvrvLx| literal 0 HcmV?d00001 diff --git a/structmrs__lib_1_1ImagePubliserData-members.html b/structmrs__lib_1_1ImagePubliserData-members.html new file mode 100644 index 00000000..8640313a --- /dev/null +++ b/structmrs__lib_1_1ImagePubliserData-members.html @@ -0,0 +1,109 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    mrs_lib::ImagePubliserData Member List
    +
    +
    + +

    This is the complete list of members for mrs_lib::ImagePubliserData, including all inherited members.

    + + + + + + +
    ImagePubliserData(const image_transport::Publisher &publisher, const std::string &topic_name, const ros::Time &last_hit) (defined in mrs_lib::ImagePubliserData)mrs_lib::ImagePubliserDatainline
    last_hit (defined in mrs_lib::ImagePubliserData)mrs_lib::ImagePubliserData
    pub_mutex (defined in mrs_lib::ImagePubliserData)mrs_lib::ImagePubliserData
    publisher (defined in mrs_lib::ImagePubliserData)mrs_lib::ImagePubliserData
    topic_name (defined in mrs_lib::ImagePubliserData)mrs_lib::ImagePubliserData
    +
    + + + + diff --git a/structmrs__lib_1_1ImagePubliserData.html b/structmrs__lib_1_1ImagePubliserData.html new file mode 100644 index 00000000..08d06485 --- /dev/null +++ b/structmrs__lib_1_1ImagePubliserData.html @@ -0,0 +1,131 @@ + + + + + + + +mrs_lib: mrs_lib::ImagePubliserData Struct Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    mrs_lib::ImagePubliserData Struct Reference
    +
    +
    + + + + +

    +Public Member Functions

    ImagePubliserData (const image_transport::Publisher &publisher, const std::string &topic_name, const ros::Time &last_hit)
     
    + + + + + + + + + +

    +Public Attributes

    +image_transport::Publisher publisher
     
    +std::string topic_name
     
    +std::mutex pub_mutex
     
    +ros::Time last_hit
     
    +
    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/structmrs__lib_1_1ImagePubliserData.js b/structmrs__lib_1_1ImagePubliserData.js new file mode 100644 index 00000000..fa2e891e --- /dev/null +++ b/structmrs__lib_1_1ImagePubliserData.js @@ -0,0 +1,8 @@ +var structmrs__lib_1_1ImagePubliserData = +[ + [ "ImagePubliserData", "structmrs__lib_1_1ImagePubliserData.html#ac3eeffc6b177501732094a6454b74f23", null ], + [ "last_hit", "structmrs__lib_1_1ImagePubliserData.html#a3083f04a921a1bc3785fceb79ff59362", null ], + [ "pub_mutex", "structmrs__lib_1_1ImagePubliserData.html#a1295d317b06cd4b2c0e5948b1dba96ab", null ], + [ "publisher", "structmrs__lib_1_1ImagePubliserData.html#a504614afd37ac4e3684a24ff899b28fa", null ], + [ "topic_name", "structmrs__lib_1_1ImagePubliserData.html#a066839c78b40c3cbfadc81eeb8877ad7", null ] +]; \ No newline at end of file diff --git a/structmrs__lib_1_1Intersection-members.html b/structmrs__lib_1_1Intersection-members.html new file mode 100644 index 00000000..5804072f --- /dev/null +++ b/structmrs__lib_1_1Intersection-members.html @@ -0,0 +1,108 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    mrs_lib::Intersection Member List
    +
    +
    + +

    This is the complete list of members for mrs_lib::Intersection, including all inherited members.

    + + + + + +
    intersect (defined in mrs_lib::Intersection)mrs_lib::Intersection
    Intersection(bool intersect, bool parallel=false, Eigen::RowVector2d point=Eigen::RowVector2d{}) (defined in mrs_lib::Intersection)mrs_lib::Intersectionexplicit
    parallel (defined in mrs_lib::Intersection)mrs_lib::Intersection
    point (defined in mrs_lib::Intersection)mrs_lib::Intersection
    +
    + + + + diff --git a/structmrs__lib_1_1Intersection.html b/structmrs__lib_1_1Intersection.html new file mode 100644 index 00000000..0889bcdc --- /dev/null +++ b/structmrs__lib_1_1Intersection.html @@ -0,0 +1,129 @@ + + + + + + + +mrs_lib: mrs_lib::Intersection Struct Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    mrs_lib::Intersection Struct Reference
    +
    +
    + + + + +

    +Public Member Functions

    Intersection (bool intersect, bool parallel=false, Eigen::RowVector2d point=Eigen::RowVector2d{})
     
    + + + + + + + +

    +Public Attributes

    +Eigen::RowVector2d point
     
    +bool parallel
     
    +bool intersect
     
    +
    The documentation for this struct was generated from the following files:
      +
    • include/mrs_lib/safety_zone/line_operations.h
    • +
    • src/safety_zone/line_operations.cpp
    • +
    +
    +
    + + + + diff --git a/structmrs__lib_1_1Intersection.js b/structmrs__lib_1_1Intersection.js new file mode 100644 index 00000000..b26739e2 --- /dev/null +++ b/structmrs__lib_1_1Intersection.js @@ -0,0 +1,7 @@ +var structmrs__lib_1_1Intersection = +[ + [ "Intersection", "structmrs__lib_1_1Intersection.html#a2a6b162130041bd6b9bfe1bb10f8dd12", null ], + [ "intersect", "structmrs__lib_1_1Intersection.html#a999a121be8f56b8f808ad9478d9ff5c6", null ], + [ "parallel", "structmrs__lib_1_1Intersection.html#a8e115e749f0c893356ffb09967832e3f", null ], + [ "point", "structmrs__lib_1_1Intersection.html#ae9426aa1099955e326ef8e65c4b5edc7", null ] +]; \ No newline at end of file diff --git a/structmrs__lib_1_1JLKF_1_1inverse__exception-members.html b/structmrs__lib_1_1JLKF_1_1inverse__exception-members.html new file mode 100644 index 00000000..c3c3f9e2 --- /dev/null +++ b/structmrs__lib_1_1JLKF_1_1inverse__exception-members.html @@ -0,0 +1,105 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >::inverse_exception Member List
    +
    + +
    + + + + diff --git a/structmrs__lib_1_1JLKF_1_1inverse__exception.html b/structmrs__lib_1_1JLKF_1_1inverse__exception.html new file mode 100644 index 00000000..71876bc9 --- /dev/null +++ b/structmrs__lib_1_1JLKF_1_1inverse__exception.html @@ -0,0 +1,185 @@ + + + + + + + +mrs_lib: mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >::inverse_exception Struct Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >::inverse_exception Struct Reference
    +
    +
    + +

    This exception is thrown when taking the inverse of a matrix fails. + More...

    + +

    #include <jlkf.h>

    +
    + + Inheritance diagram for mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >::inverse_exception:
    +
    +
    + +
    + + Collaboration diagram for mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >::inverse_exception:
    +
    +
    + + + + + + +

    +Public Member Functions

    const char * what () const throw ()
     Returns the error message, describing what caused the exception. More...
     
    +

    Detailed Description

    +

    template<int n_states, int n_inputs, int n_measurements, int n_biases>
    +struct mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >::inverse_exception

    + +

    This exception is thrown when taking the inverse of a matrix fails.

    +

    You should catch this exception in your code and act accordingly if it appears (e.g. reset the state and covariance or modify the measurement/process noise parameters).

    +

    Member Function Documentation

    + +

    ◆ what()

    + +
    +
    +
    +template<int n_states, int n_inputs, int n_measurements, int n_biases>
    + + + + + +
    + + + + + + + + + + + + + +
    const char* mrs_lib::JLKF< n_states, n_inputs, n_measurements, n_biases >::inverse_exception::what () const
    throw (
    )
    +
    +inline
    +
    + +

    Returns the error message, describing what caused the exception.

    +
    Returns
    The error message, describing what caused the exception.
    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/structmrs__lib_1_1JLKF_1_1inverse__exception.js b/structmrs__lib_1_1JLKF_1_1inverse__exception.js new file mode 100644 index 00000000..1baa48a6 --- /dev/null +++ b/structmrs__lib_1_1JLKF_1_1inverse__exception.js @@ -0,0 +1,4 @@ +var structmrs__lib_1_1JLKF_1_1inverse__exception = +[ + [ "what", "structmrs__lib_1_1JLKF_1_1inverse__exception.html#a1f02bea6207ec02864a693067bcd499f", null ] +]; \ No newline at end of file diff --git a/structmrs__lib_1_1JLKF_1_1inverse__exception__coll__graph.map b/structmrs__lib_1_1JLKF_1_1inverse__exception__coll__graph.map new file mode 100644 index 00000000..3a0c65a2 --- /dev/null +++ b/structmrs__lib_1_1JLKF_1_1inverse__exception__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1JLKF_1_1inverse__exception__coll__graph.md5 b/structmrs__lib_1_1JLKF_1_1inverse__exception__coll__graph.md5 new file mode 100644 index 00000000..1a0a949e --- /dev/null +++ b/structmrs__lib_1_1JLKF_1_1inverse__exception__coll__graph.md5 @@ -0,0 +1 @@ +2b27b7fdeed4e686073a4fe14091d71f \ No newline at end of file diff --git a/structmrs__lib_1_1JLKF_1_1inverse__exception__coll__graph.png b/structmrs__lib_1_1JLKF_1_1inverse__exception__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..4ca84afdc229c6c35e65fd23897b7c4924582cdc GIT binary patch literal 5273 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 + + + diff --git a/structmrs__lib_1_1JLKF_1_1inverse__exception__inherit__graph.md5 b/structmrs__lib_1_1JLKF_1_1inverse__exception__inherit__graph.md5 new file mode 100644 index 00000000..1a0a949e --- /dev/null +++ b/structmrs__lib_1_1JLKF_1_1inverse__exception__inherit__graph.md5 @@ -0,0 +1 @@ +2b27b7fdeed4e686073a4fe14091d71f \ No newline at end of file diff --git a/structmrs__lib_1_1JLKF_1_1inverse__exception__inherit__graph.png b/structmrs__lib_1_1JLKF_1_1inverse__exception__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..4ca84afdc229c6c35e65fd23897b7c4924582cdc GIT binary patch literal 5273 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 + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + + + + diff --git a/structmrs__lib_1_1KalmanFilterAloamGarm_1_1statecov__t.html b/structmrs__lib_1_1KalmanFilterAloamGarm_1_1statecov__t.html new file mode 100644 index 00000000..70f846d3 --- /dev/null +++ b/structmrs__lib_1_1KalmanFilterAloamGarm_1_1statecov__t.html @@ -0,0 +1,146 @@ + + + + + + + +mrs_lib: mrs_lib::KalmanFilterAloamGarm< n_states, n_inputs, n_measurements >::statecov_t Struct Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    mrs_lib::KalmanFilterAloamGarm< n_states, n_inputs, n_measurements >::statecov_t Struct Reference
    +
    +
    + +

    Helper struct for passing around the state and its covariance in one variable. + More...

    + +

    #include <kalman_filter_aloamgarm.h>

    + + + + +

    +Public Member Functions

    +statecov_toperator= (statecov_t other)
     
    + + + + + + + + + + + + + +

    +Public Attributes

    +x_t x
     State vector.
     
    +P_t P
     State covariance matrix.
     
    +std::shared_ptr< boost::circular_buffer< double > > nis_buffer = nullptr
     
    +ros::Time stamp = ros::Time(0)
     
    +bool measurement_jumped = false
     
    +

    Detailed Description

    +

    template<int n_states, int n_inputs, int n_measurements>
    +struct mrs_lib::KalmanFilterAloamGarm< n_states, n_inputs, n_measurements >::statecov_t

    + +

    Helper struct for passing around the state and its covariance in one variable.

    +

    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/structmrs__lib_1_1KalmanFilterAloamGarm_1_1statecov__t.js b/structmrs__lib_1_1KalmanFilterAloamGarm_1_1statecov__t.js new file mode 100644 index 00000000..0a043c9d --- /dev/null +++ b/structmrs__lib_1_1KalmanFilterAloamGarm_1_1statecov__t.js @@ -0,0 +1,9 @@ +var structmrs__lib_1_1KalmanFilterAloamGarm_1_1statecov__t = +[ + [ "operator=", "structmrs__lib_1_1KalmanFilterAloamGarm_1_1statecov__t.html#a9f859ca07487925676bfb3015501b113", null ], + [ "measurement_jumped", "structmrs__lib_1_1KalmanFilterAloamGarm_1_1statecov__t.html#a3217639b2d6b87bab7f64fd3a609a068", null ], + [ "nis_buffer", "structmrs__lib_1_1KalmanFilterAloamGarm_1_1statecov__t.html#a5f1075016b7dd24e558d9e8286e65232", null ], + [ "P", "structmrs__lib_1_1KalmanFilterAloamGarm_1_1statecov__t.html#a876ae3c9d4dafac63ddd0723fe351874", null ], + [ "stamp", "structmrs__lib_1_1KalmanFilterAloamGarm_1_1statecov__t.html#a20ce953ee53eb7d730fcd5f7d4c8be90", null ], + [ "x", "structmrs__lib_1_1KalmanFilterAloamGarm_1_1statecov__t.html#a78cb90ec0a35a04f7f4abe69847979ec", null ] +]; \ No newline at end of file diff --git a/structmrs__lib_1_1KalmanFilter_1_1statecov__t-members.html b/structmrs__lib_1_1KalmanFilter_1_1statecov__t-members.html new file mode 100644 index 00000000..b21b9d4a --- /dev/null +++ b/structmrs__lib_1_1KalmanFilter_1_1statecov__t-members.html @@ -0,0 +1,107 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >::statecov_t Member List
    +
    + +
    + + + + diff --git a/structmrs__lib_1_1KalmanFilter_1_1statecov__t.html b/structmrs__lib_1_1KalmanFilter_1_1statecov__t.html new file mode 100644 index 00000000..9eda374b --- /dev/null +++ b/structmrs__lib_1_1KalmanFilter_1_1statecov__t.html @@ -0,0 +1,134 @@ + + + + + + + +mrs_lib: mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >::statecov_t Struct Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >::statecov_t Struct Reference
    +
    +
    + +

    Helper struct for passing around the state and its covariance in one variable. + More...

    + +

    #include <kalman_filter.h>

    + + + + + + + + + + + +

    +Public Attributes

    +x_t x
     State vector.
     
    +P_t P
     State covariance matrix.
     
    +ros::Time stamp = ros::Time(0)
     ROS time stamp.
     
    +

    Detailed Description

    +

    template<int n_states, int n_inputs, int n_measurements>
    +struct mrs_lib::KalmanFilter< n_states, n_inputs, n_measurements >::statecov_t

    + +

    Helper struct for passing around the state and its covariance in one variable.

    +

    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/structmrs__lib_1_1KalmanFilter_1_1statecov__t.js b/structmrs__lib_1_1KalmanFilter_1_1statecov__t.js new file mode 100644 index 00000000..d978962f --- /dev/null +++ b/structmrs__lib_1_1KalmanFilter_1_1statecov__t.js @@ -0,0 +1,6 @@ +var structmrs__lib_1_1KalmanFilter_1_1statecov__t = +[ + [ "P", "structmrs__lib_1_1KalmanFilter_1_1statecov__t.html#aa2747c6fd07bc3a4d9b2c153e38c11ff", null ], + [ "stamp", "structmrs__lib_1_1KalmanFilter_1_1statecov__t.html#ab576efb895b5def90a7aab738c610f83", null ], + [ "x", "structmrs__lib_1_1KalmanFilter_1_1statecov__t.html#a725b61d95901486bbc17cf79e45bd5e4", null ] +]; \ No newline at end of file diff --git a/structmrs__lib_1_1LKF_1_1inverse__exception-members.html b/structmrs__lib_1_1LKF_1_1inverse__exception-members.html new file mode 100644 index 00000000..beded87b --- /dev/null +++ b/structmrs__lib_1_1LKF_1_1inverse__exception-members.html @@ -0,0 +1,105 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    mrs_lib::LKF< n_states, n_inputs, n_measurements >::inverse_exception Member List
    +
    +
    + +

    This is the complete list of members for mrs_lib::LKF< n_states, n_inputs, n_measurements >::inverse_exception, including all inherited members.

    + + +
    what() constmrs_lib::LKF< n_states, n_inputs, n_measurements >::inverse_exceptioninline
    +
    + + + + diff --git a/structmrs__lib_1_1LKF_1_1inverse__exception.html b/structmrs__lib_1_1LKF_1_1inverse__exception.html new file mode 100644 index 00000000..a0659c27 --- /dev/null +++ b/structmrs__lib_1_1LKF_1_1inverse__exception.html @@ -0,0 +1,185 @@ + + + + + + + +mrs_lib: mrs_lib::LKF< n_states, n_inputs, n_measurements >::inverse_exception Struct Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    mrs_lib::LKF< n_states, n_inputs, n_measurements >::inverse_exception Struct Reference
    +
    +
    + +

    This exception is thrown when taking the inverse of a matrix fails. + More...

    + +

    #include <lkf.h>

    +
    + + Inheritance diagram for mrs_lib::LKF< n_states, n_inputs, n_measurements >::inverse_exception:
    +
    +
    + +
    + + Collaboration diagram for mrs_lib::LKF< n_states, n_inputs, n_measurements >::inverse_exception:
    +
    +
    + + + + + + +

    +Public Member Functions

    const char * what () const throw ()
     Returns the error message, describing what caused the exception. More...
     
    +

    Detailed Description

    +

    template<int n_states, int n_inputs, int n_measurements>
    +struct mrs_lib::LKF< n_states, n_inputs, n_measurements >::inverse_exception

    + +

    This exception is thrown when taking the inverse of a matrix fails.

    +

    You should catch this exception in your code and act accordingly if it appears (e.g. reset the state and covariance or modify the measurement/process noise parameters).

    +

    Member Function Documentation

    + +

    ◆ what()

    + +
    +
    +
    +template<int n_states, int n_inputs, int n_measurements>
    + + + + + +
    + + + + + + + + + + + + + +
    const char* mrs_lib::LKF< n_states, n_inputs, n_measurements >::inverse_exception::what () const
    throw (
    )
    +
    +inline
    +
    + +

    Returns the error message, describing what caused the exception.

    +
    Returns
    The error message, describing what caused the exception.
    + +
    +
    +
    The documentation for this struct was generated from the following file:
      +
    • include/mrs_lib/lkf.h
    • +
    +
    +
    + + + + diff --git a/structmrs__lib_1_1LKF_1_1inverse__exception.js b/structmrs__lib_1_1LKF_1_1inverse__exception.js new file mode 100644 index 00000000..f4efdaf6 --- /dev/null +++ b/structmrs__lib_1_1LKF_1_1inverse__exception.js @@ -0,0 +1,4 @@ +var structmrs__lib_1_1LKF_1_1inverse__exception = +[ + [ "what", "structmrs__lib_1_1LKF_1_1inverse__exception.html#a44d325f6cd975003b995d33bd78948ac", null ] +]; \ No newline at end of file diff --git a/structmrs__lib_1_1LKF_1_1inverse__exception__coll__graph.map b/structmrs__lib_1_1LKF_1_1inverse__exception__coll__graph.map new file mode 100644 index 00000000..a6801f04 --- /dev/null +++ b/structmrs__lib_1_1LKF_1_1inverse__exception__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1LKF_1_1inverse__exception__coll__graph.md5 b/structmrs__lib_1_1LKF_1_1inverse__exception__coll__graph.md5 new file mode 100644 index 00000000..eb8b663f --- /dev/null +++ b/structmrs__lib_1_1LKF_1_1inverse__exception__coll__graph.md5 @@ -0,0 +1 @@ +bf1002a01e68d538b0e505425328c540 \ No newline at end of file diff --git a/structmrs__lib_1_1LKF_1_1inverse__exception__coll__graph.png b/structmrs__lib_1_1LKF_1_1inverse__exception__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..a8e51f42136559c4cc823455c48727f184953e60 GIT binary patch literal 5134 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 literal 0 HcmV?d00001 diff --git a/structmrs__lib_1_1LKF_1_1inverse__exception__inherit__graph.map b/structmrs__lib_1_1LKF_1_1inverse__exception__inherit__graph.map new file mode 100644 index 00000000..a6801f04 --- /dev/null +++ b/structmrs__lib_1_1LKF_1_1inverse__exception__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1LKF_1_1inverse__exception__inherit__graph.md5 b/structmrs__lib_1_1LKF_1_1inverse__exception__inherit__graph.md5 new file mode 100644 index 00000000..eb8b663f --- /dev/null +++ b/structmrs__lib_1_1LKF_1_1inverse__exception__inherit__graph.md5 @@ -0,0 +1 @@ +bf1002a01e68d538b0e505425328c540 \ No newline at end of file diff --git a/structmrs__lib_1_1LKF_1_1inverse__exception__inherit__graph.png b/structmrs__lib_1_1LKF_1_1inverse__exception__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..a8e51f42136559c4cc823455c48727f184953e60 GIT binary patch literal 5134 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 literal 0 HcmV?d00001 diff --git a/structmrs__lib_1_1Polygon_1_1ExtraVertices-members.html b/structmrs__lib_1_1Polygon_1_1ExtraVertices-members.html new file mode 100644 index 00000000..60ec4410 --- /dev/null +++ b/structmrs__lib_1_1Polygon_1_1ExtraVertices-members.html @@ -0,0 +1,105 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    mrs_lib::Polygon::ExtraVertices Member List
    +
    +
    + +

    This is the complete list of members for mrs_lib::Polygon::ExtraVertices, including all inherited members.

    + + +
    what() const (defined in mrs_lib::Polygon::ExtraVertices)mrs_lib::Polygon::ExtraVerticesinline
    +
    + + + + diff --git a/structmrs__lib_1_1Polygon_1_1ExtraVertices.html b/structmrs__lib_1_1Polygon_1_1ExtraVertices.html new file mode 100644 index 00000000..7540dc94 --- /dev/null +++ b/structmrs__lib_1_1Polygon_1_1ExtraVertices.html @@ -0,0 +1,137 @@ + + + + + + + +mrs_lib: mrs_lib::Polygon::ExtraVertices Struct Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    mrs_lib::Polygon::ExtraVertices Struct Reference
    +
    +
    +
    + + Inheritance diagram for mrs_lib::Polygon::ExtraVertices:
    +
    +
    + +
    + + Collaboration diagram for mrs_lib::Polygon::ExtraVertices:
    +
    +
    + + + + + +

    +Public Member Functions

    +const char * what () const throw ()
     
    +
    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/structmrs__lib_1_1Polygon_1_1ExtraVertices.js b/structmrs__lib_1_1Polygon_1_1ExtraVertices.js new file mode 100644 index 00000000..b003e526 --- /dev/null +++ b/structmrs__lib_1_1Polygon_1_1ExtraVertices.js @@ -0,0 +1,4 @@ +var structmrs__lib_1_1Polygon_1_1ExtraVertices = +[ + [ "what", "structmrs__lib_1_1Polygon_1_1ExtraVertices.html#aa6cfe154bdf65be75421c67ea9e98a42", null ] +]; \ No newline at end of file diff --git a/structmrs__lib_1_1Polygon_1_1ExtraVertices__coll__graph.map b/structmrs__lib_1_1Polygon_1_1ExtraVertices__coll__graph.map new file mode 100644 index 00000000..9d97e3bf --- /dev/null +++ b/structmrs__lib_1_1Polygon_1_1ExtraVertices__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1Polygon_1_1ExtraVertices__coll__graph.md5 b/structmrs__lib_1_1Polygon_1_1ExtraVertices__coll__graph.md5 new file mode 100644 index 00000000..acd456f2 --- /dev/null +++ b/structmrs__lib_1_1Polygon_1_1ExtraVertices__coll__graph.md5 @@ -0,0 +1 @@ +ba2b0356399dd8914a3b853bc01f612e \ No newline at end of file diff --git a/structmrs__lib_1_1Polygon_1_1ExtraVertices__coll__graph.png b/structmrs__lib_1_1Polygon_1_1ExtraVertices__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..4d514540a865a7f77553e09bd3caf7bfc686a03f GIT binary patch literal 4712 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 T^L*gZ5kyDBP`&8B!{7e_Nk?rv literal 0 HcmV?d00001 diff --git a/structmrs__lib_1_1Polygon_1_1ExtraVertices__inherit__graph.map b/structmrs__lib_1_1Polygon_1_1ExtraVertices__inherit__graph.map new file mode 100644 index 00000000..9d97e3bf --- /dev/null +++ b/structmrs__lib_1_1Polygon_1_1ExtraVertices__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1Polygon_1_1ExtraVertices__inherit__graph.md5 b/structmrs__lib_1_1Polygon_1_1ExtraVertices__inherit__graph.md5 new file mode 100644 index 00000000..acd456f2 --- /dev/null +++ b/structmrs__lib_1_1Polygon_1_1ExtraVertices__inherit__graph.md5 @@ -0,0 +1 @@ +ba2b0356399dd8914a3b853bc01f612e \ No newline at end of file diff --git a/structmrs__lib_1_1Polygon_1_1ExtraVertices__inherit__graph.png b/structmrs__lib_1_1Polygon_1_1ExtraVertices__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..4d514540a865a7f77553e09bd3caf7bfc686a03f GIT binary patch literal 4712 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 T^L*gZ5kyDBP`&8B!{7e_Nk?rv literal 0 HcmV?d00001 diff --git a/structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns-members.html b/structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns-members.html new file mode 100644 index 00000000..50caf950 --- /dev/null +++ b/structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns-members.html @@ -0,0 +1,105 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    mrs_lib::Polygon::WrongNumberOfColumns Member List
    +
    +
    + +

    This is the complete list of members for mrs_lib::Polygon::WrongNumberOfColumns, including all inherited members.

    + + +
    what() const (defined in mrs_lib::Polygon::WrongNumberOfColumns)mrs_lib::Polygon::WrongNumberOfColumnsinline
    +
    + + + + diff --git a/structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns.html b/structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns.html new file mode 100644 index 00000000..3f3eff19 --- /dev/null +++ b/structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns.html @@ -0,0 +1,137 @@ + + + + + + + +mrs_lib: mrs_lib::Polygon::WrongNumberOfColumns Struct Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    mrs_lib::Polygon::WrongNumberOfColumns Struct Reference
    +
    +
    +
    + + Inheritance diagram for mrs_lib::Polygon::WrongNumberOfColumns:
    +
    +
    + +
    + + Collaboration diagram for mrs_lib::Polygon::WrongNumberOfColumns:
    +
    +
    + + + + + +

    +Public Member Functions

    +const char * what () const throw ()
     
    +
    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns.js b/structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns.js new file mode 100644 index 00000000..07923459 --- /dev/null +++ b/structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns.js @@ -0,0 +1,4 @@ +var structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns = +[ + [ "what", "structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns.html#a0d96a9a964ec4528c4a8614e5e79419c", null ] +]; \ No newline at end of file diff --git a/structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns__coll__graph.map b/structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns__coll__graph.map new file mode 100644 index 00000000..0e9ea29b --- /dev/null +++ b/structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns__coll__graph.md5 b/structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns__coll__graph.md5 new file mode 100644 index 00000000..ebbce641 --- /dev/null +++ b/structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns__coll__graph.md5 @@ -0,0 +1 @@ +83d7307c3ed783faf6fc024e043781ae \ No newline at end of file diff --git a/structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns__coll__graph.png b/structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..1547ebc8d2c76365ec091b4578b49c7f6cfb0dca GIT binary patch literal 5196 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 LpbjgQGYk0_N2Kqa literal 0 HcmV?d00001 diff --git a/structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns__inherit__graph.map b/structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns__inherit__graph.map new file mode 100644 index 00000000..0e9ea29b --- /dev/null +++ b/structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns__inherit__graph.md5 b/structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns__inherit__graph.md5 new file mode 100644 index 00000000..ebbce641 --- /dev/null +++ b/structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns__inherit__graph.md5 @@ -0,0 +1 @@ +83d7307c3ed783faf6fc024e043781ae \ No newline at end of file diff --git a/structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns__inherit__graph.png b/structmrs__lib_1_1Polygon_1_1WrongNumberOfColumns__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..1547ebc8d2c76365ec091b4578b49c7f6cfb0dca GIT binary patch literal 5196 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 LpbjgQGYk0_N2Kqa literal 0 HcmV?d00001 diff --git a/structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices-members.html b/structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices-members.html new file mode 100644 index 00000000..d83a3f17 --- /dev/null +++ b/structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices-members.html @@ -0,0 +1,105 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    mrs_lib::Polygon::WrongNumberOfVertices Member List
    +
    +
    + +

    This is the complete list of members for mrs_lib::Polygon::WrongNumberOfVertices, including all inherited members.

    + + +
    what() const (defined in mrs_lib::Polygon::WrongNumberOfVertices)mrs_lib::Polygon::WrongNumberOfVerticesinline
    +
    + + + + diff --git a/structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices.html b/structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices.html new file mode 100644 index 00000000..e1ed72ef --- /dev/null +++ b/structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices.html @@ -0,0 +1,137 @@ + + + + + + + +mrs_lib: mrs_lib::Polygon::WrongNumberOfVertices Struct Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    mrs_lib::Polygon::WrongNumberOfVertices Struct Reference
    +
    +
    +
    + + Inheritance diagram for mrs_lib::Polygon::WrongNumberOfVertices:
    +
    +
    + +
    + + Collaboration diagram for mrs_lib::Polygon::WrongNumberOfVertices:
    +
    +
    + + + + + +

    +Public Member Functions

    +const char * what () const throw ()
     
    +
    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices.js b/structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices.js new file mode 100644 index 00000000..da409b54 --- /dev/null +++ b/structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices.js @@ -0,0 +1,4 @@ +var structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices = +[ + [ "what", "structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices.html#ab526669939611986e9e515293fe292cf", null ] +]; \ No newline at end of file diff --git a/structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices__coll__graph.map b/structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices__coll__graph.map new file mode 100644 index 00000000..8a9e7b11 --- /dev/null +++ b/structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices__coll__graph.md5 b/structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices__coll__graph.md5 new file mode 100644 index 00000000..951e3807 --- /dev/null +++ b/structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices__coll__graph.md5 @@ -0,0 +1 @@ +b1265b44259b4081bedb9d54634023fe \ No newline at end of file diff --git a/structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices__coll__graph.png b/structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..d0afc894c2425cc62b612f892ef058ead2bd7cd5 GIT binary patch literal 5423 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 RZO{RQ+*Q*>RH#@-{1-+%SNs3~ literal 0 HcmV?d00001 diff --git a/structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices__inherit__graph.map b/structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices__inherit__graph.map new file mode 100644 index 00000000..8a9e7b11 --- /dev/null +++ b/structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices__inherit__graph.md5 b/structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices__inherit__graph.md5 new file mode 100644 index 00000000..951e3807 --- /dev/null +++ b/structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices__inherit__graph.md5 @@ -0,0 +1 @@ +b1265b44259b4081bedb9d54634023fe \ No newline at end of file diff --git a/structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices__inherit__graph.png b/structmrs__lib_1_1Polygon_1_1WrongNumberOfVertices__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..d0afc894c2425cc62b612f892ef058ead2bd7cd5 GIT binary patch literal 5423 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 RZO{RQ+*Q*>RH#@-{1-+%SNs3~ literal 0 HcmV?d00001 diff --git a/structmrs__lib_1_1SafetyZone_1_1BorderError-members.html b/structmrs__lib_1_1SafetyZone_1_1BorderError-members.html new file mode 100644 index 00000000..64bd2e1e --- /dev/null +++ b/structmrs__lib_1_1SafetyZone_1_1BorderError-members.html @@ -0,0 +1,105 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    mrs_lib::SafetyZone::BorderError Member List
    +
    +
    + +

    This is the complete list of members for mrs_lib::SafetyZone::BorderError, including all inherited members.

    + + +
    what() const (defined in mrs_lib::SafetyZone::BorderError)mrs_lib::SafetyZone::BorderErrorinline
    +
    + + + + diff --git a/structmrs__lib_1_1SafetyZone_1_1BorderError.html b/structmrs__lib_1_1SafetyZone_1_1BorderError.html new file mode 100644 index 00000000..8ff3c9c1 --- /dev/null +++ b/structmrs__lib_1_1SafetyZone_1_1BorderError.html @@ -0,0 +1,137 @@ + + + + + + + +mrs_lib: mrs_lib::SafetyZone::BorderError Struct Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    mrs_lib::SafetyZone::BorderError Struct Reference
    +
    +
    +
    + + Inheritance diagram for mrs_lib::SafetyZone::BorderError:
    +
    +
    + +
    + + Collaboration diagram for mrs_lib::SafetyZone::BorderError:
    +
    +
    + + + + + +

    +Public Member Functions

    +const char * what () const throw ()
     
    +
    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/structmrs__lib_1_1SafetyZone_1_1BorderError.js b/structmrs__lib_1_1SafetyZone_1_1BorderError.js new file mode 100644 index 00000000..1e9342b3 --- /dev/null +++ b/structmrs__lib_1_1SafetyZone_1_1BorderError.js @@ -0,0 +1,4 @@ +var structmrs__lib_1_1SafetyZone_1_1BorderError = +[ + [ "what", "structmrs__lib_1_1SafetyZone_1_1BorderError.html#ae29f05e234116edb0c1bc4af26466144", null ] +]; \ No newline at end of file diff --git a/structmrs__lib_1_1SafetyZone_1_1BorderError__coll__graph.map b/structmrs__lib_1_1SafetyZone_1_1BorderError__coll__graph.map new file mode 100644 index 00000000..53a283d6 --- /dev/null +++ b/structmrs__lib_1_1SafetyZone_1_1BorderError__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1SafetyZone_1_1BorderError__coll__graph.md5 b/structmrs__lib_1_1SafetyZone_1_1BorderError__coll__graph.md5 new file mode 100644 index 00000000..49ad9e46 --- /dev/null +++ b/structmrs__lib_1_1SafetyZone_1_1BorderError__coll__graph.md5 @@ -0,0 +1 @@ +701d5c80a0512af9b062ab70d3744008 \ No newline at end of file diff --git a/structmrs__lib_1_1SafetyZone_1_1BorderError__coll__graph.png b/structmrs__lib_1_1SafetyZone_1_1BorderError__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..fdc0dd261bb55629a950de604fcb08225bfcb0d9 GIT binary patch literal 4714 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 literal 0 HcmV?d00001 diff --git a/structmrs__lib_1_1SafetyZone_1_1BorderError__inherit__graph.map b/structmrs__lib_1_1SafetyZone_1_1BorderError__inherit__graph.map new file mode 100644 index 00000000..53a283d6 --- /dev/null +++ b/structmrs__lib_1_1SafetyZone_1_1BorderError__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1SafetyZone_1_1BorderError__inherit__graph.md5 b/structmrs__lib_1_1SafetyZone_1_1BorderError__inherit__graph.md5 new file mode 100644 index 00000000..49ad9e46 --- /dev/null +++ b/structmrs__lib_1_1SafetyZone_1_1BorderError__inherit__graph.md5 @@ -0,0 +1 @@ +701d5c80a0512af9b062ab70d3744008 \ No newline at end of file diff --git a/structmrs__lib_1_1SafetyZone_1_1BorderError__inherit__graph.png b/structmrs__lib_1_1SafetyZone_1_1BorderError__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..fdc0dd261bb55629a950de604fcb08225bfcb0d9 GIT binary patch literal 4714 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 literal 0 HcmV?d00001 diff --git a/structmrs__lib_1_1ScopeTimer_1_1time__point-members.html b/structmrs__lib_1_1ScopeTimer_1_1time__point-members.html new file mode 100644 index 00000000..40143250 --- /dev/null +++ b/structmrs__lib_1_1ScopeTimer_1_1time__point-members.html @@ -0,0 +1,110 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    mrs_lib::ScopeTimer::time_point Member List
    +
    +
    + +

    This is the complete list of members for mrs_lib::ScopeTimer::time_point, including all inherited members.

    + + + + + + + +
    chrono_time (defined in mrs_lib::ScopeTimer::time_point)mrs_lib::ScopeTimer::time_point
    chrono_tp typedef (defined in mrs_lib::ScopeTimer::time_point)mrs_lib::ScopeTimer::time_point
    label (defined in mrs_lib::ScopeTimer::time_point)mrs_lib::ScopeTimer::time_point
    ros_time (defined in mrs_lib::ScopeTimer::time_point)mrs_lib::ScopeTimer::time_point
    time_point(const std::string &label) (defined in mrs_lib::ScopeTimer::time_point)mrs_lib::ScopeTimer::time_pointinline
    time_point(const std::string &label, const ros::Time &ros_time) (defined in mrs_lib::ScopeTimer::time_point)mrs_lib::ScopeTimer::time_pointinline
    +
    + + + + diff --git a/structmrs__lib_1_1ScopeTimer_1_1time__point.html b/structmrs__lib_1_1ScopeTimer_1_1time__point.html new file mode 100644 index 00000000..ebcfabfa --- /dev/null +++ b/structmrs__lib_1_1ScopeTimer_1_1time__point.html @@ -0,0 +1,138 @@ + + + + + + + +mrs_lib: mrs_lib::ScopeTimer::time_point Struct Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    mrs_lib::ScopeTimer::time_point Struct Reference
    +
    +
    + + + + +

    +Public Types

    +using chrono_tp = std::chrono::time_point< std::chrono::steady_clock >
     
    + + + + + +

    +Public Member Functions

    time_point (const std::string &label)
     
    time_point (const std::string &label, const ros::Time &ros_time)
     
    + + + + + + + +

    +Public Attributes

    +ros::Time ros_time
     
    +chrono_tp chrono_time
     
    +std::string label
     
    +
    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/structmrs__lib_1_1ScopeTimer_1_1time__point.js b/structmrs__lib_1_1ScopeTimer_1_1time__point.js new file mode 100644 index 00000000..19184e02 --- /dev/null +++ b/structmrs__lib_1_1ScopeTimer_1_1time__point.js @@ -0,0 +1,9 @@ +var structmrs__lib_1_1ScopeTimer_1_1time__point = +[ + [ "chrono_tp", "structmrs__lib_1_1ScopeTimer_1_1time__point.html#aa5378259bc9f62441c73a2c88aa5c55d", null ], + [ "time_point", "structmrs__lib_1_1ScopeTimer_1_1time__point.html#a6b7346c9fd6bb61a26ce075eb40ed199", null ], + [ "time_point", "structmrs__lib_1_1ScopeTimer_1_1time__point.html#acf225035aff4e8fbd7fbf5e8fe4791fe", null ], + [ "chrono_time", "structmrs__lib_1_1ScopeTimer_1_1time__point.html#a2c0bfcad0dcda9f9f788d7b68193af3b", null ], + [ "label", "structmrs__lib_1_1ScopeTimer_1_1time__point.html#aebc889a16ac71272523ee3c58929b460", null ], + [ "ros_time", "structmrs__lib_1_1ScopeTimer_1_1time__point.html#a2c5a2b08de7bd6d21bad8f72454bbb1d", null ] +]; \ No newline at end of file diff --git a/structmrs__lib_1_1SubscribeHandlerOptions-members.html b/structmrs__lib_1_1SubscribeHandlerOptions-members.html new file mode 100644 index 00000000..7198f06a --- /dev/null +++ b/structmrs__lib_1_1SubscribeHandlerOptions-members.html @@ -0,0 +1,116 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + + + + + + diff --git a/structmrs__lib_1_1SubscribeHandlerOptions.html b/structmrs__lib_1_1SubscribeHandlerOptions.html new file mode 100644 index 00000000..a1c1a4fb --- /dev/null +++ b/structmrs__lib_1_1SubscribeHandlerOptions.html @@ -0,0 +1,169 @@ + + + + + + + +mrs_lib: mrs_lib::SubscribeHandlerOptions Struct Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    mrs_lib::SubscribeHandlerOptions Struct Reference
    +
    +
    + +

    A helper class to simplify setup of SubscribeHandler construction. This class is passed to the SubscribeHandler constructor and specifies its common options. + More...

    + +

    #include <subscribe_handler.h>

    + + + + +

    +Public Member Functions

    SubscribeHandlerOptions (const ros::NodeHandle &nh)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Attributes

    +ros::NodeHandle nh
     The ROS NodeHandle to be used for subscription.
     
    +std::string node_name = {}
     Name of the ROS node, using this handle (used for messages printed to console).
     
    +std::string topic_name = {}
     Name of the ROS topic to be handled.
     
    +std::shared_ptr< mrs_lib::TimeoutManagertimeout_manager = nullptr
     Will be used for handling message timouts if necessary. If no manager is specified, it will be created with rate equal to half of no_message_timeout.
     
    +ros::Duration no_message_timeout = mrs_lib::no_timeout
     If no new message is received for this duration, the timeout_callback function will be called. If timeout_callback is empty, an error message will be printed to the console.
     
    +std::function< void(const std::string &topic_name, const ros::Time &last_msg)> timeout_callback = {}
     This function will be called if no new message is received for the no_message_timeout duration. If this variable is empty, an error message will be printed to the console.
     
    +bool threadsafe = true
     If true, all methods of the SubscribeHandler will be mutexed (using a recursive mutex) to avoid data races.
     
    +bool autostart = true
     If true, the SubscribeHandler will be started after construction. Otherwise it has to be started using the start() method.
     
    +uint32_t queue_size = 3
     This parameter is passed to the NodeHandle when subscribing to the topic.
     
    +ros::TransportHints transport_hints = ros::TransportHints()
     This parameter is passed to the NodeHandle when subscribing to the topic.
     
    +

    Detailed Description

    +

    A helper class to simplify setup of SubscribeHandler construction. This class is passed to the SubscribeHandler constructor and specifies its common options.

    +
    Note
    Any option, passed directly to the SubscribeHandler constructor outside this structure, OVERRIDES values in this structure. The values in this structure can be thought of as default common values for all SubscribeHandler objects you want to create, and values passed directly to the constructor as specific options for the concrete handler.
    +
    Examples
    subscribe_handler/example.cpp, and subscribe_handler/simple_example.cpp.
    +
    +

    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/structmrs__lib_1_1SubscribeHandlerOptions.js b/structmrs__lib_1_1SubscribeHandlerOptions.js new file mode 100644 index 00000000..d67c8823 --- /dev/null +++ b/structmrs__lib_1_1SubscribeHandlerOptions.js @@ -0,0 +1,15 @@ +var structmrs__lib_1_1SubscribeHandlerOptions = +[ + [ "SubscribeHandlerOptions", "structmrs__lib_1_1SubscribeHandlerOptions.html#ad7814b824334ea5a3642be4cb4001fe2", null ], + [ "SubscribeHandlerOptions", "structmrs__lib_1_1SubscribeHandlerOptions.html#a53659049ab4818428a64180204ba108c", null ], + [ "autostart", "structmrs__lib_1_1SubscribeHandlerOptions.html#aab7865b63b3dd44b61dba06c54f981c8", null ], + [ "nh", "structmrs__lib_1_1SubscribeHandlerOptions.html#ac5f6fabbc933d7e3f9beba07b166c054", null ], + [ "no_message_timeout", "structmrs__lib_1_1SubscribeHandlerOptions.html#a5702cb78ed291f5e36c960d0f90bb35c", null ], + [ "node_name", "structmrs__lib_1_1SubscribeHandlerOptions.html#a3d31e2d693f41df180cd6911a3fb8310", null ], + [ "queue_size", "structmrs__lib_1_1SubscribeHandlerOptions.html#a5abe6590d88b396d94cce7a7ae652e09", null ], + [ "threadsafe", "structmrs__lib_1_1SubscribeHandlerOptions.html#a7c924f3581ff84d571b825d7e77b9511", null ], + [ "timeout_callback", "structmrs__lib_1_1SubscribeHandlerOptions.html#aba6f6f262bfeae0d1f6f39bb778d04af", null ], + [ "timeout_manager", "structmrs__lib_1_1SubscribeHandlerOptions.html#a50dd6637eb0800d0ee53c1cd6cee058e", null ], + [ "topic_name", "structmrs__lib_1_1SubscribeHandlerOptions.html#a374f745d46497064c62909412ebdf266", null ], + [ "transport_hints", "structmrs__lib_1_1SubscribeHandlerOptions.html#a41f19ca415439152b934b3633933ec25", null ] +]; \ No newline at end of file diff --git a/structmrs__lib_1_1UKF_1_1inverse__exception-members.html b/structmrs__lib_1_1UKF_1_1inverse__exception-members.html new file mode 100644 index 00000000..53c940a0 --- /dev/null +++ b/structmrs__lib_1_1UKF_1_1inverse__exception-members.html @@ -0,0 +1,105 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    mrs_lib::UKF< n_states, n_inputs, n_measurements >::inverse_exception Member List
    +
    + +
    + + + + diff --git a/structmrs__lib_1_1UKF_1_1inverse__exception.html b/structmrs__lib_1_1UKF_1_1inverse__exception.html new file mode 100644 index 00000000..174b2d42 --- /dev/null +++ b/structmrs__lib_1_1UKF_1_1inverse__exception.html @@ -0,0 +1,147 @@ + + + + + + + +mrs_lib: mrs_lib::UKF< n_states, n_inputs, n_measurements >::inverse_exception Struct Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    mrs_lib::UKF< n_states, n_inputs, n_measurements >::inverse_exception Struct Reference
    +
    +
    + +

    is thrown when taking the inverse of a matrix fails during kalman gain calculation + More...

    + +

    #include <ukf.h>

    +
    + + Inheritance diagram for mrs_lib::UKF< n_states, n_inputs, n_measurements >::inverse_exception:
    +
    +
    + +
    + + Collaboration diagram for mrs_lib::UKF< n_states, n_inputs, n_measurements >::inverse_exception:
    +
    +
    + + + + + +

    +Public Member Functions

    +const char * what () const throw ()
     
    +

    Detailed Description

    +

    template<int n_states, int n_inputs, int n_measurements>
    +struct mrs_lib::UKF< n_states, n_inputs, n_measurements >::inverse_exception

    + +

    is thrown when taking the inverse of a matrix fails during kalman gain calculation

    +

    The documentation for this struct was generated from the following file:
      +
    • include/mrs_lib/ukf.h
    • +
    +
    +
    + + + + diff --git a/structmrs__lib_1_1UKF_1_1inverse__exception.js b/structmrs__lib_1_1UKF_1_1inverse__exception.js new file mode 100644 index 00000000..ad655115 --- /dev/null +++ b/structmrs__lib_1_1UKF_1_1inverse__exception.js @@ -0,0 +1,4 @@ +var structmrs__lib_1_1UKF_1_1inverse__exception = +[ + [ "what", "structmrs__lib_1_1UKF_1_1inverse__exception.html#a30f40124b1988fec5273fa1a0c3bfc7c", null ] +]; \ No newline at end of file diff --git a/structmrs__lib_1_1UKF_1_1inverse__exception__coll__graph.map b/structmrs__lib_1_1UKF_1_1inverse__exception__coll__graph.map new file mode 100644 index 00000000..6a27a327 --- /dev/null +++ b/structmrs__lib_1_1UKF_1_1inverse__exception__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1UKF_1_1inverse__exception__coll__graph.md5 b/structmrs__lib_1_1UKF_1_1inverse__exception__coll__graph.md5 new file mode 100644 index 00000000..d5c792c6 --- /dev/null +++ b/structmrs__lib_1_1UKF_1_1inverse__exception__coll__graph.md5 @@ -0,0 +1 @@ +baffa10969dc3ecd81910e93463ff5b9 \ No newline at end of file diff --git a/structmrs__lib_1_1UKF_1_1inverse__exception__coll__graph.png b/structmrs__lib_1_1UKF_1_1inverse__exception__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..493afa46c7d7e4e3924fde80f3e84d225eb997cb GIT binary patch literal 5529 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 VYn8jz49;31nrd*>3T4~y{{S0KwR->n literal 0 HcmV?d00001 diff --git a/structmrs__lib_1_1UKF_1_1inverse__exception__inherit__graph.map b/structmrs__lib_1_1UKF_1_1inverse__exception__inherit__graph.map new file mode 100644 index 00000000..6a27a327 --- /dev/null +++ b/structmrs__lib_1_1UKF_1_1inverse__exception__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1UKF_1_1inverse__exception__inherit__graph.md5 b/structmrs__lib_1_1UKF_1_1inverse__exception__inherit__graph.md5 new file mode 100644 index 00000000..d5c792c6 --- /dev/null +++ b/structmrs__lib_1_1UKF_1_1inverse__exception__inherit__graph.md5 @@ -0,0 +1 @@ +baffa10969dc3ecd81910e93463ff5b9 \ No newline at end of file diff --git a/structmrs__lib_1_1UKF_1_1inverse__exception__inherit__graph.png b/structmrs__lib_1_1UKF_1_1inverse__exception__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..493afa46c7d7e4e3924fde80f3e84d225eb997cb GIT binary patch literal 5529 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 VYn8jz49;31nrd*>3T4~y{{S0KwR->n literal 0 HcmV?d00001 diff --git a/structmrs__lib_1_1UKF_1_1square__root__exception-members.html b/structmrs__lib_1_1UKF_1_1square__root__exception-members.html new file mode 100644 index 00000000..95b0b5c5 --- /dev/null +++ b/structmrs__lib_1_1UKF_1_1square__root__exception-members.html @@ -0,0 +1,105 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +

    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    mrs_lib::UKF< n_states, n_inputs, n_measurements >::square_root_exception Member List
    +
    + +
    + + + + diff --git a/structmrs__lib_1_1UKF_1_1square__root__exception.html b/structmrs__lib_1_1UKF_1_1square__root__exception.html new file mode 100644 index 00000000..fd76d135 --- /dev/null +++ b/structmrs__lib_1_1UKF_1_1square__root__exception.html @@ -0,0 +1,147 @@ + + + + + + + +mrs_lib: mrs_lib::UKF< n_states, n_inputs, n_measurements >::square_root_exception Struct Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    mrs_lib::UKF< n_states, n_inputs, n_measurements >::square_root_exception Struct Reference
    +
    +
    + +

    is thrown when taking the square root of a matrix fails during sigma generation + More...

    + +

    #include <ukf.h>

    +
    + + Inheritance diagram for mrs_lib::UKF< n_states, n_inputs, n_measurements >::square_root_exception:
    +
    +
    + +
    + + Collaboration diagram for mrs_lib::UKF< n_states, n_inputs, n_measurements >::square_root_exception:
    +
    +
    + + + + + +

    +Public Member Functions

    +const char * what () const throw ()
     
    +

    Detailed Description

    +

    template<int n_states, int n_inputs, int n_measurements>
    +struct mrs_lib::UKF< n_states, n_inputs, n_measurements >::square_root_exception

    + +

    is thrown when taking the square root of a matrix fails during sigma generation

    +

    The documentation for this struct was generated from the following file:
      +
    • include/mrs_lib/ukf.h
    • +
    +
    +
    + + + + diff --git a/structmrs__lib_1_1UKF_1_1square__root__exception.js b/structmrs__lib_1_1UKF_1_1square__root__exception.js new file mode 100644 index 00000000..2b214c4d --- /dev/null +++ b/structmrs__lib_1_1UKF_1_1square__root__exception.js @@ -0,0 +1,4 @@ +var structmrs__lib_1_1UKF_1_1square__root__exception = +[ + [ "what", "structmrs__lib_1_1UKF_1_1square__root__exception.html#a9da9699dedf5b959651141b9057ec5ec", null ] +]; \ No newline at end of file diff --git a/structmrs__lib_1_1UKF_1_1square__root__exception__coll__graph.map b/structmrs__lib_1_1UKF_1_1square__root__exception__coll__graph.map new file mode 100644 index 00000000..6765d134 --- /dev/null +++ b/structmrs__lib_1_1UKF_1_1square__root__exception__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1UKF_1_1square__root__exception__coll__graph.md5 b/structmrs__lib_1_1UKF_1_1square__root__exception__coll__graph.md5 new file mode 100644 index 00000000..b148d83d --- /dev/null +++ b/structmrs__lib_1_1UKF_1_1square__root__exception__coll__graph.md5 @@ -0,0 +1 @@ +9d7f67109196bcfd3d9a2ae491312983 \ No newline at end of file diff --git a/structmrs__lib_1_1UKF_1_1square__root__exception__coll__graph.png b/structmrs__lib_1_1UKF_1_1square__root__exception__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..a5fb55b2788def7a294963d8b484caa3f134905c GIT binary patch literal 5338 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 znT20r + + + diff --git a/structmrs__lib_1_1UKF_1_1square__root__exception__inherit__graph.md5 b/structmrs__lib_1_1UKF_1_1square__root__exception__inherit__graph.md5 new file mode 100644 index 00000000..b148d83d --- /dev/null +++ b/structmrs__lib_1_1UKF_1_1square__root__exception__inherit__graph.md5 @@ -0,0 +1 @@ +9d7f67109196bcfd3d9a2ae491312983 \ No newline at end of file diff --git a/structmrs__lib_1_1UKF_1_1square__root__exception__inherit__graph.png b/structmrs__lib_1_1UKF_1_1square__root__exception__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..a5fb55b2788def7a294963d8b484caa3f134905c GIT binary patch literal 5338 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 znT20r + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    mrs_lib::eigenvector_exception Member List
    +
    +
    + +

    This is the complete list of members for mrs_lib::eigenvector_exception, including all inherited members.

    + + +
    what() const overridemrs_lib::eigenvector_exceptioninlinevirtual
    +
    + + + + diff --git a/structmrs__lib_1_1eigenvector__exception.html b/structmrs__lib_1_1eigenvector__exception.html new file mode 100644 index 00000000..d7f18fcf --- /dev/null +++ b/structmrs__lib_1_1eigenvector__exception.html @@ -0,0 +1,184 @@ + + + + + + + +mrs_lib: mrs_lib::eigenvector_exception Struct Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    mrs_lib::eigenvector_exception Struct Reference
    +
    +
    + +

    This exception may be thrown when solving the generalized eigenvalue problem with the M and N matrices. + More...

    + +

    #include <rheiv.h>

    +
    + + Inheritance diagram for mrs_lib::eigenvector_exception:
    +
    +
    + +
    + + Collaboration diagram for mrs_lib::eigenvector_exception:
    +
    +
    + + + + + + +

    +Public Member Functions

    virtual const char * what () const override throw ()
     Returns the error message, describing what caused the exception. More...
     
    +

    Detailed Description

    +

    This exception may be thrown when solving the generalized eigenvalue problem with the M and N matrices.

    +

    You should catch this exception in your code and act accordingly if it appears (e.g. ask for the last valid parameter estimate).

    +
    Examples
    rheiv/example.cpp.
    +
    +

    Member Function Documentation

    + +

    ◆ what()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + +
    virtual const char* mrs_lib::eigenvector_exception::what () const
    throw (
    )
    +
    +inlineoverridevirtual
    +
    + +

    Returns the error message, describing what caused the exception.

    +
    Returns
    The error message, describing what caused the exception.
    +
    Examples
    rheiv/example.cpp.
    +
    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/structmrs__lib_1_1eigenvector__exception.js b/structmrs__lib_1_1eigenvector__exception.js new file mode 100644 index 00000000..d77bd3c9 --- /dev/null +++ b/structmrs__lib_1_1eigenvector__exception.js @@ -0,0 +1,4 @@ +var structmrs__lib_1_1eigenvector__exception = +[ + [ "what", "structmrs__lib_1_1eigenvector__exception.html#ab825ec32cb055c8c0b3b8b59125e90b5", null ] +]; \ No newline at end of file diff --git a/structmrs__lib_1_1eigenvector__exception__coll__graph.map b/structmrs__lib_1_1eigenvector__exception__coll__graph.map new file mode 100644 index 00000000..f241da56 --- /dev/null +++ b/structmrs__lib_1_1eigenvector__exception__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1eigenvector__exception__coll__graph.md5 b/structmrs__lib_1_1eigenvector__exception__coll__graph.md5 new file mode 100644 index 00000000..99f675e9 --- /dev/null +++ b/structmrs__lib_1_1eigenvector__exception__coll__graph.md5 @@ -0,0 +1 @@ +9ff5b67a5f18be78ea9a35fa2f89e853 \ No newline at end of file diff --git a/structmrs__lib_1_1eigenvector__exception__coll__graph.png b/structmrs__lib_1_1eigenvector__exception__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..2191cddceca3a9b733d461b38082eea82ec8d5d0 GIT binary patch literal 4419 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 L-O#N?*hKsbO><58 literal 0 HcmV?d00001 diff --git a/structmrs__lib_1_1eigenvector__exception__inherit__graph.map b/structmrs__lib_1_1eigenvector__exception__inherit__graph.map new file mode 100644 index 00000000..f241da56 --- /dev/null +++ b/structmrs__lib_1_1eigenvector__exception__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1eigenvector__exception__inherit__graph.md5 b/structmrs__lib_1_1eigenvector__exception__inherit__graph.md5 new file mode 100644 index 00000000..99f675e9 --- /dev/null +++ b/structmrs__lib_1_1eigenvector__exception__inherit__graph.md5 @@ -0,0 +1 @@ +9ff5b67a5f18be78ea9a35fa2f89e853 \ No newline at end of file diff --git a/structmrs__lib_1_1eigenvector__exception__inherit__graph.png b/structmrs__lib_1_1eigenvector__exception__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..2191cddceca3a9b733d461b38082eea82ec8d5d0 GIT binary patch literal 4419 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 L-O#N?*hKsbO><58 literal 0 HcmV?d00001 diff --git a/structmrs__lib_1_1geometry_1_1cyclic-members.html b/structmrs__lib_1_1geometry_1_1cyclic-members.html new file mode 100644 index 00000000..54861301 --- /dev/null +++ b/structmrs__lib_1_1geometry_1_1cyclic-members.html @@ -0,0 +1,140 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    mrs_lib::geometry::cyclic< flt, spec > Member List
    +
    +
    + +

    This is the complete list of members for mrs_lib::geometry::cyclic< flt, spec >, including all inherited members.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    convert(const cyclic &what)mrs_lib::geometry::cyclic< flt, spec >inlinestatic
    convert() constmrs_lib::geometry::cyclic< flt, spec >inline
    cyclic()mrs_lib::geometry::cyclic< flt, spec >inline
    cyclic(const flt val)mrs_lib::geometry::cyclic< flt, spec >inline
    cyclic(const cyclic &other)mrs_lib::geometry::cyclic< flt, spec >inline
    cyclic(const spec &other)mrs_lib::geometry::cyclic< flt, spec >inline
    diff(const flt minuend, const flt subtrahend)mrs_lib::geometry::cyclic< flt, spec >inlinestatic
    diff(const cyclic minuend, const cyclic subtrahend) (defined in mrs_lib::geometry::cyclic< flt, spec >)mrs_lib::geometry::cyclic< flt, spec >inlinestatic
    dist(const flt from, const flt to)mrs_lib::geometry::cyclic< flt, spec >inlinestatic
    dist(const cyclic from, const cyclic to) (defined in mrs_lib::geometry::cyclic< flt, spec >)mrs_lib::geometry::cyclic< flt, spec >inlinestatic
    half_rangemrs_lib::geometry::cyclic< flt, spec >static
    inRange(const flt val)mrs_lib::geometry::cyclic< flt, spec >inlinestatic
    interp(const flt from, const flt to, const flt coeff)mrs_lib::geometry::cyclic< flt, spec >inlinestatic
    interp(const cyclic from, const cyclic to, const flt coeff) (defined in mrs_lib::geometry::cyclic< flt, spec >)mrs_lib::geometry::cyclic< flt, spec >inlinestatic
    interpUnwrapped(const flt from, const flt to, const flt coeff)mrs_lib::geometry::cyclic< flt, spec >inlinestatic
    interpUnwrapped(const cyclic from, const cyclic to, const flt coeff) (defined in mrs_lib::geometry::cyclic< flt, spec >)mrs_lib::geometry::cyclic< flt, spec >inlinestatic
    minimummrs_lib::geometry::cyclic< flt, spec >static
    operator+(const cyclic &lhs, const cyclic &rhs)mrs_lib::geometry::cyclic< flt, spec >friend
    operator+=(const cyclic &other)mrs_lib::geometry::cyclic< flt, spec >inline
    operator-(const cyclic &lhs, const cyclic &rhs)mrs_lib::geometry::cyclic< flt, spec >friend
    operator-=(const cyclic &other)mrs_lib::geometry::cyclic< flt, spec >inline
    operator=(const flt nval)mrs_lib::geometry::cyclic< flt, spec >inline
    operator=(const cyclic &other)mrs_lib::geometry::cyclic< flt, spec >inline
    operator=(cyclic &&other)mrs_lib::geometry::cyclic< flt, spec >inline
    pdist(const flt from, const flt to)mrs_lib::geometry::cyclic< flt, spec >inlinestatic
    pdist(const cyclic from, const cyclic to) (defined in mrs_lib::geometry::cyclic< flt, spec >)mrs_lib::geometry::cyclic< flt, spec >inlinestatic
    pinterp(const flt from, const flt to, const flt coeff)mrs_lib::geometry::cyclic< flt, spec >inlinestatic
    pinterp(const cyclic from, const cyclic to, const flt coeff) (defined in mrs_lib::geometry::cyclic< flt, spec >)mrs_lib::geometry::cyclic< flt, spec >inlinestatic
    pinterpUnwrapped(const flt from, const flt to, const flt coeff)mrs_lib::geometry::cyclic< flt, spec >inlinestatic
    pinterpUnwrapped(const cyclic from, const cyclic to, const flt coeff) (defined in mrs_lib::geometry::cyclic< flt, spec >)mrs_lib::geometry::cyclic< flt, spec >inlinestatic
    rangemrs_lib::geometry::cyclic< flt, spec >static
    supremummrs_lib::geometry::cyclic< flt, spec >static
    unwrap(const flt what, const flt from)mrs_lib::geometry::cyclic< flt, spec >inlinestatic
    val (defined in mrs_lib::geometry::cyclic< flt, spec >)mrs_lib::geometry::cyclic< flt, spec >protected
    value() constmrs_lib::geometry::cyclic< flt, spec >inline
    wrap(const flt val)mrs_lib::geometry::cyclic< flt, spec >inlinestatic
    +
    + + + + diff --git a/structmrs__lib_1_1geometry_1_1cyclic.html b/structmrs__lib_1_1geometry_1_1cyclic.html new file mode 100644 index 00000000..1bbdacce --- /dev/null +++ b/structmrs__lib_1_1geometry_1_1cyclic.html @@ -0,0 +1,1373 @@ + + + + + + + +mrs_lib: mrs_lib::geometry::cyclic< flt, spec > Struct Template Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    mrs_lib::geometry::cyclic< flt, spec > Struct Template Reference
    +
    +
    + +

    Implementation of the a general cyclic value (such as angles in radians/degrees etc). + More...

    + +

    #include <cyclic.h>

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Member Functions

     cyclic ()
     Default constructor. More...
     
     cyclic (const flt val)
     Constructor overload. More...
     
     cyclic (const cyclic &other)
     Copy constructor. More...
     
     cyclic (const spec &other)
     Copy constructor. More...
     
    flt value () const
     Getter for val. More...
     
    template<class other_t >
    other_t convert () const
     Conversion between two different circular quantities. More...
     
    cyclicoperator= (const flt nval)
     Assignment operator. More...
     
    cyclicoperator= (const cyclic &other)
     Assignment operator. More...
     
    cyclicoperator= (cyclic &&other)
     Move operator. More...
     
    cyclicoperator+= (const cyclic &other)
     Addition compound operator. More...
     
    cyclicoperator-= (const cyclic &other)
     Subtraction compound operator. More...
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Static Public Member Functions

    static bool inRange (const flt val)
     Checks if val is within the valid interval of wrapped values. More...
     
    static flt wrap (const flt val)
     Returns val, converted to the valid interval of values. More...
     
    static flt unwrap (const flt what, const flt from)
     Returns value of the parameter what modified so that there is no "jump" between from and \t what. More...
     
    static flt pdist (const flt from, const flt to)
     Returns length of the shortest walk in the positive direction from the first parameter to the second one. More...
     
    +static flt pdist (const cyclic from, const cyclic to)
     
    static flt diff (const flt minuend, const flt subtrahend)
     Returns the difference between the two circular values. More...
     
    +static flt diff (const cyclic minuend, const cyclic subtrahend)
     
    static flt dist (const flt from, const flt to)
     Returns the distance between the two circular values. More...
     
    +static flt dist (const cyclic from, const cyclic to)
     
    static flt interpUnwrapped (const flt from, const flt to, const flt coeff)
     Interpolation between two circular quantities without wrapping of the result. More...
     
    +static flt interpUnwrapped (const cyclic from, const cyclic to, const flt coeff)
     
    static flt interp (const flt from, const flt to, const flt coeff)
     Interpolation between two circular quantities. More...
     
    +static flt interp (const cyclic from, const cyclic to, const flt coeff)
     
    static flt pinterpUnwrapped (const flt from, const flt to, const flt coeff)
     Interpolation between two circular quantities in the positive direction without wrapping of the result. More...
     
    +static flt pinterpUnwrapped (const cyclic from, const cyclic to, const flt coeff)
     
    static flt pinterp (const flt from, const flt to, const flt coeff)
     Interpolation between two circular quantities in the positive direction. More...
     
    +static flt pinterp (const cyclic from, const cyclic to, const flt coeff)
     
    template<class other_t >
    static other_t convert (const cyclic &what)
     Conversion between two different circular quantities. More...
     
    + + + + + + + + + + + + + +

    +Static Public Attributes

    +static constexpr flt minimum = spec::minimum
     Minimum of the valid interval of wrapped values $ m $.
     
    +static constexpr flt supremum = spec::supremum
     Supremum of the valid interval of wrapped values $ s $.
     
    static constexpr flt range
     Range of the valid interval of wrapped values $ r $ (also the period of the cyclic quantity). More...
     
    static constexpr flt half_range
     Half of the range of the valid interval of wrapped values $ r/2 $ (used for some calculations). More...
     
    + + + +

    +Protected Attributes

    +flt val
     
    + + + + + + + +

    +Friends

    spec operator+ (const cyclic &lhs, const cyclic &rhs)
     Addition operator. More...
     
    flt operator- (const cyclic &lhs, const cyclic &rhs)
     Subtraction operator (uses the diff() method). More...
     
    +

    Detailed Description

    +

    template<typename flt, class spec>
    +struct mrs_lib::geometry::cyclic< flt, spec >

    + +

    Implementation of the a general cyclic value (such as angles in radians/degrees etc).

    +

    This class implements a periodical value with a period of $ r \in {\rm I\!R} $ so that a general number $ v \in {\rm I\!R} $ represents the same value as $ v + kr,~k \in {\rm I\!N} $. For the purposes of calculations in this class, $ v $ is confined to a half-open interval $ v \in [~m,~s~[ $, where $ m $ is the minimum of this interval and $ s $ is its supremum, and $ s = m + r $ holds. This approach enables representing $ v $ in different intervals on the real numbers axis; eg. angle in radians may be represented within the interval $ v \in [~-\pi,~\pi~[ $ or $ v \in [~0,~2\pi~[ $, according to the needs of the specific application. The period $ r $ is called range for the purposes of this class, as it represents range of the interval of valid ("wrapped") values of $ v $.

    +

    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 example). Specializations for the most common cyclic values are provided and a new specialization may be easily created simply by inheriting from this class and specifying a different minimum and supremum values.

    +

    Implementation inspired by: https://www.codeproject.com/Articles/190833/Circular-Values-Math-and-Statistics-with-Cplusplus

    +
    Note
    For a better intuitive understanding of the used functions, the term walk is sometimes used in the function explanations. You can imagine walking along the circle from one angle to another (represented by the circular quantities). 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. The walk may also be oriented - then you're walking in a specific direction (ie. according to the increasing/decreasing angle).
    +
    Note
    The terms circular quantity and value are used in the function explanations. 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 degrees and 460 degrees.
    +
    Template Parameters
    + + +
    fltfloating data type to be used by this class.
    +
    +
    +
    Examples
    geometry/cyclic_example.cpp.
    +
    +

    Constructor & Destructor Documentation

    + +

    ◆ cyclic() [1/4]

    + +
    +
    +
    +template<typename flt , class spec >
    + + + + + +
    + + + + + + + +
    mrs_lib::geometry::cyclic< flt, spec >::cyclic ()
    +
    +inline
    +
    + +

    Default constructor.

    +

    Sets the value to the minimum.

    + +
    +
    + +

    ◆ cyclic() [2/4]

    + +
    +
    +
    +template<typename flt , class spec >
    + + + + + +
    + + + + + + + + +
    mrs_lib::geometry::cyclic< flt, spec >::cyclic (const flt val)
    +
    +inline
    +
    + +

    Constructor overload.

    +
    Parameters
    + + +
    valinitialization value (will be wrapped).
    +
    +
    + +
    +
    + +

    ◆ cyclic() [3/4]

    + +
    +
    +
    +template<typename flt , class spec >
    + + + + + +
    + + + + + + + + +
    mrs_lib::geometry::cyclic< flt, spec >::cyclic (const cyclic< flt, spec > & other)
    +
    +inline
    +
    + +

    Copy constructor.

    +
    Parameters
    + + +
    valinitialization value.
    +
    +
    + +
    +
    + +

    ◆ cyclic() [4/4]

    + +
    +
    +
    +template<typename flt , class spec >
    + + + + + +
    + + + + + + + + +
    mrs_lib::geometry::cyclic< flt, spec >::cyclic (const spec & other)
    +
    +inline
    +
    + +

    Copy constructor.

    +
    Parameters
    + + +
    valinitialization value.
    +
    +
    + +
    +
    +

    Member Function Documentation

    + +

    ◆ convert() [1/2]

    + +
    +
    +
    +template<typename flt , class spec >
    +
    +template<class other_t >
    + + + + + +
    + + + + + + + +
    other_t mrs_lib::geometry::cyclic< flt, spec >::convert () const
    +
    +inline
    +
    + +

    Conversion between two different circular quantities.

    +

    This method returns the circular quantity, represented by this object, converted to the other_t type of circular quantity.

    +
    Returns
    the circular quantity converted to the range of other_t.
    +
    Template Parameters
    + + +
    other_ttype of the circular quantity to be converted to.
    +
    +
    +
    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 types correspond to each other (such as when converting eg. degrees to radians).
    + +
    +
    + +

    ◆ convert() [2/2]

    + +
    +
    +
    +template<typename flt , class spec >
    +
    +template<class other_t >
    + + + + + +
    + + + + + + + + +
    static other_t mrs_lib::geometry::cyclic< flt, spec >::convert (const cyclic< flt, spec > & what)
    +
    +inlinestatic
    +
    + +

    Conversion between two different circular quantities.

    +

    This function converts its parameter, interpreted as the circular quantity, represented by this class, to the other_t type of circular quantity.

    +
    Parameters
    + + +
    whatthe circular quantity to be converted.
    +
    +
    +
    Returns
    the circular quantity converted to the range of other_t.
    +
    Template Parameters
    + + +
    other_ttype of the circular quantity to be converted to.
    +
    +
    +
    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 types correspond to each other (such as when converting eg. degrees to radians).
    + +
    +
    + +

    ◆ diff()

    + +
    +
    +
    +template<typename flt , class spec >
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    static flt mrs_lib::geometry::cyclic< flt, spec >::diff (const flt minuend,
    const flt subtrahend 
    )
    +
    +inlinestatic
    +
    + +

    Returns the difference between the two circular values.

    +

    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 walk.

    +
    Parameters
    + + + +
    minuendthe subtrahend will be subtracted from this value.
    subtrahendthis value will be subtracted from the minuend.
    +
    +
    +
    Returns
    the difference of the two circular quantities.
    + +
    +
    + +

    ◆ dist()

    + +
    +
    +
    +template<typename flt , class spec >
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    static flt mrs_lib::geometry::cyclic< flt, spec >::dist (const flt from,
    const flt to 
    )
    +
    +inlinestatic
    +
    + +

    Returns the distance between the two circular values.

    +

    The distance may also be interpreted as length of the shortest walk between the two values.

    +
    Parameters
    + + + +
    fromthe first circular quantity.
    tothe second circular quantity.
    +
    +
    +
    Returns
    distance of the two circular quantities.
    +
    Note
    The order of the parameters doesn't matter.
    + +
    +
    + +

    ◆ inRange()

    + +
    +
    +
    +template<typename flt , class spec >
    + + + + + +
    + + + + + + + + +
    static bool mrs_lib::geometry::cyclic< flt, spec >::inRange (const flt val)
    +
    +inlinestatic
    +
    + +

    Checks if val is within the valid interval of wrapped values.

    +
    Parameters
    + + +
    valthe value to be checked.
    +
    +
    +
    Returns
    true if val is within the valid interval of wrapped values.
    + +
    +
    + +

    ◆ interp()

    + +
    +
    +
    +template<typename flt , class spec >
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    static flt mrs_lib::geometry::cyclic< flt, spec >::interp (const flt from,
    const flt to,
    const flt coeff 
    )
    +
    +inlinestatic
    +
    + +

    Interpolation between two circular quantities.

    +

    This function wraps the returned value so that it is in the interval of valid values.

    +
    Parameters
    + + + + +
    fromthe first circular quantity.
    tothe second circular quantity.
    coeffthe interpolation coefficient.
    +
    +
    +
    Returns
    interpolation of the two circular quantities using the coefficient, wrapped to the interval of valid values.
    + +
    +
    + +

    ◆ interpUnwrapped()

    + +
    +
    +
    +template<typename flt , class spec >
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    static flt mrs_lib::geometry::cyclic< flt, spec >::interpUnwrapped (const flt from,
    const flt to,
    const flt coeff 
    )
    +
    +inlinestatic
    +
    + +

    Interpolation between two circular quantities without wrapping of the result.

    +

    This function doesn't wrap the returned value.

    +
    Parameters
    + + + + +
    fromthe first circular quantity.
    tothe second circular quantity.
    coeffthe interpolation coefficient.
    +
    +
    +
    Returns
    interpolation of the two circular quantities using the coefficient.
    +
    Warning
    Note that the returned value may be outside the valid interval of wrapped values, specified by the minimum and supremum parameters of this class.
    + +
    +
    + +

    ◆ operator+=()

    + +
    +
    +
    +template<typename flt , class spec >
    + + + + + +
    + + + + + + + + +
    cyclic& mrs_lib::geometry::cyclic< flt, spec >::operator+= (const cyclic< flt, spec > & other)
    +
    +inline
    +
    + +

    Addition compound operator.

    +
    Parameters
    + + +
    othervalue to be added.
    +
    +
    +
    Returns
    reference to self.
    + +
    +
    + +

    ◆ operator-=()

    + +
    +
    +
    +template<typename flt , class spec >
    + + + + + +
    + + + + + + + + +
    cyclic& mrs_lib::geometry::cyclic< flt, spec >::operator-= (const cyclic< flt, spec > & other)
    +
    +inline
    +
    + +

    Subtraction compound operator.

    +
    Parameters
    + + +
    othervalue to be subtracted.
    +
    +
    +
    Returns
    reference to self.
    + +
    +
    + +

    ◆ operator=() [1/3]

    + +
    +
    +
    +template<typename flt , class spec >
    + + + + + +
    + + + + + + + + +
    cyclic& mrs_lib::geometry::cyclic< flt, spec >::operator= (const cyclic< flt, spec > & other)
    +
    +inline
    +
    + +

    Assignment operator.

    +
    Parameters
    + + +
    othervalue to be assigned.
    +
    +
    +
    Returns
    reference to self.
    + +
    +
    + +

    ◆ operator=() [2/3]

    + +
    +
    +
    +template<typename flt , class spec >
    + + + + + +
    + + + + + + + + +
    cyclic& mrs_lib::geometry::cyclic< flt, spec >::operator= (const flt nval)
    +
    +inline
    +
    + +

    Assignment operator.

    +
    Parameters
    + + +
    nvalvalue to be assigned (will be wrapped).
    +
    +
    +
    Returns
    reference to self.
    + +
    +
    + +

    ◆ operator=() [3/3]

    + +
    +
    +
    +template<typename flt , class spec >
    + + + + + +
    + + + + + + + + +
    cyclic& mrs_lib::geometry::cyclic< flt, spec >::operator= (cyclic< flt, spec > && other)
    +
    +inline
    +
    + +

    Move operator.

    +
    Parameters
    + + +
    othervalue to be assigned.
    +
    +
    +
    Returns
    reference to self.
    + +
    +
    + +

    ◆ pdist()

    + +
    +
    +
    +template<typename flt , class spec >
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    static flt mrs_lib::geometry::cyclic< flt, spec >::pdist (const flt from,
    const flt to 
    )
    +
    +inlinestatic
    +
    + +

    Returns length of the shortest walk in the positive direction from the first parameter to the second one.

    +
    Parameters
    + + + +
    fromthe positive walk starts at this value.
    tothe positive walk ends at this value.
    +
    +
    +
    Returns
    length of the shortest positive walk from the first parameter to the second one.
    +
    Note
    The returned value is not necessarily the shortest distance between the two circular quantities (see the dist() function for that).
    + +
    +
    + +

    ◆ pinterp()

    + +
    +
    +
    +template<typename flt , class spec >
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    static flt mrs_lib::geometry::cyclic< flt, spec >::pinterp (const flt from,
    const flt to,
    const flt coeff 
    )
    +
    +inlinestatic
    +
    + +

    Interpolation between two circular quantities in the positive direction.

    +

    Interpolates the two values in the positive direction from the first parameter to the second by the coefficient. This function wraps the returned value so that it is in the interval of valid values.

    +
    Parameters
    + + + + +
    fromthe first circular quantity.
    tothe second circular quantity.
    coeffthe interpolation coefficient.
    +
    +
    +
    Returns
    interpolation of the two circular quantities using the coefficient, wrapped to the interval of valid values.
    + +
    +
    + +

    ◆ pinterpUnwrapped()

    + +
    +
    +
    +template<typename flt , class spec >
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    static flt mrs_lib::geometry::cyclic< flt, spec >::pinterpUnwrapped (const flt from,
    const flt to,
    const flt coeff 
    )
    +
    +inlinestatic
    +
    + +

    Interpolation between two circular quantities in the positive direction without wrapping of the result.

    +

    Interpolates the two values in the positive direction from the first parameter to the second by the coefficient. This function doesn't wrap the returned value.

    +
    Parameters
    + + + + +
    fromthe first circular quantity.
    tothe second circular quantity.
    coeffthe interpolation coefficient.
    +
    +
    +
    Returns
    interpolation of the two circular quantities using the coefficient.
    +
    Warning
    Note that the returned value may be outside the valid interval of wrapped values, specified by the minimum and supremum parameters of this class.
    + +
    +
    + +

    ◆ unwrap()

    + +
    +
    +
    +template<typename flt , class spec >
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    static flt mrs_lib::geometry::cyclic< flt, spec >::unwrap (const flt what,
    const flt from 
    )
    +
    +inlinestatic
    +
    + +

    Returns value of the parameter what modified so that there is no "jump" between from and \t what.

    +

    The circular difference between the two input quantities is preserved, but the returned value is modified if necessary so that the linear distance between the values is the smallest. This is useful whenever you need to preserve linear continuity of consecutive values, eg. when commanding a multi-rotational servo motor or when using a simple linear Kalman filter to estimate circular quantities.

    +

    An example of inputs and outputs if $ m = 0,~s=360 $:

    + + + + + + + + + + +
    what from return
    20 10 20
    20 350 380
    0 350 360
    200 10 -160
    +
    Parameters
    + + + +
    whatthe value to be unwrapped.
    fromthe previous value from which the unwrapped value of what should have the same circular difference and minimal linear distance.
    +
    +
    +
    Returns
    the unwrapped value of what.
    +
    Warning
    Note that the returned value may be outside the valid interval of wrapped values, specified by the minimum and supremum parameters of this class.
    + +
    +
    + +

    ◆ value()

    + +
    +
    +
    +template<typename flt , class spec >
    + + + + + +
    + + + + + + + +
    flt mrs_lib::geometry::cyclic< flt, spec >::value () const
    +
    +inline
    +
    + +

    Getter for val.

    +
    Returns
    the value.
    + +
    +
    + +

    ◆ wrap()

    + +
    +
    +
    +template<typename flt , class spec >
    + + + + + +
    + + + + + + + + +
    static flt mrs_lib::geometry::cyclic< flt, spec >::wrap (const flt val)
    +
    +inlinestatic
    +
    + +

    Returns val, converted to the valid interval of values.

    +

    The wrapped value represents the same quantity as the parameter (ie. $ v' = v + kr $, where $ v $ is the parameter and $ v' $ is the returned value).

    +
    Parameters
    + + +
    valthe value to be wrapped.
    +
    +
    +
    Returns
    val wrapped to the valid interval of values.
    + +
    +
    +

    Friends And Related Function Documentation

    + +

    ◆ operator+

    + +
    +
    +
    +template<typename flt , class spec >
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    spec operator+ (const cyclic< flt, spec > & lhs,
    const cyclic< flt, spec > & rhs 
    )
    +
    +friend
    +
    + +

    Addition operator.

    +
    Parameters
    + + + +
    lhsleft-hand-side.
    rhsright-hand-side.
    +
    +
    +
    Returns
    the result of adding the two angles.
    + +
    +
    + +

    ◆ operator-

    + +
    +
    +
    +template<typename flt , class spec >
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    flt operator- (const cyclic< flt, spec > & lhs,
    const cyclic< flt, spec > & rhs 
    )
    +
    +friend
    +
    + +

    Subtraction operator (uses the diff() method).

    +
    Parameters
    + + + +
    lhsleft-hand-side.
    rhsright-hand-side.
    +
    +
    +
    Returns
    the result of subtracting rhs from lhs.
    + +
    +
    +

    Member Data Documentation

    + +

    ◆ half_range

    + +
    +
    +
    +template<typename flt , class spec >
    + + + + + +
    + + + + +
    constexpr flt mrs_lib::geometry::cyclic< flt, spec >::half_range
    +
    +staticconstexpr
    +
    +Initial value:
    =
    +
    range / flt(2)
    +
    +

    Half of the range of the valid interval of wrapped values $ r/2 $ (used for some calculations).

    + +
    +
    + +

    ◆ range

    + +
    +
    +
    +template<typename flt , class spec >
    + + + + + +
    + + + + +
    constexpr flt mrs_lib::geometry::cyclic< flt, spec >::range
    +
    +staticconstexpr
    +
    +Initial value: +

    Range of the valid interval of wrapped values $ r $ (also the period of the cyclic quantity).

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    +
    +
    static constexpr flt supremum
    Supremum of the valid interval of wrapped values .
    Definition: cyclic.h:86
    +
    static constexpr flt minimum
    Minimum of the valid interval of wrapped values .
    Definition: cyclic.h:85
    +
    static constexpr flt range
    Range of the valid interval of wrapped values (also the period of the cyclic quantity).
    Definition: cyclic.h:87
    + + + + diff --git a/structmrs__lib_1_1geometry_1_1cyclic.js b/structmrs__lib_1_1geometry_1_1cyclic.js new file mode 100644 index 00000000..46cdf527 --- /dev/null +++ b/structmrs__lib_1_1geometry_1_1cyclic.js @@ -0,0 +1,17 @@ +var structmrs__lib_1_1geometry_1_1cyclic = +[ + [ "cyclic", "structmrs__lib_1_1geometry_1_1cyclic.html#ab366578641265f73655d1edc023cc2c7", null ], + [ "cyclic", "structmrs__lib_1_1geometry_1_1cyclic.html#ae0cfbde43f9fa6a3f26f1e4cf8184d30", null ], + [ "cyclic", "structmrs__lib_1_1geometry_1_1cyclic.html#a9ca52b4d47969ec56057b8217f201ab9", null ], + [ "cyclic", "structmrs__lib_1_1geometry_1_1cyclic.html#ad40f88cb0dab7a684335f3403a9df7b0", null ], + [ "convert", "structmrs__lib_1_1geometry_1_1cyclic.html#aa86da042144ee34330e4cef57b410f58", null ], + [ "operator+=", "structmrs__lib_1_1geometry_1_1cyclic.html#a0d797e1245025227ede866ab08bcc19f", null ], + [ "operator-=", "structmrs__lib_1_1geometry_1_1cyclic.html#ad45609e5fa890a79729b100231e427da", null ], + [ "operator=", "structmrs__lib_1_1geometry_1_1cyclic.html#ace7e2ff831cf60311e28a70035114bcd", null ], + [ "operator=", "structmrs__lib_1_1geometry_1_1cyclic.html#a1ff6b499102b0eb290b6d121284c51ce", null ], + [ "operator=", "structmrs__lib_1_1geometry_1_1cyclic.html#a8c81dca050a406b4225e8816a1955fb2", null ], + [ "value", "structmrs__lib_1_1geometry_1_1cyclic.html#a064a156dd856871bf1b4acf22cba78e3", null ], + [ "operator+", "structmrs__lib_1_1geometry_1_1cyclic.html#a58ca734b0e19c5f25da90761303451b7", null ], + [ "operator-", "structmrs__lib_1_1geometry_1_1cyclic.html#a9d401b110dd9e5372ffa4951f073e794", null ], + [ "val", "structmrs__lib_1_1geometry_1_1cyclic.html#a94f9db20b89133f33a4c7117a8224a0b", null ] +]; \ No newline at end of file diff --git a/structmrs__lib_1_1geometry_1_1degrees-members.html b/structmrs__lib_1_1geometry_1_1degrees-members.html new file mode 100644 index 00000000..d77b32be --- /dev/null +++ b/structmrs__lib_1_1geometry_1_1degrees-members.html @@ -0,0 +1,138 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    mrs_lib::geometry::degrees Member List
    +
    +
    + +

    This is the complete list of members for mrs_lib::geometry::degrees, including all inherited members.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    convert(const cyclic &what)mrs_lib::geometry::cyclic< double, degrees >inlinestatic
    convert() constmrs_lib::geometry::cyclic< double, degrees >inline
    cyclic()mrs_lib::geometry::cyclic< double, degrees >inline
    cyclic(const double val)mrs_lib::geometry::cyclic< double, degrees >inline
    cyclic(const cyclic &other)mrs_lib::geometry::cyclic< double, degrees >inline
    cyclic(const degrees &other)mrs_lib::geometry::cyclic< double, degrees >inline
    diff(const double minuend, const double subtrahend)mrs_lib::geometry::cyclic< double, degrees >inlinestatic
    diff(const cyclic minuend, const cyclic subtrahend) (defined in mrs_lib::geometry::cyclic< double, degrees >)mrs_lib::geometry::cyclic< double, degrees >inlinestatic
    dist(const double from, const double to)mrs_lib::geometry::cyclic< double, degrees >inlinestatic
    dist(const cyclic from, const cyclic to) (defined in mrs_lib::geometry::cyclic< double, degrees >)mrs_lib::geometry::cyclic< double, degrees >inlinestatic
    half_rangemrs_lib::geometry::cyclic< double, degrees >static
    inRange(const double val)mrs_lib::geometry::cyclic< double, degrees >inlinestatic
    interp(const double from, const double to, const double coeff)mrs_lib::geometry::cyclic< double, degrees >inlinestatic
    interp(const cyclic from, const cyclic to, const double coeff) (defined in mrs_lib::geometry::cyclic< double, degrees >)mrs_lib::geometry::cyclic< double, degrees >inlinestatic
    interpUnwrapped(const double from, const double to, const double coeff)mrs_lib::geometry::cyclic< double, degrees >inlinestatic
    interpUnwrapped(const cyclic from, const cyclic to, const double coeff) (defined in mrs_lib::geometry::cyclic< double, degrees >)mrs_lib::geometry::cyclic< double, degrees >inlinestatic
    minimum (defined in mrs_lib::geometry::degrees)mrs_lib::geometry::degreesstatic
    operator+=(const cyclic &other)mrs_lib::geometry::cyclic< double, degrees >inline
    operator-=(const cyclic &other)mrs_lib::geometry::cyclic< double, degrees >inline
    operator=(const double nval)mrs_lib::geometry::cyclic< double, degrees >inline
    operator=(const cyclic &other)mrs_lib::geometry::cyclic< double, degrees >inline
    operator=(cyclic &&other)mrs_lib::geometry::cyclic< double, degrees >inline
    pdist(const double from, const double to)mrs_lib::geometry::cyclic< double, degrees >inlinestatic
    pdist(const cyclic from, const cyclic to) (defined in mrs_lib::geometry::cyclic< double, degrees >)mrs_lib::geometry::cyclic< double, degrees >inlinestatic
    pinterp(const double from, const double to, const double coeff)mrs_lib::geometry::cyclic< double, degrees >inlinestatic
    pinterp(const cyclic from, const cyclic to, const double coeff) (defined in mrs_lib::geometry::cyclic< double, degrees >)mrs_lib::geometry::cyclic< double, degrees >inlinestatic
    pinterpUnwrapped(const double from, const double to, const double coeff)mrs_lib::geometry::cyclic< double, degrees >inlinestatic
    pinterpUnwrapped(const cyclic from, const cyclic to, const double coeff) (defined in mrs_lib::geometry::cyclic< double, degrees >)mrs_lib::geometry::cyclic< double, degrees >inlinestatic
    rangemrs_lib::geometry::cyclic< double, degrees >static
    supremum (defined in mrs_lib::geometry::degrees)mrs_lib::geometry::degreesstatic
    unwrap(const double what, const double from)mrs_lib::geometry::cyclic< double, degrees >inlinestatic
    val (defined in mrs_lib::geometry::cyclic< double, degrees >)mrs_lib::geometry::cyclic< double, degrees >protected
    value() constmrs_lib::geometry::cyclic< double, degrees >inline
    wrap(const double val)mrs_lib::geometry::cyclic< double, degrees >inlinestatic
    +
    + + + + diff --git a/structmrs__lib_1_1geometry_1_1degrees.html b/structmrs__lib_1_1geometry_1_1degrees.html new file mode 100644 index 00000000..b64ec64c --- /dev/null +++ b/structmrs__lib_1_1geometry_1_1degrees.html @@ -0,0 +1,260 @@ + + + + + + + +mrs_lib: mrs_lib::geometry::degrees Struct Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    mrs_lib::geometry::degrees Struct Reference
    +
    +
    + +

    Convenience specialization of the cyclic class for unsigned degrees (from $0$ to $360$). + More...

    + +

    #include <cyclic.h>

    +
    + + Inheritance diagram for mrs_lib::geometry::degrees:
    +
    +
    + +
    + + Collaboration diagram for mrs_lib::geometry::degrees:
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Static Public Attributes

    +static constexpr double minimum = 0
     
    +static constexpr double supremum = 360
     
    - Static Public Attributes inherited from mrs_lib::geometry::cyclic< double, degrees >
    +static constexpr double minimum
     Minimum of the valid interval of wrapped values $ m $.
     
    +static constexpr double supremum
     Supremum of the valid interval of wrapped values $ s $.
     
    +static constexpr double range
     Range of the valid interval of wrapped values $ r $ (also the period of the cyclic quantity).
     
    +static constexpr double half_range
     Half of the range of the valid interval of wrapped values $ r/2 $ (used for some calculations).
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Additional Inherited Members

    - Public Member Functions inherited from mrs_lib::geometry::cyclic< double, degrees >
     cyclic ()
     Default constructor. More...
     
     cyclic (const double val)
     Constructor overload. More...
     
     cyclic (const cyclic &other)
     Copy constructor. More...
     
     cyclic (const degrees &other)
     Copy constructor. More...
     
    double value () const
     Getter for val. More...
     
    other_t convert () const
     Conversion between two different circular quantities. More...
     
    cyclicoperator= (const double nval)
     Assignment operator. More...
     
    cyclicoperator= (const cyclic &other)
     Assignment operator. More...
     
    cyclicoperator= (cyclic &&other)
     Move operator. More...
     
    cyclicoperator+= (const cyclic &other)
     Addition compound operator. More...
     
    cyclicoperator-= (const cyclic &other)
     Subtraction compound operator. More...
     
    - Static Public Member Functions inherited from mrs_lib::geometry::cyclic< double, degrees >
    static bool inRange (const double val)
     Checks if val is within the valid interval of wrapped values. More...
     
    static double wrap (const double val)
     Returns val, converted to the valid interval of values. More...
     
    static double unwrap (const double what, const double from)
     Returns value of the parameter what modified so that there is no "jump" between from and \t what. More...
     
    static double pdist (const double from, const double to)
     Returns length of the shortest walk in the positive direction from the first parameter to the second one. More...
     
    +static double pdist (const cyclic from, const cyclic to)
     
    static double diff (const double minuend, const double subtrahend)
     Returns the difference between the two circular values. More...
     
    +static double diff (const cyclic minuend, const cyclic subtrahend)
     
    static double dist (const double from, const double to)
     Returns the distance between the two circular values. More...
     
    +static double dist (const cyclic from, const cyclic to)
     
    static double interpUnwrapped (const double from, const double to, const double coeff)
     Interpolation between two circular quantities without wrapping of the result. More...
     
    +static double interpUnwrapped (const cyclic from, const cyclic to, const double coeff)
     
    static double interp (const double from, const double to, const double coeff)
     Interpolation between two circular quantities. More...
     
    +static double interp (const cyclic from, const cyclic to, const double coeff)
     
    static double pinterpUnwrapped (const double from, const double to, const double coeff)
     Interpolation between two circular quantities in the positive direction without wrapping of the result. More...
     
    +static double pinterpUnwrapped (const cyclic from, const cyclic to, const double coeff)
     
    static double pinterp (const double from, const double to, const double coeff)
     Interpolation between two circular quantities in the positive direction. More...
     
    +static double pinterp (const cyclic from, const cyclic to, const double coeff)
     
    static other_t convert (const cyclic &what)
     Conversion between two different circular quantities. More...
     
    - Protected Attributes inherited from mrs_lib::geometry::cyclic< double, degrees >
    +double val
     
    +

    Detailed Description

    +

    Convenience specialization of the cyclic class for unsigned degrees (from $0$ to $360$).

    +

    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/structmrs__lib_1_1geometry_1_1degrees__coll__graph.map b/structmrs__lib_1_1geometry_1_1degrees__coll__graph.map new file mode 100644 index 00000000..e34a195b --- /dev/null +++ b/structmrs__lib_1_1geometry_1_1degrees__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1geometry_1_1degrees__coll__graph.md5 b/structmrs__lib_1_1geometry_1_1degrees__coll__graph.md5 new file mode 100644 index 00000000..7b45e86d --- /dev/null +++ b/structmrs__lib_1_1geometry_1_1degrees__coll__graph.md5 @@ -0,0 +1 @@ +cac1bec9373883796f6a1ba0b8bda207 \ No newline at end of file diff --git a/structmrs__lib_1_1geometry_1_1degrees__coll__graph.png b/structmrs__lib_1_1geometry_1_1degrees__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..88c75bacb71a9da0074e1ddc00af26487292da4a GIT binary patch literal 5545 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 D=|-(e literal 0 HcmV?d00001 diff --git a/structmrs__lib_1_1geometry_1_1degrees__inherit__graph.map b/structmrs__lib_1_1geometry_1_1degrees__inherit__graph.map new file mode 100644 index 00000000..e34a195b --- /dev/null +++ b/structmrs__lib_1_1geometry_1_1degrees__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1geometry_1_1degrees__inherit__graph.md5 b/structmrs__lib_1_1geometry_1_1degrees__inherit__graph.md5 new file mode 100644 index 00000000..7b45e86d --- /dev/null +++ b/structmrs__lib_1_1geometry_1_1degrees__inherit__graph.md5 @@ -0,0 +1 @@ +cac1bec9373883796f6a1ba0b8bda207 \ No newline at end of file diff --git a/structmrs__lib_1_1geometry_1_1degrees__inherit__graph.png b/structmrs__lib_1_1geometry_1_1degrees__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..88c75bacb71a9da0074e1ddc00af26487292da4a GIT binary patch literal 5545 zcmcgwha;75`#&U`Bax9*$ezcRkzL5%`^XH*-YJe9vWd*>ku7_#tYl@6gCq0UoA>Vf z{?_{s{2t>x9?!b(>vMg^9jdA8BKYy5D2;P3mHjGkJRli-lCdkH$4)sdM#!h>T;Q*)}<_@IlHp;5jbir3LS5 zk%!R2H=iaUBQv+L3FWv(J)fAJ^|?AfdclPUEBXHJ%FEfA*DC6?H)CsStFI6TM)WxP zxuMuwW$ec^%rM-gXVH?lR;*zI?d^2@{I2FL1qFZN*>o6NXnQGO||^u8S~uSTuDhu0Re%Eii+;;Zk04qVbA@q zk&%)9{_SaE-a)~^ z6*aYysj0g1@;ecEBi05rc4|60>B7#rQBlKrD(T(TO`@Y-o}OZU*FHUw4;V=M+S~nY zYm4=(Uyo$T{+<{g8w&{!7Zea!wvP^hwbARndGkg}O3J_>B`~n-Gr#S8v#)`ko}QYT zD=X=K*L68L7NfZ@ zm6erUM112GU#1AKFf)&hkI&V+h988%FOIkQ`T5;<=j~s={w(3w+|clpH7?@5AS`)+ zg3DM_QYH&BCdB6y{b6{!OELTrE@MS>!)?h=@87>KF{q`( zg>iFdWMw%ayNTYpjc8&+KE=m(P4TwTCx8A-J^cv`AUYZ#;kTKepTs=@+X?n69;>0$ zfq{XJU}#Em^7d@q!D@fvU4w7U&Ei%KIXSnvViaBn>!QC5kVhy$L4@V{F>8vRyIE~uo$-qyD0hdeU!^C$j^V(b!)L+rJ<3LudnYy zlQ+2a$<`FFyZcF7n zUPcDwY4{!k8(VmrDJ3Oku|e&djvyk)dn#T_2!zw5Srqghc%rN8(bdJt#rZk7SJoaN z3jjOg8oT70nqyGn9KC#A@w8juS=e?FuB@a@|-h)%iJ(Z<%6otT)Im6esZ_eCs|3O;vT z#;54$(D3jEkGNQgPV=5t;6hhM|1m-yP(C5{Eu$41wq>kg z7y`%G-oq1JtYApX+PLI#^~$T%ZD$rVeBHaNbI*e{Sy@@Q$_gVf>LstZLw9|By}p4# zi|0XZWhL*EC#&Geb8~Zm0W2&mtXngsgK21J(EfLP(r*th*3{ID=BaS$RmkY+dG5|P z0djaqOWR#E2sELi0|_*wy1LrZ(sJ?UBPE+osf&|SmU;m|p_`itfuMH6OYLAhTk(!zs`cNF8o7zHX_`23%LE-uHxcK;^las{6L>wF( zq}EeDK0vrt_A>&)!os$;n{jbuF2f)3C>?p-X6d9`NI)|iUWszBd9;bj22pGwk+&e| zqoeJe9oi;=!-C_UsD~r6ha|Fjqw?i@AL(FeHFU+(YK>yZLLx3`nik&KH$7YjA>*6x zqB_igO^<>Q!NCW2CDhH4;zj~|e4qNvZ{508`YtVjym8UdA~GUE%ynZ7bOzA3=9_Ep zLytaQX+=eXKq(+=@)YHo*)tw!$~kR5PKROU>ZR4TO4dwM%g299dFfsH+wORKrqV_Q(B)F_!|SV) z1@DuczW#o1PtQM_n>UA}D)bU+4<3A(pEstC2;wx0#RJeB>ki;_n)djblT$vE`TH3e zr$KaNBr(cF&EYR2qIBHI1S$UljJt?bM-<=kUi*D<1y4Y-09GpL;?=dawbj+zo0~}1 z>cT=+X6EPe@=T8&Ju@-6=?bR+m;!I0rK#CDQ_r)=?msM?44OY8;-!`rc|hCuw@a8J z&QifeMMbgC8HO}yhfN!Wsf;a^f7=1v?16Cul*nC=|M>A5kPkhI2jCGj#6xkPXDD+3 z8SBQpyu5}6Z_wh>(j6P)MHoGQ)b;evcIFzuxEviFot&KLQRYDY!Bq|m&D-1CzUPMp zDJe6ptq}i5prNp_u`efs5_^9AB6Uzco;2};+w27$Y_<4axasQZzI-{@+S;07Gd;by*xcC2;&mJdzdSpzA|fIJbi)&{Cli#I z?5D4dMN;j~|E9#KL{KK~EbS8w05WS`0|FYfS{mE-+0n7>s~|Q%ON#nM}{x zIv>a}U~pjG0KLj<&y0_g)6f)u`=*kqIxskRu)qKForFZogQsq2ll#VLz&8Nc3k%ns z9iV!;x-cL~N{lcmbB_+sV<<5(=+&VwPj&S5r#m|t1O?q2y*-q$=wYI{$rcvvlvGsw z0s{B~D9svHM;>)^%m!qX&+P17N0a zVPd-N&cDo5o%m+*@a|putuV%rR+(ddU2R6He=b@VYe0n1{I|O$CYw67w%Y>VByQw% z*ioSp=UibVX?%kH7!ViNhCrhb=Dl?K&^m%2Z3sc0z379}({sQR>0zzHQ$oG{7xGg6?2jdf23JqyFCRg|KKhYh)xB%- z?=q{@-LjobYvYC7Jd57zue92onNG4!k=rcHwGi>VW#8;L zJMP_VvEkvVgWZ20jTl^9RD~}UWj+?LVhZOsR7E?PzJF3&D1*yfQGRx@J9%{_+Q}y* zq-l6*xxaZwIHR|lkqIT7Ja8qT4}pZr)H`OI{nzn~qN0|nsxVX_LyDN8zW&_!ZH~5A z5Lp52z`$?1?6U^s?DrbV(BtM4^kJT_)V4?b#-;cnhZ}4RFP9L zdH4q?5t{_|0_!?aV!#AKQ3x<-_sGfd8p81QwL%E#3=zlEDL|V!jOzbNQEsl~+CcK- z$B%(i{xLMPv$R|N$HfLxoJn!@jKh)*m5Mm>NiyKatz=5!vH2W+x`vL~Mbl@7U zQd3g{`W+tecjJe_fL&Xj

    H20z3&U)cORN*VEHeb93{!xH$A|R-b&5d<71ac59}V zi;1b{_irH~q3?Bd!WM>pIf#Dx&ZDxk;{Zu)I$}h zB{1?g*H<7*gZEf;_TKxoKZ|cyn}K(5aDV|}zgLu>-#ax$wIPl$1nBWddIUP*^1oOf3YwF;L~xDUhPh&(G=q9i#>a?T6FE zK#=v`U%>9OA^GCyOfkkv9a_lEW-1Mb*s?olHy`C zotBo?#l=Ok5@R8+T}Dt4cBssc{{Gm+MAVM~%Szz$3L&iV_z+bM4P+&EV-*C#!?WW| zjCwONI?4-!v9hvyp%*^{1O$9P9Xr>R{j*V#l?4_s;uUg;!8=2te%F_t9+W3v>a#zk zr{C_FauMPXuKaB*?@X*L|$>s-4|)ip3+Vq^pb&qA%U z1TLCDo8TSTB45NgO2q%J)Hp6s|RD)d@N7Ojr540E0xbv9W>WoY~pg zvUj2l#A!{z{qA60tj}4$4^Me-@AI?{&)gjK0u;E| z_q-}I6K-#B|Kdg8Bz?snzxqq`lC*`zDpcY!BR@YsCx<`R2xoXcz@N$v9fUk0_>spD zrgTG3^+h=`CZ?TM^|g&nW`x?7i0HN$b5a|&g9li&8NMcG)5h)md!}DBpl~8WLT*Yz zO{-VauKAj*D&A0h%d)on%Go36EfLH;mQcFU8<&Edoa(nr?F)W4UsV2?0)oHEz<>Xr z|31ft2zeb^`}j20)(U#L>KPeD93#(OqqoEi7l}|)T+Hb)%$OzOuejs4#V~R7eHo$A zWhWsds^+33c-~RC7_!~B{y8vuvq4Jd@*mny0^0*C5rE*I(D5Qv*Ih(zZgz(x5Fy2d zg&SZRWz2&}A^>5wI^$nQN?^6$PK}ks{SU7&bOWg+{8A-7iz5TpULh}Jm1Rn$O#S}_ D=|-(e literal 0 HcmV?d00001 diff --git a/structmrs__lib_1_1geometry_1_1radians-members.html b/structmrs__lib_1_1geometry_1_1radians-members.html new file mode 100644 index 00000000..3ff7ea86 --- /dev/null +++ b/structmrs__lib_1_1geometry_1_1radians-members.html @@ -0,0 +1,138 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +

    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    mrs_lib::geometry::radians Member List
    +
    +
    + +

    This is the complete list of members for mrs_lib::geometry::radians, including all inherited members.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    convert(const cyclic &what)mrs_lib::geometry::cyclic< double, radians >inlinestatic
    convert() constmrs_lib::geometry::cyclic< double, radians >inline
    cyclic()mrs_lib::geometry::cyclic< double, radians >inline
    cyclic(const double val)mrs_lib::geometry::cyclic< double, radians >inline
    cyclic(const cyclic &other)mrs_lib::geometry::cyclic< double, radians >inline
    cyclic(const radians &other)mrs_lib::geometry::cyclic< double, radians >inline
    diff(const double minuend, const double subtrahend)mrs_lib::geometry::cyclic< double, radians >inlinestatic
    diff(const cyclic minuend, const cyclic subtrahend) (defined in mrs_lib::geometry::cyclic< double, radians >)mrs_lib::geometry::cyclic< double, radians >inlinestatic
    dist(const double from, const double to)mrs_lib::geometry::cyclic< double, radians >inlinestatic
    dist(const cyclic from, const cyclic to) (defined in mrs_lib::geometry::cyclic< double, radians >)mrs_lib::geometry::cyclic< double, radians >inlinestatic
    half_rangemrs_lib::geometry::cyclic< double, radians >static
    inRange(const double val)mrs_lib::geometry::cyclic< double, radians >inlinestatic
    interp(const double from, const double to, const double coeff)mrs_lib::geometry::cyclic< double, radians >inlinestatic
    interp(const cyclic from, const cyclic to, const double coeff) (defined in mrs_lib::geometry::cyclic< double, radians >)mrs_lib::geometry::cyclic< double, radians >inlinestatic
    interpUnwrapped(const double from, const double to, const double coeff)mrs_lib::geometry::cyclic< double, radians >inlinestatic
    interpUnwrapped(const cyclic from, const cyclic to, const double coeff) (defined in mrs_lib::geometry::cyclic< double, radians >)mrs_lib::geometry::cyclic< double, radians >inlinestatic
    minimum (defined in mrs_lib::geometry::radians)mrs_lib::geometry::radiansstatic
    operator+=(const cyclic &other)mrs_lib::geometry::cyclic< double, radians >inline
    operator-=(const cyclic &other)mrs_lib::geometry::cyclic< double, radians >inline
    operator=(const double nval)mrs_lib::geometry::cyclic< double, radians >inline
    operator=(const cyclic &other)mrs_lib::geometry::cyclic< double, radians >inline
    operator=(cyclic &&other)mrs_lib::geometry::cyclic< double, radians >inline
    pdist(const double from, const double to)mrs_lib::geometry::cyclic< double, radians >inlinestatic
    pdist(const cyclic from, const cyclic to) (defined in mrs_lib::geometry::cyclic< double, radians >)mrs_lib::geometry::cyclic< double, radians >inlinestatic
    pinterp(const double from, const double to, const double coeff)mrs_lib::geometry::cyclic< double, radians >inlinestatic
    pinterp(const cyclic from, const cyclic to, const double coeff) (defined in mrs_lib::geometry::cyclic< double, radians >)mrs_lib::geometry::cyclic< double, radians >inlinestatic
    pinterpUnwrapped(const double from, const double to, const double coeff)mrs_lib::geometry::cyclic< double, radians >inlinestatic
    pinterpUnwrapped(const cyclic from, const cyclic to, const double coeff) (defined in mrs_lib::geometry::cyclic< double, radians >)mrs_lib::geometry::cyclic< double, radians >inlinestatic
    rangemrs_lib::geometry::cyclic< double, radians >static
    supremum (defined in mrs_lib::geometry::radians)mrs_lib::geometry::radiansstatic
    unwrap(const double what, const double from)mrs_lib::geometry::cyclic< double, radians >inlinestatic
    val (defined in mrs_lib::geometry::cyclic< double, radians >)mrs_lib::geometry::cyclic< double, radians >protected
    value() constmrs_lib::geometry::cyclic< double, radians >inline
    wrap(const double val)mrs_lib::geometry::cyclic< double, radians >inlinestatic
    +
    + + + + diff --git a/structmrs__lib_1_1geometry_1_1radians.html b/structmrs__lib_1_1geometry_1_1radians.html new file mode 100644 index 00000000..9292c1cc --- /dev/null +++ b/structmrs__lib_1_1geometry_1_1radians.html @@ -0,0 +1,262 @@ + + + + + + + +mrs_lib: mrs_lib::geometry::radians Struct Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    mrs_lib::geometry::radians Struct Reference
    +
    +
    + +

    Convenience specialization of the cyclic class for unsigned radians (from $0$ to $2\pi$). + More...

    + +

    #include <cyclic.h>

    +
    + + Inheritance diagram for mrs_lib::geometry::radians:
    +
    +
    + +
    + + Collaboration diagram for mrs_lib::geometry::radians:
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Static Public Attributes

    +static constexpr double minimum = 0
     
    +static constexpr double supremum = 2 * M_PI
     
    - Static Public Attributes inherited from mrs_lib::geometry::cyclic< double, radians >
    +static constexpr double minimum
     Minimum of the valid interval of wrapped values $ m $.
     
    +static constexpr double supremum
     Supremum of the valid interval of wrapped values $ s $.
     
    +static constexpr double range
     Range of the valid interval of wrapped values $ r $ (also the period of the cyclic quantity).
     
    +static constexpr double half_range
     Half of the range of the valid interval of wrapped values $ r/2 $ (used for some calculations).
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Additional Inherited Members

    - Public Member Functions inherited from mrs_lib::geometry::cyclic< double, radians >
     cyclic ()
     Default constructor. More...
     
     cyclic (const double val)
     Constructor overload. More...
     
     cyclic (const cyclic &other)
     Copy constructor. More...
     
     cyclic (const radians &other)
     Copy constructor. More...
     
    double value () const
     Getter for val. More...
     
    other_t convert () const
     Conversion between two different circular quantities. More...
     
    cyclicoperator= (const double nval)
     Assignment operator. More...
     
    cyclicoperator= (const cyclic &other)
     Assignment operator. More...
     
    cyclicoperator= (cyclic &&other)
     Move operator. More...
     
    cyclicoperator+= (const cyclic &other)
     Addition compound operator. More...
     
    cyclicoperator-= (const cyclic &other)
     Subtraction compound operator. More...
     
    - Static Public Member Functions inherited from mrs_lib::geometry::cyclic< double, radians >
    static bool inRange (const double val)
     Checks if val is within the valid interval of wrapped values. More...
     
    static double wrap (const double val)
     Returns val, converted to the valid interval of values. More...
     
    static double unwrap (const double what, const double from)
     Returns value of the parameter what modified so that there is no "jump" between from and \t what. More...
     
    static double pdist (const double from, const double to)
     Returns length of the shortest walk in the positive direction from the first parameter to the second one. More...
     
    +static double pdist (const cyclic from, const cyclic to)
     
    static double diff (const double minuend, const double subtrahend)
     Returns the difference between the two circular values. More...
     
    +static double diff (const cyclic minuend, const cyclic subtrahend)
     
    static double dist (const double from, const double to)
     Returns the distance between the two circular values. More...
     
    +static double dist (const cyclic from, const cyclic to)
     
    static double interpUnwrapped (const double from, const double to, const double coeff)
     Interpolation between two circular quantities without wrapping of the result. More...
     
    +static double interpUnwrapped (const cyclic from, const cyclic to, const double coeff)
     
    static double interp (const double from, const double to, const double coeff)
     Interpolation between two circular quantities. More...
     
    +static double interp (const cyclic from, const cyclic to, const double coeff)
     
    static double pinterpUnwrapped (const double from, const double to, const double coeff)
     Interpolation between two circular quantities in the positive direction without wrapping of the result. More...
     
    +static double pinterpUnwrapped (const cyclic from, const cyclic to, const double coeff)
     
    static double pinterp (const double from, const double to, const double coeff)
     Interpolation between two circular quantities in the positive direction. More...
     
    +static double pinterp (const cyclic from, const cyclic to, const double coeff)
     
    static other_t convert (const cyclic &what)
     Conversion between two different circular quantities. More...
     
    - Protected Attributes inherited from mrs_lib::geometry::cyclic< double, radians >
    +double val
     
    +

    Detailed Description

    +

    Convenience specialization of the cyclic class for unsigned radians (from $0$ to $2\pi$).

    +
    Examples
    geometry/cyclic_example.cpp.
    +
    +

    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/structmrs__lib_1_1geometry_1_1radians__coll__graph.map b/structmrs__lib_1_1geometry_1_1radians__coll__graph.map new file mode 100644 index 00000000..6a66dec7 --- /dev/null +++ b/structmrs__lib_1_1geometry_1_1radians__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1geometry_1_1radians__coll__graph.md5 b/structmrs__lib_1_1geometry_1_1radians__coll__graph.md5 new file mode 100644 index 00000000..9f1cae10 --- /dev/null +++ b/structmrs__lib_1_1geometry_1_1radians__coll__graph.md5 @@ -0,0 +1 @@ +461a7a6829dba785d161f3c0a460464d \ No newline at end of file diff --git a/structmrs__lib_1_1geometry_1_1radians__coll__graph.png b/structmrs__lib_1_1geometry_1_1radians__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..2d011a10bb40f4f1fa4e63edb105686046969541 GIT binary patch literal 5698 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 PDGWWhucch2XdUri`ory~ literal 0 HcmV?d00001 diff --git a/structmrs__lib_1_1geometry_1_1radians__inherit__graph.map b/structmrs__lib_1_1geometry_1_1radians__inherit__graph.map new file mode 100644 index 00000000..6a66dec7 --- /dev/null +++ b/structmrs__lib_1_1geometry_1_1radians__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1geometry_1_1radians__inherit__graph.md5 b/structmrs__lib_1_1geometry_1_1radians__inherit__graph.md5 new file mode 100644 index 00000000..9f1cae10 --- /dev/null +++ b/structmrs__lib_1_1geometry_1_1radians__inherit__graph.md5 @@ -0,0 +1 @@ +461a7a6829dba785d161f3c0a460464d \ No newline at end of file diff --git a/structmrs__lib_1_1geometry_1_1radians__inherit__graph.png b/structmrs__lib_1_1geometry_1_1radians__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..2d011a10bb40f4f1fa4e63edb105686046969541 GIT binary patch literal 5698 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 PDGWWhucch2XdUri`ory~ literal 0 HcmV?d00001 diff --git a/structmrs__lib_1_1geometry_1_1sdegrees-members.html b/structmrs__lib_1_1geometry_1_1sdegrees-members.html new file mode 100644 index 00000000..8a256a5e --- /dev/null +++ b/structmrs__lib_1_1geometry_1_1sdegrees-members.html @@ -0,0 +1,138 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    mrs_lib::geometry::sdegrees Member List
    +
    +
    + +

    This is the complete list of members for mrs_lib::geometry::sdegrees, including all inherited members.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    convert(const cyclic &what)mrs_lib::geometry::cyclic< double, sdegrees >inlinestatic
    convert() constmrs_lib::geometry::cyclic< double, sdegrees >inline
    cyclic()mrs_lib::geometry::cyclic< double, sdegrees >inline
    cyclic(const double val)mrs_lib::geometry::cyclic< double, sdegrees >inline
    cyclic(const cyclic &other)mrs_lib::geometry::cyclic< double, sdegrees >inline
    cyclic(const sdegrees &other)mrs_lib::geometry::cyclic< double, sdegrees >inline
    diff(const double minuend, const double subtrahend)mrs_lib::geometry::cyclic< double, sdegrees >inlinestatic
    diff(const cyclic minuend, const cyclic subtrahend) (defined in mrs_lib::geometry::cyclic< double, sdegrees >)mrs_lib::geometry::cyclic< double, sdegrees >inlinestatic
    dist(const double from, const double to)mrs_lib::geometry::cyclic< double, sdegrees >inlinestatic
    dist(const cyclic from, const cyclic to) (defined in mrs_lib::geometry::cyclic< double, sdegrees >)mrs_lib::geometry::cyclic< double, sdegrees >inlinestatic
    half_rangemrs_lib::geometry::cyclic< double, sdegrees >static
    inRange(const double val)mrs_lib::geometry::cyclic< double, sdegrees >inlinestatic
    interp(const double from, const double to, const double coeff)mrs_lib::geometry::cyclic< double, sdegrees >inlinestatic
    interp(const cyclic from, const cyclic to, const double coeff) (defined in mrs_lib::geometry::cyclic< double, sdegrees >)mrs_lib::geometry::cyclic< double, sdegrees >inlinestatic
    interpUnwrapped(const double from, const double to, const double coeff)mrs_lib::geometry::cyclic< double, sdegrees >inlinestatic
    interpUnwrapped(const cyclic from, const cyclic to, const double coeff) (defined in mrs_lib::geometry::cyclic< double, sdegrees >)mrs_lib::geometry::cyclic< double, sdegrees >inlinestatic
    minimum (defined in mrs_lib::geometry::sdegrees)mrs_lib::geometry::sdegreesstatic
    operator+=(const cyclic &other)mrs_lib::geometry::cyclic< double, sdegrees >inline
    operator-=(const cyclic &other)mrs_lib::geometry::cyclic< double, sdegrees >inline
    operator=(const double nval)mrs_lib::geometry::cyclic< double, sdegrees >inline
    operator=(const cyclic &other)mrs_lib::geometry::cyclic< double, sdegrees >inline
    operator=(cyclic &&other)mrs_lib::geometry::cyclic< double, sdegrees >inline
    pdist(const double from, const double to)mrs_lib::geometry::cyclic< double, sdegrees >inlinestatic
    pdist(const cyclic from, const cyclic to) (defined in mrs_lib::geometry::cyclic< double, sdegrees >)mrs_lib::geometry::cyclic< double, sdegrees >inlinestatic
    pinterp(const double from, const double to, const double coeff)mrs_lib::geometry::cyclic< double, sdegrees >inlinestatic
    pinterp(const cyclic from, const cyclic to, const double coeff) (defined in mrs_lib::geometry::cyclic< double, sdegrees >)mrs_lib::geometry::cyclic< double, sdegrees >inlinestatic
    pinterpUnwrapped(const double from, const double to, const double coeff)mrs_lib::geometry::cyclic< double, sdegrees >inlinestatic
    pinterpUnwrapped(const cyclic from, const cyclic to, const double coeff) (defined in mrs_lib::geometry::cyclic< double, sdegrees >)mrs_lib::geometry::cyclic< double, sdegrees >inlinestatic
    rangemrs_lib::geometry::cyclic< double, sdegrees >static
    supremum (defined in mrs_lib::geometry::sdegrees)mrs_lib::geometry::sdegreesstatic
    unwrap(const double what, const double from)mrs_lib::geometry::cyclic< double, sdegrees >inlinestatic
    val (defined in mrs_lib::geometry::cyclic< double, sdegrees >)mrs_lib::geometry::cyclic< double, sdegrees >protected
    value() constmrs_lib::geometry::cyclic< double, sdegrees >inline
    wrap(const double val)mrs_lib::geometry::cyclic< double, sdegrees >inlinestatic
    +
    + + + + diff --git a/structmrs__lib_1_1geometry_1_1sdegrees.html b/structmrs__lib_1_1geometry_1_1sdegrees.html new file mode 100644 index 00000000..e86c811f --- /dev/null +++ b/structmrs__lib_1_1geometry_1_1sdegrees.html @@ -0,0 +1,260 @@ + + + + + + + +mrs_lib: mrs_lib::geometry::sdegrees Struct Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    mrs_lib::geometry::sdegrees Struct Reference
    +
    +
    + +

    Convenience specialization of the cyclic class for signed degrees (from $-180$ to $180$). + More...

    + +

    #include <cyclic.h>

    +
    + + Inheritance diagram for mrs_lib::geometry::sdegrees:
    +
    +
    + +
    + + Collaboration diagram for mrs_lib::geometry::sdegrees:
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Static Public Attributes

    +static constexpr double minimum = -180
     
    +static constexpr double supremum = 180
     
    - Static Public Attributes inherited from mrs_lib::geometry::cyclic< double, sdegrees >
    +static constexpr double minimum
     Minimum of the valid interval of wrapped values $ m $.
     
    +static constexpr double supremum
     Supremum of the valid interval of wrapped values $ s $.
     
    +static constexpr double range
     Range of the valid interval of wrapped values $ r $ (also the period of the cyclic quantity).
     
    +static constexpr double half_range
     Half of the range of the valid interval of wrapped values $ r/2 $ (used for some calculations).
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Additional Inherited Members

    - Public Member Functions inherited from mrs_lib::geometry::cyclic< double, sdegrees >
     cyclic ()
     Default constructor. More...
     
     cyclic (const double val)
     Constructor overload. More...
     
     cyclic (const cyclic &other)
     Copy constructor. More...
     
     cyclic (const sdegrees &other)
     Copy constructor. More...
     
    double value () const
     Getter for val. More...
     
    other_t convert () const
     Conversion between two different circular quantities. More...
     
    cyclicoperator= (const double nval)
     Assignment operator. More...
     
    cyclicoperator= (const cyclic &other)
     Assignment operator. More...
     
    cyclicoperator= (cyclic &&other)
     Move operator. More...
     
    cyclicoperator+= (const cyclic &other)
     Addition compound operator. More...
     
    cyclicoperator-= (const cyclic &other)
     Subtraction compound operator. More...
     
    - Static Public Member Functions inherited from mrs_lib::geometry::cyclic< double, sdegrees >
    static bool inRange (const double val)
     Checks if val is within the valid interval of wrapped values. More...
     
    static double wrap (const double val)
     Returns val, converted to the valid interval of values. More...
     
    static double unwrap (const double what, const double from)
     Returns value of the parameter what modified so that there is no "jump" between from and \t what. More...
     
    static double pdist (const double from, const double to)
     Returns length of the shortest walk in the positive direction from the first parameter to the second one. More...
     
    +static double pdist (const cyclic from, const cyclic to)
     
    static double diff (const double minuend, const double subtrahend)
     Returns the difference between the two circular values. More...
     
    +static double diff (const cyclic minuend, const cyclic subtrahend)
     
    static double dist (const double from, const double to)
     Returns the distance between the two circular values. More...
     
    +static double dist (const cyclic from, const cyclic to)
     
    static double interpUnwrapped (const double from, const double to, const double coeff)
     Interpolation between two circular quantities without wrapping of the result. More...
     
    +static double interpUnwrapped (const cyclic from, const cyclic to, const double coeff)
     
    static double interp (const double from, const double to, const double coeff)
     Interpolation between two circular quantities. More...
     
    +static double interp (const cyclic from, const cyclic to, const double coeff)
     
    static double pinterpUnwrapped (const double from, const double to, const double coeff)
     Interpolation between two circular quantities in the positive direction without wrapping of the result. More...
     
    +static double pinterpUnwrapped (const cyclic from, const cyclic to, const double coeff)
     
    static double pinterp (const double from, const double to, const double coeff)
     Interpolation between two circular quantities in the positive direction. More...
     
    +static double pinterp (const cyclic from, const cyclic to, const double coeff)
     
    static other_t convert (const cyclic &what)
     Conversion between two different circular quantities. More...
     
    - Protected Attributes inherited from mrs_lib::geometry::cyclic< double, sdegrees >
    +double val
     
    +

    Detailed Description

    +

    Convenience specialization of the cyclic class for signed degrees (from $-180$ to $180$).

    +

    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/structmrs__lib_1_1geometry_1_1sdegrees__coll__graph.map b/structmrs__lib_1_1geometry_1_1sdegrees__coll__graph.map new file mode 100644 index 00000000..08feefa4 --- /dev/null +++ b/structmrs__lib_1_1geometry_1_1sdegrees__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1geometry_1_1sdegrees__coll__graph.md5 b/structmrs__lib_1_1geometry_1_1sdegrees__coll__graph.md5 new file mode 100644 index 00000000..6edc85f6 --- /dev/null +++ b/structmrs__lib_1_1geometry_1_1sdegrees__coll__graph.md5 @@ -0,0 +1 @@ +69f5bcb801b87cbbb5f73c549300da1e \ No newline at end of file diff --git a/structmrs__lib_1_1geometry_1_1sdegrees__coll__graph.png b/structmrs__lib_1_1geometry_1_1sdegrees__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..e94b87daed0e6fdbd326ee96c4d6d03bc7c74157 GIT binary patch literal 6199 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 Cz4lfB literal 0 HcmV?d00001 diff --git a/structmrs__lib_1_1geometry_1_1sdegrees__inherit__graph.map b/structmrs__lib_1_1geometry_1_1sdegrees__inherit__graph.map new file mode 100644 index 00000000..08feefa4 --- /dev/null +++ b/structmrs__lib_1_1geometry_1_1sdegrees__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1geometry_1_1sdegrees__inherit__graph.md5 b/structmrs__lib_1_1geometry_1_1sdegrees__inherit__graph.md5 new file mode 100644 index 00000000..6edc85f6 --- /dev/null +++ b/structmrs__lib_1_1geometry_1_1sdegrees__inherit__graph.md5 @@ -0,0 +1 @@ +69f5bcb801b87cbbb5f73c549300da1e \ No newline at end of file diff --git a/structmrs__lib_1_1geometry_1_1sdegrees__inherit__graph.png b/structmrs__lib_1_1geometry_1_1sdegrees__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..e94b87daed0e6fdbd326ee96c4d6d03bc7c74157 GIT binary patch literal 6199 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 Cz4lfB literal 0 HcmV?d00001 diff --git a/structmrs__lib_1_1geometry_1_1sradians-members.html b/structmrs__lib_1_1geometry_1_1sradians-members.html new file mode 100644 index 00000000..6114912c --- /dev/null +++ b/structmrs__lib_1_1geometry_1_1sradians-members.html @@ -0,0 +1,138 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    mrs_lib::geometry::sradians Member List
    +
    +
    + +

    This is the complete list of members for mrs_lib::geometry::sradians, including all inherited members.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    convert(const cyclic &what)mrs_lib::geometry::cyclic< double, sradians >inlinestatic
    convert() constmrs_lib::geometry::cyclic< double, sradians >inline
    cyclic()mrs_lib::geometry::cyclic< double, sradians >inline
    cyclic(const double val)mrs_lib::geometry::cyclic< double, sradians >inline
    cyclic(const cyclic &other)mrs_lib::geometry::cyclic< double, sradians >inline
    cyclic(const sradians &other)mrs_lib::geometry::cyclic< double, sradians >inline
    diff(const double minuend, const double subtrahend)mrs_lib::geometry::cyclic< double, sradians >inlinestatic
    diff(const cyclic minuend, const cyclic subtrahend) (defined in mrs_lib::geometry::cyclic< double, sradians >)mrs_lib::geometry::cyclic< double, sradians >inlinestatic
    dist(const double from, const double to)mrs_lib::geometry::cyclic< double, sradians >inlinestatic
    dist(const cyclic from, const cyclic to) (defined in mrs_lib::geometry::cyclic< double, sradians >)mrs_lib::geometry::cyclic< double, sradians >inlinestatic
    half_rangemrs_lib::geometry::cyclic< double, sradians >static
    inRange(const double val)mrs_lib::geometry::cyclic< double, sradians >inlinestatic
    interp(const double from, const double to, const double coeff)mrs_lib::geometry::cyclic< double, sradians >inlinestatic
    interp(const cyclic from, const cyclic to, const double coeff) (defined in mrs_lib::geometry::cyclic< double, sradians >)mrs_lib::geometry::cyclic< double, sradians >inlinestatic
    interpUnwrapped(const double from, const double to, const double coeff)mrs_lib::geometry::cyclic< double, sradians >inlinestatic
    interpUnwrapped(const cyclic from, const cyclic to, const double coeff) (defined in mrs_lib::geometry::cyclic< double, sradians >)mrs_lib::geometry::cyclic< double, sradians >inlinestatic
    minimum (defined in mrs_lib::geometry::sradians)mrs_lib::geometry::sradiansstatic
    operator+=(const cyclic &other)mrs_lib::geometry::cyclic< double, sradians >inline
    operator-=(const cyclic &other)mrs_lib::geometry::cyclic< double, sradians >inline
    operator=(const double nval)mrs_lib::geometry::cyclic< double, sradians >inline
    operator=(const cyclic &other)mrs_lib::geometry::cyclic< double, sradians >inline
    operator=(cyclic &&other)mrs_lib::geometry::cyclic< double, sradians >inline
    pdist(const double from, const double to)mrs_lib::geometry::cyclic< double, sradians >inlinestatic
    pdist(const cyclic from, const cyclic to) (defined in mrs_lib::geometry::cyclic< double, sradians >)mrs_lib::geometry::cyclic< double, sradians >inlinestatic
    pinterp(const double from, const double to, const double coeff)mrs_lib::geometry::cyclic< double, sradians >inlinestatic
    pinterp(const cyclic from, const cyclic to, const double coeff) (defined in mrs_lib::geometry::cyclic< double, sradians >)mrs_lib::geometry::cyclic< double, sradians >inlinestatic
    pinterpUnwrapped(const double from, const double to, const double coeff)mrs_lib::geometry::cyclic< double, sradians >inlinestatic
    pinterpUnwrapped(const cyclic from, const cyclic to, const double coeff) (defined in mrs_lib::geometry::cyclic< double, sradians >)mrs_lib::geometry::cyclic< double, sradians >inlinestatic
    rangemrs_lib::geometry::cyclic< double, sradians >static
    supremum (defined in mrs_lib::geometry::sradians)mrs_lib::geometry::sradiansstatic
    unwrap(const double what, const double from)mrs_lib::geometry::cyclic< double, sradians >inlinestatic
    val (defined in mrs_lib::geometry::cyclic< double, sradians >)mrs_lib::geometry::cyclic< double, sradians >protected
    value() constmrs_lib::geometry::cyclic< double, sradians >inline
    wrap(const double val)mrs_lib::geometry::cyclic< double, sradians >inlinestatic
    +
    + + + + diff --git a/structmrs__lib_1_1geometry_1_1sradians.html b/structmrs__lib_1_1geometry_1_1sradians.html new file mode 100644 index 00000000..93b38536 --- /dev/null +++ b/structmrs__lib_1_1geometry_1_1sradians.html @@ -0,0 +1,262 @@ + + + + + + + +mrs_lib: mrs_lib::geometry::sradians Struct Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    mrs_lib::geometry::sradians Struct Reference
    +
    +
    + +

    Convenience specialization of the cyclic class for signed radians (from $-\pi$ to $\pi$). + More...

    + +

    #include <cyclic.h>

    +
    + + Inheritance diagram for mrs_lib::geometry::sradians:
    +
    +
    + +
    + + Collaboration diagram for mrs_lib::geometry::sradians:
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Static Public Attributes

    +static constexpr double minimum = -M_PI
     
    +static constexpr double supremum = M_PI
     
    - Static Public Attributes inherited from mrs_lib::geometry::cyclic< double, sradians >
    +static constexpr double minimum
     Minimum of the valid interval of wrapped values $ m $.
     
    +static constexpr double supremum
     Supremum of the valid interval of wrapped values $ s $.
     
    +static constexpr double range
     Range of the valid interval of wrapped values $ r $ (also the period of the cyclic quantity).
     
    +static constexpr double half_range
     Half of the range of the valid interval of wrapped values $ r/2 $ (used for some calculations).
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Additional Inherited Members

    - Public Member Functions inherited from mrs_lib::geometry::cyclic< double, sradians >
     cyclic ()
     Default constructor. More...
     
     cyclic (const double val)
     Constructor overload. More...
     
     cyclic (const cyclic &other)
     Copy constructor. More...
     
     cyclic (const sradians &other)
     Copy constructor. More...
     
    double value () const
     Getter for val. More...
     
    other_t convert () const
     Conversion between two different circular quantities. More...
     
    cyclicoperator= (const double nval)
     Assignment operator. More...
     
    cyclicoperator= (const cyclic &other)
     Assignment operator. More...
     
    cyclicoperator= (cyclic &&other)
     Move operator. More...
     
    cyclicoperator+= (const cyclic &other)
     Addition compound operator. More...
     
    cyclicoperator-= (const cyclic &other)
     Subtraction compound operator. More...
     
    - Static Public Member Functions inherited from mrs_lib::geometry::cyclic< double, sradians >
    static bool inRange (const double val)
     Checks if val is within the valid interval of wrapped values. More...
     
    static double wrap (const double val)
     Returns val, converted to the valid interval of values. More...
     
    static double unwrap (const double what, const double from)
     Returns value of the parameter what modified so that there is no "jump" between from and \t what. More...
     
    static double pdist (const double from, const double to)
     Returns length of the shortest walk in the positive direction from the first parameter to the second one. More...
     
    +static double pdist (const cyclic from, const cyclic to)
     
    static double diff (const double minuend, const double subtrahend)
     Returns the difference between the two circular values. More...
     
    +static double diff (const cyclic minuend, const cyclic subtrahend)
     
    static double dist (const double from, const double to)
     Returns the distance between the two circular values. More...
     
    +static double dist (const cyclic from, const cyclic to)
     
    static double interpUnwrapped (const double from, const double to, const double coeff)
     Interpolation between two circular quantities without wrapping of the result. More...
     
    +static double interpUnwrapped (const cyclic from, const cyclic to, const double coeff)
     
    static double interp (const double from, const double to, const double coeff)
     Interpolation between two circular quantities. More...
     
    +static double interp (const cyclic from, const cyclic to, const double coeff)
     
    static double pinterpUnwrapped (const double from, const double to, const double coeff)
     Interpolation between two circular quantities in the positive direction without wrapping of the result. More...
     
    +static double pinterpUnwrapped (const cyclic from, const cyclic to, const double coeff)
     
    static double pinterp (const double from, const double to, const double coeff)
     Interpolation between two circular quantities in the positive direction. More...
     
    +static double pinterp (const cyclic from, const cyclic to, const double coeff)
     
    static other_t convert (const cyclic &what)
     Conversion between two different circular quantities. More...
     
    - Protected Attributes inherited from mrs_lib::geometry::cyclic< double, sradians >
    +double val
     
    +

    Detailed Description

    +

    Convenience specialization of the cyclic class for signed radians (from $-\pi$ to $\pi$).

    +
    Examples
    geometry/cyclic_example.cpp.
    +
    +

    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/structmrs__lib_1_1geometry_1_1sradians__coll__graph.map b/structmrs__lib_1_1geometry_1_1sradians__coll__graph.map new file mode 100644 index 00000000..8b08057f --- /dev/null +++ b/structmrs__lib_1_1geometry_1_1sradians__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1geometry_1_1sradians__coll__graph.md5 b/structmrs__lib_1_1geometry_1_1sradians__coll__graph.md5 new file mode 100644 index 00000000..eb5e336f --- /dev/null +++ b/structmrs__lib_1_1geometry_1_1sradians__coll__graph.md5 @@ -0,0 +1 @@ +fde4a2604bda82e0f997e8f3cfaf9404 \ No newline at end of file diff --git a/structmrs__lib_1_1geometry_1_1sradians__coll__graph.png b/structmrs__lib_1_1geometry_1_1sradians__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..cd1a623dba7068d7963b0912bb06d13266b3cd2b GIT binary patch literal 6292 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%0DDz!K0?RL%$!|UN0ufCi`{|FUup=hw>a-CZf}1D z7d0_4F#wB0xm-F@(g4=inTv=Fk-1yrzR0ejp)loZWZ5k9NIbg+I3E{?d9Q;m?4si0 zF2HhzW@cFO^73vT9*iO)x)rLxxBPWmA=up9lmw;^xPM+j!61Ods6+!3@1c{97cgl4 zKxqO{<+GaN)X~*t0tJU0ECtgK-Uz~Ob)F_HgAYgTI42jEp{;F{`|-N{2p1REk3c+% zgRR1>?!SNOfaTMvGC=$GhMi8#;|t*9xfW+Ufb;UqYMjyU=kgu(+`L9RW zs+gvZxR2|A(qcj;CMOxh#ApEnw;hksI)x1hLaOTOR&Q+$3?NV_^ki#X-bNP&EB^p2 z4h{0|?CeaZ)rAWP6ZLoRLK&bz2HO+GKqV;z_nO<+sq@wBq*^!|> zFlrEAi}8YbOI;9ikdl&aZf|!32|0^gT!bt-ljyvAho)u=9IunTy~VLx>c|U-N~S0k z%8P-fu{+&<3;tj^!}YI4?Pu39Sgd?V!Ol60F+990na{YBvL}V#yvk&N2@)Qzc<%!}sXA+};V4db5uv-79kYNpnl z2$Xw!XXn?Uk^M~ zL%X}b0C!#GxbZ3+hyjtEqA*(($mVn)@J^t^?VCC z0|Ue6LWcx8I=bE6?dQ#%9SjKY=n=rq8m|o|6crWu*4FY%OG`K10L19i*8dzR0T%Nh zROSLi0imEh8&Iw{9jHX0LHs8sG@Dvl2IrrDvH-c}Ufj z;Ttbdouk=9R#a3F0u%eA#&l?LV`Dn!vrq!_Nr?yDkpvYL)#&78Ajk}X*Ncvh9$n&j zrfL|@z{N!XEZM>7DKNgYCDW|0?d|!@ex~NzE!g^8>6X2(FBvzc6tE<7*`4ugY7z#0 zjV&%N?$B7;T6>?ArE_9}3?!1fd_uUXCuMoWoe0FMm89tP^>v*_n+!SQP0oeS=NUl% zJpaCKqw9KjvZWDDFF^-7E0r+tAba(fgXV4acaIy>v<3|qyyQ<0Gf=rILex@8RTWlS zCZ$f*yER^D4@JVmu~pZbA@%RW&rg!QQRGt=`>Md7N72-vF32 z98TtIa@-)K6Ls?iVSpisBM**_mLsx?fSMryzC+*VMgW8ugxcELtE;PvKw&!Yv;(im z`0^#Sjg8IduU|{zl@`|4GB!5cxw*NhY~%XhbO#nhMqa)L$D20E;^Jtf{I)~V$zP^v)SB#8pW2x_UeMCg;?oG?YZRz- z{RpE#gGk(6^MmB_V1PBN6I>Sq3t#Q>m{#^iAVm;H9YjP=2+-sj>DqzP=I-w9g-NC- zf==t|0Z&Z{xRO@0L|h562_H!s8Zv+|?mpy0AedA3eo)@B zl$GV>fdK)~!bEU^cu~t`j{n?GZZ0~FptYo?CYh+1n4yWum-u+H>kWxJw1XCt#kHX% z5T4HAwVPT%9ldUxWv*qMoqiW!IS)~TRH=(HAT;#;$?2*6{$DY$W}7=-Gz?ycRRyox z%MIKi;)%V=ycO2LUn%kg+lc}*zkeHoP-3Ra5Tm4|1jPU#kpjb(o-jM literal 0 HcmV?d00001 diff --git a/structmrs__lib_1_1geometry_1_1sradians__inherit__graph.map b/structmrs__lib_1_1geometry_1_1sradians__inherit__graph.map new file mode 100644 index 00000000..8b08057f --- /dev/null +++ b/structmrs__lib_1_1geometry_1_1sradians__inherit__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structmrs__lib_1_1geometry_1_1sradians__inherit__graph.md5 b/structmrs__lib_1_1geometry_1_1sradians__inherit__graph.md5 new file mode 100644 index 00000000..eb5e336f --- /dev/null +++ b/structmrs__lib_1_1geometry_1_1sradians__inherit__graph.md5 @@ -0,0 +1 @@ +fde4a2604bda82e0f997e8f3cfaf9404 \ No newline at end of file diff --git a/structmrs__lib_1_1geometry_1_1sradians__inherit__graph.png b/structmrs__lib_1_1geometry_1_1sradians__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..cd1a623dba7068d7963b0912bb06d13266b3cd2b GIT binary patch literal 6292 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%0DDz!K0?RL%$!|UN0ufCi`{|FUup=hw>a-CZf}1D z7d0_4F#wB0xm-F@(g4=inTv=Fk-1yrzR0ejp)loZWZ5k9NIbg+I3E{?d9Q;m?4si0 zF2HhzW@cFO^73vT9*iO)x)rLxxBPWmA=up9lmw;^xPM+j!61Ods6+!3@1c{97cgl4 zKxqO{<+GaN)X~*t0tJU0ECtgK-Uz~Ob)F_HgAYgTI42jEp{;F{`|-N{2p1REk3c+% zgRR1>?!SNOfaTMvGC=$GhMi8#;|t*9xfW+Ufb;UqYMjyU=kgu(+`L9RW zs+gvZxR2|A(qcj;CMOxh#ApEnw;hksI)x1hLaOTOR&Q+$3?NV_^ki#X-bNP&EB^p2 z4h{0|?CeaZ)rAWP6ZLoRLK&bz2HO+GKqV;z_nO<+sq@wBq*^!|> zFlrEAi}8YbOI;9ikdl&aZf|!32|0^gT!bt-ljyvAho)u=9IunTy~VLx>c|U-N~S0k z%8P-fu{+&<3;tj^!}YI4?Pu39Sgd?V!Ol60F+990na{YBvL}V#yvk&N2@)Qzc<%!}sXA+};V4db5uv-79kYNpnl z2$Xw!XXn?Uk^M~ zL%X}b0C!#GxbZ3+hyjtEqA*(($mVn)@J^t^?VCC z0|Ue6LWcx8I=bE6?dQ#%9SjKY=n=rq8m|o|6crWu*4FY%OG`K10L19i*8dzR0T%Nh zROSLi0imEh8&Iw{9jHX0LHs8sG@Dvl2IrrDvH-c}Ufj z;Ttbdouk=9R#a3F0u%eA#&l?LV`Dn!vrq!_Nr?yDkpvYL)#&78Ajk}X*Ncvh9$n&j zrfL|@z{N!XEZM>7DKNgYCDW|0?d|!@ex~NzE!g^8>6X2(FBvzc6tE<7*`4ugY7z#0 zjV&%N?$B7;T6>?ArE_9}3?!1fd_uUXCuMoWoe0FMm89tP^>v*_n+!SQP0oeS=NUl% zJpaCKqw9KjvZWDDFF^-7E0r+tAba(fgXV4acaIy>v<3|qyyQ<0Gf=rILex@8RTWlS zCZ$f*yER^D4@JVmu~pZbA@%RW&rg!QQRGt=`>Md7N72-vF32 z98TtIa@-)K6Ls?iVSpisBM**_mLsx?fSMryzC+*VMgW8ugxcELtE;PvKw&!Yv;(im z`0^#Sjg8IduU|{zl@`|4GB!5cxw*NhY~%XhbO#nhMqa)L$D20E;^Jtf{I)~V$zP^v)SB#8pW2x_UeMCg;?oG?YZRz- z{RpE#gGk(6^MmB_V1PBN6I>Sq3t#Q>m{#^iAVm;H9YjP=2+-sj>DqzP=I-w9g-NC- zf==t|0Z&Z{xRO@0L|h562_H!s8Zv+|?mpy0AedA3eo)@B zl$GV>fdK)~!bEU^cu~t`j{n?GZZ0~FptYo?CYh+1n4yWum-u+H>kWxJw1XCt#kHX% z5T4HAwVPT%9ldUxWv*qMoqiW!IS)~TRH=(HAT;#;$?2*6{$DY$W}7=-Gz?ycRRyox z%MIKi;)%V=ycO2LUn%kg+lc}*zkeHoP-3Ra5Tm4|1jPU#kpjb(o-jM literal 0 HcmV?d00001 diff --git a/structmrs__lib_1_1quadratic__throttle__model_1_1MotorParams__t-members.html b/structmrs__lib_1_1quadratic__throttle__model_1_1MotorParams__t-members.html new file mode 100644 index 00000000..eb681062 --- /dev/null +++ b/structmrs__lib_1_1quadratic__throttle__model_1_1MotorParams__t-members.html @@ -0,0 +1,107 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    mrs_lib::quadratic_throttle_model::MotorParams_t Member List
    +
    + +
    + + + + diff --git a/structmrs__lib_1_1quadratic__throttle__model_1_1MotorParams__t.html b/structmrs__lib_1_1quadratic__throttle__model_1_1MotorParams__t.html new file mode 100644 index 00000000..5902ec7d --- /dev/null +++ b/structmrs__lib_1_1quadratic__throttle__model_1_1MotorParams__t.html @@ -0,0 +1,121 @@ + + + + + + + +mrs_lib: mrs_lib::quadratic_throttle_model::MotorParams_t Struct Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    mrs_lib::quadratic_throttle_model::MotorParams_t Struct Reference
    +
    +
    + + + + + + + + +

    +Public Attributes

    +double A
     
    +double B
     
    +int n_motors
     
    +
    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/structmrs__lib_1_1quadratic__throttle__model_1_1MotorParams__t.js b/structmrs__lib_1_1quadratic__throttle__model_1_1MotorParams__t.js new file mode 100644 index 00000000..60e81349 --- /dev/null +++ b/structmrs__lib_1_1quadratic__throttle__model_1_1MotorParams__t.js @@ -0,0 +1,6 @@ +var structmrs__lib_1_1quadratic__throttle__model_1_1MotorParams__t = +[ + [ "A", "structmrs__lib_1_1quadratic__throttle__model_1_1MotorParams__t.html#aeed28b8e587ddfda609cf66935c7267e", null ], + [ "B", "structmrs__lib_1_1quadratic__throttle__model_1_1MotorParams__t.html#ac94138c9d8fc8a364941024bbc7650b3", null ], + [ "n_motors", "structmrs__lib_1_1quadratic__throttle__model_1_1MotorParams__t.html#a8ed1e7a5a1c5acca1444d3de59cb83e6", null ] +]; \ No newline at end of file diff --git a/structobj__t-members.html b/structobj__t-members.html new file mode 100644 index 00000000..5319415f --- /dev/null +++ b/structobj__t-members.html @@ -0,0 +1,124 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    obj_t Member List
    +
    +
    + +

    This is the complete list of members for obj_t, including all inherited members.

    + + + + + + + + + + + + + + + + + + + + + +
    avg_dt_err_s (defined in obj_t)obj_t
    callback(const ros::Time &last_update) (defined in obj_t)obj_tinline
    callback(const ros::TimerEvent &evt) (defined in obj_t)obj_tinline
    cbk_not_running (defined in obj_t)obj_t
    cbk_running (defined in obj_t)obj_t
    cbk_running (defined in obj_t)obj_t
    cbk_running_mtx (defined in obj_t)obj_t
    cbks_in_time (defined in obj_t)obj_t
    cbks_ok (defined in obj_t)obj_t
    check_dt_err (defined in obj_t)obj_t
    desired_dt (defined in obj_t)obj_t
    max_dt_err_s (defined in obj_t)obj_t
    max_expected_dt_err_s (defined in obj_t)obj_t
    mtx (defined in obj_t)obj_t
    n_cbks (defined in obj_t)obj_t
    null_cbk (defined in obj_t)obj_t
    obj_t(const ros::Duration &desired_dt, const ros::Duration &max_expected_dt_err) (defined in obj_t)obj_tinline
    r (defined in obj_t)obj_t
    set_timeout_id(mrs_lib::TimeoutManager::timeout_id_t new_timeout_id) (defined in obj_t)obj_tinline
    timeout_id (defined in obj_t)obj_t
    +
    + + + + diff --git a/structobj__t.html b/structobj__t.html new file mode 100644 index 00000000..2f839246 --- /dev/null +++ b/structobj__t.html @@ -0,0 +1,176 @@ + + + + + + + +mrs_lib: obj_t Struct Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    obj_t Struct Reference
    +
    +
    + + + + + + + + + + +

    +Public Member Functions

    obj_t (const ros::Duration &desired_dt, const ros::Duration &max_expected_dt_err)
     
    +void set_timeout_id (mrs_lib::TimeoutManager::timeout_id_t new_timeout_id)
     
    +void callback (const ros::Time &last_update)
     
    +void callback (const ros::TimerEvent &evt)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Attributes

    +std::mutex mtx
     
    +int n_cbks = 0
     
    +bool null_cbk = false
     
    +bool cbk_not_running = false
     
    +std::atomic_bool cbk_running = false
     
    +double max_dt_err_s = 0.0
     
    +double avg_dt_err_s = 0.0
     
    +bool check_dt_err = false
     
    +ros::Duration desired_dt
     
    +double max_expected_dt_err_s
     
    +mrs_lib::TimeoutManager::timeout_id_t timeout_id
     
    +ros::Rate r = ros::Rate(50.0)
     
    +bool cbks_in_time = true
     
    +bool cbks_ok = true
     
    +std::mutex cbk_running_mtx
     
    +std::atomic< bool > cbk_running = false
     
    +
    The documentation for this struct was generated from the following file:
      +
    • test/timeout_manager/test.cpp
    • +
    +
    +
    + + + + diff --git a/structobj__t.js b/structobj__t.js new file mode 100644 index 00000000..339b846f --- /dev/null +++ b/structobj__t.js @@ -0,0 +1,23 @@ +var structobj__t = +[ + [ "obj_t", "structobj__t.html#ae665f687754e0c21a9481f731b1140c0", null ], + [ "callback", "structobj__t.html#a5e0225095a080c24d639ac69bd76e642", null ], + [ "callback", "structobj__t.html#a7bc5903a6c67f5357c9165f02397516b", null ], + [ "set_timeout_id", "structobj__t.html#a739d7a31c4aaec46e6e833e9c635b28a", null ], + [ "avg_dt_err_s", "structobj__t.html#aad0d6cd5b788d2219466acce5902e812", null ], + [ "cbk_not_running", "structobj__t.html#aa3df20c1db5a58e9863ce7d0c57b9c47", null ], + [ "cbk_running", "structobj__t.html#a95c61d5d1b2e290294535388eed67883", null ], + [ "cbk_running", "structobj__t.html#a7d8d04844773296d3e1fc0936d4e6977", null ], + [ "cbk_running_mtx", "structobj__t.html#aae522b83048c71a51a47f120e5d295dc", null ], + [ "cbks_in_time", "structobj__t.html#a3b618588ff7cf0efa10bcc5b87266247", null ], + [ "cbks_ok", "structobj__t.html#aa62bb73d1d20b1e47d25efff2a402169", null ], + [ "check_dt_err", "structobj__t.html#a24d261ceae096dbead4a249d52fb195e", null ], + [ "desired_dt", "structobj__t.html#a1a2aeae5f8bdde7f65acfd4a0054d134", null ], + [ "max_dt_err_s", "structobj__t.html#aa6d9ee19be6d6b18ddeae5785d6bc12a", null ], + [ "max_expected_dt_err_s", "structobj__t.html#aa928cfe75f9cd52c96137bc0b736bff0", null ], + [ "mtx", "structobj__t.html#ac07a0989a31d1815bb24b51c0901f2b4", null ], + [ "n_cbks", "structobj__t.html#ad379d320a4bf80fb874492fa96f80e09", null ], + [ "null_cbk", "structobj__t.html#a851f76bd033dd4b3799b151ec4bda0fc", null ], + [ "r", "structobj__t.html#a0250294ebf35cd4c6347fd1194c69df2", null ], + [ "timeout_id", "structobj__t.html#aee3cfe702d12b3e2d7c64e93a1d4eca9", null ] +]; \ No newline at end of file diff --git a/structstd_1_1tuple__element_3_010_00_01mrs__lib_1_1AttitudeConverter_01_4-members.html b/structstd_1_1tuple__element_3_010_00_01mrs__lib_1_1AttitudeConverter_01_4-members.html new file mode 100644 index 00000000..5bc5685a --- /dev/null +++ b/structstd_1_1tuple__element_3_010_00_01mrs__lib_1_1AttitudeConverter_01_4-members.html @@ -0,0 +1,105 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    std::tuple_element< 0, mrs_lib::AttitudeConverter > Member List
    +
    +
    + +

    This is the complete list of members for std::tuple_element< 0, mrs_lib::AttitudeConverter >, including all inherited members.

    + + +
    type typedef (defined in std::tuple_element< 0, mrs_lib::AttitudeConverter >)std::tuple_element< 0, mrs_lib::AttitudeConverter >
    +
    + + + + diff --git a/structstd_1_1tuple__element_3_010_00_01mrs__lib_1_1AttitudeConverter_01_4.html b/structstd_1_1tuple__element_3_010_00_01mrs__lib_1_1AttitudeConverter_01_4.html new file mode 100644 index 00000000..4901d4e6 --- /dev/null +++ b/structstd_1_1tuple__element_3_010_00_01mrs__lib_1_1AttitudeConverter_01_4.html @@ -0,0 +1,115 @@ + + + + + + + +mrs_lib: std::tuple_element< 0, mrs_lib::AttitudeConverter > Struct Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    std::tuple_element< 0, mrs_lib::AttitudeConverter > Struct Reference
    +
    +
    + + + + +

    +Public Types

    +using type = double
     
    +
    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/structstd_1_1tuple__element_3_010_00_01mrs__lib_1_1AttitudeConverter_01_4.js b/structstd_1_1tuple__element_3_010_00_01mrs__lib_1_1AttitudeConverter_01_4.js new file mode 100644 index 00000000..653e810d --- /dev/null +++ b/structstd_1_1tuple__element_3_010_00_01mrs__lib_1_1AttitudeConverter_01_4.js @@ -0,0 +1,4 @@ +var structstd_1_1tuple__element_3_010_00_01mrs__lib_1_1AttitudeConverter_01_4 = +[ + [ "type", "structstd_1_1tuple__element_3_010_00_01mrs__lib_1_1AttitudeConverter_01_4.html#a3387de57fff88b3f8e5758b4c969cdcb", null ] +]; \ No newline at end of file diff --git a/structstd_1_1tuple__element_3_011_00_01mrs__lib_1_1AttitudeConverter_01_4-members.html b/structstd_1_1tuple__element_3_011_00_01mrs__lib_1_1AttitudeConverter_01_4-members.html new file mode 100644 index 00000000..effb843f --- /dev/null +++ b/structstd_1_1tuple__element_3_011_00_01mrs__lib_1_1AttitudeConverter_01_4-members.html @@ -0,0 +1,105 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    std::tuple_element< 1, mrs_lib::AttitudeConverter > Member List
    +
    +
    + +

    This is the complete list of members for std::tuple_element< 1, mrs_lib::AttitudeConverter >, including all inherited members.

    + + +
    type typedef (defined in std::tuple_element< 1, mrs_lib::AttitudeConverter >)std::tuple_element< 1, mrs_lib::AttitudeConverter >
    +
    + + + + diff --git a/structstd_1_1tuple__element_3_011_00_01mrs__lib_1_1AttitudeConverter_01_4.html b/structstd_1_1tuple__element_3_011_00_01mrs__lib_1_1AttitudeConverter_01_4.html new file mode 100644 index 00000000..0a3daa04 --- /dev/null +++ b/structstd_1_1tuple__element_3_011_00_01mrs__lib_1_1AttitudeConverter_01_4.html @@ -0,0 +1,115 @@ + + + + + + + +mrs_lib: std::tuple_element< 1, mrs_lib::AttitudeConverter > Struct Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    std::tuple_element< 1, mrs_lib::AttitudeConverter > Struct Reference
    +
    +
    + + + + +

    +Public Types

    +using type = double
     
    +
    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/structstd_1_1tuple__element_3_011_00_01mrs__lib_1_1AttitudeConverter_01_4.js b/structstd_1_1tuple__element_3_011_00_01mrs__lib_1_1AttitudeConverter_01_4.js new file mode 100644 index 00000000..bd4465e1 --- /dev/null +++ b/structstd_1_1tuple__element_3_011_00_01mrs__lib_1_1AttitudeConverter_01_4.js @@ -0,0 +1,4 @@ +var structstd_1_1tuple__element_3_011_00_01mrs__lib_1_1AttitudeConverter_01_4 = +[ + [ "type", "structstd_1_1tuple__element_3_011_00_01mrs__lib_1_1AttitudeConverter_01_4.html#a1780696fccc9e4639b3272e9837076b0", null ] +]; \ No newline at end of file diff --git a/structstd_1_1tuple__element_3_012_00_01mrs__lib_1_1AttitudeConverter_01_4-members.html b/structstd_1_1tuple__element_3_012_00_01mrs__lib_1_1AttitudeConverter_01_4-members.html new file mode 100644 index 00000000..b61e6b67 --- /dev/null +++ b/structstd_1_1tuple__element_3_012_00_01mrs__lib_1_1AttitudeConverter_01_4-members.html @@ -0,0 +1,105 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    std::tuple_element< 2, mrs_lib::AttitudeConverter > Member List
    +
    +
    + +

    This is the complete list of members for std::tuple_element< 2, mrs_lib::AttitudeConverter >, including all inherited members.

    + + +
    type typedef (defined in std::tuple_element< 2, mrs_lib::AttitudeConverter >)std::tuple_element< 2, mrs_lib::AttitudeConverter >
    +
    + + + + diff --git a/structstd_1_1tuple__element_3_012_00_01mrs__lib_1_1AttitudeConverter_01_4.html b/structstd_1_1tuple__element_3_012_00_01mrs__lib_1_1AttitudeConverter_01_4.html new file mode 100644 index 00000000..186a6c4f --- /dev/null +++ b/structstd_1_1tuple__element_3_012_00_01mrs__lib_1_1AttitudeConverter_01_4.html @@ -0,0 +1,115 @@ + + + + + + + +mrs_lib: std::tuple_element< 2, mrs_lib::AttitudeConverter > Struct Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    std::tuple_element< 2, mrs_lib::AttitudeConverter > Struct Reference
    +
    +
    + + + + +

    +Public Types

    +using type = double
     
    +
    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/structstd_1_1tuple__element_3_012_00_01mrs__lib_1_1AttitudeConverter_01_4.js b/structstd_1_1tuple__element_3_012_00_01mrs__lib_1_1AttitudeConverter_01_4.js new file mode 100644 index 00000000..bf59def3 --- /dev/null +++ b/structstd_1_1tuple__element_3_012_00_01mrs__lib_1_1AttitudeConverter_01_4.js @@ -0,0 +1,4 @@ +var structstd_1_1tuple__element_3_012_00_01mrs__lib_1_1AttitudeConverter_01_4 = +[ + [ "type", "structstd_1_1tuple__element_3_012_00_01mrs__lib_1_1AttitudeConverter_01_4.html#a2fca6607bbe082969b9cf24ca7905739", null ] +]; \ No newline at end of file diff --git a/structstd_1_1tuple__size_3_01mrs__lib_1_1AttitudeConverter_01_4-members.html b/structstd_1_1tuple__size_3_01mrs__lib_1_1AttitudeConverter_01_4-members.html new file mode 100644 index 00000000..7e7b338c --- /dev/null +++ b/structstd_1_1tuple__size_3_01mrs__lib_1_1AttitudeConverter_01_4-members.html @@ -0,0 +1,105 @@ + + + + + + + +mrs_lib: Member List + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    std::tuple_size< mrs_lib::AttitudeConverter > Member List
    +
    +
    + +

    This is the complete list of members for std::tuple_size< mrs_lib::AttitudeConverter >, including all inherited members.

    + + +
    value (defined in std::tuple_size< mrs_lib::AttitudeConverter >)std::tuple_size< mrs_lib::AttitudeConverter >static
    +
    + + + + diff --git a/structstd_1_1tuple__size_3_01mrs__lib_1_1AttitudeConverter_01_4.html b/structstd_1_1tuple__size_3_01mrs__lib_1_1AttitudeConverter_01_4.html new file mode 100644 index 00000000..ec957321 --- /dev/null +++ b/structstd_1_1tuple__size_3_01mrs__lib_1_1AttitudeConverter_01_4.html @@ -0,0 +1,115 @@ + + + + + + + +mrs_lib: std::tuple_size< mrs_lib::AttitudeConverter > Struct Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    std::tuple_size< mrs_lib::AttitudeConverter > Struct Reference
    +
    +
    + + + + +

    +Static Public Attributes

    +static constexpr int value = 3
     
    +
    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/subscribe__handler_2example_8cpp.html b/subscribe__handler_2example_8cpp.html new file mode 100644 index 00000000..e427928e --- /dev/null +++ b/subscribe__handler_2example_8cpp.html @@ -0,0 +1,163 @@ + + + + + + + +mrs_lib: src/subscribe_handler/example.cpp File Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    example.cpp File Reference
    +
    +
    + +

    Example file for the SubscribeHandler convenience class. +More...

    +
    #include <mrs_lib/subscribe_handler.h>
    +#include <mrs_lib/impl/subscribe_handler.hpp>
    +#include <std_msgs/String.h>
    +
    + + Include dependency graph for example.cpp:
    +
    +
    + +
    + + + +

    +Classes

    class  SubObject
     
    + + + + + + + +

    +Functions

    +void timeout_callback (const std::string &topic_name, const ros::Time &last_msg)
     
    +void message_callback (const std_msgs::String::ConstPtr msg)
     
    +int main (int argc, char **argv)
     
    + + + +

    +Variables

    +class SubObject sub_obj
     
    +

    Detailed Description

    +

    Example file for the SubscribeHandler convenience class.

    +
    Author
    Matouš Vrba - vrbam.nosp@m.ato@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz
    +

    This example may be run after building mrs_lib by executing rosrun mrs_lib subscribe_handler_example.

    +

    See subscribe_handler/example.cpp.

    +
    +
    + + + + diff --git a/subscribe__handler_2example_8cpp.js b/subscribe__handler_2example_8cpp.js new file mode 100644 index 00000000..3373b152 --- /dev/null +++ b/subscribe__handler_2example_8cpp.js @@ -0,0 +1,8 @@ +var subscribe__handler_2example_8cpp = +[ + [ "SubObject", "classSubObject.html", "classSubObject" ], + [ "main", "subscribe__handler_2example_8cpp.html#a3c04138a5bfe5d72780bb7e82a18e627", null ], + [ "message_callback", "subscribe__handler_2example_8cpp.html#a24622b7a9c364e5304d136fb7517ba25", null ], + [ "timeout_callback", "subscribe__handler_2example_8cpp.html#aeef8c1f6cb88fff39120645123fb0061", null ], + [ "sub_obj", "subscribe__handler_2example_8cpp.html#aeac2f2d0a7c6cf5d1a3d27230238086f", null ] +]; \ No newline at end of file diff --git a/subscribe__handler_2example_8cpp__incl.map b/subscribe__handler_2example_8cpp__incl.map new file mode 100644 index 00000000..9e59747c --- /dev/null +++ b/subscribe__handler_2example_8cpp__incl.map @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/subscribe__handler_2example_8cpp__incl.md5 b/subscribe__handler_2example_8cpp__incl.md5 new file mode 100644 index 00000000..48f2cdec --- /dev/null +++ b/subscribe__handler_2example_8cpp__incl.md5 @@ -0,0 +1 @@ +48016e67af04aee12e9ccc8960777491 \ No newline at end of file diff --git a/subscribe__handler_2example_8cpp__incl.png b/subscribe__handler_2example_8cpp__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..7b037cace57bbda0e693f962ea0ec7f1b10bffa9 GIT binary patch literal 49162 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 p*aVkbNOmEI$IsRu|KIzrG39 + + + + + + +mrs_lib: include/mrs_lib/subscribe_handler.h File Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    subscribe_handler.h File Reference
    +
    +
    + +

    Defines SubscribeHandler and related convenience classes for subscribing to ROS topics. +More...

    +
    #include <ros/ros.h>
    +#include <mrs_lib/timeout_manager.h>
    +#include <mrs_lib/impl/subscribe_handler.hpp>
    +
    + + Include dependency graph for subscribe_handler.h:
    +
    +
    + +
    + + This graph shows which files directly or indirectly include this file:
    +
    +
    + +
    +

    Go to the source code of this file.

    + + + + + + + + +

    +Classes

    struct  mrs_lib::SubscribeHandlerOptions
     A helper class to simplify setup of SubscribeHandler construction. This class is passed to the SubscribeHandler constructor and specifies its common options. More...
     
    class  mrs_lib::SubscribeHandler< MessageType >
     The main class for ROS topic subscription, message timeout handling etc. More...
     
    + + + + +

    +Namespaces

     mrs_lib
     All mrs_lib functions, classes, variables and definitions are contained in this namespace.
     
    + + + + + +

    +Typedefs

    +template<typename SubscribeHandler >
    using mrs_lib::message_type = typename SubscribeHandler::message_type
     Helper alias for convenient extraction of handled message type from a SubscribeHandlerPtr.
     
    + + + + + +

    +Functions

    template<typename Class , class ... Types>
    void mrs_lib::construct_object (Class &object, Types ... args)
     Helper function for object construstion e.g. in case of member objects. This function is useful to avoid specifying object template parameters twice - once in definition of the variable and second time during object construction. 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 argument and not as a return type. More...
     
    +

    Detailed Description

    +

    Defines SubscribeHandler and related convenience classes for subscribing to ROS topics.

    +
    Author
    Matouš Vrba - vrbam.nosp@m.ato@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz
    +
    +
    + + + + diff --git a/subscribe__handler_8h.js b/subscribe__handler_8h.js new file mode 100644 index 00000000..ed7f27a0 --- /dev/null +++ b/subscribe__handler_8h.js @@ -0,0 +1,7 @@ +var subscribe__handler_8h = +[ + [ "SubscribeHandlerOptions", "structmrs__lib_1_1SubscribeHandlerOptions.html", "structmrs__lib_1_1SubscribeHandlerOptions" ], + [ "SubscribeHandler", "classmrs__lib_1_1SubscribeHandler.html", "classmrs__lib_1_1SubscribeHandler" ], + [ "message_type", "subscribe__handler_8h.html#afe10d9f91cc2173fa3c30021514a5c12", null ], + [ "construct_object", "subscribe__handler_8h.html#a6bd2a4b1c7a370ecf5abcb082d68f02f", null ] +]; \ No newline at end of file diff --git a/subscribe__handler_8h__dep__incl.map b/subscribe__handler_8h__dep__incl.map new file mode 100644 index 00000000..88cbc3c8 --- /dev/null +++ b/subscribe__handler_8h__dep__incl.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/subscribe__handler_8h__dep__incl.md5 b/subscribe__handler_8h__dep__incl.md5 new file mode 100644 index 00000000..3c0579a2 --- /dev/null +++ b/subscribe__handler_8h__dep__incl.md5 @@ -0,0 +1 @@ +9b28763189bc9c2ba8f5774ea37e58d1 \ No newline at end of file diff --git a/subscribe__handler_8h__dep__incl.png b/subscribe__handler_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..1f9ccd532fbc7208f239f6c2918921f2c936d510 GIT binary patch literal 14646 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 literal 0 HcmV?d00001 diff --git a/subscribe__handler_8h__incl.map b/subscribe__handler_8h__incl.map new file mode 100644 index 00000000..08e21f4d --- /dev/null +++ b/subscribe__handler_8h__incl.map @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/subscribe__handler_8h__incl.md5 b/subscribe__handler_8h__incl.md5 new file mode 100644 index 00000000..6df1b921 --- /dev/null +++ b/subscribe__handler_8h__incl.md5 @@ -0,0 +1 @@ +ef6070599d5504a5778bcca341dd9026 \ No newline at end of file diff --git a/subscribe__handler_8h__incl.png b/subscribe__handler_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..f4729dcac738e1da2a07b6307839018779620bfc GIT binary patch literal 43738 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 M)>X}Fb-Sql0bhQFI{*Lx literal 0 HcmV?d00001 diff --git a/subscribe__handler_8h_source.html b/subscribe__handler_8h_source.html new file mode 100644 index 00000000..3a99b023 --- /dev/null +++ b/subscribe__handler_8h_source.html @@ -0,0 +1,408 @@ + + + + + + + +mrs_lib: include/mrs_lib/subscribe_handler.h Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    subscribe_handler.h
    +
    +
    +Go to the documentation of this file.
    1 // clang: MatousFormat
    +
    7 #ifndef SUBRSCRIBE_HANDLER_H
    +
    8 #define SUBRSCRIBE_HANDLER_H
    +
    9 
    +
    10 #include <ros/ros.h>
    + +
    12 
    +
    13 namespace mrs_lib
    +
    14 {
    +
    15 
    +
    16  static const ros::Duration no_timeout = ros::Duration(0);
    +
    17 
    +
    18  /* struct SubscribeHandlerOptions //{ */
    +
    19 
    + +
    30  {
    +
    31  SubscribeHandlerOptions(const ros::NodeHandle& nh) : nh(nh) {}
    +
    32  SubscribeHandlerOptions() = default;
    +
    33 
    +
    34  ros::NodeHandle nh;
    +
    36  std::string node_name = {};
    +
    38  std::string topic_name = {};
    +
    40  std::shared_ptr<mrs_lib::TimeoutManager> timeout_manager = nullptr;
    +
    42  ros::Duration no_message_timeout = mrs_lib::no_timeout;
    +
    44  std::function<void(const std::string& topic_name, const ros::Time& last_msg)> timeout_callback = {};
    +
    46  bool threadsafe = true;
    +
    48  bool autostart = true;
    +
    50  uint32_t queue_size = 3;
    +
    52  ros::TransportHints transport_hints = ros::TransportHints();
    +
    53  };
    +
    54 
    +
    55  //}
    +
    56 
    +
    57  /* SubscribeHandler class //{ */
    +
    79  template <typename MessageType>
    + +
    81  {
    +
    82  public:
    +
    86  using message_type = MessageType;
    +
    87 
    +
    91  using timeout_callback_t = std::function<void(const std::string& topic_name, const ros::Time& last_msg)>;
    +
    92 
    +
    96  using message_callback_t = std::function<void(typename MessageType::ConstPtr)>;
    +
    97 
    +
    98  public:
    +
    106  virtual typename MessageType::ConstPtr getMsg() {assert(m_pimpl); return m_pimpl->getMsg();};
    +
    107 
    +
    113  virtual typename MessageType::ConstPtr peekMsg() const {assert(m_pimpl); return m_pimpl->peekMsg();};
    +
    114 
    +
    120  virtual bool hasMsg() const {assert(m_pimpl); return m_pimpl->hasMsg();};
    +
    121 
    +
    127  virtual bool newMsg() const {assert(m_pimpl); return m_pimpl->newMsg();};
    +
    128 
    +
    134  virtual bool usedMsg() const {assert(m_pimpl); return m_pimpl->usedMsg();};
    +
    135 
    +
    141  virtual typename MessageType::ConstPtr waitForNew(const ros::WallDuration& timeout) {assert(m_pimpl); return m_pimpl->waitForNew(timeout);};
    +
    142 
    +
    148  virtual ros::Time lastMsgTime() const {assert(m_pimpl); return m_pimpl->lastMsgTime();};
    +
    149 
    +
    155  virtual std::string topicName() const {assert(m_pimpl); return m_pimpl->topicName();};
    +
    156 
    +
    162  virtual std::string subscribedTopicName() const {assert(m_pimpl); return m_pimpl->m_topic_name;};
    +
    163 
    +
    170  virtual void start() {assert(m_pimpl); return m_pimpl->start();};
    +
    171 
    +
    178  virtual void stop() {assert(m_pimpl); return m_pimpl->stop();};
    +
    179 
    +
    180  public:
    + +
    188 
    +
    197  template<class ... Types>
    + +
    199  const SubscribeHandlerOptions& options,
    +
    200  const std::string& topic_name,
    +
    201  Types ... args
    +
    202  )
    +
    203  :
    + +
    205  [options, topic_name]()
    +
    206  {
    +
    207  SubscribeHandlerOptions opts = options;
    +
    208  opts.topic_name = topic_name;
    +
    209  return opts;
    +
    210  }(),
    +
    211  args...
    +
    212  )
    +
    213  {
    +
    214  }
    +
    215 
    + +
    224  const SubscribeHandlerOptions& options,
    +
    225  const message_callback_t& message_callback = {}
    +
    226  )
    +
    227  {
    +
    228  if (options.threadsafe)
    +
    229  {
    +
    230  m_pimpl = std::make_unique<ImplThreadsafe>
    +
    231  (
    +
    232  options,
    +
    233  message_callback
    +
    234  );
    +
    235  }
    +
    236  else
    +
    237  {
    +
    238  m_pimpl = std::make_unique<Impl>
    +
    239  (
    +
    240  options,
    +
    241  message_callback
    +
    242  );
    +
    243  }
    +
    244  if (options.autostart)
    +
    245  start();
    +
    246  };
    +
    247 
    +
    256  template <class ... Types>
    + +
    258  const SubscribeHandlerOptions& options,
    +
    259  const timeout_callback_t& timeout_callback,
    +
    260  Types ... args
    +
    261  )
    +
    262  :
    + +
    264  [options, timeout_callback]()
    +
    265  {
    +
    266  SubscribeHandlerOptions opts = options;
    +
    267  opts.timeout_callback = timeout_callback;
    +
    268  return opts;
    +
    269  }(),
    +
    270  args...
    +
    271  )
    +
    272  {
    +
    273  }
    +
    274 
    +
    284  template <class ObjectType1, class ... Types>
    + +
    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  :
    + +
    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 
    +
    313  template <class ObjectType2, class ... Types>
    + +
    315  const SubscribeHandlerOptions& options,
    +
    316  void (ObjectType2::*const message_callback) (typename MessageType::ConstPtr),
    +
    317  ObjectType2* const obj2,
    +
    318  Types ... args
    +
    319  )
    +
    320  :
    + +
    322  options,
    +
    323  message_callback == nullptr ? message_callback_t() : std::bind(message_callback, obj2, std::placeholders::_1),
    +
    324  args...
    +
    325  )
    +
    326  {
    +
    327  }
    +
    328 
    +
    340  template <class ObjectType1, class ObjectType2, class ... Types>
    + +
    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  :
    + +
    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 
    +
    371  template<class ... Types>
    + +
    373  const SubscribeHandlerOptions& options,
    +
    374  const ros::Duration& no_message_timeout,
    +
    375  Types ... args
    +
    376  )
    +
    377  :
    + +
    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 
    +
    398  template <class ... Types>
    + +
    400  const SubscribeHandlerOptions& options,
    +
    401  mrs_lib::TimeoutManager& timeout_manager,
    +
    402  Types ... args
    +
    403  )
    +
    404  :
    + +
    406  options,
    +
    407  timeout_manager = timeout_manager,
    +
    408  args...
    +
    409  )
    +
    410  {
    +
    411  }
    +
    412 
    +
    413  ~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
    + +
    419  {
    +
    420  this->m_pimpl = std::move(other.m_pimpl);
    +
    421  other.m_pimpl = nullptr;
    +
    422  }
    +
    423  SubscribeHandler& operator=(SubscribeHandler&& other)
    +
    424  {
    +
    425  this->m_pimpl = std::move(other.m_pimpl);
    +
    426  other.m_pimpl = nullptr;
    +
    427  return *this;
    +
    428  }
    +
    429 
    +
    430  private:
    +
    431  class Impl;
    +
    432  class ImplThreadsafe;
    +
    433  std::unique_ptr<Impl> m_pimpl;
    +
    434  };
    +
    435  //}
    +
    436 
    +
    440  template<typename SubscribeHandler>
    + +
    442 
    +
    452  template<typename Class, class ... Types>
    + +
    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
    +
    +
    +
    uint32_t queue_size
    This parameter is passed to the NodeHandle when subscribing to the topic.
    Definition: subscribe_handler.h:50
    +
    virtual bool hasMsg() const
    Used to check whether at least one message has been received on the handled topic.
    Definition: subscribe_handler.h:120
    +
    SubscribeHandler(const SubscribeHandlerOptions &options, const timeout_callback_t &timeout_callback, Types ... args)
    Convenience constructor overload.
    Definition: subscribe_handler.h:257
    +
    MessageType message_type
    Convenience type for the template parameter to enable nice aliasing.
    Definition: subscribe_handler.h:86
    +
    std::function< void(const std::string &topic_name, const ros::Time &last_msg)> timeout_callback_t
    Type for the timeout callback function.
    Definition: subscribe_handler.h:91
    +
    std::shared_ptr< mrs_lib::TimeoutManager > timeout_manager
    Will be used for handling message timouts if necessary. If no manager is specified,...
    Definition: subscribe_handler.h:40
    +
    virtual bool usedMsg() const
    Used to check whether getMsg() was called at least once on this SubscribeHandler.
    Definition: subscribe_handler.h:134
    +
    ros::TransportHints transport_hints
    This parameter is passed to the NodeHandle when subscribing to the topic.
    Definition: subscribe_handler.h:52
    +
    A helper class to simplify setup of SubscribeHandler construction. This class is passed to the Subscr...
    Definition: subscribe_handler.h:29
    +
    SubscribeHandler(const SubscribeHandlerOptions &options, void(ObjectType2::*const message_callback)(typename MessageType::ConstPtr), ObjectType2 *const obj2, Types ... args)
    Convenience constructor overload.
    Definition: subscribe_handler.h:314
    +
    virtual void stop()
    Disables the callbacks for the handled topic.
    Definition: subscribe_handler.h:178
    +
    SubscribeHandler(const SubscribeHandlerOptions &options, const std::string &topic_name, Types ... args)
    Main constructor.
    Definition: subscribe_handler.h:198
    +
    virtual MessageType::ConstPtr getMsg()
    Returns the last received message on the topic, handled by this SubscribeHandler. Use hasMsg() first ...
    Definition: subscribe_handler.h:106
    +
    SubscribeHandler(const SubscribeHandlerOptions &options, void(ObjectType2::*const message_callback)(typename MessageType::ConstPtr), ObjectType2 *const obj2, void(ObjectType1::*const timeout_callback)(const std::string &topic_name, const ros::Time &last_msg), ObjectType1 *const obj1, Types ... args)
    Convenience constructor overload.
    Definition: subscribe_handler.h:341
    +
    virtual void start()
    Enables the callbacks for the handled topic.
    Definition: subscribe_handler.h:170
    +
    The main class for ROS topic subscription, message timeout handling etc.
    Definition: subscribe_handler.h:80
    + +
    ros::Duration no_message_timeout
    If no new message is received for this duration, the timeout_callback function will be called....
    Definition: subscribe_handler.h:42
    +
    virtual MessageType::ConstPtr waitForNew(const ros::WallDuration &timeout)
    Blocks until new data becomes available or until the timeout runs out or until a spurious wake-up.
    Definition: subscribe_handler.h:141
    +
    typename SubscribeHandler::message_type message_type
    Helper alias for convenient extraction of handled message type from a SubscribeHandlerPtr.
    Definition: subscribe_handler.h:441
    +
    SubscribeHandler()
    Default constructor to avoid having to use pointers.
    Definition: subscribe_handler.h:187
    +
    std::string node_name
    Name of the ROS node, using this handle (used for messages printed to console).
    Definition: subscribe_handler.h:36
    +
    SubscribeHandler(const SubscribeHandlerOptions &options, void(ObjectType1::*const timeout_callback)(const std::string &topic_name, const ros::Time &last_msg), ObjectType1 *const obj1, Types ... args)
    Convenience constructor overload.
    Definition: subscribe_handler.h:285
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    +
    virtual MessageType::ConstPtr peekMsg() const
    Returns the last received message on the topic without modifying the newMsg() or usedMsg() flags.
    Definition: subscribe_handler.h:113
    +
    std::function< void(const std::string &topic_name, const ros::Time &last_msg)> timeout_callback
    This function will be called if no new message is received for the no_message_timeout duration....
    Definition: subscribe_handler.h:44
    +
    TODO.
    Definition: timeout_manager.h:19
    +
    SubscribeHandler(const SubscribeHandlerOptions &options, const message_callback_t &message_callback={})
    Convenience constructor overload.
    Definition: subscribe_handler.h:223
    +
    virtual std::string topicName() const
    Returns the resolved (full) name of the topic, handled by this SubscribeHandler.
    Definition: subscribe_handler.h:155
    +
    std::string topic_name
    Name of the ROS topic to be handled.
    Definition: subscribe_handler.h:38
    +
    std::function< void(typename MessageType::ConstPtr)> message_callback_t
    Convenience type for the message callback function.
    Definition: subscribe_handler.h:96
    +
    virtual std::string subscribedTopicName() const
    Returns the subscribed (unresolved) name of the topic, handled by this SubscribeHandler.
    Definition: subscribe_handler.h:162
    +
    virtual bool newMsg() const
    Used to check whether at least one message has been received on the handled topic since the last call...
    Definition: subscribe_handler.h:127
    +
    bool threadsafe
    If true, all methods of the SubscribeHandler will be mutexed (using a recursive mutex) to avoid data ...
    Definition: subscribe_handler.h:46
    +
    ros::NodeHandle nh
    The ROS NodeHandle to be used for subscription.
    Definition: subscribe_handler.h:34
    +
    SubscribeHandler(const SubscribeHandlerOptions &options, mrs_lib::TimeoutManager &timeout_manager, Types ... args)
    Convenience constructor overload.
    Definition: subscribe_handler.h:399
    +
    SubscribeHandler(const SubscribeHandlerOptions &options, const ros::Duration &no_message_timeout, Types ... args)
    Convenience constructor overload.
    Definition: subscribe_handler.h:372
    +
    virtual ros::Time lastMsgTime() const
    Returns time of the last received message on the topic, handled by this SubscribeHandler.
    Definition: subscribe_handler.h:148
    +
    void construct_object(Class &object, Types ... args)
    Helper function for object construstion e.g. in case of member objects. This function is useful to av...
    Definition: subscribe_handler.h:453
    +
    bool autostart
    If true, the SubscribeHandler will be started after construction. Otherwise it has to be started usin...
    Definition: subscribe_handler.h:48
    + + + + diff --git a/subscribe__handler_8hpp_source.html b/subscribe__handler_8hpp_source.html new file mode 100644 index 00000000..16374735 --- /dev/null +++ b/subscribe__handler_8hpp_source.html @@ -0,0 +1,457 @@ + + + + + + + +mrs_lib: include/mrs_lib/impl/subscribe_handler.hpp Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    subscribe_handler.hpp
    +
    +
    +
    1 // clang: MatousFormat
    +
    2 
    +
    3 #ifndef SUBSCRIBE_HANDLER_HPP
    +
    4 #define SUBSCRIBE_HANDLER_HPP
    +
    5 
    + +
    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  Impl(const SubscribeHandlerOptions& options, const message_callback_t& message_callback = message_callback_t())
    +
    29  : m_nh(options.nh),
    +
    30  m_topic_name(options.topic_name),
    +
    31  m_node_name(options.node_name),
    +
    32  m_got_data(false),
    +
    33  m_new_data(false),
    +
    34  m_used_data(false),
    +
    35  m_timeout_manager(options.timeout_manager),
    +
    36  m_latest_message_time(0),
    +
    37  m_latest_message(nullptr),
    +
    38  m_message_callback(message_callback),
    +
    39  m_queue_size(options.queue_size),
    +
    40  m_transport_hints(options.transport_hints)
    +
    41  {
    +
    42  if (options.no_message_timeout != mrs_lib::no_timeout)
    +
    43  {
    +
    44  // initialize a new TimeoutManager if not provided by the user
    +
    45  if (!m_timeout_manager)
    +
    46  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  std::function<void(const ros::Time&)> timeout_mgr_callback;
    +
    50  if (options.timeout_callback)
    +
    51  timeout_mgr_callback = std::bind(options.timeout_callback, topicName(), std::placeholders::_1);
    +
    52  else
    +
    53  timeout_mgr_callback = std::bind(&Impl::default_timeout_callback, this, topicName(), std::placeholders::_1);
    +
    54 
    +
    55  // register the timeout callback with the TimeoutManager
    +
    56  m_timeout_id = m_timeout_manager->registerNew(options.no_message_timeout, timeout_mgr_callback);
    +
    57  }
    +
    58 
    +
    59  const std::string msg = "Subscribed to topic '" + m_topic_name + "' -> '" + topicName() + "'";
    +
    60  if (m_node_name.empty())
    +
    61  ROS_INFO_STREAM(msg);
    +
    62  else
    +
    63  ROS_INFO_STREAM("[" << m_node_name << "]: " << msg);
    +
    64  }
    +
    65  //}
    +
    66 
    +
    67  virtual ~Impl() = default;
    +
    68 
    +
    69  public:
    +
    70  /* getMsg() method //{ */
    +
    71  virtual typename MessageType::ConstPtr getMsg()
    +
    72  {
    +
    73  m_new_data = false;
    +
    74  m_used_data = true;
    +
    75  return peekMsg();
    +
    76  }
    +
    77  //}
    +
    78 
    +
    79  /* peekMsg() method //{ */
    +
    80  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  return m_latest_message;
    +
    87  }
    +
    88  //}
    +
    89 
    +
    90  /* hasMsg() method //{ */
    +
    91  virtual bool hasMsg() const
    +
    92  {
    +
    93  return m_got_data;
    +
    94  }
    +
    95  //}
    +
    96 
    +
    97  /* newMsg() method //{ */
    +
    98  virtual bool newMsg() const
    +
    99  {
    +
    100  return m_new_data;
    +
    101  }
    +
    102  //}
    +
    103 
    +
    104  /* usedMsg() method //{ */
    +
    105  virtual bool usedMsg() const
    +
    106  {
    +
    107  return m_used_data;
    +
    108  }
    +
    109  //}
    +
    110 
    +
    111  /* waitForNew() method //{ */
    +
    112  virtual typename MessageType::ConstPtr waitForNew(const ros::WallDuration& timeout)
    +
    113  {
    +
    114  // convert the ros type to chrono type
    +
    115  const std::chrono::duration<float> chrono_timeout(timeout.toSec());
    +
    116  // lock the mutex guarding the m_new_data flag
    +
    117  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  if (m_new_data)
    +
    120  return getMsg();
    +
    121  else if (m_new_data_cv.wait_for(lock, chrono_timeout) == std::cv_status::no_timeout && m_new_data)
    +
    122  return getMsg();
    +
    123  else
    +
    124  return nullptr;
    +
    125  };
    +
    126  //}
    +
    127 
    +
    128  /* lastMsgTime() method //{ */
    +
    129  virtual ros::Time lastMsgTime() const
    +
    130  {
    +
    131  return m_latest_message_time;
    +
    132  };
    +
    133  //}
    +
    134 
    +
    135  /* topicName() method //{ */
    +
    136  virtual std::string topicName() const
    +
    137  {
    +
    138  std::string ret = m_sub.getTopic();
    +
    139  if (ret.empty())
    +
    140  ret = m_nh.resolveName(m_topic_name);
    +
    141  return ret;
    +
    142  }
    +
    143  //}
    +
    144 
    +
    145  /* start() method //{ */
    +
    146  virtual void start()
    +
    147  {
    +
    148  if (m_timeout_manager)
    +
    149  m_timeout_manager->start(m_timeout_id);
    +
    150  m_sub = m_nh.subscribe(m_topic_name, m_queue_size, &Impl::data_callback, this, m_transport_hints);
    +
    151  }
    +
    152  //}
    +
    153 
    +
    154  /* stop() method //{ */
    +
    155  virtual void stop()
    +
    156  {
    +
    157  if (m_timeout_manager)
    +
    158  m_timeout_manager->pause(m_timeout_id);
    +
    159  m_sub.shutdown();
    +
    160  }
    +
    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  void default_timeout_callback(const std::string& topic_name, const ros::Time& last_msg)
    +
    196  {
    +
    197  const ros::Duration since_msg = (ros::Time::now() - last_msg);
    +
    198  const auto n_pubs = m_sub.getNumPublishers();
    +
    199  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  if (m_node_name.empty())
    +
    202  ROS_WARN_STREAM(txt);
    +
    203  else
    +
    204  ROS_WARN_STREAM("[" << m_node_name << "]: " << txt);
    +
    205  }
    +
    206  //}
    +
    207 
    +
    208  /* process_new_message() method //{ */
    +
    209  void process_new_message(const typename MessageType::ConstPtr& msg)
    +
    210  {
    +
    211  m_latest_message_time = ros::Time::now();
    +
    212  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  m_new_data = !m_message_callback;
    +
    216  m_got_data = true;
    +
    217  m_new_data_cv.notify_one();
    +
    218  }
    +
    219  //}
    +
    220 
    +
    221  /* data_callback() method //{ */
    +
    222  virtual void data_callback(const typename MessageType::ConstPtr& msg)
    +
    223  {
    +
    224  {
    +
    225  std::lock_guard lck(m_new_data_mtx);
    +
    226  if (m_timeout_manager)
    +
    227  m_timeout_manager->reset(m_timeout_id);
    +
    228  process_new_message(msg);
    +
    229  }
    +
    230 
    +
    231  // execute the callback after unlocking the mutex to enable multi-threaded callback execution
    +
    232  if (m_message_callback)
    +
    233  m_message_callback(msg);
    +
    234  }
    +
    235  //}
    +
    236  };
    +
    237  //}
    +
    238 
    +
    239  /* SubscribeHandler_threadsafe class //{ */
    +
    240  template <typename MessageType>
    +
    241  class SubscribeHandler<MessageType>::ImplThreadsafe : public SubscribeHandler<MessageType>::Impl
    +
    242  {
    +
    243  private:
    + +
    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  ImplThreadsafe(const SubscribeHandlerOptions& options, const message_callback_t& message_callback = message_callback_t())
    +
    254  : impl_class_t::Impl(options, message_callback)
    +
    255  {
    +
    256  }
    +
    257 
    +
    258  public:
    +
    259  virtual bool hasMsg() const override
    +
    260  {
    +
    261  std::lock_guard lck(m_mtx);
    +
    262  return impl_class_t::hasMsg();
    +
    263  }
    +
    264  virtual bool newMsg() const override
    +
    265  {
    +
    266  std::lock_guard lck(m_mtx);
    +
    267  return impl_class_t::newMsg();
    +
    268  }
    +
    269  virtual bool usedMsg() const override
    +
    270  {
    +
    271  std::lock_guard lck(m_mtx);
    +
    272  return impl_class_t::usedMsg();
    +
    273  }
    +
    274  virtual typename MessageType::ConstPtr getMsg() override
    +
    275  {
    +
    276  std::lock_guard lck(m_mtx);
    +
    277  return impl_class_t::getMsg();
    +
    278  }
    +
    279  virtual typename MessageType::ConstPtr peekMsg() const override
    +
    280  {
    +
    281  std::lock_guard lck(m_mtx);
    +
    282  return impl_class_t::peekMsg();
    +
    283  }
    +
    284  virtual ros::Time lastMsgTime() const override
    +
    285  {
    +
    286  std::lock_guard lck(m_mtx);
    +
    287  return impl_class_t::lastMsgTime();
    +
    288  };
    +
    289  virtual std::string topicName() const override
    +
    290  {
    +
    291  std::lock_guard lck(m_mtx);
    +
    292  return impl_class_t::topicName();
    +
    293  };
    +
    294  virtual void start() override
    +
    295  {
    +
    296  std::lock_guard lck(m_mtx);
    +
    297  return impl_class_t::start();
    +
    298  }
    +
    299  virtual void stop() override
    +
    300  {
    +
    301  std::lock_guard lck(m_mtx);
    +
    302  return impl_class_t::stop();
    +
    303  }
    +
    304 
    +
    305  virtual ~ImplThreadsafe() override = default;
    +
    306 
    +
    307  protected:
    +
    308  virtual void data_callback(const typename MessageType::ConstPtr& msg) override
    +
    309  {
    +
    310  {
    +
    311  std::scoped_lock lck(m_mtx, this->m_new_data_mtx);
    +
    312  if (this->m_timeout_manager)
    +
    313  this->m_timeout_manager->reset(this->m_timeout_id);
    +
    314  impl_class_t::process_new_message(msg);
    +
    315  }
    +
    316 
    +
    317  // execute the callback after unlocking the mutex to enable multi-threaded callback execution
    +
    318  if (this->m_message_callback)
    +
    319  impl_class_t::m_message_callback(msg);
    +
    320  }
    +
    321 
    +
    322  private:
    +
    323  mutable std::recursive_mutex m_mtx;
    +
    324  };
    +
    325  //}
    +
    326 
    +
    327 } // namespace mrs_lib
    +
    328 
    +
    329 #endif // SUBSCRIBE_HANDLER_HPP
    +
    +
    +
    uint32_t queue_size
    This parameter is passed to the NodeHandle when subscribing to the topic.
    Definition: subscribe_handler.h:50
    +
    virtual bool hasMsg() const
    Used to check whether at least one message has been received on the handled topic.
    Definition: subscribe_handler.h:120
    +
    std::shared_ptr< mrs_lib::TimeoutManager > timeout_manager
    Will be used for handling message timouts if necessary. If no manager is specified,...
    Definition: subscribe_handler.h:40
    +
    std::function< void(const std::string &topic_name, const ros::Time &last_msg)> timeout_callback_t
    Type for the timeout callback function.
    Definition: subscribe_handler.h:91
    +
    virtual bool usedMsg() const
    Used to check whether getMsg() was called at least once on this SubscribeHandler.
    Definition: subscribe_handler.h:134
    +
    ros::TransportHints transport_hints
    This parameter is passed to the NodeHandle when subscribing to the topic.
    Definition: subscribe_handler.h:52
    +
    A helper class to simplify setup of SubscribeHandler construction. This class is passed to the Subscr...
    Definition: subscribe_handler.h:29
    +
    virtual void stop()
    Disables the callbacks for the handled topic.
    Definition: subscribe_handler.h:178
    +
    Defines SubscribeHandler and related convenience classes for subscribing to ROS topics.
    +
    virtual MessageType::ConstPtr getMsg()
    Returns the last received message on the topic, handled by this SubscribeHandler. Use hasMsg() first ...
    Definition: subscribe_handler.h:106
    +
    virtual void start()
    Enables the callbacks for the handled topic.
    Definition: subscribe_handler.h:170
    +
    The main class for ROS topic subscription, message timeout handling etc.
    Definition: subscribe_handler.h:80
    +
    ros::Duration no_message_timeout
    If no new message is received for this duration, the timeout_callback function will be called....
    Definition: subscribe_handler.h:42
    +
    virtual MessageType::ConstPtr waitForNew(const ros::WallDuration &timeout)
    Blocks until new data becomes available or until the timeout runs out or until a spurious wake-up.
    Definition: subscribe_handler.h:141
    +
    Definition: subscribe_handler.hpp:16
    +
    std::string node_name
    Name of the ROS node, using this handle (used for messages printed to console).
    Definition: subscribe_handler.h:36
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    +
    virtual MessageType::ConstPtr peekMsg() const
    Returns the last received message on the topic without modifying the newMsg() or usedMsg() flags.
    Definition: subscribe_handler.h:113
    +
    std::function< void(const std::string &topic_name, const ros::Time &last_msg)> timeout_callback
    This function will be called if no new message is received for the no_message_timeout duration....
    Definition: subscribe_handler.h:44
    +
    virtual std::string topicName() const
    Returns the resolved (full) name of the topic, handled by this SubscribeHandler.
    Definition: subscribe_handler.h:155
    +
    std::string topic_name
    Name of the ROS topic to be handled.
    Definition: subscribe_handler.h:38
    +
    std::function< void(typename MessageType::ConstPtr)> message_callback_t
    Convenience type for the message callback function.
    Definition: subscribe_handler.h:96
    +
    virtual bool newMsg() const
    Used to check whether at least one message has been received on the handled topic since the last call...
    Definition: subscribe_handler.h:127
    +
    ros::NodeHandle nh
    The ROS NodeHandle to be used for subscription.
    Definition: subscribe_handler.h:34
    +
    virtual ros::Time lastMsgTime() const
    Returns time of the last received message on the topic, handled by this SubscribeHandler.
    Definition: subscribe_handler.h:148
    +
    Definition: subscribe_handler.hpp:241
    + + + + diff --git a/subscribe_handler_2example_8cpp-example.html b/subscribe_handler_2example_8cpp-example.html new file mode 100644 index 00000000..c4cc9a50 --- /dev/null +++ b/subscribe_handler_2example_8cpp-example.html @@ -0,0 +1,190 @@ + + + + + + + +mrs_lib: subscribe_handler/example.cpp + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    subscribe_handler/example.cpp
    +
    +
    +

    This example may be run after building mrs_lib by executing rosrun mrs_lib subscribe_handler_example.

    +
    // clang: MatousFormat
    +
    // Include the SubscribeHandler header
    + +
    #include <mrs_lib/impl/subscribe_handler.hpp>
    +
    #include <std_msgs/String.h>
    +
    +
    void timeout_callback(const std::string& topic_name, const ros::Time& last_msg)
    +
    {
    +
    ROS_ERROR_STREAM("Have not received a message on topic '" << topic_name << "' for " << (ros::Time::now() - last_msg).toSec() << " seconds");
    +
    }
    +
    +
    void message_callback(const std_msgs::String::ConstPtr msg)
    +
    {
    +
    ROS_INFO_STREAM("Received: '" << msg->data << "'.");
    +
    }
    +
    +
    class SubObject
    +
    {
    +
    public:
    +
    void callback_method(const std_msgs::String::ConstPtr msg)
    +
    {
    +
    ROS_INFO_STREAM("Object received: '" << msg->data << "'.");
    +
    }
    +
    +
    void timeout_method(const std::string& topic_name, const ros::Time& last_msg)
    +
    {
    +
    ROS_ERROR_STREAM("Object has not received a message on topic '" << topic_name << "' for " << (ros::Time::now()-last_msg).toSec() << " seconds");
    +
    }
    +
    } sub_obj;
    +
    +
    int main(int argc, char **argv)
    +
    {
    +
    /* Set up ROS. */
    +
    const std::string node_name("subscribe_handler_example");
    +
    ros::init(argc, argv, node_name);
    +
    ros::NodeHandle nh;
    +
    +
    /* name of the topic to be handled */
    +
    const std::string topic_name = "test_topic";
    +
    /* after this duration without receiving messages on the handled topic, the timeout_callback will be called */
    +
    const ros::Duration no_message_timeout = ros::Duration(1.0);
    +
    +
    ROS_INFO("[%s]: Creating SubscribeHandlers.", node_name.c_str());
    +
    + +
    shopts.node_name = node_name;
    +
    shopts.no_message_timeout = no_message_timeout;
    +
    +
    /* This is how a new SubscribeHandler object is initialized. */
    + +
    shopts,
    +
    topic_name,
    +
    timeout_callback,
    +
    message_callback
    +
    );
    +
    +
    /* A variation of the factory method for easier use with objects also exists. */
    + +
    handler,
    +
    shopts,
    +
    topic_name,
    +
    no_message_timeout,
    +
    &SubObject::timeout_method, &sub_obj,
    +
    &SubObject::callback_method, &sub_obj
    +
    );
    +
    +
    /* Type of the message may be accessed by C++11 decltype in case of need */
    +
    using message_type = mrs_lib::message_type<decltype(handler)>;
    +
    ros::Publisher pub = nh.advertise<message_type>(topic_name, 5);
    +
    +
    /* Now let's just spin to process calbacks until the user decides to stop the program. */
    +
    ros::Duration d(3.0);
    +
    while (ros::ok())
    +
    {
    + +
    msg.data = "asdf";
    +
    pub.publish(msg);
    +
    ROS_INFO_THROTTLE(1.0, "[%s]: Spinning", ros::this_node::getName().c_str());
    +
    ros::spinOnce();
    +
    d.sleep();
    +
    }
    +
    }
    +
    +
    +
    A helper class to simplify setup of SubscribeHandler construction. This class is passed to the Subscr...
    Definition: subscribe_handler.h:29
    +
    Defines SubscribeHandler and related convenience classes for subscribing to ROS topics.
    +
    The main class for ROS topic subscription, message timeout handling etc.
    Definition: subscribe_handler.h:80
    +
    typename SubscribeHandler::message_type message_type
    Helper alias for convenient extraction of handled message type from a SubscribeHandlerPtr.
    Definition: subscribe_handler.h:441
    +
    Definition: example.cpp:31
    +
    void construct_object(Class &object, Types ... args)
    Helper function for object construstion e.g. in case of member objects. This function is useful to av...
    Definition: subscribe_handler.h:453
    + + + + diff --git a/subscribe_handler_2simple_example_8cpp-example.html b/subscribe_handler_2simple_example_8cpp-example.html new file mode 100644 index 00000000..08c71573 --- /dev/null +++ b/subscribe_handler_2simple_example_8cpp-example.html @@ -0,0 +1,148 @@ + + + + + + + +mrs_lib: subscribe_handler/simple_example.cpp + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    subscribe_handler/simple_example.cpp
    +
    +
    +

    This example may be run after building mrs_lib by executing rosrun mrs_lib subscribe_handler_simple_example.

    +
    // clang: MatousFormat
    +
    // Include the SubscribeHandler header
    + +
    #include <std_msgs/String.h>
    +
    +
    int main(int argc, char **argv)
    +
    {
    +
    /* Set up ROS. */
    +
    const std::string node_name = "subscribe_handler_simple_example";
    +
    ros::init(argc, argv, node_name);
    +
    ros::NodeHandle nh;
    +
    +
    /* Basic configuration of the SubscribeHandler. */
    + +
    shopts.node_name = node_name; //< used for the ROS logging from inside the SubscribeHandler (ROS_INFO, ROS_WARN etc.)
    +
    shopts.no_message_timeout = ros::Duration(3.0); //< SubscribeHandler warns if no messages arrive for this duration
    +
    +
    /* name of the topic to be handled */
    +
    const std::string topic_name = "test_topic";
    +
    +
    /* This is how a new SubscribeHandler object is initialized. */
    + +
    shopts,
    +
    topic_name
    +
    );
    +
    +
    /* Now let's just spin to process calbacks until the user decides to stop the program. */
    +
    ros::Duration d(0.1);
    +
    while (ros::ok())
    +
    {
    +
    ROS_INFO_STREAM_THROTTLE(1.0, "[" << node_name << "]: Spinning");
    +
    ros::spinOnce();
    +
    /* Print out any new messages */
    +
    if (handler.newMsg())
    +
    ROS_INFO_STREAM("[" << node_name << "]: Got a new message: " << handler.getMsg()->data);
    +
    d.sleep();
    +
    }
    +
    }
    +
    +
    +
    +
    A helper class to simplify setup of SubscribeHandler construction. This class is passed to the Subscr...
    Definition: subscribe_handler.h:29
    +
    Defines SubscribeHandler and related convenience classes for subscribing to ROS topics.
    +
    virtual MessageType::ConstPtr getMsg()
    Returns the last received message on the topic, handled by this SubscribeHandler. Use hasMsg() first ...
    Definition: subscribe_handler.h:106
    +
    The main class for ROS topic subscription, message timeout handling etc.
    Definition: subscribe_handler.h:80
    +
    ros::Duration no_message_timeout
    If no new message is received for this duration, the timeout_callback function will be called....
    Definition: subscribe_handler.h:42
    +
    std::string node_name
    Name of the ROS node, using this handle (used for messages printed to console).
    Definition: subscribe_handler.h:36
    +
    virtual bool newMsg() const
    Used to check whether at least one message has been received on the handled topic since the last call...
    Definition: subscribe_handler.h:127
    + + + + diff --git a/sync_off.png b/sync_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3b443fc62892114406e3d399421b2a881b897acc GIT binary patch literal 853 zcmV-b1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 HcmV?d00001 diff --git a/sync_on.png b/sync_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e08320fb64e6fa33b573005ed6d8fe294e19db76 GIT binary patch literal 845 zcmV-T1G4;yP)Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 HcmV?d00001 diff --git a/tab_a.png b/tab_a.png new file mode 100644 index 0000000000000000000000000000000000000000..3b725c41c5a527a3a3e40097077d0e206a681247 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QlXwMjv*C{Z|8b*H5dputLHD# z=<0|*y7z(Vor?d;H&?EG&cXR}?!j-Lm&u1OOI7AIF5&c)RFE;&p0MYK>*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 literal 0 HcmV?d00001 diff --git a/tab_b.png b/tab_b.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b4a8638cb3496a016eaed9e16ffc12846dea18 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QU#tajv*C{Z}0l@H7kg?K0Lnr z!j&C6_(~HV9oQ0Pa6x{-v0AGV_E?vLn=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ literal 0 HcmV?d00001 diff --git a/tabs.css b/tabs.css new file mode 100644 index 00000000..7d45d36c --- /dev/null +++ b/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283A5D transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} diff --git a/timeout__manager_8h.html b/timeout__manager_8h.html new file mode 100644 index 00000000..65dada34 --- /dev/null +++ b/timeout__manager_8h.html @@ -0,0 +1,152 @@ + + + + + + + +mrs_lib: include/mrs_lib/timeout_manager.h File Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    timeout_manager.h File Reference
    +
    +
    + +

    TODO. +More...

    +
    #include <ros/ros.h>
    +
    + + Include dependency graph for timeout_manager.h:
    +
    +
    + +
    + + This graph shows which files directly or indirectly include this file:
    +
    +
    + +
    +

    Go to the source code of this file.

    + + + + + +

    +Classes

    class  mrs_lib::TimeoutManager
     TODO. More...
     
    + + + + +

    +Namespaces

     mrs_lib
     All mrs_lib functions, classes, variables and definitions are contained in this namespace.
     
    +

    Detailed Description

    +
    +
    + + + + diff --git a/timeout__manager_8h__dep__incl.map b/timeout__manager_8h__dep__incl.map new file mode 100644 index 00000000..a264f2f5 --- /dev/null +++ b/timeout__manager_8h__dep__incl.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/timeout__manager_8h__dep__incl.md5 b/timeout__manager_8h__dep__incl.md5 new file mode 100644 index 00000000..0d55b00d --- /dev/null +++ b/timeout__manager_8h__dep__incl.md5 @@ -0,0 +1 @@ +488158dca2210dacce13572f6d4d47f6 \ No newline at end of file diff --git a/timeout__manager_8h__dep__incl.png b/timeout__manager_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..b3f035b5ae97da2175ab069e6cd95aa50a303b0d GIT binary patch literal 17860 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 E0|BP8DgXcg literal 0 HcmV?d00001 diff --git a/timeout__manager_8h__incl.map b/timeout__manager_8h__incl.map new file mode 100644 index 00000000..cd98eab6 --- /dev/null +++ b/timeout__manager_8h__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/timeout__manager_8h__incl.md5 b/timeout__manager_8h__incl.md5 new file mode 100644 index 00000000..73124908 --- /dev/null +++ b/timeout__manager_8h__incl.md5 @@ -0,0 +1 @@ +fe85c21ba0b3cd63446d6b263b813e2e \ No newline at end of file diff --git a/timeout__manager_8h__incl.png b/timeout__manager_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..8cb676f50971ee1777c7d1dabec9b86e5f4c4774 GIT binary patch literal 4174 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 LMmj}W_n!R^9rq + + + + + + +mrs_lib: include/mrs_lib/timeout_manager.h Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    timeout_manager.h
    +
    +
    +Go to the documentation of this file.
    1 // clang: MatousFormat
    +
    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 //{ */
    + +
    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 
    +
    33  TimeoutManager(const ros::NodeHandle& nh, const ros::Rate& update_rate);
    +
    34 
    +
    35  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  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  void start(const timeout_id_t id, const ros::Time& time = ros::Time::now());
    +
    42 
    +
    43  void pauseAll();
    +
    44 
    +
    45  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
    +
    +
    +
    TimeoutManager(const ros::NodeHandle &nh, const ros::Rate &update_rate)
    TODO.
    Definition: timeout_manager.cpp:6
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    +
    TODO.
    Definition: timeout_manager.h:19
    + + + + diff --git a/timer_8h_source.html b/timer_8h_source.html new file mode 100644 index 00000000..58b9ae00 --- /dev/null +++ b/timer_8h_source.html @@ -0,0 +1,240 @@ + + + + + + + +mrs_lib: include/mrs_lib/timer.h Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    timer.h
    +
    +
    +
    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 
    +
    23  class MRSTimer
    +
    24  {
    +
    25  public:
    +
    26  using callback_t = std::function<void(const ros::TimerEvent&)>;
    +
    27 
    +
    31  virtual void stop() = 0;
    +
    32 
    +
    36  virtual void start() = 0;
    +
    37 
    +
    44  virtual void setPeriod(const ros::Duration& duration, const bool reset = true) = 0;
    +
    45 
    +
    51  virtual bool running() = 0;
    +
    52 
    +
    53  virtual ~MRSTimer() = default;
    +
    54  MRSTimer(const MRSTimer&) = default;
    +
    55  MRSTimer(MRSTimer&&) = default;
    +
    56  MRSTimer& operator=(const MRSTimer&) = default;
    +
    57  MRSTimer& operator=(MRSTimer&&) = default;
    +
    58 
    +
    59  protected:
    +
    60  MRSTimer() = default;
    +
    61  };
    +
    62 
    +
    63  // | ------------------------ ROSTimer ------------------------ |
    +
    64 
    +
    65  /* class ROSTimer //{ */
    +
    66 
    +
    70  class ROSTimer : public MRSTimer {
    +
    71  public:
    +
    72  ROSTimer();
    +
    73 
    +
    85  template <class ObjectType>
    +
    86  ROSTimer(const ros::NodeHandle& nh, const ros::Rate& rate, void (ObjectType::*const callback)(const ros::TimerEvent&), ObjectType* const obj,
    +
    87  const bool oneshot = false, const bool autostart = true);
    +
    88 
    +
    100  template <class ObjectType>
    +
    101  ROSTimer(const ros::NodeHandle& nh, const ros::Duration& duration, void (ObjectType::*const callback)(const ros::TimerEvent&), ObjectType* const obj,
    +
    102  const bool oneshot = false, const bool autostart = true);
    +
    103 
    +
    107  virtual void stop() override;
    +
    108 
    +
    112  virtual void start() override;
    +
    113 
    +
    120  virtual void setPeriod(const ros::Duration& duration, const bool reset = true) override;
    +
    121 
    +
    127  virtual bool running() override;
    +
    128 
    +
    129  virtual ~ROSTimer() override {stop();};
    +
    130  // to keep rule of five since we have a custom destructor
    +
    131  ROSTimer(const ROSTimer&) = delete;
    +
    132  ROSTimer(ROSTimer&&) = delete;
    +
    133  ROSTimer& operator=(const ROSTimer&) = delete;
    +
    134  ROSTimer& operator=(ROSTimer&&) = delete;
    +
    135 
    +
    136  private:
    +
    137  std::mutex mutex_timer_;
    +
    138 
    +
    139  std::unique_ptr<ros::Timer> timer_;
    +
    140  };
    +
    141 
    +
    142  //}
    +
    143 
    +
    144  // | ----------------------- ThreadTimer ---------------------- |
    +
    145 
    +
    146  /* class ThreadTimer //{ */
    +
    147 
    +
    151  class ThreadTimer : public MRSTimer {
    +
    152 
    +
    153  public:
    +
    154  ThreadTimer();
    +
    155 
    +
    167  template <class ObjectType>
    +
    168  ThreadTimer(const ros::NodeHandle& nh, const ros::Rate& rate, void (ObjectType::*const callback)(const ros::TimerEvent&), ObjectType* const obj,
    +
    169  const bool oneshot = false, const bool autostart = true);
    +
    170 
    +
    182  template <class ObjectType>
    +
    183  ThreadTimer(const ros::NodeHandle& nh, const ros::Duration& duration, void (ObjectType::*const callback)(const ros::TimerEvent&), ObjectType* const obj,
    +
    184  bool oneshot = false, const bool autostart = true);
    +
    185 
    +
    191  virtual void stop() override;
    +
    192 
    +
    200  virtual void start() override;
    +
    201 
    +
    210  virtual void setPeriod(const ros::Duration& duration, const bool reset = true) override;
    +
    211 
    +
    217  virtual bool running() override;
    +
    218 
    +
    224  virtual ~ThreadTimer() override {stop();};
    +
    225  // to keep rule of five since we have a custom destructor
    +
    226  ThreadTimer(const ThreadTimer&) = delete;
    +
    227  ThreadTimer(ThreadTimer&&) = delete;
    +
    228  ThreadTimer& operator=(const ThreadTimer&) = delete;
    +
    229  ThreadTimer& operator=(ThreadTimer&&) = delete;
    +
    230 
    +
    231  private:
    +
    232  class Impl;
    +
    233 
    +
    234  std::unique_ptr<Impl> impl_;
    +
    235 
    +
    236  }; // namespace mrs_lib
    +
    237 
    +
    238  //}
    +
    239 
    +
    240 #include <mrs_lib/impl/timer.hpp>
    +
    241 
    +
    242 } // namespace mrs_lib
    +
    243 
    +
    244 #endif // MRS_TIMER_H
    +
    +
    +
    virtual ~ThreadTimer() override
    stops the timer and then destroys the object
    Definition: timer.h:224
    +
    virtual void stop() override
    stop the timer
    Definition: timer.cpp:76
    +
    virtual void start() override
    start the timer
    Definition: timer.cpp:23
    +
    virtual void setPeriod(const ros::Duration &duration, const bool reset=true)=0
    set the timer period/duration
    +
    virtual bool running() override
    returns true if callbacks should be called
    Definition: timer.cpp:49
    +
    virtual void start()=0
    start the timer
    +
    ros::Timer wrapper. The interface is the same as with ros::Timer, except for the initialization metho...
    Definition: timer.h:70
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    +
    virtual void stop() override
    stop the timer
    Definition: timer.cpp:10
    +
    virtual bool running()=0
    returns true if callbacks should be called
    +
    virtual bool running() override
    returns true if callbacks should be called
    Definition: timer.cpp:98
    +
    virtual void setPeriod(const ros::Duration &duration, const bool reset=true) override
    set the timer period/duration
    Definition: timer.cpp:36
    +
    virtual void setPeriod(const ros::Duration &duration, const bool reset=true) override
    set the timer period/duration
    Definition: timer.cpp:87
    +
    virtual void stop()=0
    stop the timer
    +
    virtual void start() override
    start the timer
    Definition: timer.cpp:65
    +
    Common wrapper representing the functionality of the ros::Timer.
    Definition: timer.h:23
    +
    Custom thread-based Timers with the same interface as mrs_lib::ROSTimer.
    Definition: timer.h:151
    + + + + diff --git a/timer_8hpp_source.html b/timer_8hpp_source.html new file mode 100644 index 00000000..afb7c0c9 --- /dev/null +++ b/timer_8hpp_source.html @@ -0,0 +1,198 @@ + + + + + + + +mrs_lib: include/mrs_lib/impl/timer.hpp Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    timer.hpp
    +
    +
    +
    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 ROSTimer::ROSTimer(const ros::NodeHandle& nh, const ros::Rate& rate, void (ObjectType::*const callback)(const ros::TimerEvent&), ObjectType* const obj,
    +
    21  const bool oneshot, const bool autostart) {
    +
    22 
    +
    23  this->timer_ = std::make_unique<ros::Timer>(nh.createTimer(rate, callback, obj, oneshot, autostart));
    +
    24 }
    +
    25 
    +
    26 //}
    +
    27 
    +
    28 // | ----------------------- ThreadTimer ---------------------- |
    +
    29 
    +
    30 /* class ThreadTimer::Impl //{ */
    +
    31 
    + +
    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 
    +
    41  friend class ThreadTimer;
    +
    42 
    +
    43  // to keep rule of five since we have a custom destructor
    +
    44  Impl(const Impl&) = delete;
    +
    45  Impl(Impl&&) = delete;
    +
    46  Impl& operator=(const Impl&) = delete;
    +
    47  Impl& operator=(Impl&&) = delete;
    +
    48 
    +
    49 private:
    +
    50  std::thread thread_;
    +
    51  std::function<void(const ros::TimerEvent&)> callback_;
    +
    52 
    +
    53  bool oneshot_;
    +
    54 
    +
    55  bool breakableSleep(const ros::Time& until);
    +
    56  void threadFcn();
    +
    57 
    +
    58  std::mutex mutex_wakeup_;
    +
    59  std::condition_variable wakeup_cond_;
    +
    60  std::recursive_mutex mutex_state_;
    +
    61  bool running_;
    +
    62  ros::Duration delay_dur_;
    +
    63  bool ending_;
    +
    64  ros::Time next_expected_;
    +
    65  ros::Time last_expected_;
    +
    66  ros::Time last_real_;
    +
    67 
    +
    68 };
    +
    69 
    +
    70 //}
    +
    71 
    +
    72 /* ThreadTimer constructors and destructors//{ */
    +
    73 
    +
    74 template <class ObjectType>
    +
    75 ThreadTimer::ThreadTimer([[maybe_unused]] const ros::NodeHandle& nh, const ros::Rate& rate, void (ObjectType::*const callback)(const ros::TimerEvent&),
    +
    76  ObjectType* const obj, const bool oneshot, const bool autostart)
    +
    77  : ThreadTimer(nh, rate.expectedCycleTime(), callback, obj, oneshot, autostart)
    +
    78 {
    +
    79 }
    +
    80 
    +
    81 template <class ObjectType>
    +
    82 ThreadTimer::ThreadTimer([[maybe_unused]] const ros::NodeHandle& nh, const ros::Duration& duration,
    +
    83  void (ObjectType::*const callback)(const ros::TimerEvent&), ObjectType* const obj, bool oneshot, const bool autostart)
    +
    84 {
    +
    85  const auto cbk = std::bind(callback, obj, std::placeholders::_1);
    +
    86  if (duration == ros::Duration(0))
    +
    87  oneshot = true;
    +
    88  this->impl_ = std::make_unique<Impl>(cbk, duration, oneshot);
    +
    89  if (autostart)
    +
    90  this->impl_->start();
    +
    91 }
    +
    92 
    +
    93 //}
    +
    94 
    +
    95 #endif // MRS_TIMER_HPP
    +
    +
    +
    Definition: timer.hpp:32
    + + + + diff --git a/transform__broadcaster_8h_source.html b/transform__broadcaster_8h_source.html new file mode 100644 index 00000000..ab7ed68b --- /dev/null +++ b/transform__broadcaster_8h_source.html @@ -0,0 +1,135 @@ + + + + + + + +mrs_lib: include/mrs_lib/transform_broadcaster.h Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    transform_broadcaster.h
    +
    +
    +
    1 #ifndef TRANSFORM_BROADCASTER_H
    +
    2 #define TRANSFORM_BROADCASTER_H
    +
    3 
    +
    4 #include <tf2_ros/transform_broadcaster.h>
    +
    5 
    +
    6 namespace mrs_lib
    +
    7 {
    +
    8 
    +
    9 /* TransformBroadcaster //{ */
    +
    10 
    + +
    18 
    +
    19 public:
    + +
    24 
    +
    30  void sendTransform(const geometry_msgs::TransformStamped &transform);
    +
    31 
    +
    37  void sendTransform(const std::vector<geometry_msgs::TransformStamped> &transforms);
    +
    38 
    +
    39 private:
    +
    43  tf2_ros::TransformBroadcaster broadcaster_;
    +
    44 
    +
    51  std::map<std::string, ros::Time> last_messages_;
    +
    52 };
    +
    53 //}
    +
    54 
    +
    55 } // namespace mrs_lib
    +
    56 
    +
    57 #endif // TRANSFORM_BROADCASTER_H
    +
    +
    +
    void sendTransform(const geometry_msgs::TransformStamped &transform)
    check if the transform is newer than the last published one and publish it. Transform is skipped if a...
    Definition: transform_broadcaster.cpp:13
    +
    Wrapper for the tf2_ros::TransformBroadcaster. With each sendTransform() command, the message is chec...
    Definition: transform_broadcaster.h:17
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    +
    TransformBroadcaster()
    constructor, internally starts the TransformBroadcaster
    Definition: transform_broadcaster.cpp:7
    + + + + diff --git a/transformer_8h_source.html b/transformer_8h_source.html new file mode 100644 index 00000000..a532d425 --- /dev/null +++ b/transformer_8h_source.html @@ -0,0 +1,504 @@ + + + + + + + +mrs_lib: include/mrs_lib/transformer.h Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    transformer.h
    +
    +
    +
    1 // clang: MatousFormat
    +
    2 
    +
    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 
    +
    66  /* class Transformer //{ */
    +
    67 
    + +
    69  {
    +
    70 
    +
    71  public:
    +
    72  /* Constructor, assignment operator and overloads //{ */
    +
    73 
    +
    82  Transformer();
    +
    83 
    +
    92  Transformer(const std::string& node_name, const ros::Duration& cache_time = ros::Duration(tf2_ros::Buffer::DEFAULT_CACHE_TIME));
    +
    93 
    +
    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 
    + +
    114 
    +
    115  //}
    +
    116 
    +
    117  // | ------------------ Configuration methods ----------------- |
    +
    118 
    +
    119  /* setDefaultFrame() //{ */
    +
    120 
    +
    130  void setDefaultFrame(const std::string& frame_id)
    +
    131  {
    +
    132  std::scoped_lock lck(mutex_);
    +
    133  default_frame_id_ = frame_id;
    +
    134  }
    +
    135 
    +
    136  //}
    +
    137 
    +
    138  /* setDefaultPrefix() //{ */
    +
    139 
    +
    153  void setDefaultPrefix(const std::string& prefix)
    +
    154  {
    +
    155  std::scoped_lock lck(mutex_);
    +
    156  if (prefix.empty())
    +
    157  prefix_ = "";
    +
    158  else
    +
    159  prefix_ = prefix + "/";
    +
    160  }
    +
    161 
    +
    162  //}
    +
    163 
    +
    164  /* setLatLon() //{ */
    +
    165 
    +
    176  void setLatLon(const double lat, const double lon);
    +
    177 
    +
    178  //}
    +
    179 
    +
    180  /* setLookupTimeout() //{ */
    +
    181 
    +
    191  void setLookupTimeout(const ros::Duration timeout = ros::Duration(0))
    +
    192  {
    +
    193  std::scoped_lock lck(mutex_);
    +
    194  lookup_timeout_ = timeout;
    +
    195  }
    +
    196 
    +
    197  //}
    +
    198 
    +
    199  /* retryLookupNewest() //{ */
    +
    200 
    +
    211  void retryLookupNewest(const bool retry = true)
    +
    212  {
    +
    213  std::scoped_lock lck(mutex_);
    +
    214  retry_lookup_newest_ = retry;
    +
    215  }
    +
    216 
    +
    217  //}
    +
    218 
    +
    219  /* beQuiet() //{ */
    +
    220 
    +
    228  void beQuiet(const bool quiet = true)
    +
    229  {
    +
    230  std::scoped_lock lck(mutex_);
    +
    231  quiet_ = quiet;
    +
    232  }
    +
    233 
    +
    234  //}
    +
    235 
    +
    236  /* resolveFrame() //{ */
    +
    248  std::string resolveFrame(const std::string& frame_id)
    +
    249  {
    +
    250  std::scoped_lock lck(mutex_);
    +
    251  return resolveFrameImpl(frame_id);
    +
    252  }
    +
    253  //}
    +
    254 
    +
    255  /* transformSingle() //{ */
    +
    256 
    +
    265  template <class T>
    +
    266  [[nodiscard]] std::optional<T> transformSingle(const T& what, const std::string& to_frame);
    +
    267 
    +
    278  template <class T>
    +
    279  [[nodiscard]] std::optional<boost::shared_ptr<T>> transformSingle(const boost::shared_ptr<T>& what, const std::string& to_frame)
    +
    280  {
    +
    281  return transformSingle(boost::shared_ptr<const T>(what), to_frame);
    +
    282  }
    +
    283 
    +
    294  template <class T>
    +
    295  [[nodiscard]] std::optional<boost::shared_ptr<T>> transformSingle(const boost::shared_ptr<const T>& what, const std::string& to_frame)
    +
    296  {
    +
    297  auto ret = transformSingle(*what, to_frame);
    +
    298  if (ret == std::nullopt)
    +
    299  return std::nullopt;
    +
    300  else
    +
    301  return boost::make_shared<T>(std::move(ret.value()));
    +
    302  }
    +
    303 
    +
    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 
    +
    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 
    +
    349  template <class T>
    +
    350  [[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  auto ret = transformSingle(from_frame, *what, to_frame, time_stamp);
    +
    353  if (ret == std::nullopt)
    +
    354  return std::nullopt;
    +
    355  else
    +
    356  return boost::make_shared<T>(std::move(ret.value()));
    +
    357  }
    +
    358 
    +
    359  //}
    +
    360 
    +
    361  /* transform() //{ */
    +
    362 
    +
    371  template <class T>
    +
    372  [[nodiscard]] std::optional<T> transform(const T& what, const geometry_msgs::TransformStamped& tf);
    +
    373 
    +
    384  template <class T>
    +
    385  [[nodiscard]] std::optional<boost::shared_ptr<T>> transform(const boost::shared_ptr<const T>& what, const geometry_msgs::TransformStamped& tf)
    +
    386  {
    +
    387  auto ret = transform(*what, tf);
    +
    388  if (ret == std::nullopt)
    +
    389  return std::nullopt;
    +
    390  else
    +
    391  return boost::make_shared<T>(std::move(ret.value()));
    +
    392  }
    +
    393 
    +
    404  template <class T>
    +
    405  [[nodiscard]] std::optional<boost::shared_ptr<T>> transform(const boost::shared_ptr<T>& what, const geometry_msgs::TransformStamped& tf)
    +
    406  {
    +
    407  return transform(boost::shared_ptr<const T>(what), tf);
    +
    408  }
    +
    409 
    +
    410  //}
    +
    411 
    +
    412  /* transformAsVector() method //{ */
    +
    423  [[nodiscard]] std::optional<Eigen::Vector3d> transformAsVector(const Eigen::Vector3d& what, const geometry_msgs::TransformStamped& tf);
    +
    424 
    +
    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 //{ */
    +
    451  [[nodiscard]] std::optional<Eigen::Vector3d> transformAsPoint(const Eigen::Vector3d& what, const geometry_msgs::TransformStamped& tf);
    +
    452 
    +
    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 
    +
    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 
    +
    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 
    +
    550  static constexpr const std::string& frame_from(const geometry_msgs::TransformStamped& msg)
    +
    551  {
    +
    552  return msg.child_frame_id;
    +
    553  }
    +
    554 
    +
    563  static constexpr std::string& frame_from(geometry_msgs::TransformStamped& msg)
    +
    564  {
    +
    565  return msg.child_frame_id;
    +
    566  }
    +
    567 
    +
    574  static constexpr const std::string& frame_to(const geometry_msgs::TransformStamped& msg)
    +
    575  {
    +
    576  return msg.header.frame_id;
    +
    577  }
    +
    578 
    +
    587  static constexpr std::string& frame_to(geometry_msgs::TransformStamped& msg)
    +
    588  {
    +
    589  return msg.header.frame_id;
    +
    590  }
    +
    591 
    +
    598  static geometry_msgs::TransformStamped inverse(const geometry_msgs::TransformStamped& msg)
    +
    599  {
    +
    600  tf2::Transform tf2;
    +
    601  tf2::fromMsg(msg.transform, tf2);
    +
    602  tf2 = tf2.inverse();
    +
    603  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  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  geometry_msgs::TransformStamped ret;
    +
    621  frame_from(ret) = from_frame;
    +
    622  frame_to(ret) = to_frame;
    +
    623  ret.header.stamp = time_stamp;
    +
    624  ret.transform = tf;
    +
    625  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
    +
    +
    +
    std::optional< boost::shared_ptr< T > > transform(const boost::shared_ptr< T > &what, const geometry_msgs::TransformStamped &tf)
    Transform a variable to new frame using a particular transformation.
    Definition: transformer.h:405
    +
    std::string resolveFrame(const std::string &frame_id)
    Deduce the full frame ID from a shortened or empty string using current default prefix and default fr...
    Definition: transformer.h:248
    +
    std::optional< T > transformSingle(const T &what, const std::string &to_frame)
    Transforms a single variable to a new frame and returns it or std::nullopt if transformation fails.
    Definition: transformer.hpp:138
    +
    static constexpr std::string & frame_from(geometry_msgs::TransformStamped &msg)
    A convenience function that returns the frame from which the message transforms.
    Definition: transformer.h:563
    +
    static geometry_msgs::TransformStamped inverse(const geometry_msgs::TransformStamped &msg)
    A convenience function implements returns the inverse of the transform message as a one-liner.
    Definition: transformer.h:598
    +
    Transformer()
    A convenience constructor that doesn't initialize anything.
    Definition: transformer.cpp:39
    +
    std::optional< boost::shared_ptr< T > > transform(const boost::shared_ptr< const T > &what, const geometry_msgs::TransformStamped &tf)
    Transform a variable to new frame using a particular transformation.
    Definition: transformer.h:385
    +
    Defines useful geometry utilities and functions.
    +
    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))
    Transforms a single variable to a new frame and returns it or std::nullopt if transformation fails.
    Definition: transformer.h:332
    +
    void retryLookupNewest(const bool retry=true)
    Enable/disable retry of a failed transform lookup with ros::Time(0).
    Definition: transformer.h:211
    +
    A convenience wrapper class for ROS's native TF2 API to simplify transforming of various messages.
    Definition: transformer.h:68
    +
    void setLatLon(const double lat, const double lon)
    Sets the curret lattitude and longitude for UTM zone calculation.
    Definition: transformer.cpp:117
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    +
    void setDefaultFrame(const std::string &frame_id)
    Sets the default frame ID to be used instead of any empty frame ID.
    Definition: transformer.h:130
    +
    std::optional< T > transform(const T &what, const geometry_msgs::TransformStamped &tf)
    Transform a variable to new frame using a particular transformation.
    Definition: transformer.hpp:175
    +
    static constexpr std::string & frame_to(geometry_msgs::TransformStamped &msg)
    A convenience function that returns the frame to which the message transforms.
    Definition: transformer.h:587
    +
    static constexpr const std::string & frame_to(const geometry_msgs::TransformStamped &msg)
    A convenience function that returns the frame to which the message transforms.
    Definition: transformer.h:574
    +
    static constexpr const std::string & frame_from(const geometry_msgs::TransformStamped &msg)
    A convenience function that returns the frame from which the message transforms.
    Definition: transformer.h:550
    +
    std::optional< Eigen::Vector3d > transformAsPoint(const Eigen::Vector3d &what, const geometry_msgs::TransformStamped &tf)
    Transform an Eigen::Vector3d (interpreting it as a point).
    Definition: transformer.cpp:186
    +
    void beQuiet(const bool quiet=true)
    Enable/disable some prints that may be too noisy.
    Definition: transformer.h:228
    +
    void setLookupTimeout(const ros::Duration timeout=ros::Duration(0))
    Set a timeout for transform lookup.
    Definition: transformer.h:191
    +
    std::optional< boost::shared_ptr< T > > transformSingle(const boost::shared_ptr< const T > &what, const std::string &to_frame)
    Transforms a single variable to a new frame.
    Definition: transformer.h:295
    +
    std::optional< boost::shared_ptr< T > > transformSingle(const boost::shared_ptr< T > &what, const std::string &to_frame)
    Transforms a single variable to a new frame.
    Definition: transformer.h:279
    +
    std::optional< Eigen::Vector3d > transformAsVector(const Eigen::Vector3d &what, const geometry_msgs::TransformStamped &tf)
    Transform an Eigen::Vector3d (interpreting it as a vector).
    Definition: transformer.cpp:130
    +
    Transformer & operator=(Transformer &&other)
    A convenience move assignment operator.
    Definition: transformer.cpp:53
    +
    std::optional< geometry_msgs::TransformStamped > getTransform(const std::string &from_frame, const std::string &to_frame, const ros::Time &time_stamp=ros::Time(0))
    Obtains a transform between two frames in a given time.
    Definition: transformer.cpp:78
    +
    void setDefaultPrefix(const std::string &prefix)
    Sets the default frame ID prefix to be used if no prefix is present in the frame.
    Definition: transformer.h:153
    +
    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))
    Transforms a single variable to a new frame and returns it or std::nullopt if transformation fails.
    Definition: transformer.h:350
    + + + + diff --git a/transformer_8hpp_source.html b/transformer_8hpp_source.html new file mode 100644 index 00000000..418b5bb0 --- /dev/null +++ b/transformer_8hpp_source.html @@ -0,0 +1,303 @@ + + + + + + + +mrs_lib: include/mrs_lib/impl/transformer.hpp Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    transformer.hpp
    +
    +
    +
    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  std_msgs::Header Transformer::getHeader(const msg_t& msg)
    +
    15  {
    +
    16  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  void Transformer::setHeader(msg_t& msg, const std_msgs::Header& header)
    +
    33  {
    +
    34  msg.header = header;
    +
    35  }
    +
    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  T Transformer::copyChangeFrame(const T& what, const std::string& frame_id)
    +
    49  {
    +
    50  T ret = what;
    +
    51  if constexpr (has_header_member_v<T>)
    +
    52  {
    +
    53  std_msgs::Header new_header = getHeader(what);
    +
    54  new_header.frame_id = frame_id;
    +
    55  setHeader(ret, new_header);
    +
    56  }
    +
    57  return ret;
    +
    58  }
    +
    59 
    +
    60  //}
    +
    61 
    +
    62  /* transformImpl() //{ */
    +
    63 
    +
    64  template <class T>
    +
    65  std::optional<T> Transformer::transformImpl(const geometry_msgs::TransformStamped& tf, const T& what)
    +
    66  {
    +
    67  const std::string from_frame = frame_from(tf);
    +
    68  const std::string to_frame = frame_to(tf);
    +
    69 
    +
    70  if (from_frame == to_frame)
    +
    71  return copyChangeFrame(what, from_frame);
    +
    72 
    +
    73  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  if (from_frame == latlon_frame_name)
    +
    81  {
    +
    82  const std::optional<T> tmp = LLtoUTM(what, getFramePrefix(from_frame));
    +
    83  if (!tmp.has_value())
    +
    84  return std::nullopt;
    +
    85  return doTransform(tmp.value(), tf);
    +
    86  }
    +
    87  // check for transformation to LAT-LON GPS
    +
    88  else if (to_frame == latlon_frame_name)
    +
    89  {
    +
    90  const std::optional<T> tmp = doTransform(what, tf);
    +
    91  if (!tmp.has_value())
    +
    92  return std::nullopt;
    +
    93  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  if (from_frame == latlon_frame_name || to_frame == latlon_frame_name)
    +
    100  {
    +
    101  ROS_ERROR_STREAM_THROTTLE(1.0, "[" << node_name_ << "]: Transformer: cannot transform message of this type (" << typeid(T).name() << ") to/from latitude/longitude coordinates!");
    +
    102  return std::nullopt;
    +
    103  }
    +
    104  }
    +
    105 
    +
    106  // otherwise it's just an ol' borin' transformation
    +
    107  return doTransform(what, tf);
    +
    108  }
    +
    109 
    +
    110  //}
    +
    111 
    +
    112  /* doTransform() //{ */
    +
    113 
    +
    114  template <class T>
    +
    115  std::optional<T> Transformer::doTransform(const T& what, const geometry_msgs::TransformStamped& tf)
    +
    116  {
    +
    117  try
    +
    118  {
    +
    119  T result;
    +
    120  tf2::doTransform(what, result, tf);
    +
    121  return result;
    +
    122  }
    +
    123  catch (tf2::TransformException& ex)
    +
    124  {
    +
    125  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  return std::nullopt;
    +
    128  }
    +
    129  }
    +
    130 
    +
    131  //}
    +
    132 
    +
    133  // | ------------------ user-callable methods ----------------- |
    +
    134 
    +
    135  /* transformSingle() //{ */
    +
    136 
    +
    137  template <class T>
    +
    138  std::optional<T> Transformer::transformSingle(const T& what, const std::string& to_frame_raw)
    +
    139  {
    +
    140  const std_msgs::Header orig_header = getHeader(what);
    +
    141  return transformSingle(orig_header.frame_id, what, to_frame_raw, orig_header.stamp);
    +
    142  }
    +
    143 
    +
    144  template <class T>
    +
    145  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  std::scoped_lock lck(mutex_);
    +
    148 
    +
    149  if (!initialized_)
    +
    150  {
    +
    151  ROS_ERROR_THROTTLE(1.0, "[%s]: Transformer: cannot transform, not initialized", node_name_.c_str());
    +
    152  return std::nullopt;
    +
    153  }
    +
    154 
    +
    155  const std::string from_frame = resolveFrameImpl(from_frame_raw);
    +
    156  const std::string to_frame = resolveFrameImpl(to_frame_raw);
    +
    157  const std::string latlon_frame = resolveFrameImpl(LATLON_ORIGIN);
    +
    158 
    +
    159  // get the transform
    +
    160  const auto tf_opt = getTransformImpl(from_frame, to_frame, time_stamp, latlon_frame);
    +
    161  if (!tf_opt.has_value())
    +
    162  return std::nullopt;
    +
    163  const geometry_msgs::TransformStamped& tf = tf_opt.value();
    +
    164 
    +
    165  // do the transformation
    +
    166  const geometry_msgs::TransformStamped tf_resolved = create_transform(from_frame, to_frame, tf.header.stamp, tf.transform);
    +
    167  return transformImpl(tf_resolved, what);
    +
    168  }
    +
    169 
    +
    170  //}
    +
    171 
    +
    172  /* transform() //{ */
    +
    173 
    +
    174  template <class T>
    +
    175  std::optional<T> Transformer::transform(const T& what, const geometry_msgs::TransformStamped& tf)
    +
    176  {
    +
    177  std::scoped_lock lck(mutex_);
    +
    178 
    +
    179  if (!initialized_)
    +
    180  {
    +
    181  ROS_ERROR_THROTTLE(1.0, "[%s]: Transformer: cannot transform, not initialized", node_name_.c_str());
    +
    182  return std::nullopt;
    +
    183  }
    +
    184 
    +
    185  const std::string from_frame = resolveFrameImpl(frame_from(tf));
    +
    186  const std::string to_frame = resolveFrameImpl(frame_to(tf));
    +
    187  const geometry_msgs::TransformStamped tf_resolved = create_transform(from_frame, to_frame, tf.header.stamp, tf.transform);
    +
    188 
    +
    189  return transformImpl(tf_resolved, what);
    +
    190  }
    +
    191 
    +
    192  /* //} */
    +
    193 
    +
    194 }
    +
    195 
    +
    196 #endif // TRANSFORMER_HPP
    +
    +
    +
    std::optional< T > transformSingle(const T &what, const std::string &to_frame)
    Transforms a single variable to a new frame and returns it or std::nullopt if transformation fails.
    Definition: transformer.hpp:138
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    +
    std::optional< T > transform(const T &what, const geometry_msgs::TransformStamped &tf)
    Transform a variable to new frame using a particular transformation.
    Definition: transformer.hpp:175
    +
    static constexpr const std::string & frame_to(const geometry_msgs::TransformStamped &msg)
    A convenience function that returns the frame to which the message transforms.
    Definition: transformer.h:574
    +
    static constexpr const std::string & frame_from(const geometry_msgs::TransformStamped &msg)
    A convenience function that returns the frame from which the message transforms.
    Definition: transformer.h:550
    + + + + diff --git a/ukf_2example_8cpp-example.html b/ukf_2example_8cpp-example.html new file mode 100644 index 00000000..1c18617d --- /dev/null +++ b/ukf_2example_8cpp-example.html @@ -0,0 +1,269 @@ + + + + + + + +mrs_lib: ukf/example.cpp + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    ukf/example.cpp
    +
    +
    +

    This example may be run after building mrs_lib by executing rosrun mrs_lib ukf_example.

    +

    Example code for using the UKF implementation (see documentation of the UKF class):

    +
    // clang: MatousFormat
    +
    // Include the UKF header
    +
    #include <mrs_lib/ukf.h>
    +
    #include <random>
    +
    #include <ros/ros.h>
    +
    +
    // Define the UKF we will be using
    +
    namespace mrs_lib
    +
    {
    +
    const int n_states = 3;
    +
    const int n_inputs = 1;
    +
    const int n_measurements = 2;
    +
    +
    using ukf_t = UKF<n_states, n_inputs, n_measurements>;
    +
    }
    +
    +
    // Some helpful aliases to make writing of types shorter
    +
    using namespace mrs_lib;
    +
    using Q_t = ukf_t::Q_t;
    +
    using tra_model_t = ukf_t::transition_model_t;
    +
    using obs_model_t = ukf_t::observation_model_t;
    +
    using x_t = ukf_t::x_t;
    +
    using P_t = ukf_t::P_t;
    +
    using u_t = ukf_t::u_t;
    +
    using z_t = ukf_t::z_t;
    +
    using R_t = ukf_t::R_t;
    +
    using statecov_t = ukf_t::statecov_t;
    +
    +
    // Some helper enums to make the code more readable
    +
    enum x_pos
    +
    {
    +
    x_x = 0,
    +
    x_y = 1,
    +
    x_alpha = 2,
    +
    };
    +
    enum u_pos
    +
    {
    +
    u_alpha = 0,
    +
    };
    +
    enum z_pos
    +
    {
    +
    z_x = 0,
    +
    z_y = 1,
    +
    };
    +
    +
    // This function implements the state transition
    +
    const double speed = 0.3;
    +
    x_t tra_model_f(const x_t& x, const u_t& u, const double dt)
    +
    {
    +
    x_t ret;
    +
    ret(x_x) = x(x_x) + dt*std::cos(x(x_alpha))*speed;
    +
    ret(x_y) = x(x_y) + dt*std::sin(x(x_alpha))*speed;
    +
    ret(x_alpha) = x(x_alpha) + u(u_alpha);
    +
    return ret;
    +
    }
    +
    +
    // This function implements the observation generation from a state
    +
    ukf_t::z_t obs_model_f(const ukf_t::x_t& x)
    +
    {
    +
    z_t ret;
    +
    ret(z_x) = x(x_x);
    +
    ret(z_y) = x(x_y);
    +
    return ret;
    +
    }
    +
    +
    // Helper function to generate a random Eigen matrix with normal distribution
    +
    template <int rows>
    +
    Eigen::Matrix<double, rows, 1> normal_randmat(const Eigen::Matrix<double, rows, rows>& cov)
    +
    {
    +
    static std::random_device rd{};
    +
    static std::mt19937 gen{rd()};
    +
    static std::normal_distribution<> d{0,1};
    +
    Eigen::Matrix<double, rows, 1> ret;
    +
    for (int row = 0; row < rows; row++)
    +
    ret(row, 0) = d(gen);
    +
    return cov*ret;
    +
    }
    +
    +
    int main()
    +
    {
    +
    // Parameters of the Unscented Kalman Filter
    +
    const double alpha = 1e-3;
    +
    const double kappa = 1;
    +
    const double beta = 2;
    +
    tra_model_t tra_model(tra_model_f);
    +
    obs_model_t obs_model(obs_model_f);
    +
    +
    // dt will be constant in this example
    +
    const double dt = 1.0;
    +
    +
    // Initialize the process noise matrix
    +
    Q_t Q; Q <<
    +
    1e-3, 0, 0,
    +
    0, 1e-3, 0,
    +
    0, 0, 1e-2;
    +
    +
    // Initialize the measurement noise matrix
    +
    R_t R; R <<
    +
    1e-2, 0,
    +
    0, 1e-2;
    +
    +
    // Generate initial state and covariance
    +
    const x_t x0 = 100.0*x_t::Random();
    +
    P_t P_tmp = P_t::Random();
    +
    const P_t P0 = 10.0*P_tmp*P_tmp.transpose();
    +
    const ukf_t::statecov_t sc0({x0, P0});
    +
    +
    // Instantiate the UKF itself
    +
    ukf_t ukf(tra_model, obs_model, alpha, kappa, beta);
    +
    +
    const int n_its = 1e4;
    +
    // Prepare the ground-truth state and the estimated state and covariance
    +
    x_t x_gt = sc0.x;
    +
    statecov_t sc_est = sc0;
    +
    +
    for (int it = 0; it < n_its; it++)
    +
    {
    +
    std::cout << "step: " << it << std::endl;
    +
    +
    // Generate a new input vector
    +
    const u_t u = u_t::Random();
    +
    +
    // Generate a new state according to the model and noise parameters
    +
    x_gt = tra_model_f(x_gt, u, dt) + normal_randmat(Q);
    +
    +
    // Generate a new observation according to the model and noise parameters
    +
    const z_t z = obs_model_f(x_gt) + normal_randmat(R);
    +
    +
    // There should be a try-catch here to prevent program crashes
    +
    // in case of numerical instabilities (which are possible with UKF)
    +
    try
    +
    {
    +
    // Apply the prediction step
    +
    sc_est = ukf.predict(sc_est, u, Q, dt);
    +
    +
    // Apply the correction step
    +
    sc_est = ukf.correct(sc_est, z, R);
    +
    }
    +
    catch (const std::exception& e)
    +
    {
    +
    // In case of error, alert the user
    +
    ROS_ERROR("UKF failed: %s", e.what());
    +
    }
    +
    +
    const auto error = (x_gt-sc_est.x).norm();
    +
    std::cout << "Current UKF estimation error is: " << error << std::endl;
    +
    std::cout << "Current ground-truth state is: " << x_gt.transpose() << std::endl;
    +
    std::cout << "Current UKF estimated state is: " << sc_est.x.transpose() << std::endl;
    +
    std::cout << "Current UKF state covariance is:" << std::endl << sc_est.P << std::endl;
    +
    }
    +
    +
    return 0;
    +
    }
    +
    +
    +
    +
    typename Base_class::Q_t Q_t
    process covariance n*n typedef
    Definition: ukf.h:69
    +
    typename Base_class::z_t z_t
    measurement vector p*1 typedef
    Definition: ukf.h:63
    +
    typename std::function< x_t(const x_t &, const u_t &, double)> transition_model_t
    function of the state transition model typedef
    Definition: ukf.h:75
    +
    typename Base_class::u_t u_t
    input vector m*1 typedef
    Definition: ukf.h:61
    +
    typename Base_class::statecov_t statecov_t
    typedef of a helper struct for state and covariance
    Definition: ukf.h:73
    +
    typename std::function< z_t(const x_t &)> observation_model_t
    function of the observation model typedef
    Definition: ukf.h:77
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    +
    typename Base_class::R_t R_t
    measurement covariance p*p typedef
    Definition: ukf.h:67
    +
    typename Base_class::P_t P_t
    state covariance n*n typedef
    Definition: ukf.h:65
    +
    typename Base_class::x_t x_t
    state vector n*1 typedef
    Definition: ukf.h:59
    +
    Defines UKF - a class implementing the Unscented Kalman Filter .
    +
    Implementation of the Unscented Kalman filter .
    Definition: ukf.h:39
    + + + + diff --git a/ukf_2example_8cpp.html b/ukf_2example_8cpp.html new file mode 100644 index 00000000..1ec3b8e5 --- /dev/null +++ b/ukf_2example_8cpp.html @@ -0,0 +1,234 @@ + + + + + + + +mrs_lib: src/ukf/example.cpp File Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    example.cpp File Reference
    +
    +
    + +

    Example file for the UKF implementation. +More...

    +
    #include <mrs_lib/ukf.h>
    +#include <random>
    +#include <ros/ros.h>
    +
    + + Include dependency graph for example.cpp:
    +
    +
    + +
    + + + + +

    +Namespaces

     mrs_lib
     All mrs_lib functions, classes, variables and definitions are contained in this namespace.
     
    + + + + + + + + + + + + + + + + + + + + + +

    +Typedefs

    +using mrs_lib::ukf_t = UKF< n_states, n_inputs, n_measurements >
     
    +using Q_t = ukf_t::Q_t
     
    +using tra_model_t = ukf_t::transition_model_t
     
    +using obs_model_t = ukf_t::observation_model_t
     
    +using x_t = ukf_t::x_t
     
    +using P_t = ukf_t::P_t
     
    +using u_t = ukf_t::u_t
     
    +using z_t = ukf_t::z_t
     
    +using R_t = ukf_t::R_t
     
    +using statecov_t = ukf_t::statecov_t
     
    + + + + + + + +

    +Enumerations

    enum  x_pos {
    +  x_x = 0, +x_y = 1, +x_dx = 2, +x_dy = 3, +
    +  x_x = 0, +x_y = 1, +x_alpha = 2, +x_x = 0, +
    +  x_y, +x_alpha, +x_speed +
    + }
     
    enum  u_pos { u_dx = 0, +u_dy = 0, +u_alpha = 0, +u_alpha = 0 + }
     
    enum  z_pos {
    +  z_x = 0, +z_y = 1, +z_x = 0, +z_y = 1, +
    +  z_x = 0, +z_y +
    + }
     
    + + + + + + + + + + +

    +Functions

    +x_t tra_model_f (const x_t &x, const u_t &u, const double dt)
     
    +ukf_t::z_t obs_model_f (const ukf_t::x_t &x)
     
    +template<int rows>
    Eigen::Matrix< double, rows, 1 > normal_randmat (const Eigen::Matrix< double, rows, rows > &cov)
     
    +int main ()
     
    + + + +

    +Variables

    +const double speed = 0.3
     
    +

    Detailed Description

    +

    Example file for the UKF implementation.

    +
    Author
    Matouš Vrba - vrbam.nosp@m.ato@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz
    +

    This example may be run after building mrs_lib by executing rosrun mrs_lib ukf_example.

    +

    See ukf/example.cpp.

    +
    +
    + + + + diff --git a/ukf_2example_8cpp.js b/ukf_2example_8cpp.js new file mode 100644 index 00000000..721ab78d --- /dev/null +++ b/ukf_2example_8cpp.js @@ -0,0 +1,45 @@ +var ukf_2example_8cpp = +[ + [ "obs_model_t", "ukf_2example_8cpp.html#aee654ce22e33b09c6661f26354647913", null ], + [ "P_t", "ukf_2example_8cpp.html#a2e6c44a337167abef6c8358ec879babc", null ], + [ "Q_t", "ukf_2example_8cpp.html#a48a3b5d352fb2b050710720c67f14bf5", null ], + [ "R_t", "ukf_2example_8cpp.html#a0eb6584c89962faa4a31546f3dc59228", null ], + [ "statecov_t", "ukf_2example_8cpp.html#a1ca48b74ebe6b20239eb737cfa0fb1e0", null ], + [ "tra_model_t", "ukf_2example_8cpp.html#ac8c529530a49c5c7851f3dc33de33f15", null ], + [ "u_t", "ukf_2example_8cpp.html#a37f1e01ad571bef8f44e01ff29b8ef6a", null ], + [ "ukf_t", "ukf_2example_8cpp.html#a2635db3a96f0b457abe21cac4669c4a9", null ], + [ "x_t", "ukf_2example_8cpp.html#a8470a3151c8e60cd2d8b634068a10665", null ], + [ "z_t", "ukf_2example_8cpp.html#ae2e2918bf1c1c46e7031e414d13d3b6d", null ], + [ "u_pos", "ukf_2example_8cpp.html#af4cfed65720084d0bd14a3d413e1dcf5", [ + [ "u_dx", "lkf_2example_8cpp.html#af4cfed65720084d0bd14a3d413e1dcf5a7d974952f0e878cbc8d0576f49892b04", null ], + [ "u_dy", "lkf_2example_8cpp.html#af4cfed65720084d0bd14a3d413e1dcf5a9882f4765a1cde48a725304736906a59", null ], + [ "u_alpha", "ukf_2example_8cpp.html#af4cfed65720084d0bd14a3d413e1dcf5ab11d48e78f42e7cbf42ab7d09dd53403", null ], + [ "u_alpha", "ukf_2test_8cpp.html#af4cfed65720084d0bd14a3d413e1dcf5ab11d48e78f42e7cbf42ab7d09dd53403", null ] + ] ], + [ "x_pos", "ukf_2example_8cpp.html#af66fc452d7243bb3be3e0dec10c684b3", [ + [ "x_x", "lkf_2example_8cpp.html#af66fc452d7243bb3be3e0dec10c684b3a73f2def2a7f99112d90954c4343b9341", null ], + [ "x_y", "lkf_2example_8cpp.html#af66fc452d7243bb3be3e0dec10c684b3a19830385ee6cb72a377bbb2680bb48f8", null ], + [ "x_dx", "lkf_2example_8cpp.html#af66fc452d7243bb3be3e0dec10c684b3a51fd194b0acf678a00fd40d662dec461", null ], + [ "x_dy", "lkf_2example_8cpp.html#af66fc452d7243bb3be3e0dec10c684b3ae7ae62baad83c4d51fd304977c5bb5fa", null ], + [ "x_x", "ukf_2example_8cpp.html#af66fc452d7243bb3be3e0dec10c684b3a73f2def2a7f99112d90954c4343b9341", null ], + [ "x_y", "ukf_2example_8cpp.html#af66fc452d7243bb3be3e0dec10c684b3a19830385ee6cb72a377bbb2680bb48f8", null ], + [ "x_alpha", "ukf_2example_8cpp.html#af66fc452d7243bb3be3e0dec10c684b3a3e43122a748ab55aaf12a0ab4acc33ce", null ], + [ "x_x", "ukf_2test_8cpp.html#af66fc452d7243bb3be3e0dec10c684b3a73f2def2a7f99112d90954c4343b9341", null ], + [ "x_y", "ukf_2test_8cpp.html#af66fc452d7243bb3be3e0dec10c684b3a19830385ee6cb72a377bbb2680bb48f8", null ], + [ "x_alpha", "ukf_2test_8cpp.html#af66fc452d7243bb3be3e0dec10c684b3a3e43122a748ab55aaf12a0ab4acc33ce", null ], + [ "x_speed", "ukf_2test_8cpp.html#af66fc452d7243bb3be3e0dec10c684b3aa7e2945a84168a1e2f80c386acbeaae4", null ] + ] ], + [ "z_pos", "ukf_2example_8cpp.html#a333f210bb9cc2047487bc6ea732e6084", [ + [ "z_x", "lkf_2example_8cpp.html#a333f210bb9cc2047487bc6ea732e6084aab5757870b95e7a22683c18efee6ca83", null ], + [ "z_y", "lkf_2example_8cpp.html#a333f210bb9cc2047487bc6ea732e6084a53109a343e0ef48e39be85965b69f609", null ], + [ "z_x", "ukf_2example_8cpp.html#a333f210bb9cc2047487bc6ea732e6084aab5757870b95e7a22683c18efee6ca83", null ], + [ "z_y", "ukf_2example_8cpp.html#a333f210bb9cc2047487bc6ea732e6084a53109a343e0ef48e39be85965b69f609", null ], + [ "z_x", "ukf_2test_8cpp.html#a333f210bb9cc2047487bc6ea732e6084aab5757870b95e7a22683c18efee6ca83", null ], + [ "z_y", "ukf_2test_8cpp.html#a333f210bb9cc2047487bc6ea732e6084a53109a343e0ef48e39be85965b69f609", null ] + ] ], + [ "main", "ukf_2example_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4", null ], + [ "normal_randmat", "ukf_2example_8cpp.html#a1aa37976011a3b2fb4c2af6d82853687", null ], + [ "obs_model_f", "ukf_2example_8cpp.html#a2f2d91655b6f61b5e4dc53c95e10d710", null ], + [ "tra_model_f", "ukf_2example_8cpp.html#abc7dbaca2f835f1baab605fa3faa01a4", null ], + [ "speed", "ukf_2example_8cpp.html#a71fd37308050cd439537c5c6c2cb4614", null ] +]; \ No newline at end of file diff --git a/ukf_2example_8cpp__incl.map b/ukf_2example_8cpp__incl.map new file mode 100644 index 00000000..3a7919a2 --- /dev/null +++ b/ukf_2example_8cpp__incl.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ukf_2example_8cpp__incl.md5 b/ukf_2example_8cpp__incl.md5 new file mode 100644 index 00000000..b633c2c1 --- /dev/null +++ b/ukf_2example_8cpp__incl.md5 @@ -0,0 +1 @@ +b915c9a451a0fffd61820b131622eece \ No newline at end of file diff --git a/ukf_2example_8cpp__incl.png b/ukf_2example_8cpp__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..803af7b94b42ad290f2344423bcf34217444b334 GIT binary patch literal 20044 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

    V@}6MkuIY=lrKM09jC z_U_#ai9~{$ni>G+^XPlIZK?hVA(kg#%sx+NRjE|y@9#%SN{ZFSeDvrM^7HdeE)QC- zvuDr3#l;2X<>eNL%)WfN#jU;GVwLY~{rzv{+-_@YLsV3h$?<w-QBo&@gnl_@+{K#YA(4WWGkZFCS>bz*c0>sAT>1=B_$;|efl)q-Q98I z$PrXjR9K{MnM`Jpeh9HQl-q=CJq}&$#bPlU8X9aJ1|ftHvZ)+;H$EYR5aI}^*b_ns zAv{OLo)AI^;W;Yygb+dq&)NM6dMcI5)*+BZbUGbP!ee7PosPB*LddGweX;NF@3(ab zWEnm_KDG|Qp=q^R+BOIwt7f+|=n+B)A;cmadj>s12qDA~P_ZY35JGs4iajBO5W;g* f> + + + + + + +mrs_lib: include/mrs_lib/ukf.h File Reference + + + + + + + + + + + + + +

    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ukf.h File Reference
    +
    +
    + +

    Defines UKF - a class implementing the Unscented Kalman Filter [4]. +More...

    +
    + + Include dependency graph for ukf.h:
    +
    +
    + +
    + + This graph shows which files directly or indirectly include this file:
    +
    +
    + +
    +

    Go to the source code of this file.

    + + + + + + + + + + + +

    +Classes

    class  mrs_lib::UKF< n_states, n_inputs, n_measurements >
     Implementation of the Unscented Kalman filter [4]. More...
     
    struct  mrs_lib::UKF< n_states, n_inputs, n_measurements >::square_root_exception
     is thrown when taking the square root of a matrix fails during sigma generation More...
     
    struct  mrs_lib::UKF< n_states, n_inputs, n_measurements >::inverse_exception
     is thrown when taking the inverse of a matrix fails during kalman gain calculation More...
     
    + + + + +

    +Namespaces

     mrs_lib
     All mrs_lib functions, classes, variables and definitions are contained in this namespace.
     
    +

    Detailed Description

    +

    Defines UKF - a class implementing the Unscented Kalman Filter [4].

    +
    Author
    Tomáš Báča - bacat.nosp@m.oma@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz (original implementation)
    +
    +Matouš Vrba - vrbam.nosp@m.ato@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz (rewrite, documentation)
    +
    +
    + + + + diff --git a/ukf_8h__dep__incl.map b/ukf_8h__dep__incl.map new file mode 100644 index 00000000..17475939 --- /dev/null +++ b/ukf_8h__dep__incl.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ukf_8h__dep__incl.md5 b/ukf_8h__dep__incl.md5 new file mode 100644 index 00000000..bba8dbd3 --- /dev/null +++ b/ukf_8h__dep__incl.md5 @@ -0,0 +1 @@ +bb15f9e9d557198366ab3464f9a1e3c1 \ No newline at end of file diff --git a/ukf_8h__dep__incl.png b/ukf_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..971aad0b8e71ff1640992d1714cf512837c4067a GIT binary patch literal 12790 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 RC=3FTlTwuY@zyZ#{{eD^$s+&& literal 0 HcmV?d00001 diff --git a/ukf_8h__incl.map b/ukf_8h__incl.map new file mode 100644 index 00000000..83464ff3 --- /dev/null +++ b/ukf_8h__incl.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ukf_8h__incl.md5 b/ukf_8h__incl.md5 new file mode 100644 index 00000000..59d0621f --- /dev/null +++ b/ukf_8h__incl.md5 @@ -0,0 +1 @@ +a4ea7977f7e979f765d1a2e740205b09 \ No newline at end of file diff --git a/ukf_8h__incl.png b/ukf_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..c3ca29f09119f2729e15205751871073ce5e0358 GIT binary patch literal 11828 zcmZ{~1yt2R7wCH^0qH)H(gK2XcXtRV(jnd5CEeZ9ASIwGFlzU~MltvxFHzp9N!!*WsoeKu{=yCu0&hDT6K8c5&44A2`XRoM;u{8${o`OC-p~)|T;5GDCPoL|}6>-|5*|t?!*14IN!qU*9u4I>q=o{a5%@ zuV16r*4DmaU=XX;Z#y27p~zRt;vRQpF=$7B^X82MFDW7tQoc&Au*dZ=CApASFt_cz z;Z(V1lk+wv6*aY*wsxdZcc{_aH`7%I-tqN|)6*{4jz52nCSZD(S5t$XkdWYUb4vR; zI~#|TG`dQ!mGNN?UewBpQCwX7cw-Q6c42{&&@B>#7H%jv0;&&_5Uc2qCy zP)~Y^3|5Cym>>b^>ClmMHiWaS(Fy_+FE4%|5xT3^cZ5^m7?MPu?(xtFUw4cZ%CLEz zTi7f%;b=}Y+Jlcca-l9T)#3Ws$Yp;TgU5c^<}IIr-wiD~28QF#A4;3~I@A*7?8Fc4 zo@Zts&CLET*#DH0ltd&YBdfJr;@8NPe>~kBKEAw6ZEyEDp-O%I;ZvbZTvu-|64Se{ zqF^77XSq*?SBFcm<6zNkda3?vFo~Yc|Ivq3#Eus2il|pZs=%4EIkJP z4^u_!N!vip(goaEfDqYSc2vJ=*FO&l32`M?F~P^je+iDdQm3)+i&B=MjZO4u7LQ3+ zFzWHuRe!Vd_6D6r-s6$>2blgPb##cj94(VcOG|rfXS=IvX@%e4`)q7%tb$Ez)mstp zyX-)mot>|5ZWummKvr+gwq+F+d&Y|ujBIUV+z#fAIzJ(eZ#FkKH-VQEe!MoRvt1zk z^5u(GlLI9?2gk|zt~#Wn;(c{|ax#tjSr)G&6*x&FW8+V1h0k z+@9|S$;6Ql_TXY;2jmEOe;VHW)W6=@(E$O=v2t<-M@69#vgpqCsC;WUS?}*&S|S4j z>B7GJHa0fcBqTc9C!91~Tm%ZKuRG%@C2CxD-#Ro$7WcKZTWjWRVTw=o%+G7zwk9Ot z1PqCkoSmI@ZaR%s=?N4M4~&k603BBRFm;ucl7f`S9x-|Tw-?Q2ZxVH;N>2jlwIR?q z9ybXI3FwO#gPgrkV&Z}yKXlFf8yXtMR~8yiq^a{X@QzI=s4cxE`9$~-VIAnNJKM=tCW4y2P` zPylaS3k5Q=eygtFi;IhkO-L9zGNKqRNhM2z`@`>n7&k(a_D;m@AJlH8JqGxw;IJ@i z9v&hDWXxo5!3$qMO%FkG;fHf|UOqmf-SJ{4JkJy$T%()QO-8=hzC7Tr(ZHV2=;`Ud z>Nev}l&Hu!Ik9_P9WuKwVF_PD-~%Cnfq`0WUR=*Gh-tq2JltMjKM(OZYP+iOy0D5S z7t%Jn*_*0Z+t~?EVR~;2>}9sunZ7Uj1%hyHoPhgb2k?4sZf=Z1!tU5Kk zlKJ?NX1dw{3l9%3<=@K63Wbr85ehnb&)j$OTHq11baaM=azcfFGLm8dgiW7-v4?H8K@T3t5@L%sv6>HaocCVMZ#iYFo2DlE|+9- zQjTir>V6)|;-4+D??+JWr=%R6fAjOcVC+=?hezP}!RE92C6Uk6q)QDY5$K+*BZ8owp2n8` zK*#LICdH({m5UHx$VhMM03)Yo-J0Y{?La7Bxza-(6{saK^~zgiY0z2pyn+V?JU;U# zppeG}v6*-ooo+O;S^P0dNxQl`;=#ssLW!ezLJJLzQK7V+mNZ&vSK#%3qzpyh{c_rL zP5^?di^jWml(FP(u?Bt-6586r%U%^i?bpWe@bI@CBZ@Z}TYFAN%g!zb^V0c<7?AhX z?|vDynGU1Mk3R?M5{~KlpdBpo^dqXY6!HGy3Zc%*^qK$Dvd5L)8xVFI*2qdb9_}(6 z94$Q}r}l=1rDT=;;2^S!BONzqSZnJOdSq+6WZ)LE6R@#C6dtYEvDW?mB{s^~Pk*BO z(_ z-L)n>I4@qrU0;{%Ob$MC-a_xGv&^Y!wC|Kx6koIcXik*xY`zfszH008fD;OJpv0AX zNvPoP^yvIq;0n7t^g>m==r#y;VUeUVijP0WS5rg1K4{#Jm!*Mn4H2xZQ5dgwRDGQh zR98RiWJM<>(_yGv8qKm~ujV7gk!)3x&0SZ0Fx!})sra7p`|A*uvfhbKS6$J>24>1YQv%jnxsu*&PQ zQtb8no3QXm`HsP)2v!b`(4Rj^y1KSHdZli{Cd(zPtb}cBUgNiT7nPQxzj*P+y6yKS zd=@uZ|M8koDYqUL5U<5-q0C%(c({zmwI)7(vSCL+)%Byd8$TSu#orLf!TblFAI4mb z_9cUDN4ns(laoWfn;)5M4CItQS36Qoq?1I@Z)5B(Q+LNENC}7{N*b%m=K7+1(ew2K z!s=>=GQFWX5Nzl4yGQl@eWx=s;%gsrM#i4{RLy#&IOv*q{VqRjkr-UO3CCkYQlM;@ zwOXzGa9LFJB`9P94euJF}K1;%r8QsI%2 zX}gH`8%d7ooMmsc>sU<$1dCx`JMle9d||OE;dzAQ+ifSzu&B{26~oEW9R3@Mv=(5W zl1M$qs4ND4(Lu=T4ttYi;1Xke@8N!bK4H_;!pP09lGWz(;ZrK}C`p^2TLZ+?vwDN2 z!p46)uRuH+XeF=bDP~`+uYy#<9!!+4)&`SEN%@>GaBybga}A>55L%4yF3XOu+{0?w zau1F*lwV?Z4Gk5I?XR??u$*Q7-tO$_!JeL`g9`tk2kO!_Rtqi!7RASHGowhr{P2PK z1#*}luB~?R_VfvV%FZVEqPQD&wQ@DRFG-ExE-e)TO-+qa8RzCEoNYd9^G|e8sIxQ) zk&5!`+@GPcS>#oV8T-%9INxg08@ilhXlR79dDSsp9%O|Xb$bQ$PdtT@5)h!miRNdz zT<(0u1^$%H&&S?oSrGN%mch+DNEo;U zL+Bb?yWq36V%QTjoR^wC&P+gYMu`w<1$a1MyqMIgtUS%Z` zJi^KsWl@4MuWymxob{t5jVp6`bh3cB`QI??A{7+i9`9GbSJlwCp|RaV)MzWutov5K z8u>h8T#0TJmDaK#DKavc*X3f<}|h;q6by%*@H1yUJ@Od%wHIOJ7}H6!pI1Vi~O$NEYD??1M@WUWgNKN!GXcl9s(Kp30c8Y{GslxYAIwR7i{MYCZDGmx|iD0OwP0Hp;7*eyo>0+-n>m zF4t02MB3ZCSyNw3vjj{5_3z&taG<$tj>Z%=^Y~gvEylHoX>UZTE@^BfqA8AIms-s` zr>68JaPX9NXR7gjw6(6z*C%T$k%^iL)KgK5Iy*%|0{-I;mPVu`drWRlsX+h_kNy$+ zTi6@9ukT)aU&u2th+3wKlIkz<=~)yTkh0B+Fu~*Fq0WYKh~wNcaJ zTQSia#-zGR=A|W=rDidN8XaHElpK%plyt5+bg%}fYQ-keAH95;hXn!I2E6&N#U$kd zdvo&;U~y{?S8Z!Mvyq$BFEjtHtp$q(ea0cWlKf%|Lc`yKMghjU>bg1~D9Kq_vjiMi zJb$KI3I*eVfQ_vYk~e>#L3)2WOzU!J69mE+HkmI10f8~h`S{*#8O_#^%a2kky3Ay9 z`9THT!bZG}*${YmdigPOg@z^iV=K!zKERgD`1A>PNd`%6ez^c7Q=d6*MepRdfRr4-4nt0me=lM9b@ zc^@4}>+7@i7~eE%yns5exmt!Set+nQXY!@_-IFGkYhUAIz37Vf$MZ$#qcmw-_v8-*T8}Bst@%;L_kGI zF=f`2yXjS&UV^y!J14n_Kuk_ME}|Frs}5023KKQB>3!VNDaA@dBjv|0+1d$b*_)dn zFO+EoKCh|OUDaa2`zj|0MC`daWu>uQdQA28p_uUS4v@9YMTV84gqegBGW!^P+?d?4 zrAdtR_w&Yx*x))n#SAh^&JxgCf=56Ach9m^UzHre7iwy1R&$Lk9IO@?Bw1JSN#C)I zYxBkyPCT|)Ic<>h;~(Xd=miBy)xS(0qLqJNXB8CGt%Sq57#evkW@q=}+J^=Fprbdf zp7A~146LV9jUp`~3b_5V@Svsj^z?*fa#n9-W+bJ*ykvFYS&}cI zy3mZ?R~$cO=ck;P)Z^OOBPAu>(T?w4d8$9p2$S@@ptZD0q6>Z%ja#<`obG=!81cGv zeHu$ZoPt9_rkWQ496-h*w>f{r*E2}anx!L*VzXZs1X)}6)KvYnlTuIh$hN{>$)2?s zUb4_OG5?py$mb)OTxf)ZgigObZSNJ!C!%Qdk{amcxwCm4;T;_v2S!GEU}P#j9%5o* z($Gz1Rq(Gq4{K)J|LM-4r@x@QGc{_%No&(AiAW4-lXLc}Oe|&Nh7!raMOUm~t zTfn_*a1a%sMkuERw%uaWSdquZLxkJYqc1u!CrWB+>dr(77Qg^B-v#ODo&jWukj8YE zker(OH`{%=v&nHC+*ja5L_`4bb7=j^7#En0c0=Y9sxJ-?549TY$U-qlo+&6O zz(87wO0M0p^U2v+_tV45lhM`TkQj=lh%1-7Viq^XOtnG(XFlhSHHX#BO(X~mJ6Kq} zg0U!TYiq!wD7m;a>Dn__Y?b8Xg_hI*2 zbTm5H6Fwo~^t|%&h4#ber}GJw&D8fRH?ykuN_@g0tXzOJa5ybjrDbK2Ow^jl&{0wb zdS2`iZ~%(i*VXkYL&RS=DL3~w4Lv;vAOMPzlEEX~;FpnNg*0e_Y!9HiY(B!d5iv2Q z!Qzy7L`3~xwQ390Hod*P*u5|Rm7UeY7A}xN+gfaPjuw4s*kCi)rKPRS&d0|$?)nUi zd_+=8N^a(9GtD6V>(|$P-Q7VS06wF}jrcf(A0assL&B2|B+nX#NmkxyBPEg*I^^K& zYyt>l1|Vzfw6wG%K(J699UW<^1kURZ%=$mlZ&rh_imKPw*I!Um7xJ$kEi}IQ?tY}7 z;fsif$lBiCt|%}6oEjS?eRDXCqs{xutjD;PvwaT;bg0Kb&(QEC9u!*ohkI}NXS*I+ zId3ir<9D+cTqZS*jpn~T^HJ-i=H&c>7y>n9Sn~Isu^x49{}TGEKlHEti1|D=MA5^e zY0;F?`Va*bRcxi**T~K;HiN^wps5LX`hTJT4vp1YzelGK{_)P%a4?Z}XXU2|fIHVd z!T_oQx`hfX%meraK-S8iV*%(H92bZ6nwh!QYKjrYd-?f^MNRQU#l_*JV~A<>00p~) zEdgBE2>@(>8V>%8>tD|Y=7@rc*;i}QzsKClkgFtN8XOv0VDQtAm5Zwvfb#gHq#!`u zcrMm0>wuO>%E(Xynysv?TvJ!qGhL~30`T%;tGh~z{>9Nd@`k@Nh`z0a8jd~}DIe5L zj7!V%_v&-IO+jH;7;{`?t+ zkbUk?`j3x~JAfiM-d);ihJ-0+^G|tYCnUf@K(a>j43iWEEs6)L|NgiCBZ9iR`fL3k zT4t>S1G4A46UbXzTY!?IU|^&imas(namO%pPhXCH+^3_XgQ)JGX@&u#f`|M&I4B;a z6(q-!l9KYc{FmXe1s-lmebSI4%X-q zm5bl;bjxbd+y-cSEZ@ImvZbe|573MNQE4v>wCZb?&)b`J_Z#L z4Gj%t}?mSk&{j3i;2MnT1fd4hbEJTCeygqyG_+iMVX#$y ze?0lDHvgK$+eay%OU`Q`p0cK)A+)+0B>xtHWCCt4si@$=aWc+5eL_O30eHX8dIl31 zcvl1-y`hOo(Cn-haM*b!{jv28YfjCx-_7Id=u8X^13*wP2B;jSqTfu1SwU4QrRRMy zm}m7y0*C2+RS&2h0KQJu*1Fyih_JKVCg9`iYh-O5wYq9Jk|U&3V(&aoH}An*S}~Hj z(R*C&|9}Rn14`P^{Zc6} z#@&5~-Bk}w)7_xvMG!l2q(Q=Z1sbQLdstOuM1NLEv``q*vaFn z_j|&^mDQm5CF=}hmEv_!kch&eUq2n^?=QlD5d4L-5x>#eTEd#;6iixB{Eix6xk zKRnYz3s$O6bh*1cz=1*sq+fe6b4!fz}6p1t6{T^hKkPb!qS~Z#2vDL}Ac;y-uWFtCFdjLxX*8 zWERf^>&F4YkxYV6z)u>wsb3drbG8Eb#vq&17lM{+c(m*}@QdYB^${j)-u{gG z9A;ciu+`W^p6G26IuV+nz zZa+Oe?)dJgv!;Q&_v;5ED3_H0c&FVBb@6cHQo>PT`SBvP^3cz@!fo)%%G|J14aF*< z+`f&r8k+|dAGL6hxVRnVg#3KGg;rIiNc=*^ECR#eD`3NxiHA!}VW0c^syYV}z~J3Q zAsGAw1_9bti!3y$@Rw%u3x#E8S@z272aP|$!~C)T9Y-Z0LHnw=A9j8Ho7Mc6XmE%g zY%~&#hJdHb04c2Txq*}uU_2#1AI@y#ST|lBGznlV!FmCtb#*u6&vY8cSJ&0~ zHtsKNiJhu!O9?A|!6C$y50#9dyr>D`0H=@(iRWm5Jsb%aywMDSUn7Fr84(O{s$hP-kg68`U z4^!}OrZPJW+r-jfn^JO_7BM+O2er=I-n`zICg*#b0h_~d03OGnpxsdn4KdDQs@SVB zYqtVOr(L4MBk*tWhMYxDJ4&rk_sMg}b2G>}Dsl)+I#T`bqzd1=R3Hit^UHn}5xs!M zt7kByz$YA!ch&^&aS61eE+-}i38v{yO)6~ehoblQ&KH#1@D1G)mSDSn0K5Du72fcf zDzD}ByXO`ZVv=DK_D=10^WYD&8fyV(KgMTfrYZ4Dq_@FV9RPfEiBKCcnD%=mkAg`- z|DE(9H1ydx^0pnw`2qJf+4 zyA9L&%_%_oIzakulhp?F zl9E2J$ee_|FMp3Z4czoo$QZ8ot-oT#m0u~;uCrTX)o4>~4hT4MxUiBB+IMUw)&1E{ zZac4K`LcZL;PGL5wtku7M=?E%WUU)3%xL+C z7z)a@2!JrpTHQuJ3J8v)Bo|E?K0PXEwcYYST>a}vG5=KO;uRE1a1uc~zngnruZ8_| z+!)ZDo%>+a2~RPSzJ>w#?m~WSeqRL^7qfv? z6+e7H;&<2AtYFRob?HCxQO(ZC)VvO#699OjrEe|x)$FWUYs`;r5P*ST(Ko+RgVigtZ{U-4@b z&@6ydYAwcCN3wXJgoL+e6v@J4zrHJADQ0e{Z7(4Tk|Rrmxs@PRB55~rKbhmNdj$ta zcjQYr0{wiWKPj|vKVIB_{Wt1~ie}?|j2PJVxTY(2dELgM2kJZ?D~r*8$^?onCN zf}S3)o_z|!vNSDFRv4~6BSmC9dUG^gi4jYVA-zAnMI0Ud>QiD}W_l*EF(|`0y}<=u z7>C;H8#aOEKo;fpevR*)hVIXtNUd>qdw+8Wf?9va_RnS)fM%3)eiXV!@N;n)*a`XwgHSz3 z&F_WE)w~OlAGhN4X+j$riT=2Z7XelLJeyV=9$o-yLSGa;&yvrQlSy^kZV?Fxz749p zPF4teVJfhFC08-m6VX;o z^feF;3l7eA?_h*-o{5W#qCak>oChwd7x%NUFA;^GN5GV%o`yzfVj@o*@%l*@rG2 z4sBdSiL@*fM1nIPm8ETQAG{g8`&nf$zfw*IIOA3k&rgwJjttx^~@M{;p1rj)9ex%oS`q?3I;r?@vxn zj06xu_QU`?)jH5q4joy8blFA7@?R4%cWmlxbpiy3RZ0H zBUGx4--;XHa#|9D@Ew!NW21!?lPWVA#*g`b*6H6y0lb4rE;!%@MI3!C=k4i9`TBMA z0V@h+(bzeoT-*zeXQY@V)4#!$8x8^xl$fe&eBZj0n;VGFpA~&Tp13nvhG#aC9vB>q z7}GE5qCV9unTgdVKMuhrCVn1j^wCc`8rrEX2(Zel*RO+1N=g)cK;r~x3zG!N_}ali z%+8L*v@uOf{uX!;xlLjGqHJz4AtNIKWZ7NgHaV%Wd-?y1gHjnd{wG2$^CE< z6*PFHXJi=t$rA(ADb(eI#2sDv+Tmerz4c62e?Kxnc%VRs0#c1*u#v9mX+qoiy3Vg3 zzN@MpZ{fVZ@U;*4*IX3)Fq52|tZ~$=#2GyHc5ZHN1awB>&zph5zoLbOMfR|ekWhw@ z_ob`>7L+w0gWHxkDJiL2(DO7HKzj;=fWgsGQ)s9W=rn*D7#Pse(uUxmAdY~hsSI%F z9LBZjM$k~l|0|@C9fl>=cmxER_CEd(7eojFp2w?!Bo$6KD>}!=0c^jwIjlghKL_`F7w?@tY=s>G?@e~t-17a8$h;QfS;xdhlj4V1CR2Ux| z97KoEadW@hby9!(7RtfFvD-4mWwsI{Cf5QmkR6Ov6;At;q-0U@2X@(V3QcB!M$xi2sbQvNo4(Qn&Rze7~{ibyIH(pW%Cp|pbotCO=cC`*5us(7!ECh&i!7e6{5 zqW%{aaY}oyq4AP|0Tspz0uhjFoVS$$BP|{l0zD_wUq1x($59mi&xS4Wd~DE{wd{qE|5H|dM+Jlp;a+R?%Q;@RaNN)`YL58A7`XJ&|)wd*>-X<_5w zz=3AP;wzR0)oeJ(g}=RPwnF*5$e5kBNNycn3F8AGhO8!i z=ot&CnO2~e3{;Z4K-;7Sc7|J7W_caoC_P4v`;QhMmTVFKoUNpHi9r4YIN)Vg{O&Md z+zDt7j7tJ+twehl8xc`<^;=z>IO7WA=;NOBo zU*N_nK8ghYX`cMSwNJBDuE_*CGlKu)%auo4nu7r70Fn29gAS0W{O?-F^vV*b-g-7j zymXqKovk7JB)z${HQp?%m0wSdIXpZJ8kA=-gC;v?XF&r-Du{nL00zEdVgh}}*`V|w zHG%m`%sL75QDehuDcF_&2UvLqp_;?|ge@NK^Mv*84rz`gNQ4-)fkWh^lqIXg4L|)4 DC@A}) literal 0 HcmV?d00001 diff --git a/ukf_8h_source.html b/ukf_8h_source.html new file mode 100644 index 00000000..5c1334f6 --- /dev/null +++ b/ukf_8h_source.html @@ -0,0 +1,246 @@ + + + + + + + +mrs_lib: include/mrs_lib/ukf.h Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    ukf.h
    +
    +
    +Go to the documentation of this file.
    1 // clang: MatousFormat
    +
    2 #ifndef UKF_H
    +
    3 #define UKF_H
    +
    4 
    +
    11 #include <mrs_lib/kalman_filter.h>
    +
    12 
    +
    13 namespace mrs_lib
    +
    14 {
    +
    15 
    +
    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;
    +
    44  static constexpr int m = n_inputs;
    +
    45  static constexpr int p = n_measurements;
    +
    46  static constexpr int w = 2 * n + 1;
    + +
    50  using X_t = typename Eigen::Matrix<double, n, w>;
    +
    51  using Z_t = typename Eigen::Matrix<double, p, w>;
    +
    52  using Pzz_t = typename Eigen::Matrix<double, p, p>;
    +
    53  using K_t = typename Eigen::Matrix<double, n, p>;
    +
    54  //}
    +
    55 
    +
    56  public:
    +
    57  /* public UKF definitions (typedefs, constants etc) //{ */
    +
    59  using x_t = typename Base_class::x_t;
    +
    61  using u_t = typename Base_class::u_t;
    +
    63  using z_t = typename Base_class::z_t;
    +
    65  using P_t = typename Base_class::P_t;
    +
    67  using R_t = typename Base_class::R_t;
    +
    69  using Q_t = typename Base_class::Q_t;
    +
    71  using W_t = typename Eigen::Matrix<double, w, 1>;
    + +
    75  using transition_model_t = typename std::function<x_t(const x_t&, const u_t&, double)>;
    +
    77  using observation_model_t = typename std::function<z_t(const x_t&)>;
    +
    78 
    +
    80  struct square_root_exception : public std::exception
    +
    81  {
    +
    82  const char* what() const throw()
    +
    83  {
    +
    84  return "UKF: taking the square root of covariance update produced NANs!!!";
    +
    85  }
    +
    86  };
    +
    87 
    +
    89  struct inverse_exception : public std::exception
    +
    90  {
    +
    91  const char* what() const throw()
    +
    92  {
    +
    93  return "UKF: inverting of Pzz in correction update produced NANs!!!";
    +
    94  }
    +
    95  };
    +
    96  //}
    +
    97 
    +
    98  public:
    +
    99  /* UKF constructor //{ */
    +
    106  UKF();
    +
    107 
    +
    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 //{ */
    +
    129  virtual statecov_t correct(const statecov_t& sc, const z_t& z, const R_t& R) const override;
    +
    130  //}
    +
    131 
    +
    132  /* predict() method //{ */
    +
    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 //{ */
    +
    153  void setConstants(const double alpha, const double kappa, const double beta);
    +
    154  //}
    +
    155 
    +
    156  /* setTransitionModel() method //{ */
    +
    162  void setTransitionModel(const transition_model_t& transition_model);
    +
    163  //}
    +
    164 
    +
    165  /* setObservationModel() method //{ */
    +
    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
    +
    +
    +
    typename Eigen::Matrix< double, n, w > X_t
    State sigma points matrix.
    Definition: ukf.h:50
    +
    is thrown when taking the square root of a matrix fails during sigma generation
    Definition: ukf.h:80
    +
    void setConstants(const double alpha, const double kappa, const double beta)
    Changes the Unscented Transform parameters.
    Definition: ukf.hpp:61
    +
    UKF()
    Convenience default constructor.
    Definition: ukf.hpp:20
    +
    typename Base_class::z_t z_t
    measurement vector p*1 typedef
    Definition: ukf.h:63
    +
    static constexpr int n
    Length of the state vector of the system.
    Definition: ukf.h:43
    +
    Eigen::Matrix< double, p, p > R_t
    Measurement noise covariance matrix type .
    Definition: kalman_filter.h:39
    +
    typename Eigen::Matrix< double, n, p > K_t
    Kalman gain matrix.
    Definition: ukf.h:53
    +
    Implements UKF - a class implementing the Unscented Kalman Filter.
    +
    static constexpr int p
    Length of the measurement vector of the system.
    Definition: ukf.h:45
    +
    typename std::function< x_t(const x_t &, const u_t &, double)> transition_model_t
    function of the state transition model typedef
    Definition: ukf.h:75
    +
    virtual statecov_t correct(const statecov_t &sc, const z_t &z, const R_t &R) const override
    Implements the state correction step (measurement update).
    Definition: ukf.hpp:223
    +
    Eigen::Matrix< double, n, n > P_t
    State uncertainty covariance matrix type .
    Definition: kalman_filter.h:38
    +
    typename Base_class::statecov_t statecov_t
    typedef of a helper struct for state and covariance
    Definition: ukf.h:73
    +
    typename Eigen::Matrix< double, w, 1 > W_t
    weights vector (2n+1)*1 typedef
    Definition: ukf.h:71
    +
    Eigen::Matrix< double, m, 1 > u_t
    Input vector type .
    Definition: kalman_filter.h:35
    +
    static constexpr int w
    Number of sigma points/weights.
    Definition: ukf.h:46
    +
    typename std::function< z_t(const x_t &)> observation_model_t
    function of the observation model typedef
    Definition: ukf.h:77
    +
    void setObservationModel(const observation_model_t &observation_model)
    Changes the observation model function.
    Definition: ukf.hpp:85
    +
    Eigen::Matrix< double, n, 1 > x_t
    State vector type .
    Definition: kalman_filter.h:34
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    +
    void setTransitionModel(const transition_model_t &transition_model)
    Changes the transition model function.
    Definition: ukf.hpp:75
    +
    Defines KalmanFilter - an abstract class, defining common interfaces and types for a generic Kalman f...
    +
    typename Eigen::Matrix< double, p, p > Pzz_t
    Pzz helper matrix.
    Definition: ukf.h:52
    +
    static constexpr int m
    Length of the input vector of the system.
    Definition: ukf.h:44
    +
    virtual statecov_t predict(const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const override
    Implements the state prediction step (time update).
    Definition: ukf.hpp:178
    +
    typename Base_class::x_t x_t
    state vector n*1 typedef
    Definition: ukf.h:59
    +
    Eigen::Matrix< double, n, n > Q_t
    Process noise covariance matrix type .
    Definition: kalman_filter.h:40
    +
    Eigen::Matrix< double, p, 1 > z_t
    Measurement vector type .
    Definition: kalman_filter.h:36
    +
    typename Eigen::Matrix< double, p, w > Z_t
    Measurement sigma points matrix.
    Definition: ukf.h:51
    +
    Helper struct for passing around the state and its covariance in one variable.
    Definition: kalman_filter.h:47
    +
    Implementation of the Unscented Kalman filter .
    Definition: ukf.h:39
    +
    is thrown when taking the inverse of a matrix fails during kalman gain calculation
    Definition: ukf.h:89
    +
    This abstract class defines common interfaces and types for a generic Kalman filter.
    Definition: kalman_filter.h:26
    + + + + diff --git a/ukf_8hpp.html b/ukf_8hpp.html new file mode 100644 index 00000000..668c8f5f --- /dev/null +++ b/ukf_8hpp.html @@ -0,0 +1,151 @@ + + + + + + + +mrs_lib: include/mrs_lib/impl/ukf.hpp File Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    ukf.hpp File Reference
    +
    +
    + +

    Implements UKF - a class implementing the Unscented Kalman Filter. +More...

    +
    #include <ros/ros.h>
    +#include <mrs_lib/ukf.h>
    +
    + + Include dependency graph for ukf.hpp:
    +
    +
    + +
    + + This graph shows which files directly or indirectly include this file:
    +
    +
    + +
    +

    Go to the source code of this file.

    + + + + + +

    +Namespaces

     mrs_lib
     All mrs_lib functions, classes, variables and definitions are contained in this namespace.
     
    +

    Detailed Description

    +

    Implements UKF - a class implementing the Unscented Kalman Filter.

    +
    Author
    Tomáš Báča - bacat.nosp@m.oma@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz (original implementation)
    +
    +Matouš Vrba - vrbam.nosp@m.ato@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz (rewrite, documentation)
    +
    +
    + + + + diff --git a/ukf_8hpp__dep__incl.map b/ukf_8hpp__dep__incl.map new file mode 100644 index 00000000..44a11c27 --- /dev/null +++ b/ukf_8hpp__dep__incl.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ukf_8hpp__dep__incl.md5 b/ukf_8hpp__dep__incl.md5 new file mode 100644 index 00000000..757c4296 --- /dev/null +++ b/ukf_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +ab2a079642e8b494b5aac490be2e7d39 \ No newline at end of file diff --git a/ukf_8hpp__dep__incl.png b/ukf_8hpp__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..a904e3d403b38076d64f825007cdfcb4975c6284 GIT binary patch literal 11555 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 literal 0 HcmV?d00001 diff --git a/ukf_8hpp__incl.map b/ukf_8hpp__incl.map new file mode 100644 index 00000000..5ef19e96 --- /dev/null +++ b/ukf_8hpp__incl.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ukf_8hpp__incl.md5 b/ukf_8hpp__incl.md5 new file mode 100644 index 00000000..b381286c --- /dev/null +++ b/ukf_8hpp__incl.md5 @@ -0,0 +1 @@ +168e0a71714413452afdf269c5a72d61 \ No newline at end of file diff --git a/ukf_8hpp__incl.png b/ukf_8hpp__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..6306355f7759bc1953d7b88de438079e535d9d86 GIT binary patch literal 12715 zcmbWeWmJ_>*Dkziq#KlyMp7CHLApb_K|s1&q@-KAOS)4!MMRM9?%H%oZ0anZXN-5e z-}uJ)b2dLr`&_gY*weOG|AYCj$KZxksoH0!tm<9_v4XRbbTXYip<5 zDMsIpkR$|dZf^&Eb4LB8VnX|04R6$%^oAVFR!15>F1LC3`uf`0+10tovV@$Au&}T& zGo!olZG}h3QKDy?B>Ldj~xpL`ga z3onv^!}K6j1v_4paRxY}2Cv?Z41U7#cXe;)`$R9ic>xY$BfRn^L>G$7!ex_V-H zIWr`;t?h0%$Ith4?VW{1adowWghWtC2y$0kFgo$^Ty1Y(9}=Y7_%#u$ZemvAiEY#F&y^kdX~BuTD-Tq^71OBuq|E^Ehq%9DRFdd$~9MTML^)$kD^2f8Ei< z#AIY-q}s59iJhHN_>-%G!cZhJ`+GIDwzf8lp;TOQ^61`moSfz5<;aML!NI{s`{jj& zh4l3Fg^7s|78Xrblk|FedQQx65EV5w{O8Ygbabpfek6MS9J;s1xRxPW7=CPFVzMq; zUxJ|L1A#QV9cX%b-Xt+=y}elr?C`#(b|JYsUe+@-%>Me-5v&o2qlovFf`pCt)gcvL z_`txx-PO^bp`k7E)h<6jJG&!~RUZ%N1RXkhWOFnBidi@cHpMA2%gJ(ElhfueX00lI zetz5K*1t!KO~uMNZ@td90#UG!S33UGyI<@Kf47-6Y;zwT89DB!^oxp)R#a9t>hgWa z67--g54ya(a`EtBVq;6kaFIlLUmx2o zHV*&%8Kgj8ZPeA-*m(8#U>4#Z6B9Er@qViq8B$~111~5jsHiyn#$^YLMnXbjZ*MO( zBLn<0B_-v8jQ|hte8u}@{mc_SAh)PUiasG+;#*)~FYNCDU3n0;$o<&BK)3=uyFqKB zT;a~v7RG{JylKqocC2GK>?aj|SO^f61ZiK`KuL@leR~w0m+=O&>eX_(jj;zfZ!S z?Uha+K~B!|!6fG2Pc_=7`jT&zGk6t0tOlj`!M|R6PDVpRgN+@FfPytOHRbB&X3*wt zXUull?6k?r#RcL>N=mAnEfh}1&BNp7>U#fpcLLJ);NZXy24%?Zv6?KRqop0QZ0PLl z)T%b@>+9o4Q{c^b*c;D}Go#&wd<7|edI=3Q=gtJ?t{9-f%ExT2!s z?r6@_)&Tz2&GB*@Hn~89?L22e=AM{`6# z(0={;g?9(t+EQ0l#l^>;oSHJTx9{}6wg)XfJ48f6qNAs$HsH9sKAD}IByDjBOeYWL zdG$rDj_^4VoBnU(*944Kw>M{-64V?lEEsmu$R=BzAZ=L<+dZ!i=kfGTFD~R|Wpx@X z<9-r_z#|JWCS+tVM|zRGhx^kRO-6E>JJjN`TVP+GmuCW{J?d=q8?jT@R@2{NecY z_%JasF*T*m%F5c{ql#=?9t-~`g`J&^jp(`}A|m1$KE3F&JUXL~7mX8^qn1`mYilcu z{(HsT%WX_{6i;w=w5z^G4qV^eot>W_FsiGrX6NN~?~fq|*(K<4-2UmWwUksyPR{D6 z$Pr@o_jfIMB!F=%_SSNN_L+nUs_iG9qG7XecouA*P@HwEsj3pZGQe{S+)t zNeQF4c(2dhm6fIC;cAx%IBFOf83hIJCY4198HFq-ct`|HNb19Xo+HW`RbeC`3@L-X z{41K&=ksS?hn1*)bU!JCgsQkraXJiB-Z<@SQRtr}6KDV17Ny#mt@6~#KueKU%R z2)}+YD$>;0xYF)*ksEN+6Nu7eJ5PNX@xS_uC1y7~-Gx-^HC0tsvT}2~?v7*`8XCd} zgMBwssh5?N1vU^Jmdw|n^|7(B#U_Uf1`KRB{X&1)Kj-2jw*#Q5SRpXxi*HEa?|nTuHFXN0RQ~3#XffH(8g#jr=6^sI5>h<=i6ETx zg;^1X(_Uo|29DdC(Ka*Qsw{QfMGWu2Lmc@X59jQhstc__rhKK5e!SU;Ty;OjxY;i^ z#?`ZjdqFCh^fqC@_ofET%VpECSyJ-5a`u#rqvSN4oDsca%hJtFlz1rT_2ILau+&$z zdO4;`piw-HDVWrnH3ggft zDJg+(i9-Xgw6qvbAI&)5@Yxe|dQA$&moxLJz}|-p??^}+Daf_@ZTyVri!6>A(^XRo z&C8RS=yKVmOSrA>^b?}+yE=Tp70CT53YEvFPw22;p1-`@m6f$YfTxdLGM1LEj)^%{ z${QK!{6^h_t4|c^1D=nGS&3`QO9ZcA(kGCEKy`SV6SGxZoIMwD4rCz;9Wb-8#tTj! z8m<(Dxg+i!m>RTRT5e@C(y72E;H*wgmYD^;d2RRANlWJrp->da*MT2}>^OTDYmWT= zu@?37j-EC+VA7C`;qWMh$Ajt#m)#%B%XIVg?kcTqcW{vO^dBjy4<~*`9BCB+{Vn<` zMyu&bbXR2~W&U-A)dQ5g8TD3b&YGG|?qBYYBKMBFV|kMApEtcg+xo7t)XoPF*9fDA6XfgL zIp4l-ZZ6O9qiAp~ZBt+m3Nu`4&JykJjrpwVKS3N@QL!5Dd;n##SD zgqJhIpb#$8Z8|=Tr?cnaxY%-hQ!u@IQb~No!srtR-b>owFXFLLy1Sh}S*48VmE}B< z(En=C@H6SH?O#c7oYF2VdTUib&JQU(g;Kty!r4-{itmHfs2NEZW5+tCD!6OUrOnJ_ zlk&aAr%O}NeJR4KU*)Oj>ALRG5Pn^O4Ox+ zPtni_5V0^(D7LJQPOn9dfp&}Y0%~!xd{hk9Gsw$h3~`c!NYuo~HCMO4!J#?doA@5j zFFWJOzn$9BjFPtUuFup zUGGmb3=Di=31>lXXb3}u@2pqThhFzmP^kLD#l8d^{%60%&!0mHgJozmaG||cR&fi9 zCfzjnxtC9pYHGU+-z`4-97)&d<`RGl4~K8fPsDzMy=lB>Iu z`VXcEM@NcdS4a?uW_7l`aW0P|Cq`sn7Pstg-gFEp6s%CL*C1zO%H+GcatH~Ngv=x8 zbi)M@sN$x09kRI`sYyb6(}Z+NE(O7MR(U#lkE(6}3&mdjHm>V?WAa?;6Bq8=+n+9% zmIiQV_~F*3{Vy>6KA4(jgtgU(s_Vk0rxh8LAD`oMISi2?H2B;S@9zigS@wji_Vl>k zc<4jA4`vmUlSArU6}?ofp#6OYwT-;`olE%tK->TxpNk7Z_RaM4bWrCeJfy5V!`8Nh z(@nuj#Q?h6ssZkMaFmMt_-Ll^a;?ce3%z@F0UU>7t4?r`>1hmR=DGdIpa?lIukRMh zpB!uIr?ik$sHvz%l9Tg2xm+0(IVn4ZvR1}dR&4Ar^?c$~RH2lD?!|d|th~H9cG4k% zqTMHRxc)3`-}3U|-n04SwYjs4%W9_&Gka`E@1kB;MTM$X ziWfkg>+&BzCLciI^7^(yii?X|TE4!-RBUFFl9kO$o8LK@MGs*odhsISD&ZDIytgnt z9Y2VucYW#^B8J<3aY4cF-88w7!SAru&n|$l58Xd7ps_xG@d9vLCX|$*_^gM)C4Ije zZl4OO9CKOeFV?bMHK%r(nrHL%CUbtT?{9ABUDoB&C#1d`y5Qs4D`X3O+)-HXL6}jg zc+vDC z`rT96vzp*p09;Skb__^AVB)U`JqBw62sF;|n0TVUj^y&@4bQS0TjdJF21jozg^z7XnH5HTc z-VE69vnIhjeA@y4Pg9tgnAmujpPcMv{%CS`J*WwoFEN|`T%%n^dHF#)j}00c8f{xu zbTsCZ#fxZUNHbt`m(WQ!*C4a=%(p)23iQ$v5@DXKH2GZ@g*-ewaFF}!!e+*nOTe|O zVq$)ML8`J8Jg;7#%gxOl8X5v(!*D7`@8Tj*p7h`Yfkd+7Q&m&urfUjxC; z6pEgJx;}#ahDWcI$qzK5!i{Ob22mke5g%fC$9F^o4L8U*@HrF@9uz* zK>5abYobtoVIjVPgph)Qf|S$-q)2Aw=LeV@Q&M_Df~mc|y}5ZX!Oc#F1DFw*IXnUa zF^l#~M*)gh5x0GU^ZGzU`7&gsH!CwJKR&uFEpGyjcJp_Z3NN$Maa{}ok%~{2H2agx zN{eR&PDM*WAlLGfvC+|)kAIW26y&6pTijpmG9mBmcr^Hy@-oi zq$&o@5xh1YA(M9X@D4GiG*9sL^4jbT)nL}_j=>7UNvsTIcm)k8+-59Q=vI`M55%8K zA}Nf28`&qT>~{q%UZF{`b#>+D%#Cz9Ua2e|Z%tYQvRt?G0v4-Wk4S{PLA9M^?=4R*z zSfn+iWD9cAVV+ZrtPUqnFFdltiu7CSkdOr;qI}~a z8n(fg5ApG>gL2>o=30o!4T+32_x0sjFk~bFe~F6PEh_q?R-_HYZR_S%U14v{-u3QV zwhy@&6J5R?FByN!CSBO+>sJ8GyxyIx&Defv)LBtol8b^^qUq5IaWs~PCoqHoCPzYg zARwrhcZ8bW9l-ib#S?1Orip{|`Z>KrPXMcvsx4GYb3$I8R9$G{oj-!!#<#f%Wo195 z!u|HAP988UY_d5#;=bg^zXwPcJBrje1b1u&@c({?M1&bV^Zxz&-4hX9JL#H#ze7h# z_SMv^O(q&xHVEL8Ok@M2U?I?kc^oI+z!vbs<#_s?X~8IJRn(!^SDchWC8<2TG+LjsRw8y@^k?&<0%ejuTrE8c#eO zRKMrpY0t>OT!=A#p{2zf5Kx(%T-EuOD1yxd2T9($-J|;O;kt6bjQZaL#Kg>ODH++1 z7?7m|hUu1;ByL^#cRdt%vZQviuY+Mcl5GRg%+BU!Z$P9^vSD-;^7_tr^_q8)ulD(776Nrfi1@t zeF)&kCiQTT?%!eX(hww-0_`Wz8fO~672c2$NsvZ)5%eJ8%yVpYRLXU9G?jy?VIV$? zG4;|wze3&Rjd`95WBS<{IY1lg6=_Xu89kyr)T8t+f5W+OhovR zAq8y0l$xj?GF_dWNm4dWE`bSSp{A>yV*x1hwpD3qo%dNi{Ae@}?d@PLU+U}kt7zHK zG&MtVe0ZgeO{jS@5DG1vT?|cTY(>B zp2qW;AP{{`P1nwQ&Qt|@>R#=lqSp)05&OOZf9QMVk)^OO=Ryo41`MX#<}r!_0U`r4 zGk-P@Y6R7T#i(_WLaoFiI+E$xMyXn{E`SFdrWk-+L^6t^{$6)PN4L7zjkRm}y787GgoPzru*3#1A<>fWu zEUWr5LFePgELuELJLxe7R@Nh+Zr)21Q1HX>DDmuK)fe;Qg$u z1~o1&#v5hu4KU@LP9Q4){|2JP5f&06F!hkj=%2kN$Rw9vK0i+p9n~ zC^131dHox;B1YMn^#3n{rF_&^9YpQ;T47Q@pW_QFZ3Ij$KR@aox11sb?ry@*)V9LL zwj#2TW&(xPZ7>mdY`Z%<08)Q#8zN#uVNcZ&g_ogNfB|t$TbtiLU^bZf)VW#%r~v{Yt=_xT8cs$flD|7V>e`-f4QOg=0!T-v1knkI%#5;UNfeP!J+ouvqbATy=X#$K=GsS59yrmRDDM0KcWnS2(h7 zBh9>48yF$veD?az&gZ$mBwI@J6cn?C=70Ry00B2JFgQCq16n&7mPH9^R9KjHlRf$Q zErFDUP zv$ON^@U8TO2H-ca&nSgIahv|aaBw&|Mn@H}fk1H8 z|J4H6%ksXKknmU0&@i{R$AbI@{0I$ggIrlgCY9f51Mn_AU0nzyIyzcDg$*do?E41? zZ^%Z#%4oAZn@vpm_A2kRt4Ui|cjN4)sEGbiCCK9srvV36+r-I%sfPO4_H7LFKU=xY z{iv*@#F#V9mbb0AIP`jhkq9`C&A{=JmhR6J54Gghm61V>>>C7g!NAx`QdLuvS5k6! zb-lc}$e)D%{tk9zxWorT!xhjqZ72Gxbi9c0a9I-*s`F}d6O*&`P|7OZ?`0Jg6@X%a zOr)Zs0{jZT_&>0pN50kGSPKRYLIwK8o*n`_=^#M<@{5aiPfh^m_1pR#2WDqwBVU*6 zV7b^R zPe`~bLucUvEHDV9PfmBG&Kx~lVxh@_5?o3M|3eMhY3A(y0yJl9CtdDbpO)pTGc(I$W4tEtGpkNi5$IBdPv_>s5YcxC6k%fi2GE23_#{q6 z$}hODnI6v1L(Vp(TM-cuIWb6lhFRGi8tO?|4Klc290Afa@%@>qK6oku4OXFZB0KvL zEY?O}WTA~(c1bBzjj=N;EB5XVWmJ_EnM{d1mZ5&$uFg^6UC*~mL4i-Cq>KI0T=Cx& z`(E@Dg35`fMF)p00XL5yh?C->zF%KfzY>19h5fZS*f&c}%Xc(Z{kNJBf2Yj?vQtJz z9i6_~+LXmb@6C<3`W>HIyWL;mgoB2enf7SoUo0UMx3<1wJ08puWDoq3xv@#CQYv8S zU7&8P28-t9l`30m=SVvQm)^x#o&p!w1CV?!&g;Y%Y3L9$CW;pqcCJ94&eP4i5~IYc_ptY>)fISE&haf#z{h zq%+OiXu&yeF}fn+xE7L^H*$Ni&h=42bdhEo#bv_5((>TIR7baL>`EDATAO>}^c1(W z#1OzhL`z31Z;h*xZLHJbAWYN%gwniy`*6O^Q2+5wrZDM8lRP|+Xx!Hf4}1>kJls>! zQH+2x>hY5u1FN8~zc^u_;G|Qp)p7j}%-0!24G4i|t!PO51O)BNEnJn&&F*~>R)X$B zlN0ZwB$<*hhGe^nigd#LuJ!cVuqiv;c7}vKu4{F4^o|aV-I=UG3v%^wh$8xId|;xZ z*{(c1_i;3@f4rj{l6@M^*jZb9W$8_29uaBdaVW#g=vnW)eR;I_;O1J>w*F<`pB3ui z_7`~fOlsYeD=RLi#yjj?Tg}bdz!)V|YWayZ7yp>SH>}U5W%Y@di!V*U}pi7tv*c zkMoiaHy+$F9QYQ7*MN{4iB{`eYVc~h%YcP>2z$LQ!D>>2n-BJkvIU0J>8CGnf4#g z&5;;%v^oLLYJFGqHKegXIsZH3jG#R*ee{>6f&9*2DY4%D^%BI@+dHkOD57@b#ZyB( zvlef9`hMOKu7uEQ+6Nen7vf*bF~bw2z6owR%tuHQK-pDJfN1Fe<9oU%O*B@WvjXV9#H_A%d!L~nV9w* zb;IKWc%Y`1hSUza;i3I=i%m`Q3qOK!lFPwHo#P3R@DTP z2?^oF$G8jWGR3ijPKZR5Xap6JS38<0Oyt;G!rA@Zg8De$A+R z#CK+hn*RpzYukBzfBhZ(i0^}&K*sQLmx${;r^mJ-9z48CA{f63r%wCSXEP!6B>&y* zKdt0~6M!%o)^u-|SAY5YcfA2G2@*Q9(uE-vnlNb(SVvV=Q9uAunu4vR<;8Ulw{>D; zKtOU{USn--Rb*t6g3sRZF~D+96vCetS5|1LO!7D@5y$7|uKI|(&K_;8pk-wrPG^Bg z?F%etM$eGvDmH&h)yYXo^9Ki|kn;n3_8@>bG`s9l0Q!Ix3e+WH_G~6KsD(M<$x_

    qWy-4eg}qoD~Jch2=t+SUI4)BTB4i#~nA@+yFI za}fVi$DBBl(Ld!|j>u2%ydMA`>u1oagw0R7fT}pb-XHBr3fHKSL><*dyy|#7e6&9$ zt5%G$xhZcOtQr;Qz1N)J;ZD{$fQYXa&f4Yq?(SwYVRv*FjqK#eoZ@XJbl1aQ$>HhY zT2VTdO>G0JPDRBgLqiS0LaC@Mb<`o?E(9;fh>{f01P|}n&#f`k>Hrh^_B`j4w~mot z*7(xWfM9l##^Gkd>1OOaD32N*TH4sRW<8@L_~Nt~b$A$s;;vCzikr-m77-zz3a<#Y zu}Pp;A{?S4BU;EGFq!n)M>YD5NP!=! zb5#NSZ3qN3udCY$j@&e^>t9hEGK$fuympzc_nJ6g0<*4ky}x+X~Olpz!$wEJVefof>KhC3X0}08hQ` z^}z}yCD;o3CNc+S4h5KYY01`e7>MKs->uUT-I2`wOWGBe_VZh(e*g!@oVV z6V!O$8xbbNzIB$I&;b0u>xs5uxd&~}!d`$sb${Qw@%vwXK|Q&zk{8=4UAsG)&iqe% z6tVqaxnXzn5J%vhWoEH1FWIj6t$qRm+Hz;;$2oBI<*KYz5%~pnUOMq- zHeKHURSXxGt55hE6aq~aKfyyvO4sLYu~N`o-3Hj$lB=pTm6V8pXtuW>Z@yOdC9hHu zwuaCTL`&m_-qEfC<>E=j%h(Syf7>K(*)2IU1-I!$1~~KrRf{zpNvPK*nj4r)Z9F=YX9GfRJg5c#gk$Br~ ziJ4qFpG$8~oS)Oe68bfz-UK}nmsB`!5DKwXRTJOA{%bZ#FQSKi$-|h?da<;;jE|2$ zekGxH?w&*uXSfK=8s zXNviMxdapm)X)KgY0J;*5QmVkZ`*XHLZ_~c$S;^?*3QPJ4M5rO@bJ*ke&A7EX$7a|rQ#=Vsl_?EP{&>E0wSLPvD7}@b&6keV)zh=FvI0X8_JJjO zd;*M7R1`uHOPNRR3+O5+P<@xD@(bL|pqx|2QBB)lWUaKaGKOF}K4({s>#cpeD-Pqg&g_QhcF=K6v zO#eQ3x(X~34Yxfgl&B3bRNxd8D`koOt8la%h^GUdOuWfK|BEgJl_RHzYquzK{PZpbaiz>At3xNC?$?>DnZc*RB zV75X>O-03@;D4MYS1C(rh~cq6U`CMK;$rE#yLeJ~JiwT@o`5W&si&9WG4^Zc#I6KX z^QNR(q72^ipLV{^bWAZf=6v^W0H$Pa19U9|h(suA>~LziPBA!1BGM zt|}=J#e#+3eW~tx+&?-pFfvl6Px!ADC1o$YL8^%gtQ+7PW~8U%{MFLXpy~(6 z{mfG+ONo+4Zi+Bg97;`dv|bCum#eFou&@%q9q+E} z%*+b9y1D=x)zqA+GH3&d0A$9D;bSOt-I1S#h?$Fv>-B5LAa@7^Y(>r^!gnd4*x3v4 z%!P*V9%FS4jiaR&{5SUhR~9Qi|Gex+n!-mbE9lkHVnTd;423Yb6n=ge+H=93MQxSI zbK#<+`)5Q>6vzVg1r+E4_Ywl3q@)Bz!+w5#K>DGPj?r&*mDSS|WMJrDTFNAzma(Zd>KU8n>yva(h{?Gkji6&3CN5sVH8k)XzfeEt7(*f<&S<2%lpA8`l3 z?Hl3rJYv+Nj(=T}02Ni^@RJ?BL!9y+&J5F${{q6XJYo8QIv7 zAu>K?5mR>X5c{R(vjK*j(@)-#C~Aan2>|A2U{cfA5-3QDi{r3tKzJ@ACpQQx^MREI zEXxlcJ|wf~PzT^@ulK&3ZE2CwdLcpZaX6h27q`~^NSBqh5(%A%mX=n=7*X@)b*>02 zIVWSjRCKH788z@+Np5;f)PzoDsxc}=bPVYi_(ujLIm-Xl;`vh- YO~SlpQu7M@CHnDLkY1BS97)Bpeg literal 0 HcmV?d00001 diff --git a/ukf_8hpp_source.html b/ukf_8hpp_source.html new file mode 100644 index 00000000..9567cf9e --- /dev/null +++ b/ukf_8hpp_source.html @@ -0,0 +1,400 @@ + + + + + + + +mrs_lib: include/mrs_lib/impl/ukf.hpp Source File + + + + + + + + + + + + + +

    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    ukf.hpp
    +
    +
    +Go to the documentation of this file.
    1 // clang: MatousFormat
    +
    2 
    +
    3 #ifndef UKF_HPP
    +
    4 #define UKF_HPP
    +
    5 
    +
    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>
    + +
    21  {
    +
    22  }
    +
    23 
    +
    24  template <int n_states, int n_inputs, int n_measurements>
    +
    25  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  : 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  assert(alpha > 0.0);
    +
    29  computeWeights();
    +
    30  }
    +
    31 
    +
    32  //}
    +
    33 
    +
    34  /* computeWeights() //{ */
    +
    35 
    +
    36  template <int n_states, int n_inputs, int n_measurements>
    + +
    38  {
    +
    39  // initialize lambda
    +
    40  /* m_lambda = double(n) * (m_alpha * m_alpha - 1.0); */
    +
    41  m_lambda = m_alpha*m_alpha*(double(n) + m_kappa) - double(n);
    +
    42 
    +
    43  // initialize first terms of the weights
    +
    44  m_Wm(0) = m_lambda / (double(n) + m_lambda);
    +
    45  m_Wc(0) = m_Wm(0) + (1.0 - m_alpha*m_alpha + m_beta);
    +
    46 
    +
    47  // initialize the rest of the weights
    +
    48  for (int i = 1; i < w; i++)
    +
    49  {
    +
    50  m_Wm(i) = (1.0 - m_Wm(0))/(w - 1.0);
    +
    51  m_Wc(i) = m_Wm(i);
    +
    52  }
    +
    53  }
    +
    54 
    +
    55  //}
    +
    56 
    +
    57  /* setConstants() //{ */
    +
    58 
    +
    59  template <int n_states, int n_inputs, int n_measurements>
    +
    60  // update the UKF constants
    +
    61  void UKF<n_states, n_inputs, n_measurements>::setConstants(const double alpha, const double kappa, const double beta)
    +
    62  {
    +
    63  m_alpha = alpha;
    +
    64  m_kappa = kappa;
    +
    65  m_beta = beta;
    +
    66 
    +
    67  computeWeights();
    +
    68  }
    +
    69 
    +
    70  //}
    +
    71 
    +
    72  /* setTransitionModel() method //{ */
    +
    73 
    +
    74  template <int n_states, int n_inputs, int n_measurements>
    + +
    76  {
    +
    77  m_transition_model = transition_model;
    +
    78  }
    +
    79 
    +
    80  //}
    +
    81 
    +
    82  /* setObservationModel() method //{ */
    +
    83 
    +
    84  template <int n_states, int n_inputs, int n_measurements>
    + +
    86  {
    +
    87  m_observation_model = observation_model;
    +
    88  }
    +
    89 
    +
    90  //}
    +
    91 
    +
    92  /* computePaSqrt() method //{ */
    +
    93  template <int n_states, int n_inputs, int n_measurements>
    + +
    95  {
    +
    96  // calculate the square root of the covariance matrix
    +
    97  const P_t Pa = (double(n) + m_lambda)*P;
    +
    98 
    +
    99  /* Eigen::SelfAdjointEigenSolver<P_t> es(Pa); */
    +
    100  Eigen::LLT<P_t> llt(Pa);
    +
    101  if (llt.info() != Eigen::Success)
    +
    102  {
    +
    103  P_t tmp = Pa + (double(n) + m_lambda)*1e-9*P_t::Identity();
    +
    104  llt.compute(tmp);
    +
    105  if (llt.info() != Eigen::Success)
    +
    106  {
    +
    107  ROS_WARN("UKF: taking the square root of covariance during sigma point generation failed.");
    +
    108  throw square_root_exception();
    +
    109  }
    +
    110  }
    +
    111 
    +
    112  const P_t Pa_sqrt = llt.matrixL();
    +
    113  return Pa_sqrt;
    +
    114  }
    +
    115  //}
    +
    116 
    +
    117  /* computeInverse() method //{ */
    +
    118  template <int n_states, int n_inputs, int n_measurements>
    +
    119  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  Eigen::ColPivHouseholderQR<Pzz_t> qr(Pzz);
    +
    122  if (!qr.isInvertible())
    +
    123  {
    +
    124  // add some stuff to the tmp matrix diagonal to make it invertible
    +
    125  Pzz_t tmp = Pzz + 1e-9*Pzz_t::Identity(Pzz.rows(), Pzz.cols());
    +
    126  qr.compute(tmp);
    +
    127  if (!qr.isInvertible())
    +
    128  {
    +
    129  // never managed to make this happen except for explicitly putting NaNs in the input
    +
    130  ROS_ERROR("UKF: could not compute matrix inversion!!! Fix your covariances (the measurement's is probably too low...)");
    +
    131  throw inverse_exception();
    +
    132  }
    +
    133  ROS_WARN("UKF: artificially inflating matrix for inverse computation! Check your covariances (the measurement's might be too low...)");
    +
    134  }
    +
    135  Pzz_t ret = qr.inverse();
    +
    136  return ret;
    +
    137  }
    +
    138  //}
    +
    139 
    +
    140  /* computeKalmanGain() method //{ */
    +
    141  template <int n_states, int n_inputs, int n_measurements>
    +
    142  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  const Pzz_t Pzz_inv = computeInverse(Pzz);
    +
    145  const K_t K = Pxz * Pzz_inv;
    +
    146  return K;
    +
    147  }
    +
    148  //}
    +
    149 
    +
    150  /* computeSigmas() method //{ */
    +
    151  template <int n_states, int n_inputs, int n_measurements>
    +
    152  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  X_t S;
    +
    157  S.col(0) = x;
    +
    158 
    +
    159  const P_t P_sqrt = computePaSqrt(P);
    +
    160  const auto xrep = x.replicate(1, n);
    +
    161 
    +
    162  // positive sigma points
    +
    163  S.template block<n, n>(0, 1) = xrep + P_sqrt;
    +
    164 
    +
    165  // negative sigma points
    +
    166  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  return S;
    +
    172  }
    +
    173  //}
    +
    174 
    +
    175  /* predict() method //{ */
    +
    176 
    +
    177  template <int n_states, int n_inputs, int n_measurements>
    + +
    179  {
    +
    180  const auto& x = sc.x;
    +
    181  const auto& P = sc.P;
    +
    182  statecov_t ret;
    +
    183 
    +
    184  const X_t S = computeSigmas(x, P);
    +
    185 
    +
    186  // propagate sigmas through the transition model
    +
    187  X_t X;
    +
    188  for (int i = 0; i < w; i++)
    +
    189  {
    +
    190  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  ret.x = x_t::Zero();
    +
    199  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  x_t tmp = 1.0/w * X.col(i);
    +
    203  /* x_t tmp = m_Wm(i) * X.col(i); */
    +
    204  ret.x += tmp;
    +
    205  }
    +
    206 
    +
    207  // recompute the covariance
    +
    208  ret.P = P_t::Zero();
    +
    209  for (int i = 0; i < w; i++)
    +
    210  {
    +
    211  ret.P += m_Wc(i) * (X.col(i) - ret.x) * (X.col(i) - ret.x).transpose();
    +
    212  }
    +
    213  ret.P += Q;
    +
    214 
    +
    215  return ret;
    +
    216  }
    +
    217 
    +
    218  //}
    +
    219 
    +
    220  /* correct() method //{ */
    +
    221 
    +
    222  template <int n_states, int n_inputs, int n_measurements>
    + +
    224  {
    +
    225  const auto& x = sc.x;
    +
    226  const auto& P = sc.P;
    +
    227  const X_t S = computeSigmas(x, P);
    +
    228 
    +
    229  // propagate sigmas through the observation model
    +
    230  Z_t Z_exp(z.rows(), w);
    +
    231  for (int i = 0; i < w; i++)
    +
    232  {
    +
    233  Z_exp.col(i) = m_observation_model(S.col(i));
    +
    234  }
    +
    235 
    +
    236  // compute expected measurement
    +
    237  z_t z_exp = z_t::Zero(z.rows());
    +
    238  for (int i = 0; i < w; i++)
    +
    239  {
    +
    240  z_exp += m_Wm(i) * Z_exp.col(i);
    +
    241  }
    +
    242 
    +
    243  // compute the covariance of measurement
    +
    244  Pzz_t Pzz = Pzz_t::Zero(z.rows(), z.rows());
    +
    245  for (int i = 0; i < w; i++)
    +
    246  {
    +
    247  Pzz += m_Wc(i) * (Z_exp.col(i) - z_exp) * (Z_exp.col(i) - z_exp).transpose();
    +
    248  }
    +
    249  Pzz += R;
    +
    250 
    +
    251  // compute cross covariance
    +
    252  K_t Pxz = K_t::Zero(n, z.rows());
    +
    253  for (int i = 0; i < w; i++)
    +
    254  {
    +
    255  Pxz += m_Wc(i) * (S.col(i) - x) * (Z_exp.col(i) - z_exp).transpose();
    +
    256  }
    +
    257 
    +
    258  // compute Kalman gain
    +
    259  const z_t inn = (z - z_exp); // innovation
    +
    260  const K_t K = computeKalmanGain(sc.x, inn, Pxz, Pzz);
    +
    261 
    +
    262  // check whether the inverse produced valid numbers
    +
    263  if (!K.array().isFinite().all())
    +
    264  {
    +
    265  ROS_ERROR("UKF: inverting of Pzz in correction update produced non-finite numbers!!! Fix your covariances (the measurement's is probably too low...)");
    +
    266  throw inverse_exception();
    +
    267  }
    +
    268 
    +
    269  // correct
    +
    270  statecov_t ret;
    +
    271  ret.x = x + K * inn;
    +
    272  ret.P = P - K * Pzz * K.transpose();
    +
    273  return ret;
    +
    274  }
    +
    275 
    +
    276  //}
    +
    277 
    +
    278 } // namespace mrs_lib
    +
    279 
    +
    280 #endif
    +
    +
    +
    typename Eigen::Matrix< double, n, w > X_t
    State sigma points matrix.
    Definition: ukf.h:50
    +
    void setConstants(const double alpha, const double kappa, const double beta)
    Changes the Unscented Transform parameters.
    Definition: ukf.hpp:61
    +
    UKF()
    Convenience default constructor.
    Definition: ukf.hpp:20
    +
    Eigen::Matrix< double, p, p > R_t
    Measurement noise covariance matrix type .
    Definition: kalman_filter.h:39
    +
    typename Eigen::Matrix< double, n, p > K_t
    Kalman gain matrix.
    Definition: ukf.h:53
    +
    typename std::function< x_t(const x_t &, const u_t &, double)> transition_model_t
    function of the state transition model typedef
    Definition: ukf.h:75
    +
    virtual statecov_t correct(const statecov_t &sc, const z_t &z, const R_t &R) const override
    Implements the state correction step (measurement update).
    Definition: ukf.hpp:223
    +
    typename Base_class::statecov_t statecov_t
    typedef of a helper struct for state and covariance
    Definition: ukf.h:73
    +
    typename Eigen::Matrix< double, w, 1 > W_t
    weights vector (2n+1)*1 typedef
    Definition: ukf.h:71
    +
    Eigen::Matrix< double, m, 1 > u_t
    Input vector type .
    Definition: kalman_filter.h:35
    +
    typename std::function< z_t(const x_t &)> observation_model_t
    function of the observation model typedef
    Definition: ukf.h:77
    +
    void setObservationModel(const observation_model_t &observation_model)
    Changes the observation model function.
    Definition: ukf.hpp:85
    +
    Eigen::Matrix< double, n, 1 > x_t
    State vector type .
    Definition: kalman_filter.h:34
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    +
    void setTransitionModel(const transition_model_t &transition_model)
    Changes the transition model function.
    Definition: ukf.hpp:75
    +
    typename Eigen::Matrix< double, p, p > Pzz_t
    Pzz helper matrix.
    Definition: ukf.h:52
    +
    typename Base_class::P_t P_t
    state covariance n*n typedef
    Definition: ukf.h:65
    +
    virtual statecov_t predict(const statecov_t &sc, const u_t &u, const Q_t &Q, double dt) const override
    Implements the state prediction step (time update).
    Definition: ukf.hpp:178
    +
    Eigen::Matrix< double, n, n > Q_t
    Process noise covariance matrix type .
    Definition: kalman_filter.h:40
    +
    Eigen::Matrix< double, p, 1 > z_t
    Measurement vector type .
    Definition: kalman_filter.h:36
    +
    typename Eigen::Matrix< double, p, w > Z_t
    Measurement sigma points matrix.
    Definition: ukf.h:51
    +
    Defines UKF - a class implementing the Unscented Kalman Filter .
    +
    Implementation of the Unscented Kalman filter .
    Definition: ukf.h:39
    +
    is thrown when taking the inverse of a matrix fails during kalman gain calculation
    Definition: ukf.h:89
    + + + + diff --git a/utils_8h.html b/utils_8h.html new file mode 100644 index 00000000..611837a2 --- /dev/null +++ b/utils_8h.html @@ -0,0 +1,189 @@ + + + + + + + +mrs_lib: include/mrs_lib/utils.h File Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    utils.h File Reference
    +
    +
    + +

    Defines various general utility functions. +More...

    +
    #include <iterator>
    +#include <vector>
    +#include <sstream>
    +#include <atomic>
    +
    + + Include dependency graph for utils.h:
    +
    +
    + +
    + + This graph shows which files directly or indirectly include this file:
    +
    +
    + +
    +

    Go to the source code of this file.

    + + + + + +

    +Classes

    class  mrs_lib::AtomicScopeFlag
     Convenience class for automatically setting and unsetting an atomic boolean based on the object's scope. Useful e.g. for indicating whether a thread is running or not. More...
     
    + + + + +

    +Namespaces

     mrs_lib
     All mrs_lib functions, classes, variables and definitions are contained in this namespace.
     
    + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    template<typename Iterator >
    std::string mrs_lib::containerToString (const Iterator begin, const Iterator end, const std::string &delimiter=", ")
     Convenience function for converting container ranges to strings (e.g. for printing). More...
     
    template<typename Iterator >
    std::string mrs_lib::containerToString (const Iterator begin, const Iterator end, const char *delimiter)
     Convenience function for converting container ranges to strings (e.g. for printing). More...
     
    template<typename Container >
    std::string mrs_lib::containerToString (const Container &cont, const std::string &delimiter=", ")
     Convenience function for converting containers to strings (e.g. for printing). More...
     
    template<typename Container >
    std::string mrs_lib::containerToString (const Container &cont, const char *delimiter=", ")
     Convenience function for converting containers to strings (e.g. for printing). More...
     
    template<typename T >
    T::iterator mrs_lib::remove_const (const typename T::const_iterator &it, T &cont)
     Convenience class for removing const-ness from a container iterator. More...
     
    +template<typename T >
    int mrs_lib::signum (T val)
     
    +

    Detailed Description

    +
    +
    + + + + diff --git a/utils_8h.js b/utils_8h.js new file mode 100644 index 00000000..e2aca68f --- /dev/null +++ b/utils_8h.js @@ -0,0 +1,10 @@ +var utils_8h = +[ + [ "AtomicScopeFlag", "classmrs__lib_1_1AtomicScopeFlag.html", "classmrs__lib_1_1AtomicScopeFlag" ], + [ "containerToString", "utils_8h.html#ad5bd70829aedd3ff4a67d8902855eed9", null ], + [ "containerToString", "utils_8h.html#a1c0c2c8502894646615382a9134c866a", null ], + [ "containerToString", "utils_8h.html#a10c2af0f8c317177ca6abca5fd80a52a", null ], + [ "containerToString", "utils_8h.html#adcd658b38c38786fa906e95b1252393a", null ], + [ "remove_const", "utils_8h.html#a006d8eb9265ad5e8b2f908df6deb55b5", null ], + [ "signum", "utils_8h.html#a860d8ff84b45a6a45863d410b54a6dec", null ] +]; \ No newline at end of file diff --git a/utils_8h__dep__incl.map b/utils_8h__dep__incl.map new file mode 100644 index 00000000..ae392433 --- /dev/null +++ b/utils_8h__dep__incl.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/utils_8h__dep__incl.md5 b/utils_8h__dep__incl.md5 new file mode 100644 index 00000000..ee21bbb6 --- /dev/null +++ b/utils_8h__dep__incl.md5 @@ -0,0 +1 @@ +75b31844a7013110d1c813fc2aeadb2c \ No newline at end of file diff --git a/utils_8h__dep__incl.png b/utils_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..ba0e6b52baee901c65f761b08df53eaeb8d55c52 GIT binary patch literal 14340 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 literal 0 HcmV?d00001 diff --git a/utils_8h__incl.map b/utils_8h__incl.map new file mode 100644 index 00000000..71f8c7e1 --- /dev/null +++ b/utils_8h__incl.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/utils_8h__incl.md5 b/utils_8h__incl.md5 new file mode 100644 index 00000000..027361a4 --- /dev/null +++ b/utils_8h__incl.md5 @@ -0,0 +1 @@ +5b66800825eb91f27808fe3e0ac83511 \ No newline at end of file diff --git a/utils_8h__incl.png b/utils_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..7093baadf85d2e39781aac3de78f361b49a29e3b GIT binary patch literal 7654 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 + + + + + + +mrs_lib: include/mrs_lib/utils.h Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    utils.h
    +
    +
    +Go to the documentation of this file.
    1 // clang: MatousFormat
    +
    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 
    +
    29  template <typename Iterator>
    +
    30  std::string containerToString(const Iterator begin, const Iterator end, const std::string& delimiter = ", ")
    +
    31  {
    +
    32  bool first = true;
    +
    33  std::ostringstream output;
    +
    34  for (Iterator it = begin; it != end; it++)
    +
    35  {
    +
    36  if (!first)
    +
    37  output << delimiter;
    +
    38  output << *it;
    +
    39  first = false;
    +
    40  }
    +
    41  return output.str();
    +
    42  }
    +
    43 
    +
    53  template <typename Iterator>
    +
    54  std::string containerToString(const Iterator begin, const Iterator end, const char* delimiter)
    +
    55  {
    +
    56  return containerToString(begin, end, std::string(delimiter));
    +
    57  }
    +
    58 
    +
    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 
    +
    81  template <typename Container>
    +
    82  std::string containerToString(const Container& cont, const char* delimiter = ", ")
    +
    83  {
    +
    84  return containerToString(std::begin(cont), std::end(cont), std::string(delimiter));
    +
    85  }
    +
    86 
    +
    87  //}
    +
    88 
    +
    89  /* remove_const() function //{ */
    +
    90 
    +
    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 
    + +
    115  {
    +
    116 
    +
    117  public:
    +
    124  AtomicScopeFlag(std::atomic<bool>& in);
    + +
    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  int signum(T val)
    +
    139  {
    +
    140  return (T(0) < val) - (val < T(0));
    +
    141  }
    +
    142 
    +
    143 } // namespace mrs_lib
    +
    144 
    +
    145 #endif
    +
    +
    +
    Convenience class for automatically setting and unsetting an atomic boolean based on the object's sco...
    Definition: utils.h:114
    +
    std::string containerToString(const Iterator begin, const Iterator end, const std::string &delimiter=", ")
    Convenience function for converting container ranges to strings (e.g. for printing).
    Definition: utils.h:30
    +
    T::iterator remove_const(const typename T::const_iterator &it, T &cont)
    Convenience class for removing const-ness from a container iterator.
    Definition: utils.h:100
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    +
    AtomicScopeFlag(std::atomic< bool > &in)
    The constructor. Sets the flag in to true.
    Definition: utils.cpp:6
    +
    ~AtomicScopeFlag()
    The destructor. Resets the variable given in the constructor to false.
    Definition: utils.cpp:12
    + + + + diff --git a/vector__converter_2example_8cpp.html b/vector__converter_2example_8cpp.html new file mode 100644 index 00000000..21362ace --- /dev/null +++ b/vector__converter_2example_8cpp.html @@ -0,0 +1,159 @@ + + + + + + + +mrs_lib: src/vector_converter/example.cpp File Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    example.cpp File Reference
    +
    +
    + +

    Example file for the convert() vector type conversion function. +More...

    +
    #include <geometry_msgs/Vector3.h>
    +#include <Eigen/Dense>
    +#include <pcl/point_types.h>
    +#include <mrs_lib/vector_converter.h>
    +
    + + Include dependency graph for example.cpp:
    +
    +
    + +
    + + + +

    +Classes

    struct  MyPoint
     
    + + + + +

    +Namespaces

     mrs_lib
     All mrs_lib functions, classes, variables and definitions are contained in this namespace.
     
    + + + + + + + +

    +Functions

    +std::tuple< double, double, double > mrs_lib::impl::convertFrom (const MyPoint &in)
     
    +void mrs_lib::impl::convertTo (MyPoint &ret, const double x, const double y, const double z)
     
    +int main ()
     
    +

    Detailed Description

    +

    Example file for the convert() vector type conversion function.

    +
    Author
    Matouš Vrba - vrbam.nosp@m.ato@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz
    +

    This example may be run after building mrs_lib by executing rosrun mrs_lib vector_converter_example.

    +

    See vector_converter/example.cpp.

    +
    +
    + + + + diff --git a/vector__converter_2example_8cpp.js b/vector__converter_2example_8cpp.js new file mode 100644 index 00000000..b3ec1887 --- /dev/null +++ b/vector__converter_2example_8cpp.js @@ -0,0 +1,7 @@ +var vector__converter_2example_8cpp = +[ + [ "MyPoint", "structMyPoint.html", "structMyPoint" ], + [ "convertFrom", "vector__converter_2example_8cpp.html#a6828e3ce1e89ca5de408209a5e5fb049", null ], + [ "convertTo", "vector__converter_2example_8cpp.html#af40c76d70b6c9cce94cf336ac620887c", null ], + [ "main", "vector__converter_2example_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4", null ] +]; \ No newline at end of file diff --git a/vector__converter_2example_8cpp__incl.map b/vector__converter_2example_8cpp__incl.map new file mode 100644 index 00000000..6581407b --- /dev/null +++ b/vector__converter_2example_8cpp__incl.map @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/vector__converter_2example_8cpp__incl.md5 b/vector__converter_2example_8cpp__incl.md5 new file mode 100644 index 00000000..2ee67eed --- /dev/null +++ b/vector__converter_2example_8cpp__incl.md5 @@ -0,0 +1 @@ +c2d4f9f7c8deb607a11470f3524ed3c7 \ No newline at end of file diff --git a/vector__converter_2example_8cpp__incl.png b/vector__converter_2example_8cpp__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..49705ef07478e3d5a3490830fe67625256535dd5 GIT binary patch literal 22008 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 literal 0 HcmV?d00001 diff --git a/vector__converter_8h.html b/vector__converter_8h.html new file mode 100644 index 00000000..a9d6e357 --- /dev/null +++ b/vector__converter_8h.html @@ -0,0 +1,153 @@ + + + + + + + +mrs_lib: include/mrs_lib/vector_converter.h File Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    vector_converter.h File Reference
    +
    +
    + +

    Defines the convert() function for conversion between different vector representations (Eigen, OpenCV, tf2 etc.). +More...

    +
    #include <tuple>
    +#include <mrs_lib/impl/vector_converter.hpp>
    +
    + + Include dependency graph for vector_converter.h:
    +
    +
    + +
    + + This graph shows which files directly or indirectly include this file:
    +
    +
    + +
    +

    Go to the source code of this file.

    + + + + + +

    +Namespaces

     mrs_lib
     All mrs_lib functions, classes, variables and definitions are contained in this namespace.
     
    + + + + + +

    +Functions

    template<typename ret_t , typename in_t >
    ret_t mrs_lib::convert (const in_t &in)
     Converts between different vector representations. More...
     
    +

    Detailed Description

    +

    Defines the convert() function for conversion between different vector representations (Eigen, OpenCV, tf2 etc.).

    +
    Author
    Matouš Vrba - vrbam.nosp@m.ato@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz
    +
    +
    + + + + diff --git a/vector__converter_8h.js b/vector__converter_8h.js new file mode 100644 index 00000000..9a104ec7 --- /dev/null +++ b/vector__converter_8h.js @@ -0,0 +1,4 @@ +var vector__converter_8h = +[ + [ "convert", "vector__converter_8h.html#a66ab536759b8cab264138c098008c9ca", null ] +]; \ No newline at end of file diff --git a/vector__converter_8h__dep__incl.map b/vector__converter_8h__dep__incl.map new file mode 100644 index 00000000..d4cbe81c --- /dev/null +++ b/vector__converter_8h__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/vector__converter_8h__dep__incl.md5 b/vector__converter_8h__dep__incl.md5 new file mode 100644 index 00000000..12f493fb --- /dev/null +++ b/vector__converter_8h__dep__incl.md5 @@ -0,0 +1 @@ +d916916ab8b3e4b7b2df2c0df9b294da \ No newline at end of file diff --git a/vector__converter_8h__dep__incl.png b/vector__converter_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..dfa5bd1bfe371eef84e198e33b36a2bb0f8fe635 GIT binary patch literal 4959 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 VHnw53d4ZKfsQc>3QiUha{|~KqMjHSC literal 0 HcmV?d00001 diff --git a/vector__converter_8h__incl.map b/vector__converter_8h__incl.map new file mode 100644 index 00000000..ea4fffb8 --- /dev/null +++ b/vector__converter_8h__incl.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/vector__converter_8h__incl.md5 b/vector__converter_8h__incl.md5 new file mode 100644 index 00000000..c6da6874 --- /dev/null +++ b/vector__converter_8h__incl.md5 @@ -0,0 +1 @@ +1daaf89af5bc6561e7f0192ae9e97e8e \ No newline at end of file diff --git a/vector__converter_8h__incl.png b/vector__converter_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..153f76ade875efd778e9e47017cf6a4ec97e11b3 GIT binary patch literal 9950 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 S8w3q&5IHGj$r5p6pZ@}m1( + + + + + + +mrs_lib: include/mrs_lib/vector_converter.h Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    vector_converter.h
    +
    +
    +Go to the documentation of this file.
    1 // clang: MatousFormat
    +
    6 #ifndef VECTOR_CONVERTER_H
    +
    7 #define VECTOR_CONVERTER_H
    +
    8 
    +
    9 #include <tuple>
    +
    10 
    + +
    12 
    +
    13 namespace mrs_lib
    +
    14 {
    +
    15 
    +
    33  template <typename ret_t, typename in_t>
    +
    34  ret_t convert(const in_t& in)
    +
    35  {
    +
    36  const auto [x, y, z] = impl::convertFrom(in);
    +
    37  ret_t ret;
    +
    38  impl::convertTo(ret, x, y, z);
    +
    39  return ret;
    +
    40  }
    +
    41 
    +
    42 }
    +
    43 
    +
    44 #endif // VECTOR_CONVERTER_H
    +
    +
    +
    ret_t convert(const in_t &in)
    Converts between different vector representations.
    Definition: vector_converter.h:34
    +
    Implements the convertTo() and convertFrom() functions for conversion between different vector repres...
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    + + + + diff --git a/vector__converter_8hpp.html b/vector__converter_8hpp.html new file mode 100644 index 00000000..103dc23e --- /dev/null +++ b/vector__converter_8hpp.html @@ -0,0 +1,267 @@ + + + + + + + +mrs_lib: include/mrs_lib/impl/vector_converter.hpp File Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    vector_converter.hpp File Reference
    +
    +
    + +

    Implements the convertTo() and convertFrom() functions for conversion between different vector representations (Eigen, OpenCV, tf2 etc.). +More...

    +
    #include <experimental/type_traits>
    +
    + + Include dependency graph for vector_converter.hpp:
    +
    +
    + +
    + + This graph shows which files directly or indirectly include this file:
    +
    +
    + +
    +

    Go to the source code of this file.

    + + + + + +

    +Namespaces

     mrs_lib
     All mrs_lib functions, classes, variables and definitions are contained in this namespace.
     
    + + + + + +

    +Macros

    #define GENERATE_HAS_MEMBER_FUNC(func, rettype)
     
    #define GENERATE_HAS_MEMBER(memb, type)
     
    + + + + + + +

    +Typedefs

    +using mrs_lib::impl::unw_t = std::tuple< double, double, double >
     
    +template<class T >
    using mrs_lib::impl::_has_squarebracket_operator_chk = decltype(std::declval< T & >()[0])
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions

    +template<typename in_t >
    std::enable_if_t< has_xfun_v< in_t >, unw_t > mrs_lib::impl::convertFrom (const in_t &in)
     
    +template<typename in_t >
    std::enable_if_t< has_xmem_v< in_t >, unw_t > mrs_lib::impl::convertFrom (const in_t &in)
     
    +template<typename in_t >
    std::enable_if_t< has_squarebracket_operator_v< in_t > &&!has_xfun_v< in_t >, unw_t > mrs_lib::impl::convertFrom (const in_t &in)
     
    +template<typename ret_t >
    std::enable_if_t< has_xyz_constructor_v< ret_t >, void > mrs_lib::impl::convertTo (ret_t &out, const double x, const double y, const double z)
     
    +template<typename ret_t >
    std::enable_if_t<!has_xyz_constructor_v< ret_t > &&has_xmem_v< ret_t >, void > mrs_lib::impl::convertTo (ret_t &out, const double x, const double y, const double z)
     
    +template<typename ret_t >
    ret_t mrs_lib::impl::convertTo (const double x, const double y, const double z)
     
    + + + + + + + +

    +Variables

    +template<class T >
    constexpr bool mrs_lib::impl::has_squarebracket_operator_v = std::experimental::is_detected_convertible_v<double, _has_squarebracket_operator_chk, T>
     
    +template<class T >
    constexpr bool mrs_lib::impl::has_xyz_constructor_v = std::experimental::is_constructible_v<T, double, double, double>
     
    +

    Detailed Description

    +

    Implements the convertTo() and convertFrom() functions for conversion between different vector representations (Eigen, OpenCV, tf2 etc.).

    +
    Author
    Matouš Vrba - vrbam.nosp@m.ato@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz
    +

    Macro Definition Documentation

    + +

    ◆ GENERATE_HAS_MEMBER

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    #define GENERATE_HAS_MEMBER( memb,
     type 
    )
    +
    +Value:
    template<class T> using _has_##memb##mem_chk = \
    +
    decltype(std::declval<T &>().memb); \
    +
    template<class T> constexpr bool has_##memb##mem_v = \
    +
    std::experimental::is_detected_convertible_v<type, _has_##memb##mem_chk, T>;
    +
    +
    +
    + +

    ◆ GENERATE_HAS_MEMBER_FUNC

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    #define GENERATE_HAS_MEMBER_FUNC( func,
     rettype 
    )
    +
    +Value:
    template<class T> using _has_##func##fun_chk = \
    +
    decltype(std::declval<T &>().func()); \
    +
    template<class T> constexpr bool has_##func##fun_v = \
    +
    std::experimental::is_detected_convertible_v<rettype, _has_##func##fun_chk, T>;
    +
    +
    +
    +
    +
    + + + + diff --git a/vector__converter_8hpp.js b/vector__converter_8hpp.js new file mode 100644 index 00000000..4405c9ff --- /dev/null +++ b/vector__converter_8hpp.js @@ -0,0 +1,15 @@ +var vector__converter_8hpp = +[ + [ "GENERATE_HAS_MEMBER", "vector__converter_8hpp.html#aa41d8468e319f49aa2522ff4ab2353a0", null ], + [ "GENERATE_HAS_MEMBER_FUNC", "vector__converter_8hpp.html#a65f0dda4c9fc957340ff554926c94d04", null ], + [ "_has_squarebracket_operator_chk", "vector__converter_8hpp.html#a4eae190daf29448c2fc41fd55aa46467", null ], + [ "unw_t", "vector__converter_8hpp.html#a58f0f9a437a7cd5d07b57ab0a78bc280", null ], + [ "convertFrom", "vector__converter_8hpp.html#afc6c8098a01c4174a87d3339b8d1025a", null ], + [ "convertFrom", "vector__converter_8hpp.html#a2ebce3a44ae9b2febe7adce4c775ddf4", null ], + [ "convertFrom", "vector__converter_8hpp.html#a1bfa972986fa65e93eb79a28aacc532f", null ], + [ "convertTo", "vector__converter_8hpp.html#a7867152bf1395e0cafb4b31f565e2304", null ], + [ "convertTo", "vector__converter_8hpp.html#a7b987e1f29569d4848b90e21a44a330e", null ], + [ "convertTo", "vector__converter_8hpp.html#a521be99b55661a3496c95a526fb9fad5", null ], + [ "has_squarebracket_operator_v", "vector__converter_8hpp.html#afe0124d8facb7f51b97db1237945825a", null ], + [ "has_xyz_constructor_v", "vector__converter_8hpp.html#aaddf0e395b295102fbc6011eda6450c5", null ] +]; \ No newline at end of file diff --git a/vector__converter_8hpp__dep__incl.map b/vector__converter_8hpp__dep__incl.map new file mode 100644 index 00000000..b159db62 --- /dev/null +++ b/vector__converter_8hpp__dep__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/vector__converter_8hpp__dep__incl.md5 b/vector__converter_8hpp__dep__incl.md5 new file mode 100644 index 00000000..6a891573 --- /dev/null +++ b/vector__converter_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +cfac1f8079466ec20379ab1a1709d58e \ No newline at end of file diff --git a/vector__converter_8hpp__dep__incl.png b/vector__converter_8hpp__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..9d76090d5b5fcb578989f0113be7ad5209698bef GIT binary patch literal 8593 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 literal 0 HcmV?d00001 diff --git a/vector__converter_8hpp__incl.map b/vector__converter_8hpp__incl.map new file mode 100644 index 00000000..89e7cdf3 --- /dev/null +++ b/vector__converter_8hpp__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/vector__converter_8hpp__incl.md5 b/vector__converter_8hpp__incl.md5 new file mode 100644 index 00000000..b38b9258 --- /dev/null +++ b/vector__converter_8hpp__incl.md5 @@ -0,0 +1 @@ +62e0fa06a887f780f1a666d9413d0d64 \ No newline at end of file diff --git a/vector__converter_8hpp__incl.png b/vector__converter_8hpp__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..9fdad77c766b127908fd2e080d13b0f9794ac8d3 GIT binary patch literal 5113 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 literal 0 HcmV?d00001 diff --git a/vector__converter_8hpp_source.html b/vector__converter_8hpp_source.html new file mode 100644 index 00000000..3a22791a --- /dev/null +++ b/vector__converter_8hpp_source.html @@ -0,0 +1,189 @@ + + + + + + + +mrs_lib: include/mrs_lib/impl/vector_converter.hpp Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    vector_converter.hpp
    +
    +
    +Go to the documentation of this file.
    1 
    +
    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  std::enable_if_t<has_xfun_v<in_t>, unw_t> convertFrom(const in_t& in)
    +
    43  {
    +
    44  return {in.x(), in.y(), in.z()};
    +
    45  }
    +
    46 
    +
    47  // convertFrom specialization for plain member types
    +
    48  template <typename in_t>
    +
    49  std::enable_if_t<has_xmem_v<in_t>, unw_t> convertFrom(const in_t& in)
    +
    50  {
    +
    51  return {in.x, in.y, in.z};
    +
    52  }
    +
    53 
    +
    54  // convertFrom specialization for OpenCV vectors
    +
    55  template <typename in_t>
    +
    56  std::enable_if_t<has_squarebracket_operator_v<in_t> && !has_xfun_v<in_t>, unw_t> convertFrom(const in_t& in)
    +
    57  {
    +
    58  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  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  out = {x, y, z};
    +
    66  }
    +
    67 
    +
    68  // convertTo specialization for other types
    +
    69  template <typename ret_t>
    +
    70  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  out.x = x;
    +
    73  out.y = y;
    +
    74  out.z = z;
    +
    75  }
    +
    76 
    +
    77  template <typename ret_t>
    +
    78  ret_t convertTo(const double x, const double y, const double z)
    +
    79  {
    +
    80  ret_t ret;
    +
    81  convertTo(ret, x, y, z);
    +
    82  return ret;
    +
    83  }
    +
    84 
    +
    85  } // namespace impl
    +
    86 
    +
    87 } // namespace mrs_lib
    +
    88 
    +
    89 #endif // VECTOR_CONVERTER_HPP
    +
    +
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    + + + + diff --git a/vector__converter__types_8h_source.html b/vector__converter__types_8h_source.html new file mode 100644 index 00000000..741d6263 --- /dev/null +++ b/vector__converter__types_8h_source.html @@ -0,0 +1,110 @@ + + + + + + + +mrs_lib: include/mrs_lib/impl/vector_converter_types.h Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    vector_converter_types.h
    +
    +
    +
    1 // Include necessary files for the vector types here
    +
    2 #include <Eigen/Dense>
    +
    3 #include <geometry_msgs/Vector3.h>
    +
    4 #include <opencv2/imgproc/imgproc.hpp>
    +
    5 #include <pcl/point_types.h>
    +
    6 
    +
    7 // Add the types for which you want the conversion to be instantiated to this list
    +
    8 #define VC_TYPE_LIST Eigen::Vector3d, Eigen::Vector3f, cv::Vec3d, cv::Vec3f, geometry_msgs::Vector3, pcl::PointXYZ
    +
    +
    + + + + diff --git a/vector_converter_2example_8cpp-example.html b/vector_converter_2example_8cpp-example.html new file mode 100644 index 00000000..a9bbc9de --- /dev/null +++ b/vector_converter_2example_8cpp-example.html @@ -0,0 +1,180 @@ + + + + + + + +mrs_lib: vector_converter/example.cpp + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    vector_converter/example.cpp
    +
    +
    +

    This is an example of usage of the convert() function for conversion between different vector types. It may be run after building mrs_lib by executing rosrun mrs_lib vector_converter_example.

    +
    // clang: MatousFormat
    +
    #include <geometry_msgs/Vector3.h>
    +
    #include <Eigen/Dense>
    +
    #include <pcl/point_types.h>
    +
    +
    /* Demonstration of usage for custom incompatible types. //{ */
    +
    +
    // What if we want to convert from/to a different type, which doesn't provide either operator[], nor x(), y() and z() getter/setter methods, nor x, y and z-named members?
    +
    struct MyPoint
    +
    {
    +
    double e1, e2, e3;
    +
    };
    +
    +
    // We need to define our own specialization of the mrs_lib::impl::convertFrom() and mrs_lib::impl::convertTo() functions for this type. convert() will then work automatically.
    +
    namespace mrs_lib
    +
    {
    +
    namespace impl
    +
    {
    +
    +
    // convertFrom specialization for MyPoint (mrs_lib::impl::unw_t is just a shorthand for std::tuple<double, double, double>)
    +
    std::tuple<double, double, double> convertFrom(const MyPoint& in)
    +
    {
    +
    return {in.e1, in.e2, in.e3};
    +
    }
    +
    +
    // convertTo specialization for MyPoint
    +
    void convertTo(MyPoint& ret, const double x, const double y, const double z)
    +
    {
    +
    ret.e1 = x;
    +
    ret.e2 = y;
    +
    ret.e3 = z;
    +
    }
    +
    +
    }
    +
    }
    +
    +
    //}
    +
    +
    // Include the vector_converter.h header (this has to be included *after* defining functions for your custom types)
    +
    #pragma GCC diagnostic push
    +
    #pragma GCC diagnostic ignored "-Wnarrowing"
    + +
    #pragma GCC diagnostic pop
    +
    +
    int main()
    +
    {
    +
    // prepare a source variable `from` with the type, which we'll want to convert
    +
    const double xo = rand(), yo = rand(), zo = rand();
    +
    // the mrs_lib::impl::convertTo() function is used as a shortcut for initialization of the object
    +
    // Note, then when converting to a single precision floating type,
    +
    // the compiler will emit a narrowing conversion waring. This can be disabled using the pragma statements
    +
    // around the line `#include <mrs_lib/vector_converter.h>` (see above).
    +
    const auto from = mrs_lib::impl::convertTo<pcl::PointXYZ>(xo, yo, zo);
    +
    +
    // This is the main functionality - one-liner for converting between two vector types.
    +
    const auto to = mrs_lib::convert<Eigen::Vector3d>(from);
    +
    const auto to2 = mrs_lib::convert<geometry_msgs::Vector3>(to);
    +
    +
    std::cout << "Converted from type " << typeid(decltype(from)).name() << " with value:" << std::endl << from << std::endl;
    +
    std::cout << " to type " << typeid(decltype(to)).name() << " with value:" << std::endl << to << std::endl << std::endl;
    +
    std::cout << " and then to type " << typeid(decltype(to2)).name() << " with value:" << std::endl << to2 << std::endl;
    +
    +
    // Even for custom types with compatible API, the convert() function will work (thanks to templates)
    +
    struct MyPointOK
    +
    {
    +
    double x, y, z;
    +
    };
    +
    const auto custom1 = mrs_lib::convert<MyPointOK>(from); // works
    +
    std::cout << " and to new type " << typeid(decltype(custom1)).name() << " with value:" << std::endl << custom1.x << std::endl << custom1.y << std::endl << custom1.z << std::endl << std::endl;
    +
    +
    // However, for custom types with incompatible API, the convertFrom() and convertTo() functions have to be manually implemented for convert() to work (take a look before main()):
    +
    const auto custom2 = mrs_lib::convert<MyPoint>(from); // now also works
    +
    std::cout << " and to new type " << typeid(decltype(custom2)).name() << " with value:" << std::endl << custom2.e1 << std::endl << custom2.e2 << std::endl << custom2.e3 << std::endl << std::endl;
    +
    }
    +
    +
    +
    +
    Defines the convert() function for conversion between different vector representations (Eigen,...
    +
    Definition: example.cpp:24
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    + + + + diff --git a/visual__object_8h.html b/visual__object_8h.html new file mode 100644 index 00000000..4f9594a4 --- /dev/null +++ b/visual__object_8h.html @@ -0,0 +1,176 @@ + + + + + + + +mrs_lib: include/mrs_lib/visual_object.h File Reference + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    visual_object.h File Reference
    +
    +
    + +

    Object abstraction for the Batch Visualizer. +More...

    +
    #include <Eigen/Core>
    +#include <ros/time.h>
    +#include <std_msgs/ColorRGBA.h>
    +#include <geometry_msgs/Point.h>
    +#include <mrs_lib/geometry/shapes.h>
    +#include <mrs_msgs/TrajectoryReference.h>
    +
    + + Include dependency graph for visual_object.h:
    +
    +
    + +
    + + This graph shows which files directly or indirectly include this file:
    +
    +
    + +
    +

    Go to the source code of this file.

    + + + + +

    +Classes

    class  mrs_lib::VisualObject
     
    + + + + +

    +Namespaces

     mrs_lib
     All mrs_lib functions, classes, variables and definitions are contained in this namespace.
     
    + + + +

    +Macros

    +#define DEFAULT_ELLIPSE_POINTS   64
     
    + + + +

    +Enumerations

    enum  MarkerType { POINT = 0, +LINE = 1, +TRIANGLE = 2 + }
     
    +

    Detailed Description

    +

    Object abstraction for the Batch Visualizer.

    +
    Author
    Petr Štibinger - stibi.nosp@m.pet@.nosp@m.fel.c.nosp@m.vut..nosp@m.cz
    +
    +
    + + + + diff --git a/visual__object_8h.js b/visual__object_8h.js new file mode 100644 index 00000000..2fad00e8 --- /dev/null +++ b/visual__object_8h.js @@ -0,0 +1,10 @@ +var visual__object_8h = +[ + [ "VisualObject", "classmrs__lib_1_1VisualObject.html", "classmrs__lib_1_1VisualObject" ], + [ "DEFAULT_ELLIPSE_POINTS", "visual__object_8h.html#a51b7645de121a21302986b8fa7ff2759", null ], + [ "MarkerType", "visual__object_8h.html#a76c3f6cd3ae9c808511ffe4d2a3d799f", [ + [ "POINT", "visual__object_8h.html#a76c3f6cd3ae9c808511ffe4d2a3d799faf4a7505a8b840856e361a9852997d8c6", null ], + [ "LINE", "visual__object_8h.html#a76c3f6cd3ae9c808511ffe4d2a3d799fa1d6aa4216fb97d4aef252473bed38425", null ], + [ "TRIANGLE", "visual__object_8h.html#a76c3f6cd3ae9c808511ffe4d2a3d799fabd23f5af6c16dfdb2f098be0be10264a", null ] + ] ] +]; \ No newline at end of file diff --git a/visual__object_8h__dep__incl.map b/visual__object_8h__dep__incl.map new file mode 100644 index 00000000..e639f217 --- /dev/null +++ b/visual__object_8h__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/visual__object_8h__dep__incl.md5 b/visual__object_8h__dep__incl.md5 new file mode 100644 index 00000000..ecd025ad --- /dev/null +++ b/visual__object_8h__dep__incl.md5 @@ -0,0 +1 @@ +6435b4219fd5f921f887776643edb21b \ No newline at end of file diff --git a/visual__object_8h__dep__incl.png b/visual__object_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..8cf99afab5ffe8386d8b77752906814a023b2b40 GIT binary patch literal 5709 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 + + + + + + + + + + diff --git a/visual__object_8h__incl.md5 b/visual__object_8h__incl.md5 new file mode 100644 index 00000000..025b3ad5 --- /dev/null +++ b/visual__object_8h__incl.md5 @@ -0,0 +1 @@ +05fa3ca8656a451a296cf3f8cb98d18e \ No newline at end of file diff --git a/visual__object_8h__incl.png b/visual__object_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..82ba9dd4c597f0f4b1ded128e1690cfe504d6c1d GIT binary patch literal 21912 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 + + + + + + +mrs_lib: include/mrs_lib/visual_object.h Source File + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    mrs_lib +
    +
    Various reusable classes, functions and utilities for use in MRS projects
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    visual_object.h
    +
    +
    +Go to the documentation of this file.
    1 
    +
    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>
    + +
    14 #include <mrs_msgs/TrajectoryReference.h>
    +
    15 
    +
    16 #define DEFAULT_ELLIPSE_POINTS 64
    +
    17 
    +
    18 namespace mrs_lib
    +
    19 {
    +
    20 
    +
    21 enum MarkerType
    +
    22 {
    +
    23  POINT = 0,
    +
    24  LINE = 1,
    +
    25  TRIANGLE = 2
    +
    26 };
    +
    27 
    +
    28 class VisualObject {
    +
    29 
    +
    30 
    +
    31 public:
    +
    32  VisualObject(const Eigen::Vector3d& point, const double r, const double g, const double b, const double a, const ros::Duration& timeout,
    +
    33  const unsigned long& id);
    +
    34 
    +
    35  VisualObject(const mrs_lib::geometry::Ray& ray, const double r, const double g, const double b, const double a, const ros::Duration& timeout,
    +
    36  const unsigned long& id);
    +
    37 
    +
    38  VisualObject(const mrs_lib::geometry::Triangle& triangle, const double r, const double g, const double b, const double a, const ros::Duration& timeout,
    +
    39  const bool filled, const unsigned long& id);
    +
    40 
    +
    41  VisualObject(const mrs_lib::geometry::Rectangle& rectangle, const double r, const double g, const double b, const double a, const ros::Duration& timeout,
    +
    42  const bool filled, const unsigned long& id);
    +
    43 
    +
    44  VisualObject(const mrs_lib::geometry::Cuboid& cuboid, const double r, const double g, const double b, const double a, const ros::Duration& timeout,
    +
    45  const bool filled, const unsigned long& id);
    +
    46 
    +
    47  VisualObject(const mrs_lib::geometry::Ellipse& ellipse, const double r, const double g, const double b, const double a, const ros::Duration& timeout,
    +
    48  const bool filled, const unsigned long& id, const int num_points = DEFAULT_ELLIPSE_POINTS);
    +
    49 
    +
    50  VisualObject(const mrs_lib::geometry::Cylinder& cylinder, const double r, const double g, const double b, const double a, const ros::Duration& timeout,
    +
    51  const bool filled, const bool capped, const unsigned long& id, const int num_sides = DEFAULT_ELLIPSE_POINTS);
    +
    52 
    +
    53  VisualObject(const mrs_lib::geometry::Cone& cone, const double r, const double g, const double b, const double a, const ros::Duration& timeout,
    +
    54  const bool filled, const bool capped, const unsigned long& id, const int num_sides = DEFAULT_ELLIPSE_POINTS);
    +
    55 
    +
    56  VisualObject(const mrs_msgs::TrajectoryReference& traj, const double r, const double g, const double b, const double a, const ros::Duration& timeout,
    +
    57  const bool filled, const unsigned long& id);
    +
    58 
    +
    59 
    +
    60 public:
    +
    61  unsigned long getID() const;
    +
    62  int getType() const;
    +
    63  bool isTimedOut() const;
    +
    64 
    +
    65  const std::vector<geometry_msgs::Point> getPoints() const;
    +
    66  const std::vector<std_msgs::ColorRGBA> getColors() const;
    +
    67 
    +
    68  bool operator<(const VisualObject& other) const {
    +
    69  return id_ < other.id_;
    +
    70  }
    +
    71 
    +
    72  bool operator>(const VisualObject& other) const {
    +
    73  return id_ > other.id_;
    +
    74  }
    +
    75 
    +
    76  bool operator==(const VisualObject& other) const {
    +
    77  return id_ == other.id_;
    +
    78  }
    +
    79 
    +
    80 private:
    +
    81  const unsigned long id_;
    +
    82  MarkerType type_;
    +
    83  std::vector<geometry_msgs::Point> points_;
    +
    84  std::vector<std_msgs::ColorRGBA> colors_;
    +
    85  ros::Time timeout_time_;
    +
    86 
    +
    87  void addRay(const mrs_lib::geometry::Ray& ray, const double r, const double g, const double b, const double a);
    +
    88 
    +
    89  void addTriangle(const mrs_lib::geometry::Triangle& triangle, const double r, const double g, const double b, const double a, const bool filled);
    +
    90 
    +
    91  void 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 }; // namespace batch_visualizer
    +
    95 
    +
    96 } // namespace mrs_lib
    +
    97 
    +
    98 #endif
    +
    +
    +
    geometric representation of a ray. Instantiate it by two input Vector3. Use static methods for from-t...
    Definition: shapes.h:24
    +
    geometric representation of a cuboid
    Definition: shapes.h:317
    +
    geometric representation of an ellipse
    Definition: shapes.h:426
    +
    All mrs_lib functions, classes, variables and definitions are contained in this namespace.
    Definition: attitude_converter.h:29
    +
    geometric representation of a rectangle (can represent any quadrilateral)
    Definition: shapes.h:187
    +
    Defines various geometrical shapes and their relations.
    +
    geometric representation of a triangle. Instantiate a new triangle by providing three vertices
    Definition: shapes.h:98
    +
    geometric representation of a cylinder
    Definition: shapes.h:490
    +
    Definition: visual_object.h:28
    +
    geometric representaiton of a cone
    Definition: shapes.h:573
    + + + +

    + +
    +
    + + +
    + +
    + +
    +
    +
    dynamic_reconfigure_mgr.h
    +
    +
    +Go to the documentation of this file.
    1 // clang: MatousFormat
    +
    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 
    +
    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>
    + +
    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  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  m_server(m_server_mtx, nh),
    +
    54  m_usr_cbf(user_callback),
    +
    55  m_pl(nh, print_values, node_name)
    +
    56  {
    +
    57  // initialize the dynamic reconfigure callback
    +
    58  m_server.setCallback(boost::bind(&DynamicReconfigureMgr<ConfigType>::dynamic_reconfigure_callback, this, _1, _2));
    +
    59  };
    +
    60 
    +
    61  /* Constructor overloads //{ */
    +
    62  // Convenience constructor to enable writing DynamicReconfigureMgr<MyConfig> drmgr(nh, node_name)
    +
    63  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  void update_config(const ConfigType& cfg)
    +
    72  {
    +
    73  m_server.updateConfig(cfg);
    +
    74  }
    +
    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  void dynamic_reconfigure_callback(ConfigType& new_config, uint32_t level)
    +
    107  {
    +
    108  if (m_print_values)
    +
    109  {
    +
    110  if (m_node_name.empty())
    +
    111  ROS_INFO("Dynamic reconfigure request received");
    +
    112  else
    +
    113  ROS_INFO("[%s]: Dynamic reconfigure request received", m_node_name.c_str());
    +
    114  }
    +
    115 
    +
    116  if (m_not_initialized)
    +
    117  {
    +
    118  load_defaults(new_config);
    +
    119  update_config(new_config);
    +
    120  }
    +
    121  if (m_print_values)
    +
    122  {
    +
    123  print_changed_params(new_config);
    +
    124  }
    +
    125  m_not_initialized = false;
    +
    126  config = new_config;
    +
    127  if (m_usr_cbf)
    +
    128  m_usr_cbf(new_config, level);
    +
    129  }
    +
    130 
    +
    131  template <typename T>
    +
    132  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  boost::shared_ptr<const param_descr_t> cast_descr = boost::dynamic_pointer_cast<const param_descr_t>(descr);
    +
    136  m_pl.loadParam(name, config.*(cast_descr->field));
    +
    137  }
    +
    138 
    +
    139  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  std::vector<typename ConfigType::AbstractParamDescriptionConstPtr> descrs = new_config.__getParamDescriptions__();
    +
    143  for (auto& descr : descrs)
    +
    144  {
    +
    145  std::string name = descr->name;
    +
    146  size_t pos = name.find("__");
    +
    147  while (pos != name.npos)
    +
    148  {
    +
    149  name.replace(pos, 2, "/");
    +
    150  pos = name.find("__");
    +
    151  }
    +
    152 
    +
    153  if (descr->type == "bool")
    +
    154  load_param<bool>(name, descr, new_config);
    +
    155  else if (descr->type == "int")
    +
    156  load_param<int>(name, descr, new_config);
    +
    157  else if (descr->type == "double")
    +
    158  load_param<double>(name, descr, new_config);
    +
    159  else if (descr->type == "str")
    +
    160  load_param<std::string>(name, descr, new_config);
    +
    161  else
    +
    162  {
    +
    163  ROS_ERROR("[%s]: Unknown parameter type: '%s'", m_node_name.c_str(), descr->type.c_str());
    +
    164  m_loaded_invalid_default = true;
    +
    165  }
    +
    166  }
    +
    167  }
    +
    168 
    +
    169  // method for printing names and values of new received parameters (prints only the changed ones) //{
    +
    170  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  std::vector<typename ConfigType::AbstractParamDescriptionConstPtr> descrs = new_config.__getParamDescriptions__();
    +
    174  for (auto& descr : descrs)
    +
    175  {
    +
    176  boost::any val, old_val;
    +
    177  descr->getValue(new_config, val);
    +
    178  descr->getValue(config, old_val);
    +
    179  std::string name = descr->name;
    +
    180  const size_t pos = name.find("__");
    +
    181  if (pos != name.npos)
    +
    182  {
    +
    183  if (m_not_initialized)
    +
    184  {
    +
    185  continue;
    +
    186  } else
    +
    187  {
    +
    188  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  if (try_cast(val, intval))
    +
    199  {
    +
    200  if (m_not_initialized || !try_compare(old_val, intval))
    +
    201  print_value(name, *intval);
    +
    202  } else if (try_cast(val, doubleval))
    +
    203  {
    +
    204  if (m_not_initialized || !try_compare(old_val, doubleval))
    +
    205  print_value(name, *doubleval);
    +
    206  } else if (try_cast(val, boolval))
    +
    207  {
    +
    208  if (m_not_initialized || !try_compare(old_val, boolval))
    +
    209  print_value(name, *boolval);
    +
    210  } else if (try_cast(val, stringval))
    +
    211  {
    +
    212  if (m_not_initialized || !try_compare(old_val, stringval))
    +
    213  print_value(name, *stringval);
    +
    214  } else
    +
    215  {
    +
    216  print_value(name, std::string("unknown dynamic reconfigure type"));
    +
    217  }
    +
    218  }
    +
    219  }
    +
    220  //}
    +
    221 
    +
    222  // helper method for parameter printing
    +
    223  template <typename T>
    +
    224  inline void print_value(const std::string& name, const T& val)
    +
    225  {
    +
    226  if (m_node_name.empty())
    +
    227  std::cout << "\t" << name << ":\t" << val << std::endl;
    +
    228  else
    +
    229  ROS_INFO_STREAM("[" << m_node_name << "]: parameter '" << name << "':\t" << val);
    +
    230  }
    +
    231  // helper methods for automatic parameter value parsing
    +
    232  template <typename T>
    +
    233  inline bool try_cast(boost::any& val, T*& out)
    +
    234  {
    +
    235  return (out = boost::any_cast<T>(&val));
    +
    236  }
    +
    237  template <typename T>
    +
    238  inline bool try_compare(boost::any& val, T*& to_what)
    +
    239  {
    +
    240  T* tmp;
    +
    241  if ((tmp = boost::any_cast<T>(&val)))
    +
    242  {
    +
    243  /* std::cout << std::endl << *tmp << " vs " << *to_what << std::endl; */
    +
    244  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  if (m_node_name.empty())
    +
    248  ROS_WARN("DynamicReconfigure value type has changed - this should not happen!");
    +
    249  else
    +
    250  ROS_WARN_STREAM("[" << m_node_name << "]: DynamicReconfigure value type has changed - this should not happen!");
    +
    251  return false;
    +
    252  }
    +
    253  }
    +
    254 };
    +
    255 //}
    +
    256 
    +
    257 }
    +
    258 
    +
    259 #endif // DYNAMIC_RECONFIGURE_MGR_H
    +
    +
    + +
    +
    + + +
    + +
    + +
    +
    +
    dynamic_publisher.h
    +
    +
    +Go to the documentation of this file.
    1 // clang: MatousFormat
    +
    8 #ifndef DYNAMIC_PUBLISHER_H
    +
    9 #define DYNAMIC_PUBLISHER_H
    +
    10 
    +
    11 #include <mutex>
    +
    12 #include <ros/ros.h>
    + +
    14 
    +
    15 namespace mrs_lib
    +
    16 {
    +
    17 
    + +
    27  {
    +
    28  public:
    + +
    35 
    +
    42  DynamicPublisher(const ros::NodeHandle& nh);
    +
    43 
    +
    52  template <class T>
    +
    53  void publish(const std::string name, const T& msg);
    +
    54 
    +
    55  private:
    +
    56  class impl;
    +
    57  std::unique_ptr<impl> m_impl;
    +
    58  };
    +
    59 
    +
    60 #include <mrs_lib/impl/dynamic_publisher.hpp>
    +
    61 
    +
    62 } // namespace mrs_lib
    +
    63 
    +
    64 #endif // DYNAMIC_PUBLISHER_H
    +
    +
    + +
    +
    + + +
    + +
    + +
    +
    +
    attitude_converter.h
    +
    +
    +Go to the documentation of this file.
    1 // clang: TomasFormat
    +
    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 
    + +
    47 public:
    +
    55  EulerAttitude(const double& roll, const double& pitch, const double& yaw);
    +
    56 
    +
    62  double roll(void) const;
    +
    63 
    +
    69  double pitch(void) const;
    +
    70 
    +
    76  double yaw(void) const;
    +
    77 
    +
    78 private:
    +
    79  double roll_, pitch_, yaw_;
    +
    80 };
    +
    81 
    +
    82 //}
    +
    83 
    +
    84 /* class Vector3Converter //{ */
    +
    85 
    + +
    91 public:
    +
    97  Vector3Converter(const tf2::Vector3& vector3) : vector3_(vector3){};
    +
    98 
    +
    104  Vector3Converter(const Eigen::Vector3d& vector3);
    +
    105 
    +
    111  Vector3Converter(const geometry_msgs::Vector3& vector3);
    +
    112 
    +
    120  Vector3Converter(const double& x, const double& y, const double& z);
    +
    121 
    +
    127  operator tf2::Vector3() const;
    +
    128 
    +
    134  operator Eigen::Vector3d() const;
    +
    135 
    +
    141  operator geometry_msgs::Vector3() const;
    +
    142 
    +
    143 private:
    +
    144  tf2::Vector3 vector3_;
    +
    145 };
    +
    146 
    +
    147 //}
    +
    148 
    + +
    154 public:
    +
    155  /* exceptions //{ */
    +
    156 
    +
    158  struct GetHeadingException : public std::exception
    +
    159  {
    +
    160  const char* what() const throw() {
    +
    161  return "AttitudeConverter: can not calculate the heading, the rotated x-axis is parallel to the world's z-axis";
    +
    162  }
    +
    163  };
    +
    164 
    +
    166  struct MathErrorException : public std::exception
    +
    167  {
    +
    168  const char* what() const throw() {
    +
    169  return "AttitudeConverter: math error";
    +
    170  }
    +
    171  };
    +
    172 
    +
    174  struct InvalidAttitudeException : public std::exception
    +
    175  {
    +
    176  const char* what() const throw() {
    +
    177  return "AttitudeConverter: invalid attitude, the input probably constains NaNs";
    +
    178  }
    +
    179  };
    +
    180 
    +
    182  struct EulerFormatException : public std::exception
    +
    183  {
    +
    184  const char* what() const throw() {
    +
    185  return "AttitudeConverter: invalid Euler angle format";
    +
    186  }
    +
    187  };
    +
    188 
    +
    190  struct SetHeadingException : public std::exception
    +
    191  {
    +
    192  const char* what() const throw() {
    +
    193  return "AttitudeConverter: cannot set the desired heading, the thrust vector's Z component is 0";
    +
    194  }
    +
    195  };
    +
    196 
    +
    197  //}
    +
    198 
    +
    199  /* constructors //{ */
    +
    200 
    +
    209  AttitudeConverter(const double& roll, const double& pitch, const double& yaw, const RPY_convention_t& format = RPY_EXTRINSIC);
    +
    210 
    +
    216  AttitudeConverter(const tf::Quaternion quaternion);
    +
    217 
    +
    223  AttitudeConverter(const geometry_msgs::Quaternion quaternion);
    +
    224 
    +
    230  AttitudeConverter(const mrs_lib::EulerAttitude& euler_attitude);
    +
    231 
    +
    237  AttitudeConverter(const Eigen::Quaterniond quaternion);
    +
    238 
    +
    244  AttitudeConverter(const Eigen::Matrix3d matrix);
    +
    245 
    +
    252  template <class T>
    +
    253  AttitudeConverter(const Eigen::AngleAxis<T> angle_axis) {
    +
    254  double angle = angle_axis.angle();
    +
    255  tf2::Vector3 axis(angle_axis.axis()[0], angle_axis.axis()[1], angle_axis.axis()[2]);
    +
    256 
    +
    257  tf2_quaternion_.setRotation(axis, angle);
    +
    258  }
    +
    259 
    +
    265  AttitudeConverter(const tf2::Quaternion quaternion);
    +
    266 
    +
    272  AttitudeConverter(const tf2::Matrix3x3 matrix);
    +
    273 
    +
    274  //}
    +
    275 
    +
    276  /* operators //{ */
    +
    277 
    +
    283  operator tf2::Quaternion() const;
    +
    284 
    +
    290  operator tf::Quaternion() const;
    +
    291 
    +
    297  operator geometry_msgs::Quaternion() const;
    +
    298 
    +
    304  operator EulerAttitude() const;
    +
    305 
    +
    313  template <class T>
    +
    314  operator Eigen::AngleAxis<T>() const {
    +
    315 
    +
    316  double angle = tf2_quaternion_.getAngle();
    +
    317  Eigen::Vector3d axis(tf2_quaternion_.getAxis()[0], tf2_quaternion_.getAxis()[1], tf2_quaternion_.getAxis()[2]);
    +
    318 
    +
    319  Eigen::AngleAxis<T> angle_axis(angle, axis);
    +
    320 
    +
    321  return angle_axis;
    +
    322  }
    +
    323 
    +
    324 
    +
    332  template <class T>
    +
    333  operator Eigen::Quaternion<T>() const {
    +
    334 
    +
    335  return Eigen::Quaternion<T>(tf2_quaternion_.w(), tf2_quaternion_.x(), tf2_quaternion_.y(), tf2_quaternion_.z());
    +
    336  }
    +
    337 
    +
    338  operator Eigen::Matrix3d() const;
    +
    339 
    +
    345  operator std::tuple<double&, double&, double&>();
    +
    346 
    +
    352  operator tf2::Matrix3x3() const;
    +
    353 
    +
    359  operator tf2::Transform() const;
    +
    360 
    +
    361  //}
    +
    362 
    +
    363  /* getters //{ */
    +
    364 
    +
    370  double getRoll(void);
    +
    371 
    +
    377  double getPitch(void);
    +
    378 
    +
    384  double getYaw(void);
    +
    385 
    +
    391  double getHeading(void);
    +
    392 
    +
    400  double getHeadingRate(const Vector3Converter& attitude_rate);
    +
    401 
    +
    409  double getYawRateIntrinsic(const double& heading_rate);
    +
    410 
    + +
    417 
    + +
    424 
    + +
    431 
    +
    437  std::tuple<double, double, double> getIntrinsicRPY();
    +
    438 
    +
    444  std::tuple<double, double, double> getExtrinsicRPY();
    +
    445 
    +
    446  //}
    +
    447 
    +
    448  /* setters //{ */
    +
    449 
    +
    457  AttitudeConverter setHeading(const double& heading);
    +
    458 
    +
    466  AttitudeConverter setYaw(const double& new_yaw);
    +
    467 
    +
    468  //}
    +
    469 
    +
    470  template <std::size_t I>
    +
    471  constexpr auto get();
    +
    472 
    +
    473 private:
    +
    477  tf2::Quaternion tf2_quaternion_;
    +
    478 
    +
    482  void calculateRPY(void);
    +
    483 
    +
    487  void validateOrientation(void);
    +
    488 
    +
    492  double roll_, pitch_, yaw_;
    +
    493  bool got_rpy_ = false;
    +
    494 };
    +
    495 
    +
    496 
    +
    497 template <std::size_t I>
    +
    498 constexpr auto AttitudeConverter::get() {
    +
    499 
    +
    500  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  return static_cast<double>(roll_);
    +
    508  } else if constexpr (I == 1) {
    +
    509  return static_cast<double>(pitch_);
    +
    510  } else if constexpr (I == 2) {
    +
    511  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
    +
    +