1#ifndef SRC_PROVIDERS_STAGE_PROVIDERS_HPP_
2#define SRC_PROVIDERS_STAGE_PROVIDERS_HPP_
7#include "command-line/parsing/options.hpp"
9#include "common/pipeline/pipelines.hpp"
11#include "calibrate/calibrate.hpp"
13#include "distance/edge.hpp"
14#include "distance/distance.hpp"
15#include "distance/vectorize.hpp"
16#include "distance/edge-filters.hpp"
18#include "orbit/orbit.hpp"
24#include "common/decimal.hpp"
35inline std::unique_ptr<CalibrationAlgorithm> ProvideCalibrationAlgorithm(
37 return std::make_unique<LOSTCalibrationAlgorithm>();
47inline std::unique_ptr<EdgeDetectionAlgorithm> ProvideEdgeDetectionAlgorithm(
const DistanceOptions &&options) {
48 return std::make_unique<SimpleEdgeDetectionAlgorithm>(options.SEDAThreshold,
49 options.SEDABorderLen,
60inline std::unique_ptr<DistanceDeterminationAlgorithm> ProvideDistanceDeterminationAlgorithm(
62 if (options.distanceAlgo == SDDA) {
63 return std::make_unique<SphericalDistanceDeterminationAlgorithm>(options.radius, Camera(options.focalLength,
64 options.pixelSize, options.image.width, options.image.height));
65 }
else if (options.distanceAlgo == ISDDA) {
66 return std::make_unique<IterativeSphericalDistanceDeterminationAlgorithm>(options.radius,
67 Camera(options.focalLength,
70 options.image.height),
71 options.ISDDAMinIters,
72 options.ISDDAMaxRefresh,
73 options.ISDDADistRatio,
74 options.ISDDADiscimRatio,
76 options.ISDDARadLossOrd);
78 LOG_ERROR(
"Unrecognized distance algorithm: " << options.distanceAlgo);
79 throw std::runtime_error(
"Unrecognized distance algorithm: " + options.distanceAlgo);
90inline std::unique_ptr<VectorGenerationAlgorithm> ProvideVectorGenerationAlgorithm(
const DistanceOptions &&options) {
91 Quaternion referenceOrientation = SphericalToQuaternion(options.refOrientation);
92 if (options.calibrationData.header.version != emptyDFVer) {
93 LOG_INFO(
"Using DataFile for calibration information");
94 return std::make_unique<LOSTVectorGenerationAlgorithm>(options.calibrationData.relative_attitude,
95 referenceOrientation);
97 Quaternion relativeOrientation = SphericalToQuaternion(options.relOrientation);
98 if (options.refAsOrientation) {
99 LOG_INFO(
"Using provided reference orientation for calibration information");
100 return std::make_unique<LOSTVectorGenerationAlgorithm>(referenceOrientation);
102 return std::make_unique<LOSTVectorGenerationAlgorithm>(relativeOrientation, referenceOrientation);
114inline std::unique_ptr<EdgeFilteringAlgorithms> ProvideEdgeFilteringAlgorithm(
const DistanceOptions &&options) {
115 std::unique_ptr<EdgeFilteringAlgorithms> pipeline = std::make_unique<EdgeFilteringAlgorithms>();
118 if (options.enableNoOpEdgeFilter) {
119 pipeline->Complete(std::make_unique<NoOpEdgeFilter>());
123 if (!added)
return nullptr;
Definition options.hpp:87
Definition options.hpp:95