@@ -110,23 +110,28 @@ TEST_F(FilterTest, TestLowPassWrenchFilterComputation)
110110 " " , " TestLowPassFilter" , node_->get_node_logging_interface (),
111111 node_->get_node_parameters_interface ()));
112112
113- // first filter pass, output should be zero as no old wrench was stored
113+ // first filter pass, output should be equal to the input
114114 ASSERT_TRUE (filter_->update (in, out));
115- ASSERT_EQ (out.wrench .force .x , 0.0 );
116- ASSERT_EQ (out.wrench .force .y , 0.0 );
117- ASSERT_EQ (out.wrench .force .z , 0.0 );
118- ASSERT_EQ (out.wrench .torque .x , 0.0 );
119- ASSERT_EQ (out.wrench .torque .y , 0.0 );
120- ASSERT_EQ (out.wrench .torque .z , 0.0 );
121-
122- // second filter pass with same values:
115+ ASSERT_EQ (out.wrench .force .x , in.wrench .force .x );
116+ ASSERT_EQ (out.wrench .force .y , in.wrench .force .y );
117+ ASSERT_EQ (out.wrench .force .z , in.wrench .force .z );
118+ ASSERT_EQ (out.wrench .torque .x , in.wrench .torque .x );
119+ ASSERT_EQ (out.wrench .torque .y , in.wrench .torque .y );
120+ ASSERT_EQ (out.wrench .torque .z , in.wrench .torque .z );
121+
122+ // second filter pass with a step in values (otherwise there is nothing to filter):
123+ in.wrench .force .x = 2.0 ;
124+ in.wrench .torque .x = 20.0 ;
125+ ASSERT_TRUE (filter_->update (in, out));
126+
127+ // update once again and check results
123128 // calculate wrench by hand
124- calculated.wrench .force .x = b1 * in.wrench .force .x ;
125- calculated.wrench .force .y = b1 * in.wrench .force .y ;
126- calculated.wrench .force .z = b1 * in.wrench .force .z ;
127- calculated.wrench .torque .x = b1 * in.wrench .torque .x ;
128- calculated.wrench .torque .y = b1 * in.wrench .torque .y ;
129- calculated.wrench .torque .z = b1 * in.wrench .torque .z ;
129+ calculated.wrench .force .x = b1 * in.wrench .force .x + a1 * out. wrench . force . x ;
130+ calculated.wrench .force .y = b1 * in.wrench .force .y + a1 * out. wrench . force . y ;
131+ calculated.wrench .force .z = b1 * in.wrench .force .z + a1 * out. wrench . force . z ;
132+ calculated.wrench .torque .x = b1 * in.wrench .torque .x + a1 * out. wrench . torque . x ;
133+ calculated.wrench .torque .y = b1 * in.wrench .torque .y + a1 * out. wrench . torque . y ;
134+ calculated.wrench .torque .z = b1 * in.wrench .torque .z + a1 * out. wrench . torque . z ;
130135 // check equality with low-pass-filter
131136 ASSERT_TRUE (filter_->update (in, out));
132137 ASSERT_EQ (out.wrench .force .x , calculated.wrench .force .x );
@@ -135,23 +140,50 @@ TEST_F(FilterTest, TestLowPassWrenchFilterComputation)
135140 ASSERT_EQ (out.wrench .torque .x , calculated.wrench .torque .x );
136141 ASSERT_EQ (out.wrench .torque .y , calculated.wrench .torque .y );
137142 ASSERT_EQ (out.wrench .torque .z , calculated.wrench .torque .z );
143+ }
144+
145+ TEST_F (FilterTest, TestLowPassVectorDoubleFilterComputation)
146+ {
147+ // parameters should match the test yaml file
148+ double sampling_freq = 1000.0 ;
149+ double damping_freq = 20.5 ;
150+ double damping_intensity = 1.25 ;
151+
152+ double a1, b1;
153+ a1 = exp (
154+ -1.0 / sampling_freq * (2.0 * M_PI * damping_freq) / (pow (10.0 , damping_intensity / -10.0 )));
155+ b1 = 1.0 - a1;
156+
157+ std::vector<double > in{1.0 , 2.0 , 3.0 };
158+ std::vector<double > calculated, out;
159+ calculated.resize (in.size ());
160+ out.resize (in.size ());
161+
162+ std::shared_ptr<filters::FilterBase<std::vector<double >>> filter_ =
163+ std::make_shared<control_filters::LowPassFilter<std::vector<double >>>();
164+
165+ node_->declare_parameter (" sampling_frequency" , rclcpp::ParameterValue (sampling_freq));
166+ node_->declare_parameter (" damping_frequency" , rclcpp::ParameterValue (damping_freq));
167+ node_->declare_parameter (" damping_intensity" , rclcpp::ParameterValue (damping_intensity));
168+ ASSERT_TRUE (filter_->configure (
169+ " " , " TestLowPassFilter" , node_->get_node_logging_interface (),
170+ node_->get_node_parameters_interface ()));
171+
172+ ASSERT_TRUE (filter_->update (in, out));
173+ ASSERT_TRUE (std::equal (in.begin (), in.end (), out.begin ()));
174+
175+ // second filter pass with a step in values (otherwise there is nothing to filter):
176+ in = {2.0 , 4.0 , 6.0 };
177+ ASSERT_TRUE (filter_->update (in, out));
138178
139179 // update once again and check results
140180 // calculate wrench by hand
141- calculated.wrench .force .x = b1 * in.wrench .force .x + a1 * calculated.wrench .force .x ;
142- calculated.wrench .force .y = b1 * in.wrench .force .y + a1 * calculated.wrench .force .y ;
143- calculated.wrench .force .z = b1 * in.wrench .force .z + a1 * calculated.wrench .force .z ;
144- calculated.wrench .torque .x = b1 * in.wrench .torque .x + a1 * calculated.wrench .torque .x ;
145- calculated.wrench .torque .y = b1 * in.wrench .torque .y + a1 * calculated.wrench .torque .y ;
146- calculated.wrench .torque .z = b1 * in.wrench .torque .z + a1 * calculated.wrench .torque .z ;
181+ calculated[0 ] = b1 * in[0 ] + a1 * out[0 ];
182+ calculated[1 ] = b1 * in[1 ] + a1 * out[1 ];
183+ calculated[2 ] = b1 * in[2 ] + a1 * out[2 ];
147184 // check equality with low-pass-filter
148185 ASSERT_TRUE (filter_->update (in, out));
149- ASSERT_EQ (out.wrench .force .x , calculated.wrench .force .x );
150- ASSERT_EQ (out.wrench .force .y , calculated.wrench .force .y );
151- ASSERT_EQ (out.wrench .force .z , calculated.wrench .force .z );
152- ASSERT_EQ (out.wrench .torque .x , calculated.wrench .torque .x );
153- ASSERT_EQ (out.wrench .torque .y , calculated.wrench .torque .y );
154- ASSERT_EQ (out.wrench .torque .z , calculated.wrench .torque .z );
186+ ASSERT_TRUE (std::equal (out.begin (), out.end (), calculated.begin ()));
155187}
156188
157189int main (int argc, char ** argv)
0 commit comments