FOUND
Loading...
Searching...
No Matches
stage-providers.hpp
1#ifndef SRC_PROVIDERS_STAGE_PROVIDERS_HPP_
2#define SRC_PROVIDERS_STAGE_PROVIDERS_HPP_
3
4#include <memory>
5
6#include "command-line/parsing/options.hpp"
7
8#include "common/pipeline/pipelines.hpp"
9
10#include "calibrate/calibrate.hpp"
11
12#include "distance/edge.hpp"
13#include "distance/distance.hpp"
14#include "distance/vectorize.hpp"
15
16#include "orbit/orbit.hpp"
17
18// TODO(nguy8tri): Include statement for Orbit Pipeline
19// TODO: Fully Implement this when orbit stage is implemented
20
21#include "common/decimal.hpp"
22
23namespace found {
24
32std::unique_ptr<CalibrationAlgorithm> ProvideCalibrationAlgorithm([[maybe_unused]] CalibrationOptions &&options) {
33 return std::make_unique<LOSTCalibrationAlgorithm>();
34}
35
43std::unique_ptr<EdgeDetectionAlgorithm> ProvideEdgeDetectionAlgorithm(DistanceOptions &&options) {
44 return std::make_unique<SimpleEdgeDetectionAlgorithm>(options.SEDAThreshold,
45 options.SEDABorderLen,
46 options.SEDAOffset);
47}
48
56std::unique_ptr<DistanceDeterminationAlgorithm> ProvideDistanceDeterminationAlgorithm(DistanceOptions &&options) {
57 if (options.distanceAlgo == SDDA) {
58 return std::make_unique<SphericalDistanceDeterminationAlgorithm>(options.radius,
59 Camera(options.focalLength,
60 options.pixelSize,
61 options.image.width,
62 options.image.height));
63 } else if (options.distanceAlgo == ISDDA) {
64 return std::make_unique<IterativeSphericalDistanceDeterminationAlgorithm>(options.radius,
65 Camera(options.focalLength,
66 options.pixelSize,
67 options.image.width,
68 options.image.height),
69 options.ISDDAMinIters,
70 options.ISDDADistRatio,
71 options.ISDDADiscimRatio,
72 options.ISDDAPdfOrd,
73 options.ISDDARadLossOrd);
74 } else {
75 LOG_ERROR("Unrecognized distance algorithm: " << options.distanceAlgo);
76 throw std::runtime_error("Unrecognized distance algorithm: " + options.distanceAlgo);
77 }
78}
79
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);
93 } else {
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);
98 }
99 return std::make_unique<LOSTVectorGenerationAlgorithm>(relativeOrientation, referenceOrientation);
100 }
101}
102
103// TODO: Uncomment when orbit stage is implemented
111// std::unique_ptr<OrbitPropagationAlgorithm> ProvideOrbitPropagationAlgorithm(OrbitOptions &&options) {
112// return std::make_unique<ApproximateOrbitPropagationAlgorithm>(options.totalTime,
113// options.dt,
114// options.radius,
115// options.mu);
116// }
117
118} // namespace found
119
120#endif // SRC_PROVIDERS_STAGE_PROVIDERS_HPP_
Definition options.hpp:81
Definition options.hpp:89