test_state_6dof.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2019, the mcl_3dl authors
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  * * Redistributions in binary form must reproduce the above copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution.
13  * * Neither the name of the copyright holder nor the names of its
14  * contributors may be used to endorse or promote products derived from
15  * this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27  * POSSIBILITY OF SUCH DAMAGE.
28  */
29 
30 #include <array>
31 #include <cstddef>
32 #include <cmath>
33 
34 #include <gtest/gtest.h>
35 
36 #include <mcl_3dl/state_6dof.h>
37 
38 TEST(State6DOF, Constructors)
39 {
40  const mcl_3dl::State6DOF a(
41  mcl_3dl::Vec3(1.0, 2.0, 3.0), mcl_3dl::Quat(0.001, 0.002, 0.003, 0.99));
42 
43  ASSERT_FALSE(a.isDiff());
44  ASSERT_EQ(a.pos_, mcl_3dl::Vec3(1.0, 2.0, 3.0));
45  ASSERT_EQ(a.rot_, mcl_3dl::Quat(0.001, 0.002, 0.003, 0.99));
46  ASSERT_EQ(a.rot_, mcl_3dl::Quat(0.001, 0.002, 0.003, 0.99));
47  ASSERT_EQ(a.odom_err_integ_lin_, mcl_3dl::Vec3(0.0, 0.0, 0.0));
48  ASSERT_EQ(a.odom_err_integ_ang_, mcl_3dl::Vec3(0.0, 0.0, 0.0));
49 
50  const mcl_3dl::State6DOF b(
51  mcl_3dl::Vec3(4.0, 5.0, 6.0), mcl_3dl::Vec3(0.1, 0.2, 0.3));
52 
53  ASSERT_TRUE(b.isDiff());
54  ASSERT_EQ(b.pos_, mcl_3dl::Vec3(4.0, 5.0, 6.0));
55  ASSERT_EQ(b.rot_, mcl_3dl::Quat(0.0, 0.0, 0.0, 1.0));
56  ASSERT_EQ(b.rpy_.v_, mcl_3dl::Vec3(0.1, 0.2, 0.3));
57  ASSERT_EQ(b.odom_err_integ_lin_, mcl_3dl::Vec3(0.0, 0.0, 0.0));
58  ASSERT_EQ(b.odom_err_integ_ang_, mcl_3dl::Vec3(0.0, 0.0, 0.0));
59 }
60 
61 TEST(State6DOF, Accessors)
62 {
63  const mcl_3dl::State6DOF a(
64  mcl_3dl::Vec3(1.0, 2.0, 3.0), mcl_3dl::Quat(0.001, 0.002, 0.003, 0.99));
65 
66  ASSERT_EQ(a[0], 1.0f);
67  ASSERT_EQ(a[1], 2.0f);
68  ASSERT_EQ(a[2], 3.0f);
69  ASSERT_EQ(a[3], 0.001f);
70  ASSERT_EQ(a[4], 0.002f);
71  ASSERT_EQ(a[5], 0.003f);
72  ASSERT_EQ(a[6], 0.99f);
73  ASSERT_EQ(a[7], 0.0f);
74  ASSERT_EQ(a[8], 0.0f);
75  ASSERT_EQ(a[9], 0.0f);
76  ASSERT_EQ(a[10], 0.0f);
77  ASSERT_EQ(a[11], 0.0f);
78  ASSERT_EQ(a[12], 0.0f);
79 
81  for (size_t i = 0; i < b.size(); ++i)
82  b[i] = 0.1 * (i + 1);
83  for (size_t i = 0; i < b.size(); ++i)
84  ASSERT_FLOAT_EQ(b[i], 0.1 * (i + 1));
85 
86  const mcl_3dl::State6DOF c = b;
87  for (size_t i = 0; i < b.size(); ++i)
88  ASSERT_FLOAT_EQ(c[i], 0.1 * (i + 1));
89 }
90 
91 TEST(State6DOF, Adder)
92 {
93  const mcl_3dl::State6DOF a(
94  mcl_3dl::Vec3(1.0, 2.0, 3.0), mcl_3dl::Quat(mcl_3dl::Vec3(0.0, 0.0, 1.0), 0.1));
95  const mcl_3dl::State6DOF b(
96  mcl_3dl::Vec3(4.0, 5.0, 6.0), mcl_3dl::Quat(mcl_3dl::Vec3(0.0, 0.0, 1.0), 0.2));
97 
98  const mcl_3dl::State6DOF sum = a + b;
99  const mcl_3dl::State6DOF sub = a - b;
100  const mcl_3dl::Quat sum_rot(mcl_3dl::Vec3(0.0, 0.0, 1.0), 0.3);
101  const mcl_3dl::Quat sub_rot(mcl_3dl::Vec3(0.0, 0.0, 1.0), -0.1);
102 
103  ASSERT_EQ(sum.pos_, mcl_3dl::Vec3(5.0, 7.0, 9.0));
104  ASSERT_FLOAT_EQ(sum.rot_.x_, sum_rot.x_);
105  ASSERT_FLOAT_EQ(sum.rot_.y_, sum_rot.y_);
106  ASSERT_FLOAT_EQ(sum.rot_.z_, sum_rot.z_);
107  ASSERT_FLOAT_EQ(sum.rot_.w_, sum_rot.w_);
108  ASSERT_EQ(sub.pos_, mcl_3dl::Vec3(-3.0, -3.0, -3.0));
109  ASSERT_FLOAT_EQ(sub.rot_.x_, sub_rot.x_);
110  ASSERT_FLOAT_EQ(sub.rot_.y_, sub_rot.y_);
111  ASSERT_FLOAT_EQ(sub.rot_.z_, sub_rot.z_);
112  ASSERT_FLOAT_EQ(sub.rot_.w_, sub_rot.w_);
113 }
114 
115 TEST(State6DOF, CovarianceMatrix)
116 {
117  const mcl_3dl::State6DOF e(
118  mcl_3dl::Vec3(1.0, 2.0, 3.0), mcl_3dl::Quat(mcl_3dl::Vec3(0.0, 0.0, 1.0), 0.1));
119 
120  ASSERT_EQ(e.covDimension(), 6);
121  std::array<float, 36> cov{};
122 
123  std::mt19937 mt(42);
124  std::normal_distribution<float> x_dis(e.pos_.x_, 0.1);
125  std::normal_distribution<float> y_dis(e.pos_.y_, 0.2);
126  std::normal_distribution<float> z_dis(e.pos_.z_, 0.3);
127  std::normal_distribution<float> yaw_dis(e.rot_.getRPY().z_, 0.4);
128 
129  const auto generate_state = [&mt, &x_dis, &y_dis, &z_dis, &yaw_dis](const bool use_rpy) -> mcl_3dl::State6DOF
130  {
131  if (use_rpy)
132  {
133  return mcl_3dl::State6DOF(mcl_3dl::Vec3(x_dis(mt), y_dis(mt), z_dis(mt)),
134  mcl_3dl::Vec3(0, 0, yaw_dis(mt)));
135  }
136  else
137  {
138  return mcl_3dl::State6DOF(mcl_3dl::Vec3(x_dis(mt), y_dis(mt), z_dis(mt)),
139  mcl_3dl::Quat(mcl_3dl::Vec3(0.0, 0.0, 1.0), yaw_dis(mt)));
140  }
141  };
142 
143  const std::size_t N = 500;
144  for (std::size_t n = 0; n < N; n++)
145  {
146  mcl_3dl::State6DOF s = generate_state(n % 2 == 0);
147  for (std::size_t j = 0; j < 6; j++)
148  {
149  for (std::size_t k = j; k < 6; k++)
150  {
151  cov[k * 6 + j] = cov[j * 6 + k] += s.covElement(e, j, k);
152  }
153  }
154  }
155 
156  for (size_t j = 0; j < 6; j++)
157  {
158  for (size_t k = 0; k < 6; k++)
159  {
160  cov[k * 6 + j] /= (N - 1);
161  }
162  }
163 
164  const float tolerance = 1e-2;
165  ASSERT_NEAR(std::sqrt(cov[0]), 0.1, tolerance);
166  ASSERT_NEAR(std::sqrt(cov[7]), 0.2, tolerance);
167  ASSERT_NEAR(std::sqrt(cov[14]), 0.3, tolerance);
168  ASSERT_NEAR(std::sqrt(cov[35]), 0.4, tolerance);
169 }
170 
171 int main(int argc, char** argv)
172 {
173  testing::InitGoogleTest(&argc, argv);
174 
175  return RUN_ALL_TESTS();
176 }
mcl_3dl::State6DOF::odom_err_integ_ang_
mcl_3dl::Vec3 odom_err_integ_ang_
Definition: state_6dof.h:60
mcl_3dl::Vec3::x_
float x_
Definition: vec3.h:40
s
XmlRpcServer s
mcl_3dl::State6DOF::isDiff
bool isDiff() const
Definition: state_6dof.h:210
mcl_3dl::Quat::y_
float y_
Definition: quat.h:44
f
f
mcl_3dl::Quat::getRPY
constexpr Vec3 getRPY() const
Definition: quat.h:191
mcl_3dl::Vec3::z_
float z_
Definition: vec3.h:42
state_6dof.h
mcl_3dl::Quat
Definition: quat.h:40
mcl_3dl::Quat::w_
float w_
Definition: quat.h:46
mcl_3dl::State6DOF::odom_err_integ_lin_
mcl_3dl::Vec3 odom_err_integ_lin_
Definition: state_6dof.h:59
mcl_3dl::Vec3::y_
float y_
Definition: vec3.h:41
mcl_3dl::State6DOF::size
size_t size() const override
Definition: state_6dof.h:150
mcl_3dl::State6DOF::covDimension
size_t covDimension() const override
Definition: state_6dof.h:158
mcl_3dl::State6DOF::RPYVec::v_
mcl_3dl::Vec3 v_
Definition: state_6dof.h:64
mcl_3dl::State6DOF::rot_
mcl_3dl::Quat rot_
Definition: state_6dof.h:53
TEST
TEST(State6DOF, Constructors)
Definition: test_state_6dof.cpp:38
main
int main(int argc, char **argv)
Definition: test_state_6dof.cpp:171
mcl_3dl::State6DOF::pos_
mcl_3dl::Vec3 pos_
Definition: state_6dof.h:52
mcl_3dl::Vec3
Definition: vec3.h:37
mcl_3dl::Quat::z_
float z_
Definition: quat.h:45
mcl_3dl::State6DOF
Definition: state_6dof.h:49
mcl_3dl::State6DOF::rpy_
RPYVec rpy_
Definition: state_6dof.h:79
mcl_3dl::Quat::x_
float x_
Definition: quat.h:43


mcl_3dl
Author(s): Atsushi Watanabe
autogenerated on Thu Oct 17 2024 02:18:04