36 #include <boost/algorithm/string/predicate.hpp>
42 #undef PAUSE_BEFORE_EXIT
62 static const auto DEFAULT_ROUTINE = OptimizationRoutine::RefTracker;
64 static const auto RECOGNIZED_ROUTINES = {
65 OptimizationRoutine::RefTracker, OptimizationRoutine::ParamViaRansac,
66 OptimizationRoutine::ParamViaRefTracker};
70 case OptimizationRoutine::RefTracker:
73 case OptimizationRoutine::ParamViaRansac:
74 return "ParamViaRansac";
76 case OptimizationRoutine::ParamViaRefTracker:
77 return "ParamViaRefTracker";
79 case OptimizationRoutine::Unrecognized:
81 return "ERROR - UNRECOGNIZED";
87 for (
auto &routine : RECOGNIZED_ROUTINES) {
88 if (boost::iequals(routineToString(routine), routineName)) {
92 return OptimizationRoutine::Unrecognized;
96 template <
typename T>
void operator()(T
const &) {
104 int usage(
const char *argv0) {
105 std::cerr <<
"Usage: " << argv0 <<
" [<routine> [<paramset> [--cost]]]\n"
108 <<
"where <routine> is one of the following (case insensitive): \n";
109 for (
auto &routine : RECOGNIZED_ROUTINES) {
110 std::cerr <<
" " << routineToString(routine) <<
"\n";
113 <<
"\nThe various ParamViaX routines take an optional additional "
114 "argument specifying the parameter set that they optimize, one "
118 std::cerr <<
"as well as an additional optional switch, --cost, if you'd "
119 "like to just run the current parameters through and compute "
120 "the cost, rather than optimize.\n\n";
122 <<
"\nIf no routine is explicitly specified, the default routine is "
123 << routineToString(DEFAULT_ROUTINE) <<
"\n";
124 std::cerr <<
"Too many arguments, or an unrecognized routine parameter "
125 "(including anything vaguely 'help-ish') will trigger this "
134 std::string ¶mSetName)
135 : outFunc_(outFunc), paramSetName_(paramSetName) {}
136 template <
typename T>
void operator()(T
const &,
const char *arg) {
140 outFunc_ = &osvr::vbtracker::runOptimizer<RefSource, T>;
146 osvr::vbtracker::ParamOptimizerFunc &outFunc_;
147 std::string ¶mSetName_;
150 template <
typename RefSource>
151 int parseParamSetForParamOptimizer(osvr::vbtracker::ParamOptimizerFunc &func,
152 bool &costOnly,
int argc,
char *argv[]) {
154 std::cerr <<
"Too many command line arguments!" << std::endl;
155 return usage(argv[0]);
158 if (boost::iequals(argv[3],
"--cost")) {
159 std::cout <<
"Will run for just cost-only." << std::endl;
162 std::cerr <<
"Too many command line arguments - didn't recognize "
165 return usage(argv[0]);
170 std::cout <<
"Will process default parameter set "
172 ps::DefaultParamSet>::get()
174 func = &osvr::vbtracker::runOptimizer<RefSource, ps::DefaultParamSet>;
179 osvr::vbtracker::ParamOptimizerFunc result;
180 std::string paramSetName;
182 osvr::typepack::for_each_type<ps::ParamSets>(functor, argv[2]);
184 std::cout <<
"Will process parameter set " << paramSetName
185 <<
" as specified on the command line.\n";
190 std::cerr <<
"Did not recognize " << argv[2]
191 <<
" as one of the known parameter sets to optimize!"
194 return usage(argv[0]);
197 int main(
int argc,
char *argv[]) {
199 static const auto DATAFILE =
"augmented-blobs.csv";
201 auto withUsage = [&] {
return usage(argv[0]); };
202 auto tooManyArguments = [&] {
203 std::cerr <<
"Too many command line arguments!" << std::endl;
208 routine = stringToRoutine(argv[1]);
209 if (OptimizationRoutine::Unrecognized == routine) {
210 std::cerr <<
"Didn't recognize '" << argv[1]
211 <<
"' as an optimization routine.\n"
217 std::cout <<
"Will execute optimization routine "
218 << routineToString(routine)
219 <<
" as specified on the command line." << std::endl;
221 std::cout <<
"No optimization routine specified on the command line, "
223 << routineToString(routine) <<
" by default." << std::endl;
226 bool costOnly =
false;
227 osvr::vbtracker::ParamOptimizerFunc paramOptFunc;
231 case OptimizationRoutine::ParamViaRansac:
233 parseParamSetForParamOptimizer<osvr::vbtracker::RansacOneEuro>(
234 paramOptFunc, costOnly, argc, argv);
242 case OptimizationRoutine::ParamViaRefTracker:
244 ret = parseParamSetForParamOptimizer<
254 case OptimizationRoutine::RefTracker:
259 std::cerr <<
"Too many command line arguments!" << std::endl;
265 std::cout <<
"Loading and parsing data from " << DATAFILE <<
" ";
266 auto data = osvr::vbtracker::loadData(DATAFILE);
269 const auto camParams =
275 params.
debug =
false;
279 params.
imu.path =
"";
283 std::cout <<
"Starting optimization routine " << routineToString(routine)
286 case OptimizationRoutine::RefTracker:
290 osvr::vbtracker::computeRefTrackerTransform(
294 case OptimizationRoutine::ParamViaRansac:
296 paramOptFunc(data, costOnly,
300 case OptimizationRoutine::ParamViaRefTracker:
302 paramOptFunc(data, costOnly,
307 assert(
false &&
"Should not happen - only recognized routines should "
308 "make it this far!");
311 #ifdef PAUSE_BEFORE_EXIT
312 std::cout <<
"Press enter to exit." << std::endl;
bool silent
For optimization usage.
bool performingOptimization
int main(int argc, char *argv[])
typename detail::split_list_< List...>::head head
Get the first element of a list.
A wrapper for a template parameter pack of types.
IMUInputParams imu
IMU input-related parameters.
General configuration parameters.
bool debug
Whether to show the debug windows and debug messages.
Input from main to the optimization routine (wrapper)
Trait for param set name.
Define to add a "press enter to exit" thing at the end.
CameraParameters createUndistortedVariant() const
Copy-constructs, with zero distortion parameters.