Visual Servoing Platform  version 3.6.1 under development (2025-02-20)
vpRBTrackerLogger.h
1 /*
2  * ViSP, open source Visual Servoing Platform software.
3  * Copyright (C) 2005 - 2024 by Inria. All rights reserved.
4  *
5  * This software is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  * See the file LICENSE.txt at the root directory of this source
10  * distribution for additional information about the GNU GPL.
11  *
12  * For using ViSP with software that can not be combined with the GNU
13  * GPL, please contact Inria about acquiring a ViSP Professional
14  * Edition License.
15  *
16  * See https://visp.inria.fr for more information.
17  *
18  * This software was developed at:
19  * Inria Rennes - Bretagne Atlantique
20  * Campus Universitaire de Beaulieu
21  * 35042 Rennes Cedex
22  * France
23  *
24  * If you have questions regarding the use of this file, please contact
25  * Inria at visp@inria.fr
26  *
27  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
28  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
29  */
30 
35 #ifndef VP_RB_TRACKER_LOGGER_H
36 #define VP_RB_TRACKER_LOGGER_H
37 
38 #include <visp3/core/vpConfig.h>
39 #include <visp3/core/vpMath.h>
40 #include <visp3/core/vpTime.h>
41 
42 #if defined(VISP_HAVE_NLOHMANN_JSON)
43 #include VISP_NLOHMANN_JSON(json.hpp)
44 #endif
45 
46 BEGIN_VISP_NAMESPACE
53 class vpRBTrackerLogger;
54 
55 std::ostream &operator<<(std::ostream &s, const vpRBTrackerLogger &I);
56 
57 class VISP_EXPORT vpRBTrackerLogger
58 {
59 public:
60  void reset()
61  {
62  m_renderTime = 0.0;
63  m_silhouetteExtractionTime = 0.0;
64  m_odometryTime = 0.0;
65  m_driftTime = 0.0;
66 
67  m_trackerIterStartTime.clear();
68  m_trackerFeatureExtractionTime.clear();
69 
70  m_trackerFeatureTrackingTime.clear();
71  m_trackerVVSIterTimes.clear();
72  }
73 
74  friend std::ostream &operator<<(std::ostream &, const vpRBTrackerLogger &);
75 
76  void startTimer() { m_startTime = vpTime::measureTimeMs(); }
77  double endTimer()
78  {
79  if (m_startTime < 0.f) throw vpException(vpException::notInitialized, "Tried to query timer without starting it.");
80  double elapsed = vpTime::measureTimeMs() - m_startTime;
81  m_startTime = -1.f;
82  return elapsed;
83  }
84 
85  void setRenderTime(double elapsed) { m_renderTime = elapsed; }
86  void setSilhouetteTime(double elapsed) { m_silhouetteExtractionTime = elapsed; }
87  void setMaskTime(double elapsed) { m_maskTime = elapsed; }
88 
89  void insertTrackerTime(std::map<int, std::vector<double>> &map, int id, double elapsed)
90  {
91  if (map.find(id) == map.end()) {
92  map.insert(std::make_pair(id, std::vector<double>()));
93  }
94  map.find(id)->second.push_back(elapsed);
95  }
96  void addTrackerVVSTime(int id, double elapsed)
97  {
98  insertTrackerTime(m_trackerVVSIterTimes, id, elapsed);
99  }
100 
101  void setTrackerIterStartTime(int id, double elapsed)
102  {
103  m_trackerIterStartTime[id] = elapsed;
104  }
105 
106  void setTrackerFeatureExtractionTime(int id, double elapsed)
107  {
108  m_trackerFeatureExtractionTime[id] = elapsed;
109  }
110 
111  void setTrackerFeatureTrackingTime(int id, double elapsed)
112  {
113  m_trackerFeatureTrackingTime[id] = elapsed;
114  }
115 
116  void setInitVVSTime(int id, double elapsed)
117  {
118  m_trackerInitVVSTime[id] = elapsed;
119  }
120 
121  void setDriftDetectionTime(double elapsed)
122  {
123  m_driftTime = elapsed;
124  }
125 
126  void setOdometryTime(double elapsed)
127  {
128  m_odometryTime = elapsed;
129  }
130 
131 private:
132  double m_startTime;
133  double m_renderTime;
134  double m_silhouetteExtractionTime;
135  double m_maskTime;
136  double m_driftTime;
137  double m_odometryTime;
138  std::map<int, std::vector<double>> m_trackerVVSIterTimes;
139 
140  std::map<int, double> m_trackerIterStartTime;
141 
142  std::map<int, double> m_trackerFeatureExtractionTime;
143 
144  std::map<int, double> m_trackerFeatureTrackingTime;
145  std::map<int, double> m_trackerInitVVSTime;
146  std::map<int, int> m_trackerNumFeatures;
147 
148 };
149 
150 std::ostream &operator<<(std::ostream &out, const vpRBTrackerLogger &timer)
151 {
152  const auto default_precision { out.precision() };
153  auto flags = out.flags();
154  out << std::setprecision(2) << std::fixed;
155  out << "====================================================" << std::endl;
156  out << "Render: " << timer.m_renderTime << "ms" << std::endl;
157  out << "Mask: " << timer.m_maskTime << "ms" << std::endl;
158  out << "Drift: " << timer.m_driftTime << "ms" << std::endl;
159  out << "Odometry: " << timer.m_odometryTime << "ms" << std::endl;
160  out << "Silhouette extraction: " << timer.m_silhouetteExtractionTime << "ms" << std::endl;
161 
162  out << "Trackers: " << std::endl;
163  for (const std::pair<const int, std::vector<double>> &vvsIterData : timer.m_trackerVVSIterTimes) {
164  double trackingStartTime = timer.m_trackerIterStartTime.find(vvsIterData.first)->second;
165  double featTrackTime = timer.m_trackerFeatureTrackingTime.find(vvsIterData.first)->second;
166  double featExtractionTime = timer.m_trackerFeatureExtractionTime.find(vvsIterData.first)->second;
167  double initVVSTime = timer.m_trackerInitVVSTime.find(vvsIterData.first)->second;
168 
169  double ttVVSIter = 0.f;
170  for (double v : vvsIterData.second) {
171  ttVVSIter += v;
172  }
173  out << "\t" << vvsIterData.first << std::endl;
174  out << "\t" << "\t" << "Tracking initialization: " << trackingStartTime << "ms" << std::endl;
175  out << "\t" << "\t" << "Feature extraction: " << featExtractionTime << "ms" << std::endl;
176  out << "\t" << "\t" << "Feature tracking: " << featTrackTime << "ms" << std::endl;
177  out << "\t" << "\t" << "VVS init: " << initVVSTime << "ms" << std::endl;
178  out << "\t" << "\t" << "VVS: " << ttVVSIter << "ms (" << vpMath::getMean(vvsIterData.second) << "ms"
179  << "+-" << vpMath::getStdev(vvsIterData.second) << "ms)" << std::endl;
180  }
181  out << "====================================================" << std::endl;
182  out.flags(flags);
183  out << std::setprecision(default_precision); // restore defaults
184  return out;
185 }
186 
187 END_VISP_NAMESPACE
188 
189 #endif
friend std::ostream & operator<<(std::ostream &s, const vpArray2D< Type > &A)
Definition: vpArray2D.h:699
error that can be emitted by ViSP classes.
Definition: vpException.h:60
@ notInitialized
Used to indicate that a parameter is not initialized.
Definition: vpException.h:74
static double getStdev(const std::vector< double > &v, bool useBesselCorrection=false)
Definition: vpMath.cpp:353
static double getMean(const std::vector< double > &v)
Definition: vpMath.cpp:302
void setTrackerFeatureTrackingTime(int id, double elapsed)
void setRenderTime(double elapsed)
void setOdometryTime(double elapsed)
void setInitVVSTime(int id, double elapsed)
void setMaskTime(double elapsed)
void setTrackerIterStartTime(int id, double elapsed)
void setSilhouetteTime(double elapsed)
void addTrackerVVSTime(int id, double elapsed)
void insertTrackerTime(std::map< int, std::vector< double >> &map, int id, double elapsed)
void setDriftDetectionTime(double elapsed)
void setTrackerFeatureExtractionTime(int id, double elapsed)
VISP_EXPORT double measureTimeMs()