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#include <utility>
6
7#include "command-line/parsing/options.hpp"
8
9#include "common/pipeline/pipelines.hpp"
10
11#include "calibrate/calibrate.hpp"
12
13#include "distance/edge.hpp"
14#include "distance/distance.hpp"
15#include "distance/vectorize.hpp"
16#include "distance/edge-filters.hpp"
17
18#include "orbit/orbit.hpp"
19
20
21// TODO(nguy8tri): Include statement for Orbit Pipeline
22// TODO: Fully Implement this when orbit stage is implemented
23
24#include "common/decimal.hpp"
25
26namespace found {
27
35inline std::unique_ptr<CalibrationAlgorithm> ProvideCalibrationAlgorithm(
36 [[maybe_unused]] const CalibrationOptions &&options) {
37 return std::make_unique<LOSTCalibrationAlgorithm>();
38}
39
47inline std::unique_ptr<EdgeDetectionAlgorithm> ProvideEdgeDetectionAlgorithm(const DistanceOptions &&options) {
48 return std::make_unique<SimpleEdgeDetectionAlgorithm>(options.SEDAThreshold,
49 options.SEDABorderLen,
50 options.SEDAOffset);
51}
52
60inline std::unique_ptr<DistanceDeterminationAlgorithm> ProvideDistanceDeterminationAlgorithm(
61 const DistanceOptions &&options) {
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,
68 options.pixelSize,
69 options.image.width,
70 options.image.height),
71 options.ISDDAMinIters,
72 options.ISDDAMaxRefresh,
73 options.ISDDADistRatio,
74 options.ISDDADiscimRatio,
75 options.ISDDAPdfOrd,
76 options.ISDDARadLossOrd);
77 } else {
78 LOG_ERROR("Unrecognized distance algorithm: " << options.distanceAlgo);
79 throw std::runtime_error("Unrecognized distance algorithm: " + options.distanceAlgo);
80 }
81}
82
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);
96 } else {
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);
101 }
102 return std::make_unique<LOSTVectorGenerationAlgorithm>(relativeOrientation, referenceOrientation);
103 }
104}
105
114inline std::unique_ptr<EdgeFilteringAlgorithms> ProvideEdgeFilteringAlgorithm(const DistanceOptions &&options) {
115 std::unique_ptr<EdgeFilteringAlgorithms> pipeline = std::make_unique<EdgeFilteringAlgorithms>();
116 bool added = false;
117
118 if (options.enableNoOpEdgeFilter) {
119 pipeline->Complete(std::make_unique<NoOpEdgeFilter>());
120 added = true;
121 }
122
123 if (!added) return nullptr;
124 return pipeline;
125}
126
127// TODO: Uncomment when orbit stage is implemented
135// std::unique_ptr<OrbitPropagationAlgorithm> ProvideOrbitPropagationAlgorithm(const OrbitOptions &options) {
136// return std::make_unique<ApproximateOrbitPropagationAlgorithm>(options.totalTime,
137// options.dt,
138// options.radius,
139// options.mu);
140// }
141
142} // namespace found
143
144#endif // SRC_PROVIDERS_STAGE_PROVIDERS_HPP_
Definition options.hpp:87
Definition options.hpp:95