blob: 1ae971c8912fe6cd219127cad482e4df9a2f1390 [file] [log] [blame]
Austin Schuh7400da02018-01-28 19:54:58 -08001/**********************************************************************************************************************
2This file is part of the Control Toolbox (https://adrlab.bitbucket.io/ct), copyright by ETH Zurich, Google Inc.
3Authors: Michael Neunert, Markus Giftthaler, Markus Stäuble, Diego Pardo, Farbod Farshidian
4Licensed under Apache2 license (see LICENSE file in main directory)
5**********************************************************************************************************************/
6
7
8#include <chrono>
9#include <kindr/Core>
10
11int main()
12{
13 static const size_t nTests = 1000000;
14 std::vector<kindr::EulerAnglesXyzD, Eigen::aligned_allocator<kindr::EulerAnglesXyzD>> angles(nTests);
15
16 typedef std::vector<Eigen::Vector3d, Eigen::aligned_allocator<Eigen::Vector3d>> test_vector_t;
17 test_vector_t vectors(nTests);
18 test_vector_t vectorsRotatedNormal(nTests);
19 test_vector_t vectorsRotatedMatrix(nTests);
20
21 std::cout << "running " << nTests << " rotation tests" << std::endl;
22
23 for (size_t i = 0; i < nTests; i++)
24 {
25 angles[i].setRandom();
26 vectors[i].setRandom();
27 }
28
29 std::cout << "timing angle.inverseRotate(vector)" << std::endl;
30 auto start = std::chrono::high_resolution_clock::now();
31 for (size_t i = 0; i < nTests; i++)
32 {
33 vectorsRotatedNormal[i] = angles[i].inverseRotate(vectors[i]);
34 }
35 auto end = std::chrono::high_resolution_clock::now();
36 auto diff = end - start;
37 size_t msTotal = std::chrono::duration<double, std::milli>(diff).count();
38 std::cout << "Total time: " << msTotal << " ms. Average: " << msTotal / double(nTests) << " ms" << std::endl;
39
40 std::cout << "timing angle.toRotationMatrix().inverted().rotate(vector)" << std::endl;
41 start = std::chrono::high_resolution_clock::now();
42 for (size_t i = 0; i < nTests; i++)
43 {
44 vectorsRotatedMatrix[i] = kindr::RotationMatrixD(angles[i]).inverted().rotate(vectors[i]);
45 }
46 end = std::chrono::high_resolution_clock::now();
47 diff = end - start;
48 msTotal = std::chrono::duration<double, std::milli>(diff).count();
49 std::cout << "Total time: " << msTotal << " ms. Average: " << msTotal / double(nTests) << " ms" << std::endl;
50
51 double error = 0.0;
52 double maxError = 0.0;
53 size_t maxErrorIndex = 0;
54 for (size_t i = 0; i < nTests; i++)
55 {
56 double err = (vectorsRotatedNormal[i] - vectorsRotatedMatrix[i]).norm();
57 if (err > maxError)
58 {
59 maxError = err;
60 maxErrorIndex = i;
61 }
62 error += err;
63 }
64 std::cout << "average error: " << error / double(nTests) << std::endl;
65 std::cout << "max error " << maxError << " for pair: " << std::endl;
66 std::cout << "euler angles: " << angles[maxErrorIndex].toImplementation().transpose() << std::endl;
67 std::cout << "vector to rotate: " << vectors[maxErrorIndex].transpose() << std::endl;
68 std::cout << "vector inverse rotated (direct): " << vectorsRotatedNormal[maxErrorIndex].transpose() << std::endl;
69 std::cout << "vector inverse rotated (rotation matrix transpose): "
70 << vectorsRotatedMatrix[maxErrorIndex].transpose() << std::endl;
71}