25 #ifndef INCLUDED_TransformFindingRoutine_h_GUID_A09E7693_04E5_4FA2_C929_F23CBEC12306 
   26 #define INCLUDED_TransformFindingRoutine_h_GUID_A09E7693_04E5_4FA2_C929_F23CBEC12306 
   44     void computeRefTrackerTransform(MeasurementsRows 
const &data,
 
   45                                     OptimCommonData 
const &commonData) {
 
   50         TrackedSamples samples;
 
   53             std::cout << 
"Starting processing tracking..." << std::endl;
 
   54             auto optim = OptimData::make(commonData);
 
   55             FeedDataWithoutProcessing mainAlgo;
 
   56             RansacOneEuro ransacOneEuro;
 
   58             for (
auto const &rowPtr : data) {
 
   61                 mainAlgo(optim, *rowPtr);
 
   62                 ransacOneEuro(optim, *rowPtr);
 
   63                 if (ransacOneEuro.havePose()) {
 
   64                     TrackedDataPtr newSample(
new TrackedData);
 
   65                     newSample->videoPose = ransacOneEuro.getPose();
 
   68                     samples.emplace_back(std::move(newSample));
 
   72             std::cout << 
"Initial tracking complete: " << samples.size()
 
   73                       << 
" valid samples, " << ransacOneEuro.getNumFlips()
 
   74                       << 
" flipped." << std::endl;
 
   77         if (samples.empty()) {
 
   79             std::cout << 
"No samples with pose?" << std::endl;
 
   83         const auto numSamples = samples.size();
 
   84         const double numSamplesDouble = 
static_cast<double>(numSamples);
 
   86         auto simpleCost = [](Eigen::Isometry3d 
const &a,
 
   87                              Eigen::Isometry3d 
const &b,
 
   88                              double angleScale = 1) {
 
   90                 Eigen::Quaterniond(a.rotation())
 
   91                     .angularDistance(Eigen::Quaterniond(b.rotation()));
 
   92             auto linearDistance = (a.translation() - b.translation()).norm();
 
   93             return linearDistance + angleScale * angDistance;
 
   97         std::cout << 
"Starting actual optimization procedures..." << std::endl;
 
   98         Vec<3> baseXlate = -Vec<3>(-0.316523, -0.740873, -2.0701);
 
  101             std::cout << 
"Optimizing base translation" << std::endl;
 
  103                 baseXlate, {1e-6, 1e-1}, 10000,
 
  104                 [&](Vec<3> 
const &vec) -> 
double {
 
  107                     return std::accumulate(
 
  108                         samples.begin(), samples.end(), 0.0,
 
  109                         [&](
double prev, TrackedDataPtr 
const &s) {
 
  111                             auto cost = simpleCost(s->videoPose,
 
  112                                                    baseXform * s->refPose, 0);
 
  113                             return prev + (cost / numSamplesDouble);
 
  117             std::cout << 
"Result: cost " << ret << std::endl;
 
  118             std::cout << baseXlate.format(getFullFormat()) << 
"\n" << std::endl;
 
  119             std::cout << 
"First sample:\n";
 
  121                                     Eigen::Isometry3d::Identity(),
 
  124         Vec<6> baseXlateRot = Vec<6>::Zero();
 
  125         baseXlateRot.head<3>() = baseXlate;
 
  127             std::cout << 
"\nOptimizing base transform, max runs = " << maxRuns
 
  130                 baseXlateRot, {1e-6, 1e-1}, 10000,
 
  131                 [&](Vec<6> 
const &vec) -> 
double {
 
  132                     Eigen::Isometry3d baseXform =
 
  135                     return std::accumulate(
 
  136                         samples.begin(), samples.end(), 0.0,
 
  137                         [&](
double prev, TrackedDataPtr 
const &s) {
 
  138                             auto cost = simpleCost(s->videoPose,
 
  139                                                    baseXform * s->refPose);
 
  140                             return prev + (cost / numSamplesDouble);
 
  143             std::cout << 
"Result: cost " << ret << std::endl;
 
  144             std::cout << baseXlateRot.format(getFullFormat()) << 
"\n" 
  146             std::cout << 
"First sample:\n";
 
  147             outputTransformedSample(
 
  149                              rot_exp(baseXlateRot.tail<3>())),
 
  150                 Eigen::Isometry3d::Identity(), *(samples[0]));
 
  154             using namespace reftracker;
 
  155             TransformParams x = TransformParams::Zero();
 
  156             x.head<3>() = baseXlateRot.head<3>();
 
  157             x.segment<3>(BaseRot) = baseXlateRot.tail<3>();
 
  159             std::cout << 
"Starting optimization procedure for full transform, " 
  161                       << maxRuns << std::endl;
 
  163                 x, {1e-6, 1e-1}, maxRuns,
 
  164                 [&](TransformParams 
const ¶mVec) -> 
double {
 
  165                     Eigen::Isometry3d baseXform = getBaseTransform(paramVec);
 
  166                     Eigen::Isometry3d innerXform = getInnerTransform(paramVec);
 
  168                     return std::accumulate(
 
  169                         samples.begin(), samples.end(), 0.0,
 
  170                         [&](
double prev, TrackedDataPtr 
const &s) {
 
  171                             auto cost = costMeasurement(s->videoPose,
 
  172                                                         baseXform * s->refPose *
 
  174                             return prev + (cost / numSamplesDouble);
 
  178                 std::cout << 
"Optimizer returned " << ret
 
  179                           << 
" and these parameter values:" << std::endl;
 
  180                 std::cout << x.format(getFullFormat()) << std::endl;
 
  182                 Eigen::Isometry3d baseXform = getBaseTransform(x);
 
  183                 Eigen::Isometry3d innerXform = getInnerTransform(x);
 
  184                 std::cout << 
"The first three samples, transformed for your " 
  185                              "viewing pleasure:\n";
 
  186                 for (std::size_t i = 0; i < 3; ++i) {
 
  187                     outputTransformedSample(baseXform, innerXform,
 
  195 #endif // INCLUDED_TransformFindingRoutine_h_GUID_A09E7693_04E5_4FA2_C929_F23CBEC12306 
double ei_newuoa_wrapped(long npt, Eigen::MatrixBase< Derived > &x, std::pair< double, double > rho, long maxfun, Function &&f)
Header for M.J.D. Powell's NEWUOA method for unconstrained minimization. 
Isometry3< typename Derived1::Scalar > makeIsometry(Eigen::MatrixBase< Derived1 > const &translation, Eigen::RotationBase< Derived2, 3 > const &rotation)
A simpler, functional-style alternative to .fromPositionOrientationScale when no scaling is performed...