farm-ng-core
group_accessors_unit_tests.h
Go to the documentation of this file.
1 // Copyright (c) 2011, Hauke Strasdat
2 // Copyright (c) 2012, Steven Lovegrove
3 // Copyright (c) 2021, farm-ng, inc.
4 //
5 // Use of this source code is governed by an MIT-style
6 // license that can be found in the LICENSE file or at
7 // https://opensource.org/licenses/MIT.
8 
9 #pragma once
10 
13 #include "sophus/lie/isometry2.h"
14 #include "sophus/lie/isometry3.h"
15 #include "sophus/lie/rotation2.h"
16 #include "sophus/lie/rotation3.h"
17 #include "sophus/lie/similarity2.h"
18 #include "sophus/lie/similarity3.h"
22 
23 namespace sophus {
24 namespace test {
25 
26 template <concepts::accessors::Translation TGroup>
28  using Scalar = typename TGroup::Scalar;
29  int constexpr k_point_dim = TGroup::kPointDim;
30  Eigen::Vector<Scalar, k_point_dim> p;
31  for (int i = 0; i < k_point_dim; ++i) {
32  p[i] = 0.1 * i;
33  }
34  SOPHUS_ASSERT_NEAR(TGroup(p).translation(), p, kEpsilon<Scalar>);
35 
36  Eigen::Vector<Scalar, k_point_dim> q;
37  for (int i = 0; i < k_point_dim; ++i) {
38  q[i] = 0.2 * i;
39  }
40  TGroup q2;
41  q2.translation() = q;
42 
43  SOPHUS_ASSERT_NEAR(q2.translation(), q, kEpsilon<Scalar>);
44 }
45 
46 template <concepts::accessors::Rotation TGroup>
48  using Scalar = typename TGroup::Scalar;
49  if constexpr (TGroup::kPointDim == 2) {
51  for (size_t g_id = 0; g_id < kElems.size(); ++g_id) {
52  sophus::Rotation2<Scalar> rot = SOPHUS_AT(kElems, g_id);
53 
54  TGroup g = TGroup::fromRotationMatrix(rot.matrix());
56  g.rotationMatrix(), rot.matrix(), kEpsilonSqrt<Scalar>);
57  }
58  } else if constexpr (TGroup::kPointDim == 3) {
60 
61  for (size_t g_id = 0; g_id < kElems.size(); ++g_id) {
62  sophus::Rotation3<Scalar> rot = SOPHUS_AT(kElems, g_id);
63 
64  TGroup g = TGroup::fromRotationMatrix(rot.matrix());
66  g.rotationMatrix(), rot.matrix(), kEpsilonSqrt<Scalar>);
67  }
68  }
69 }
70 
71 template <concepts::accessors::TxTy TGroup>
72 void runTxTyTests() {
73  {
74  auto g = TGroup::fromTx(0.7);
76  g.translation().x(), 0.7, kEpsilon<typename TGroup::Scalar>);
78  g.translation().y(),
79  0.0,
80  kEpsilon<typename TGroup::Scalar>,
81  "{}",
82  g.translation());
83  }
84  {
85  auto g = TGroup::fromTy(-0.9);
87  g.translation().y(),
88  -0.9,
89  kEpsilon<typename TGroup::Scalar>,
90  "{}",
91  g.translation());
93  g.translation().x(),
94  0.0,
95  kEpsilon<typename TGroup::Scalar>,
96  "{}",
97  g.translation());
98  }
99 }
100 
101 template <concepts::accessors::TxTyTz TGroup>
103  {
104  auto g = TGroup::fromTx(0.7);
106  g.translation().x(), 0.7, kEpsilon<typename TGroup::Scalar>);
108  g.translation().template tail<2>().norm(),
109  kEpsilon<typename TGroup::Scalar>);
110  }
111  {
112  auto g = TGroup::fromTy(-0.9);
114  g.translation().y(),
115  -0.9,
116  kEpsilon<typename TGroup::Scalar>,
117  "{}",
118  g.translation());
120  g.translation().x(),
121  0.0,
122  kEpsilon<typename TGroup::Scalar>,
123  "{}",
124  g.translation());
126  g.translation().z(),
127  0.0,
128  kEpsilon<typename TGroup::Scalar>,
129  "{}",
130  g.translation());
131  }
132  {
133  auto g = TGroup::fromTz(0.9);
135  g.translation().z(),
136  0.9,
137  kEpsilon<typename TGroup::Scalar>,
138  "{}",
139  g.translation());
141  g.translation().template head<2>().norm(),
142  kEpsilon<typename TGroup::Scalar>);
143  }
144 }
145 
146 template <concepts::accessors::Isometry TGroup>
148  using Scalar = typename TGroup::Scalar;
149  if constexpr (TGroup::kPointDim == 2) {
151  for (size_t g_id = 0; g_id < kElems.size(); ++g_id) {
152  sophus::Isometry2<Scalar> iso = SOPHUS_AT(kElems, g_id);
153 
154  TGroup rot_g = TGroup::fromRotationMatrix(iso.rotationMatrix());
156  rot_g.rotationMatrix(), iso.rotationMatrix(), kEpsilon<Scalar>);
157  }
158  } else if constexpr (TGroup::kPointDim == 3) {
160 
161  for (size_t g_id = 0; g_id < kElems.size(); ++g_id) {
162  sophus::Isometry3<Scalar> iso = SOPHUS_AT(kElems, g_id);
163 
164  TGroup rot_g = TGroup::fromRotationMatrix(iso.rotationMatrix());
166  rot_g.rotationMatrix(), iso.rotationMatrix(), kEpsilon<Scalar>);
167  }
168  }
169 
170  // todo: also the Isometry(t, R) constructor
171 }
172 
173 template <concepts::accessors::SpiralSimilarity TGroup>
175  using Scalar = typename TGroup::Scalar;
176 
177  if constexpr (TGroup::kPointDim == 2) {
179  for (size_t g_id = 0; g_id < kElems.size(); ++g_id) {
180  sophus::SpiralSimilarity2<Scalar> spiral_sim = SOPHUS_AT(kElems, g_id);
181  double scale = spiral_sim.scale();
182 
183  TGroup scale_g = TGroup::fromScale(scale);
184  SOPHUS_ASSERT_NEAR(scale_g.scale(), scale, kEpsilon<Scalar>);
185 
186  TGroup scale_g2;
187  scale_g2.setScale(spiral_sim.scale());
188  SOPHUS_ASSERT_NEAR(scale_g2.scale(), scale, kEpsilon<Scalar>);
189  }
190  } else if constexpr (TGroup::kPointDim == 3) {
192 
193  for (size_t g_id = 0; g_id < kElems.size(); ++g_id) {
194  sophus::SpiralSimilarity3<Scalar> spiral_sim = SOPHUS_AT(kElems, g_id);
195  double scale = spiral_sim.scale();
196 
197  TGroup scale_g = TGroup::fromScale(scale);
198  SOPHUS_ASSERT_NEAR(scale_g.scale(), scale, kEpsilon<Scalar>);
199 
200  TGroup scale_g2;
201  scale_g2.setScale(spiral_sim.scale());
202  SOPHUS_ASSERT_NEAR(scale_g2.scale(), scale, kEpsilon<Scalar>);
203  }
204  }
205 }
206 
207 template <concepts::accessors::Similarity TGroup>
209  using Scalar = typename TGroup::Scalar;
210 
211  if constexpr (TGroup::kPointDim == 2) {
213  for (size_t g_id = 0; g_id < kElems.size(); ++g_id) {
214  sophus::Similarity2<Scalar> sim = SOPHUS_AT(kElems, g_id);
215  double scale = sim.scale();
216 
217  TGroup scale_g = TGroup::fromScale(scale);
218  SOPHUS_ASSERT_NEAR(scale_g.scale(), scale, kEpsilon<Scalar>);
219 
220  TGroup scale_g2;
221  scale_g2.setScale(sim.scale());
222  SOPHUS_ASSERT_NEAR(scale_g2.scale(), scale, kEpsilon<Scalar>);
223  }
224  } else if constexpr (TGroup::kPointDim == 3) {
226 
227  for (size_t g_id = 0; g_id < kElems.size(); ++g_id) {
228  sophus::Similarity3<Scalar> sim = SOPHUS_AT(kElems, g_id);
229  double scale = sim.scale();
230 
231  TGroup scale_g = TGroup::fromScale(scale);
232  SOPHUS_ASSERT_NEAR(scale_g.scale(), scale, kEpsilon<Scalar>);
233 
234  TGroup scale_g2;
235  scale_g2.setScale(sim.scale());
236  SOPHUS_ASSERT_NEAR(scale_g2.scale(), scale, kEpsilon<Scalar>);
237  }
238  }
239 }
240 
241 template <concepts::accessors::UnitComplex TGroup>
243  // TODO
244 }
245 
246 template <concepts::accessors::UnitQuaternion TGroup>
248  // TODO
249 }
250 
251 template <concepts::accessors::Rotation2 TGroup>
253  runRotationAccessorTests<TGroup>();
254  // TODO
255 }
256 
257 template <concepts::accessors::Rotation3 TGroup>
259  runRotationAccessorTests<TGroup>();
260  // TODO
261 }
262 
263 template <concepts::accessors::SpiralSimilarity2 TGroup>
265  runSpiralSimilarityAccessorTests<TGroup>();
266  runRotation2AccessorTests<TGroup>();
267  // TODO
268 }
269 
270 template <concepts::accessors::SpiralSimilarity3 TGroup>
272  runSpiralSimilarityAccessorTests<TGroup>();
273  runRotation3AccessorTests<TGroup>();
274  // TODO
275 }
276 
277 template <concepts::base::Rotation TGroup>
279  // TODO
280 }
281 
282 template <concepts::accessors::Isometry2 TGroup>
284  runIsometryAccessorTests<TGroup>();
285  runRotation2AccessorTests<TGroup>();
286  runTxTyTests<TGroup>();
287 }
288 
289 template <concepts::accessors::Isometry3 TGroup>
291  runIsometryAccessorTests<TGroup>();
292  runRotation3AccessorTests<TGroup>();
293  runTxTyTzTests<TGroup>();
294 }
295 
296 template <concepts::accessors::Similarity2 TGroup>
298  runSimilarityAccessorTests<TGroup>();
299  runSpiralSimilarity2AccessorTests<TGroup>();
300  runTxTyTests<TGroup>();
301 }
302 
303 template <concepts::accessors::Similarity3 TGroup>
305  runSimilarityAccessorTests<TGroup>();
306  runSpiralSimilarity3AccessorTests<TGroup>();
307  runTxTyTzTests<TGroup>();
308 }
309 
310 ///
311 
312 template <concepts::Rotation2 TGroup>
314  runRotation2AccessorTests<TGroup>();
315  runBaseRotationTests<TGroup>();
316  runUnitComplexTests<TGroup>();
317 }
318 
319 template <concepts::Rotation3 TGroup>
321  runRotation3AccessorTests<TGroup>();
322  runBaseRotationTests<TGroup>();
323  runUnitQuaternionTests<TGroup>();
324 }
325 
326 template <concepts::Isometry2 TGroup>
328  runIsometry2AccessorTests<TGroup>();
329  runUnitComplexTests<TGroup>();
330 }
331 
332 template <concepts::Isometry3 TGroup>
334  runIsometry3AccessorTests<TGroup>();
335  runUnitQuaternionTests<TGroup>();
336 }
337 
338 template <concepts::SpiralSimilarity2 TGroup>
340  runSpiralSimilarity2AccessorTests<TGroup>();
341 }
342 
343 template <concepts::SpiralSimilarity3 TGroup>
345  runSpiralSimilarity3AccessorTests<TGroup>();
346 }
347 
348 template <concepts::Similarity2 TGroup>
350  runSimilarity2AccessorTests<TGroup>();
351  runSpiralSimilarity2AccessorTests<TGroup>();
352 }
353 
354 template <concepts::Similarity3 TGroup>
356  runSimilarity3AccessorTests<TGroup>();
357  runSpiralSimilarity3AccessorTests<TGroup>();
358 }
359 } // namespace test
360 } // namespace sophus
sophus::test::runIsometry2AccessorTests
void runIsometry2AccessorTests()
Definition: group_accessors_unit_tests.h:283
similarity3.h
sophus::Similarity2
Definition: similarity2.h:22
sophus::test::runRotation2UnitTests
void runRotation2UnitTests()
Definition: group_accessors_unit_tests.h:313
sophus::test::runSpiralSimilarityAccessorTests
void runSpiralSimilarityAccessorTests()
Definition: group_accessors_unit_tests.h:174
sophus::test::runRotation2AccessorTests
void runRotation2AccessorTests()
Definition: group_accessors_unit_tests.h:252
sophus::Rotation3
Definition: rotation3.h:20
sophus::test::runIsometry2UnitTests
void runIsometry2UnitTests()
Definition: group_accessors_unit_tests.h:327
num_diff.h
sophus::SpiralSimilarity3::scale
auto scale() const -> Scalar
Definition: spiral_similarity3.h:90
sophus
Image MutImage, owning images types.
Definition: num_diff.h:20
sophus::test::runSimilarity2AccessorTests
void runSimilarity2AccessorTests()
Definition: group_accessors_unit_tests.h:297
sophus::test::runUnitQuaternionTests
void runUnitQuaternionTests()
Definition: group_accessors_unit_tests.h:247
similarity2.h
sophus::test::runRotation3UnitTests
void runRotation3UnitTests()
Definition: group_accessors_unit_tests.h:320
sophus::lie::Group< Rotation2, TScalar, lie::Rotation2Impl >::elementExamples
static auto elementExamples() -> std::vector< Derived >
Definition: lie_group.h:221
sophus::test::runTxTyTzTests
void runTxTyTzTests()
Definition: group_accessors_unit_tests.h:102
sophus::test::runTxTyTests
void runTxTyTests()
Definition: group_accessors_unit_tests.h:72
sophus::test::runIsometry3AccessorTests
void runIsometry3AccessorTests()
Definition: group_accessors_unit_tests.h:290
sophus::test::runSpiralSimilarity3AccessorTests
void runSpiralSimilarity3AccessorTests()
Definition: group_accessors_unit_tests.h:271
sophus::SpiralSimilarity2::scale
auto scale() const -> Scalar
Definition: spiral_similarity2.h:79
sophus::test::runTranslationAccessorTests
void runTranslationAccessorTests()
Definition: group_accessors_unit_tests.h:27
sophus::test::runSpiralSimilarity3UnitTests
void runSpiralSimilarity3UnitTests()
Definition: group_accessors_unit_tests.h:344
sophus::SpiralSimilarity3
Definition: spiral_similarity3.h:20
isometry3.h
sophus::test::runSimilarity3AccessorTests
void runSimilarity3AccessorTests()
Definition: group_accessors_unit_tests.h:304
sophus::test::runSimilarity3UnitTests
void runSimilarity3UnitTests()
Definition: group_accessors_unit_tests.h:355
SOPHUS_ASSERT_NEAR
#define SOPHUS_ASSERT_NEAR(...)
Definition: common.h:47
sophus::test::runSpiralSimilarity2AccessorTests
void runSpiralSimilarity2AccessorTests()
Definition: group_accessors_unit_tests.h:264
isometry2.h
sophus::test::runIsometry3UnitTests
void runIsometry3UnitTests()
Definition: group_accessors_unit_tests.h:333
sophus::test::runRotationAccessorTests
void runRotationAccessorTests()
Definition: group_accessors_unit_tests.h:47
sophus::test::runIsometryAccessorTests
void runIsometryAccessorTests()
Definition: group_accessors_unit_tests.h:147
sophus::Isometry2
Definition: isometry2.h:22
sophus::SpiralSimilarity2
Definition: spiral_similarity2.h:20
SOPHUS_ASSERT_LE
#define SOPHUS_ASSERT_LE(...)
Definition: common.h:44
sophus::test::runBaseRotationTests
void runBaseRotationTests()
Definition: group_accessors_unit_tests.h:278
rotation2.h
sophus::Isometry2::rotationMatrix
auto rotationMatrix() const -> Eigen::Matrix2< Scalar >
Definition: isometry2.h:121
spiral_similarity2.h
sophus::Isometry3::rotationMatrix
auto rotationMatrix() const -> Eigen::Matrix3< Scalar >
Definition: isometry3.h:151
sophus::test::runRotation3AccessorTests
void runRotation3AccessorTests()
Definition: group_accessors_unit_tests.h:258
sophus::Similarity3::scale
auto scale() const -> Scalar
Definition: similarity3.h:169
sophus::lie::Group< Rotation2, TScalar, lie::Rotation2Impl >::matrix
auto matrix() const -> Eigen::Matrix< Scalar, kAmbientDim, kAmbientDim >
Definition: lie_group.h:176
sophus::test::runSimilarity2UnitTests
void runSimilarity2UnitTests()
Definition: group_accessors_unit_tests.h:349
group_accessors.h
sophus::Similarity2::scale
auto scale() const -> Scalar
Definition: similarity2.h:150
rotation3.h
sophus::test::runUnitComplexTests
void runUnitComplexTests()
Definition: group_accessors_unit_tests.h:242
sophus::Rotation2
Definition: rotation2.h:20
sophus::Isometry3< Scalar >
sophus::test::runSimilarityAccessorTests
void runSimilarityAccessorTests()
Definition: group_accessors_unit_tests.h:208
sophus::Similarity3
Definition: similarity3.h:22
SOPHUS_AT
#define SOPHUS_AT(...)
Definition: common.h:48
spiral_similarity3.h
sophus::test::runSpiralSimilarity2UnitTests
void runSpiralSimilarity2UnitTests()
Definition: group_accessors_unit_tests.h:339
vector_space.h