test_filter.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2016-2017, 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 <cstddef>
31 
32 #include <gtest/gtest.h>
33 
34 #include <mcl_3dl/filter.h>
35 
36 TEST(Filter, LPFCharacteristic)
37 {
38  for (int time_const = 20; time_const < 100; time_const += 20)
39  {
40  mcl_3dl::Filter lpf(mcl_3dl::Filter::FILTER_LPF, time_const, 0.0);
41  ASSERT_LT(fabs(lpf.get()), 1e-6);
42 
43  // Input step function
44  float ret = 0;
45  for (int i = 0; i < time_const; ++i)
46  {
47  ret = lpf.in(1.0);
48  }
49  // Check value at 1 time unit
50  ASSERT_TRUE(ret == lpf.get());
51  ASSERT_LT(fabs(ret - (1.0 - expf(-1.0))), 1e-2);
52 
53  for (int i = time_const; i < time_const * 100; ++i)
54  {
55  ret = lpf.in(1.0);
56  }
57  // Check value at inf time
58  ASSERT_TRUE(ret == lpf.get());
59  ASSERT_LT(fabs(ret - 1.0), 1e-2);
60 
61  // Check set
62  lpf.set(1.0);
63  ASSERT_LT(fabs(lpf.get() - 1.0), 1e-2);
64  lpf.in(1.0);
65  ASSERT_LT(fabs(lpf.get() - 1.0), 1e-2);
66  }
67 }
68 
69 TEST(Filter, HPFCharacteristic)
70 {
71  for (int time_const = 20; time_const < 100; time_const += 20)
72  {
73  mcl_3dl::Filter lpf(mcl_3dl::Filter::FILTER_LPF, time_const, 0.0);
74  mcl_3dl::Filter hpf(mcl_3dl::Filter::FILTER_HPF, time_const, 0.0);
75 
76  // Input step function
77  for (int i = 0; i < time_const * 10; ++i)
78  {
79  float ret_h, ret_l;
80  ret_l = lpf.in(1.0);
81  ret_h = hpf.in(1.0);
82 
83  // Check complementarity against LPF
84  ASSERT_LT(fabs(ret_l + ret_h - 1.0), 1e-2);
85  }
86  }
87 }
88 
89 TEST(Filter, AugleLPF)
90 {
91  for (float zero = 0.0; zero < M_PI * 2 * 4; zero += M_PI * 2)
92  {
93  // Check 0.5 rad to 2pi - 0.5 rad transition
94  const float start1 = zero + 0.5;
95  const float end1 = zero + M_PI * 2.0 - 0.5;
96 
98  mcl_3dl::Filter lpf_angle(mcl_3dl::Filter::FILTER_LPF, 10, start1, true);
99  ASSERT_LT(fabs(lpf.get() - start1), 1e-6);
100  ASSERT_LT(fabs(lpf_angle.get() - start1), 1e-6);
101 
102  for (int i = 0; i < 100; ++i)
103  {
104  lpf.in(end1);
105  lpf_angle.in(end1);
106  ASSERT_GT(lpf.get(), start1);
107  ASSERT_LT(lpf_angle.get(), start1);
108  }
109  ASSERT_LT(fabs(lpf.get() - end1), 1e-2);
110  ASSERT_LT(fabs(lpf_angle.get() - (zero - 0.5)), 1e-2);
111 
112  // Check 2pi - 0.5 to 0.5 rad transition
113  const float start2 = zero - 0.5;
114  const float end2 = zero - M_PI * 2.0 + 0.5;
115 
116  lpf.set(start2);
117  lpf_angle.set(start2);
118  ASSERT_LT(fabs(lpf.get() - start2), 1e-6);
119  ASSERT_LT(fabs(lpf_angle.get() - start2), 1e-6);
120 
121  for (int i = 0; i < 100; ++i)
122  {
123  lpf.in(end2);
124  lpf_angle.in(end2);
125  ASSERT_LT(lpf.get(), start2);
126  ASSERT_GT(lpf_angle.get(), start2);
127  }
128  ASSERT_LT(fabs(lpf.get() - end2), 1e-2);
129  ASSERT_LT(fabs(lpf_angle.get() - (zero + 0.5)), 1e-2);
130  }
131 }
132 
133 int main(int argc, char** argv)
134 {
135  testing::InitGoogleTest(&argc, argv);
136 
137  return RUN_ALL_TESTS();
138 }
void set(const float out0)
Definition: filter.h:76
float in(float in)
Definition: filter.h:81
TEST(Filter, LPFCharacteristic)
Definition: test_filter.cpp:36
float get() const
Definition: filter.h:95
int main(int argc, char **argv)


mcl_3dl
Author(s): Atsushi Watanabe
autogenerated on Wed May 12 2021 02:16:29