test-mp2p_optimize_pt2pl.cpp
Go to the documentation of this file.
1 /* -------------------------------------------------------------------------
2  * A Modular Optimization framework for Localization and mApping (MOLA)
3  * Copyright (C) 2018-2024 Jose Luis Blanco, University of Almeria
4  * See LICENSE for license information.
5  * ------------------------------------------------------------------------- */
6 
15 #include <mp2p_icp/Solver_Horn.h>
16 #include <mrpt/poses/Lie/SE.h>
17 
18 static void test_opt_pt2pl(const mrpt::poses::CPose3D& groundTruth, const mp2p_icp::Solver& solver)
19 {
20  using namespace mrpt::poses::Lie;
21 
22  MRPT_START
23 
24  // Prepare test case pairings:
25  // 3 point-to-plane correspondences, such that the sought optimal
26  // pose is the given one:
27 
29 
30  {
31  auto& pp = p.paired_pt2pl.emplace_back();
32  pp.pl_global = {mrpt::math::TPlane::FromPointAndNormal({0, 0, 0}, {0, 0, 1}), {0, 0, 0}};
33  pp.pt_local = groundTruth.inverseComposePoint({0.5, 0, 0});
34  }
35  {
36  auto& pp = p.paired_pt2pl.emplace_back();
37  pp.pl_global = {mrpt::math::TPlane::FromPointAndNormal({0, 0, 0}, {1, 0, 0}), {0, 0, 0}};
38  pp.pt_local = groundTruth.inverseComposePoint({0, 0.8, 0});
39  }
40  {
41  auto& pp = p.paired_pt2pl.emplace_back();
42  pp.pl_global = {mrpt::math::TPlane::FromPointAndNormal({0, 0, 0}, {0, 1, 0}), {0, 0, 0}};
43  pp.pt_local = groundTruth.inverseComposePoint({0, 0, 0.3});
44  }
45  {
46  auto& pp = p.paired_pt2pt.emplace_back();
47  pp.global = {0, 0, 0};
48  const auto loc = groundTruth.inverseComposePoint({0, 0, 0});
49  pp.local = loc;
50  }
51 
52  std::cout << "Input pairings: " << p.contents_summary() << std::endl;
53 
54  // Init solver:
55 
58  sc.guessRelativePose = mrpt::poses::CPose3D::Identity();
59 
60  bool solvedOk = solver.optimal_pose(p, result, sc);
61 
62  std::cout << "Found optimalPose: " << result.optimalPose << std::endl;
63  std::cout << "Expected optimalPose: " << groundTruth << std::endl;
64 
65  // check results:
66  ASSERT_(solvedOk);
67  ASSERT_NEAR_(mrpt::poses::Lie::SE<3>::log(result.optimalPose - groundTruth).norm(), 0.0, 1e-3);
68 
69  MRPT_END
70 }
71 
73 {
74  using mrpt::poses::CPose3D;
75  using namespace mrpt; // _deg
76 
77  // With different solvers:
79  {
80  mrpt::containers::yaml solverParams;
81  solverParams["maxIterations"] = 25;
82  // solverParams["innerLoopVerbose"] = true;
83  solverGN.initialize(solverParams);
84  }
85  // mp2p_icp::Solver_Horn solverHorn;
86 
87  const std::vector<const mp2p_icp::Solver*> solvers = {
88  &solverGN,
89  //&solverHorn
90  };
91 
92  for (const auto solverPtr : solvers)
93  {
94  const auto& solver = *solverPtr;
95  std::cout << "Using solver: " << solver.GetRuntimeClass()->className
96  << "\n"
97  "=========================================================\n";
98 
99  test_opt_pt2pl(CPose3D::FromTranslation(0, 0, 0), solver);
100 
101  test_opt_pt2pl(CPose3D::FromTranslation(1.0, 0, 0), solver);
102  test_opt_pt2pl(CPose3D::FromTranslation(0, 1.0, 0), solver);
103  test_opt_pt2pl(CPose3D::FromTranslation(0, 0, 1.0), solver);
104 
105  test_opt_pt2pl(CPose3D::FromTranslation(-2.0, 0, 0), solver);
106  test_opt_pt2pl(CPose3D::FromTranslation(0, -3.0, 0), solver);
107  test_opt_pt2pl(CPose3D::FromTranslation(0, 0, -4.0), solver);
108 
109  test_opt_pt2pl(CPose3D::FromYawPitchRoll(20.0_deg, 0.0_deg, 0.0_deg), solver);
110  test_opt_pt2pl(CPose3D::FromYawPitchRoll(-20.0_deg, 0.0_deg, 0.0_deg), solver);
111 
112  test_opt_pt2pl(CPose3D::FromYawPitchRoll(0.0_deg, 10.0_deg, 0.0_deg), solver);
113  test_opt_pt2pl(CPose3D::FromYawPitchRoll(0.0_deg, -10.0_deg, 0.0_deg), solver);
114 
115  test_opt_pt2pl(CPose3D::FromYawPitchRoll(0.0_deg, 0.0_deg, 15.0_deg), solver);
116  test_opt_pt2pl(CPose3D::FromYawPitchRoll(0.0_deg, 0.0_deg, -15.0_deg), solver);
117 
118  test_opt_pt2pl(CPose3D::FromTranslation(1.0, 2.0, 3.0), solver);
120  CPose3D::FromXYZYawPitchRoll(1.0, 2.0, 3.0, -10.0_deg, 5.0_deg, 30.0_deg), solver);
121  }
122 }
123 
124 int main([[maybe_unused]] int argc, [[maybe_unused]] char** argv)
125 {
126  try
127  {
129  }
130  catch (std::exception& e)
131  {
132  std::cerr << mrpt::exception_to_str(e) << "\n";
133  return 1;
134  }
135 }
mp2p_icp::OptimalTF_Result::optimalPose
mrpt::poses::CPose3D optimalPose
Definition: OptimalTF_Result.h:26
mp2p_icp::Solver::optimal_pose
virtual bool optimal_pose(const Pairings &pairings, OptimalTF_Result &out, const SolverContext &sc) const
Definition: Solver.cpp:28
test_mp2p_optimize_pt2pl
static void test_mp2p_optimize_pt2pl()
Definition: test-mp2p_optimize_pt2pl.cpp:72
mp2p_icp::Solver_GaussNewton
Definition: Solver_GaussNewton.h:25
mp2p_icp::Pairings
Definition: Pairings.h:76
mp2p_icp::SolverContext
Definition: Solver.h:36
main
int main([[maybe_unused]] int argc, [[maybe_unused]] char **argv)
Definition: test-mp2p_optimize_pt2pl.cpp:124
mrpt
Definition: LogRecord.h:100
mp2p_icp::OptimalTF_Result
Definition: OptimalTF_Result.h:24
mp2p_icp::SolverContext::guessRelativePose
std::optional< mrpt::poses::CPose3D > guessRelativePose
Definition: Solver.h:40
mp2p_icp::Solver
Definition: Solver.h:65
Solver_Horn.h
ICP solver for pointclouds split in different "layers".
test_opt_pt2pl
static void test_opt_pt2pl(const mrpt::poses::CPose3D &groundTruth, const mp2p_icp::Solver &solver)
Definition: test-mp2p_optimize_pt2pl.cpp:18
Solver_GaussNewton.h
ICP registration for points and planes.
mp2p_icp::Pairings::paired_pt2pl
MatchedPointPlaneList paired_pt2pl
Definition: Pairings.h:88
mp2p_icp::Solver_GaussNewton::initialize
void initialize(const mrpt::containers::yaml &params) override
Definition: Solver_GaussNewton.cpp:21


mp2p_icp
Author(s):
autogenerated on Mon May 26 2025 02:45:50