35#ifndef VP_RB_TRACKING_RESULT_H
36#define VP_RB_TRACKING_RESULT_H
38#include <visp3/core/vpConfig.h>
42#include <visp3/core/vpColVector.h>
43#include <visp3/core/vpHomogeneousMatrix.h>
45#include <visp3/rbt/vpRBTrackingTimings.h>
46#include <visp3/rbt/vpRBFeatureTracker.h>
48#if defined(VISP_HAVE_NLOHMANN_JSON)
49#include VISP_NLOHMANN_JSON(json.hpp)
68 m_numFeatures.push_back(tracker.getNumFeatures());
69 double w = tracker.getVVSTrackerWeight(
static_cast<double>(iter) /
static_cast<double>(maxIters));
73 m_overallWeight.push_back(w);
74 m_error.push_back(tracker.getWeightedError());
75 m_JTJ.push_back(tracker.getLTL());
76 m_JTR.push_back(tracker.getLTR());
80 std::vector<double>
getWeight()
const {
return m_overallWeight; }
82 std::vector<vpColVector>
getErrors()
const {
return m_error; }
83 std::vector<vpMatrix>
getJTJs()
const {
return m_JTJ; }
84 std::vector<vpColVector>
getJTRs()
const {
return m_JTR; }
87#ifdef VISP_HAVE_NLOHMANN_JSON
93 std::vector<unsigned int> m_numFeatures;
94 std::vector<double> m_overallWeight;
96 std::vector<vpColVector> m_error;
97 std::vector<vpMatrix> m_JTJ;
98 std::vector<vpColVector> m_JTR;
102enum vpRBTrackingStoppingReason
105 CONVERGENCE_CRITERION = 1,
106 OBJECT_NOT_IN_IMAGE = 2,
107 NOT_ENOUGH_FEATURES = 3,
131 const std::vector<vpHomogeneousMatrix> &
getPoses()
const {
return m_cMos; }
134 const std::vector<vpColVector> &
getVelocities()
const {
return m_velocities; }
149 m_odometryMotion = cMcp;
150 m_cMoBeforeOdometry = cMo_before;
151 m_cMoAfterOdometry = cMo_after;
156 m_odometryMetric = metricValue;
157 m_odometryThreshold = metricThreshold;
162 m_cMoBeforeTracking = cMo;
170 m_cMos.push_back(cMo);
171 m_velocities.push_back(v);
172 m_convergenceMetric.push_back(convergenceMetric);
173 m_JTJ.push_back(JTJ);
174 m_JTR.push_back(JTR);
179 inline void logFeatures(
unsigned int iter,
unsigned int maxIters,
const std::vector<std::shared_ptr<vpRBFeatureTracker>> &features)
181 if (m_featureData.size() == 0) {
182 m_featureData.resize(features.size());
184 else if (m_featureData.size() != features.size()) {
188 for (
unsigned int i = 0; i < features.size(); ++i) {
189 m_featureData[i].onIter(iter, maxIters, *features[i]);
193#ifdef VISP_HAVE_NLOHMANN_JSON
194 void saveToFile(
const std::string &path)
const;
201 vpRBTrackingStoppingReason m_stopReason;
203 std::vector<vpHomogeneousMatrix> m_cMos;
206 std::vector<vpColVector> m_velocities;
207 std::vector<double> m_convergenceMetric;
208 std::vector<double> m_mus;
209 std::vector<vpMatrix> m_JTJ;
210 std::vector<vpColVector> m_JTR;
215 double m_odometryMetric, m_odometryThreshold;
216 std::vector<vpRBFeatureResult> m_featureData;
220#ifdef VISP_HAVE_NLOHMANN_JSON
222#if defined(__clang__)
225# pragma clang diagnostic push
226# pragma clang diagnostic ignored "-Wexit-time-destructors"
229NLOHMANN_JSON_SERIALIZE_ENUM(vpRBTrackingStoppingReason, {
230 {vpRBTrackingStoppingReason::INVALID_REASON,
nullptr},
231 {vpRBTrackingStoppingReason::MAX_ITERS,
"maxIterations"},
232 {vpRBTrackingStoppingReason::CONVERGENCE_CRITERION,
"converged"},
233 {vpRBTrackingStoppingReason::OBJECT_NOT_IN_IMAGE,
"objectNotInImage"},
234 {vpRBTrackingStoppingReason::NOT_ENOUGH_FEATURES,
"notEnoughFeatures"},
235 {vpRBTrackingStoppingReason::EXCEPTION,
"exception"}
238#if defined(__clang__)
239# pragma clang diagnostic pop
244 result.m_numFeatures = j.at(
"numFeatures").get<std::vector<unsigned int>>();
245 result.m_overallWeight = j.at(
"weight").get<std::vector<double>>();
246 result.m_error = j.at(
"error");
247 result.m_JTJ = j.at(
"JTJ");
248 result.m_JTR = j.at(
"JTR");
252 j[
"numFeatures"] = result.m_numFeatures;
253 j[
"weight"] = result.m_overallWeight;
254 j[
"error"] = result.m_error;
255 j[
"JTJ"] = result.m_JTJ;
256 j[
"JTR"] = result.m_JTR;
261 result.m_stopReason = j.at(
"stopReason");
262 result.m_timings = j.at(
"timings");
263 result.m_cMos = j.at(
"cMos");
264 result.m_cMoBeforeTracking = j.at(
"cMoBeforeTracking");
266 result.m_velocities = j.at(
"velocities");
267 result.m_mus = j.at(
"mus").get<std::vector<double>>();
268 result.m_JTJ = j.at(
"JTJ");
269 result.m_JTR = j.at(
"JTR");
271 result.m_convergenceMetric = j.at(
"convergenceMetric").get<std::vector<double>>();
272 result.m_odometryMotion = j.at(
"odometryDisplacement");
273 result.m_cMoBeforeOdometry = j.at(
"cMoBeforeOdometry");
274 result.m_cMoAfterOdometry = j.at(
"cMoAfterOdometry");
277 result.m_odometryMetric = j.at(
"odometryMetric");
278 result.m_odometryThreshold = j.at(
"odometryThreshold");
280 result.m_featureData = j.at(
"features");
284 j[
"stopReason"] = result.m_stopReason;
285 j[
"timings"] = result.m_timings;
286 j[
"cMos"] = result.m_cMos;
287 j[
"cMoBeforeTracking"] = result.m_cMoBeforeTracking;
288 j[
"velocities"] = result.m_velocities;
289 j[
"mus"] = result.m_mus;
290 j[
"JTJ"] = result.m_JTJ;
291 j[
"JTR"] = result.m_JTR;
293 j[
"convergenceMetric"] = result.m_convergenceMetric;
294 j[
"odometryDisplacement"] = result.m_odometryMotion;
295 j[
"cMoBeforeOdometry"] = result.m_cMoBeforeOdometry;
296 j[
"cMoAfterOdometry"] = result.m_cMoAfterOdometry;
297 j[
"odometryMetric"] = result.m_odometryMetric;
298 j[
"odometryThreshold"] = result.m_odometryThreshold;
300 j[
"features"] = result.m_featureData;
Implementation of column vector and the associated operations.
error that can be emitted by ViSP classes.
@ dimensionError
Bad dimension.
Implementation of an homogeneous matrix and operations on such kind of matrices.
static bool isFinite(double value)
Implementation of a matrix and operations on matrices.
std::vector< double > getWeight() const
friend void to_json(nlohmann::json &j, const vpRBFeatureResult &result)
std::vector< unsigned int > getNumFeatures() const
friend void from_json(const nlohmann::json &j, vpRBFeatureResult &result)
std::vector< vpColVector > getErrors() const
void onIter(unsigned int iter, unsigned int maxIters, vpRBFeatureTracker &tracker)
std::vector< vpMatrix > getJTJs() const
vpRBFeatureResult()=default
std::vector< vpColVector > getJTRs() const
A base class for all features that can be used and tracked in the vpRBTracker.
friend void from_json(const nlohmann::json &j, vpRBTrackingResult &result)
void setOdometryMetricAndThreshold(const double metricValue, const double metricThreshold)
void setStoppingReason(vpRBTrackingStoppingReason reason)
vpRBTrackingStoppingReason getStoppingReason() const
void setOdometryMotion(const vpHomogeneousMatrix &cMo_before, const vpHomogeneousMatrix &cMcp, const vpHomogeneousMatrix &cMo_after)
vpRBTrackingTimings & timer()
vpHomogeneousMatrix getOdometryMotion()
void onEndIter(const vpHomogeneousMatrix &cMo, const vpColVector &v, const double convergenceMetric, const vpMatrix &JTJ, const vpColVector &JTR, double mu)
friend void to_json(nlohmann::json &j, const vpRBTrackingResult &result)
vpHomogeneousMatrix getPoseBeforeOdometry()
std::vector< vpRBFeatureResult > getFeatureData() const
vpHomogeneousMatrix getPoseAfterOdometry()
void beforeIter(const vpHomogeneousMatrix &cMo)
const std::vector< vpHomogeneousMatrix > & getPoses() const
const std::vector< vpColVector > & getVelocities() const
const std::vector< double > & getConvergenceMetricValues() const
unsigned int getNumIterations() const
void logFeatures(unsigned int iter, unsigned int maxIters, const std::vector< std::shared_ptr< vpRBFeatureTracker > > &features)
vpHomogeneousMatrix getPoseBeforeTracking() const