1#ifndef SRC_PROVIDERS_STAGE_PROVIDERS_HPP_
2#define SRC_PROVIDERS_STAGE_PROVIDERS_HPP_
6#include "command-line/parsing/options.hpp"
8#include "common/pipeline/pipelines.hpp"
10#include "calibrate/calibrate.hpp"
12#include "distance/edge.hpp"
13#include "distance/distance.hpp"
14#include "distance/vectorize.hpp"
16#include "orbit/orbit.hpp"
21#include "common/decimal.hpp"
32std::unique_ptr<CalibrationAlgorithm> ProvideCalibrationAlgorithm([[maybe_unused]]
CalibrationOptions &&options) {
33 return std::make_unique<LOSTCalibrationAlgorithm>();
43std::unique_ptr<EdgeDetectionAlgorithm> ProvideEdgeDetectionAlgorithm(
DistanceOptions &&options) {
44 return std::make_unique<SimpleEdgeDetectionAlgorithm>(options.SEDAThreshold,
45 options.SEDABorderLen,
56std::unique_ptr<DistanceDeterminationAlgorithm> ProvideDistanceDeterminationAlgorithm(
DistanceOptions &&options) {
57 if (options.distanceAlgo == SDDA) {
58 return std::make_unique<SphericalDistanceDeterminationAlgorithm>(options.radius,
59 Camera(options.focalLength,
62 options.image.height));
63 }
else if (options.distanceAlgo == ISDDA) {
64 return std::make_unique<IterativeSphericalDistanceDeterminationAlgorithm>(options.radius,
65 Camera(options.focalLength,
68 options.image.height),
69 options.ISDDAMinIters,
70 options.ISDDADistRatio,
71 options.ISDDADiscimRatio,
73 options.ISDDARadLossOrd);
75 LOG_ERROR(
"Unrecognized distance algorithm: " << options.distanceAlgo);
76 throw std::runtime_error(
"Unrecognized distance algorithm: " + options.distanceAlgo);
87std::unique_ptr<VectorGenerationAlgorithm> ProvideVectorGenerationAlgorithm(
DistanceOptions &&options) {
88 Quaternion referenceOrientation = SphericalToQuaternion(options.refOrientation);
89 if (options.calibrationData.header.version != emptyDFVer) {
90 LOG_INFO(
"Using DataFile for calibration information");
91 return std::make_unique<LOSTVectorGenerationAlgorithm>(options.calibrationData.relative_attitude,
92 referenceOrientation);
94 Quaternion relativeOrientation = SphericalToQuaternion(options.relOrientation);
95 if (options.refAsOrientation) {
96 LOG_INFO(
"Using provided reference orientation for calibration information");
97 return std::make_unique<LOSTVectorGenerationAlgorithm>(referenceOrientation);
99 return std::make_unique<LOSTVectorGenerationAlgorithm>(relativeOrientation, referenceOrientation);
Definition options.hpp:81
Definition options.hpp:89