Skip to content

Commit e2b2b7d

Browse files
Merge branch 'ros2-master' into pid_double
2 parents 15e132a + ec19b21 commit e2b2b7d

13 files changed

+103
-191
lines changed

CMakeLists.txt

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,6 @@ add_library(exponential_filter SHARED
115115
target_compile_features(exponential_filter PUBLIC cxx_std_17)
116116
target_include_directories(exponential_filter PUBLIC
117117
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
118-
$<BUILD_INTERFACE:${EIGEN3_INCLUDE_DIR}>
119118
$<INSTALL_INTERFACE:include/control_toolbox>
120119
)
121120
target_link_libraries(exponential_filter PUBLIC
@@ -148,21 +147,37 @@ if(BUILD_TESTING)
148147
ament_target_dependencies(pid_publisher_tests rclcpp_lifecycle)
149148

150149
## Control Filters
150+
# exponential_filter
151+
add_rostest_with_parameters_gmock(test_exponential_filter test/control_filters/test_exponential_filter.cpp
152+
${CMAKE_CURRENT_SOURCE_DIR}/test/control_filters/test_exponential_filter_parameters.yaml
153+
)
154+
target_link_libraries(test_exponential_filter exponential_filter exponential_filter_parameters)
155+
ament_target_dependencies(test_exponential_filter ${CONTROL_FILTERS_INCLUDE_DEPENDS})
156+
set_tests_properties(test_exponential_filter PROPERTIES TIMEOUT 2)
157+
158+
ament_add_gmock(test_load_exponential_filter test/control_filters/test_load_exponential_filter.cpp)
159+
target_link_libraries(test_load_exponential_filter exponential_filter exponential_filter_parameters)
160+
ament_target_dependencies(test_load_exponential_filter ${CONTROL_FILTERS_INCLUDE_DEPENDS})
161+
162+
# low_pass_filter
151163
add_rostest_with_parameters_gmock(test_low_pass_filter test/control_filters/test_low_pass_filter.cpp
152164
${CMAKE_CURRENT_SOURCE_DIR}/test/control_filters/test_low_pass_filter_parameters.yaml
153165
)
154166
target_link_libraries(test_low_pass_filter low_pass_filter low_pass_filter_parameters)
155167
ament_target_dependencies(test_low_pass_filter ${CONTROL_FILTERS_INCLUDE_DEPENDS})
168+
set_tests_properties(test_low_pass_filter PROPERTIES TIMEOUT 2)
156169

157170
ament_add_gmock(test_load_low_pass_filter test/control_filters/test_load_low_pass_filter.cpp)
158171
target_link_libraries(test_load_low_pass_filter low_pass_filter low_pass_filter_parameters)
159172
ament_target_dependencies(test_load_low_pass_filter ${CONTROL_FILTERS_INCLUDE_DEPENDS})
160173

174+
# rate_limiter
161175
add_rostest_with_parameters_gmock(test_rate_limiter test/control_filters/test_rate_limiter.cpp
162176
${CMAKE_CURRENT_SOURCE_DIR}/test/control_filters/test_rate_limiter_parameters.yaml
163177
)
164178
target_link_libraries(test_rate_limiter rate_limiter rate_limiter_parameters)
165179
ament_target_dependencies(test_rate_limiter ${CONTROL_FILTERS_INCLUDE_DEPENDS})
180+
set_tests_properties(test_rate_limiter PROPERTIES TIMEOUT 2)
166181

167182
ament_add_gmock(test_load_rate_limiter test/control_filters/test_load_rate_limiter.cpp)
168183
target_link_libraries(test_load_rate_limiter rate_limiter rate_limiter_parameters)
@@ -177,6 +192,7 @@ install(
177192
install(TARGETS control_toolbox
178193
low_pass_filter low_pass_filter_parameters
179194
rate_limiter rate_limiter_parameters
195+
exponential_filter exponential_filter_parameters
180196
EXPORT export_control_toolbox
181197
ARCHIVE DESTINATION lib
182198
LIBRARY DESTINATION lib

include/control_filters/exponential_filter.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,13 +86,14 @@ bool ExponentialFilter<T>::configure()
8686
std::make_shared<exponential_filter::ParamListener>(this->params_interface_,
8787
this->param_prefix_);
8888
}
89-
catch (rclcpp::exceptions::ParameterUninitializedException & ex) {
90-
RCLCPP_ERROR((*logger_), "Exponential filter cannot be configured: %s", ex.what());
89+
catch (const std::exception & ex) {
90+
RCLCPP_ERROR((*logger_),
91+
"Exponential filter cannot be configured: %s (type : %s)", ex.what(), typeid(ex).name());
9192
parameter_handler_.reset();
9293
return false;
9394
}
94-
catch (rclcpp::exceptions::InvalidParameterValueException & ex) {
95-
RCLCPP_ERROR((*logger_), "Exponential filter cannot be configured: %s", ex.what());
95+
catch (...) {
96+
RCLCPP_ERROR((*logger_), "Caught unknown exception while configuring Exponential filter");
9697
parameter_handler_.reset();
9798
return false;
9899
}

include/control_filters/low_pass_filter.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -112,13 +112,14 @@ bool LowPassFilter<T>::configure()
112112
std::make_shared<low_pass_filter::ParamListener>(this->params_interface_,
113113
this->param_prefix_);
114114
}
115-
catch (rclcpp::exceptions::ParameterUninitializedException & ex) {
116-
RCLCPP_ERROR((*logger_), "LowPass filter cannot be configured: %s", ex.what());
115+
catch (const std::exception & ex) {
116+
RCLCPP_ERROR((*logger_),
117+
"LowPass filter cannot be configured: %s (type : %s)", ex.what(), typeid(ex).name());
117118
parameter_handler_.reset();
118119
return false;
119120
}
120-
catch (rclcpp::exceptions::InvalidParameterValueException & ex) {
121-
RCLCPP_ERROR((*logger_), "LowPass filter cannot be configured: %s", ex.what());
121+
catch (...) {
122+
RCLCPP_ERROR((*logger_), "Caught unknown exception while configuring LowPass filter");
122123
parameter_handler_.reset();
123124
return false;
124125
}

include/control_filters/rate_limiter.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,13 +89,14 @@ bool RateLimiter<T>::configure()
8989
std::make_shared<rate_limiter::ParamListener>(this->params_interface_,
9090
this->param_prefix_);
9191
}
92-
catch (rclcpp::exceptions::ParameterUninitializedException & ex) {
93-
RCLCPP_ERROR((*logger_), "Rate limiter cannot be configured: %s", ex.what());
92+
catch (const std::exception & ex) {
93+
RCLCPP_ERROR((*logger_),
94+
"Rate Limiter filter cannot be configured: %s (type : %s)", ex.what(), typeid(ex).name());
9495
parameter_handler_.reset();
9596
return false;
9697
}
97-
catch (rclcpp::exceptions::InvalidParameterValueException & ex) {
98-
RCLCPP_ERROR((*logger_), "Rate limiter cannot be configured: %s", ex.what());
98+
catch (...) {
99+
RCLCPP_ERROR((*logger_), "Caught unknown exception while configuring Rate Limiter filter");
99100
parameter_handler_.reset();
100101
return false;
101102
}

test/control_filters/test_exponential_filter.cpp

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,30 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
#include "test_exponential_filter.hpp"
15+
#include "test_filter_util.hpp"
1616

17-
TEST_F(ExponentialFilterTest, TestExponentialFilterThrowsUnconfigured)
17+
#include <memory>
18+
#include "gmock/gmock.h"
19+
20+
#include "control_filters/exponential_filter.hpp"
21+
22+
TEST_F(FilterTest, TestExponentialFilterThrowsUnconfigured)
1823
{
1924
std::shared_ptr<filters::FilterBase<double>> filter_ =
2025
std::make_shared<control_filters::ExponentialFilter<double>>();
2126
double in, out;
2227
ASSERT_THROW(filter_->update(in, out), std::runtime_error);
2328
}
2429

30+
TEST_F(FilterTest, TestExponentialFilterInvalidParameterValue)
31+
{
32+
std::shared_ptr<filters::FilterBase<double>> filter_ =
33+
std::make_shared<control_filters::ExponentialFilter<double>>();
34+
ASSERT_FALSE(filter_->configure("", "TestExponentialFilter",
35+
node_->get_node_logging_interface(), node_->get_node_parameters_interface()));
36+
}
2537

26-
TEST_F(ExponentialFilterTest, TestExponentialFilterComputation)
38+
TEST_F(FilterTest, TestExponentialFilterComputation)
2739
{
2840
// parameters should match the test yaml file
2941
double alpha = 0.7;
@@ -42,13 +54,13 @@ TEST_F(ExponentialFilterTest, TestExponentialFilterComputation)
4254
ASSERT_EQ(out, 1.0);
4355

4456
// second filter pass with same values: no change
45-
// check equality with low-pass-filter
46-
ASSERT_TRUE(filter_->update(in, out));
47-
calculated = in;
48-
ASSERT_EQ(calculated, out);
57+
// check equality with low-pass-filter
58+
ASSERT_TRUE(filter_->update(in, out));
59+
calculated = in;
60+
ASSERT_EQ(calculated, out);
4961

5062
// input change
51-
in = 0.0;
63+
in = 0.0;
5264
for (int i = 0; i < 100; ++i){
5365
ASSERT_TRUE(filter_->update(in, out));
5466
calculated = alpha * in + (1 - alpha) * calculated;

test/control_filters/test_exponential_filter.hpp

Lines changed: 0 additions & 62 deletions
This file was deleted.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
TestExponentialFilterComputation:
22
ros__parameters:
33
alpha: 0.7
4+
5+
TestExponentialInvalidParameterValue:
6+
ros__parameters:
7+
alpha: "a"

test/control_filters/test_low_pass_filter.hpp renamed to test/control_filters/test_filter_util.hpp

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -12,52 +12,35 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
#ifndef CONTROL_FILTERS__TEST_LOW_PASS_FILTER_HPP_
16-
#define CONTROL_FILTERS__TEST_LOW_PASS_FILTER_HPP_
15+
#ifndef CONTROL_FILTERS__TEST_FILTER_UTIL_HPP_
16+
#define CONTROL_FILTERS__TEST_FILTER_UTIL_HPP_
1717

1818
#include <memory>
19-
#include <thread>
2019
#include "gmock/gmock.h"
2120

22-
#include "control_filters/low_pass_filter.hpp"
23-
#include "geometry_msgs/msg/wrench_stamped.hpp"
24-
#include "rclcpp/rclcpp.hpp"
21+
#include "rclcpp/node.hpp"
22+
#include "rclcpp/logger.hpp"
2523

26-
namespace
27-
{
28-
static const rclcpp::Logger LOGGER = rclcpp::get_logger("test_low_pass_filter");
29-
} // namespace
30-
31-
class LowPassFilterTest : public ::testing::Test
24+
class FilterTest : public ::testing::Test
3225
{
3326
public:
3427
void SetUp() override
3528
{
3629
auto testname = ::testing::UnitTest::GetInstance()->current_test_info()->name();
3730
node_ = std::make_shared<rclcpp::Node>(testname);
38-
executor_->add_node(node_);
39-
executor_thread_ = std::thread([this]() { executor_->spin(); });
4031
}
4132

42-
LowPassFilterTest()
33+
FilterTest()
4334
{
44-
executor_ = std::make_shared<rclcpp::executors::SingleThreadedExecutor>();
4535
}
4636

4737
void TearDown() override
4838
{
49-
executor_->cancel();
50-
if (executor_thread_.joinable())
51-
{
52-
executor_thread_.join();
53-
}
5439
node_.reset();
5540
}
5641

5742
protected:
5843
rclcpp::Node::SharedPtr node_;
59-
rclcpp::Executor::SharedPtr executor_;
60-
std::thread executor_thread_;
6144
};
6245

63-
#endif // CONTROL_FILTERS__TEST_LOW_PASS_FILTER_HPP_
46+
#endif // CONTROL_FILTERS__TEST_FILTER_UTIL_HPP_

test/control_filters/test_low_pass_filter.cpp

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,16 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
#include "test_low_pass_filter.hpp"
15+
#include "test_filter_util.hpp"
1616

17-
TEST_F(LowPassFilterTest, TestLowPassWrenchFilterAllParameters)
17+
#include <memory>
18+
#include "gmock/gmock.h"
19+
20+
#include "geometry_msgs/msg/wrench_stamped.hpp"
21+
22+
#include "control_filters/low_pass_filter.hpp"
23+
24+
TEST_F(FilterTest, TestLowPassWrenchFilterAllParameters)
1825
{
1926
std::shared_ptr<filters::FilterBase<geometry_msgs::msg::WrenchStamped>> filter_ =
2027
std::make_shared<control_filters::LowPassFilter<geometry_msgs::msg::WrenchStamped>>();
@@ -26,12 +33,13 @@ TEST_F(LowPassFilterTest, TestLowPassWrenchFilterAllParameters)
2633
// change a parameter
2734
node_->set_parameter(rclcpp::Parameter("sampling_frequency", 500.0));
2835
// accept second call to configure with valid parameters to already configured filter
36+
// will give a warning "Filter %s already being reconfigured"
2937
ASSERT_TRUE(filter_->configure("", "TestLowPassFilter",
3038
node_->get_node_logging_interface(), node_->get_node_parameters_interface()));
3139
}
3240

3341

34-
TEST_F(LowPassFilterTest, TestLowPassWrenchFilterMissingParameter)
42+
TEST_F(FilterTest, TestLowPassWrenchFilterMissingParameter)
3543
{
3644
std::shared_ptr<filters::FilterBase<geometry_msgs::msg::WrenchStamped>> filter_ =
3745
std::make_shared<control_filters::LowPassFilter<geometry_msgs::msg::WrenchStamped>>();
@@ -41,7 +49,7 @@ TEST_F(LowPassFilterTest, TestLowPassWrenchFilterMissingParameter)
4149
node_->get_node_logging_interface(), node_->get_node_parameters_interface()));
4250
}
4351

44-
TEST_F(LowPassFilterTest, TestLowPassWrenchFilterInvalidThenFixedParameter)
52+
TEST_F(FilterTest, TestLowPassWrenchFilterInvalidThenFixedParameter)
4553
{
4654
std::shared_ptr<filters::FilterBase<geometry_msgs::msg::WrenchStamped>> filter_ =
4755
std::make_shared<control_filters::LowPassFilter<geometry_msgs::msg::WrenchStamped>>();
@@ -57,23 +65,23 @@ TEST_F(LowPassFilterTest, TestLowPassWrenchFilterInvalidThenFixedParameter)
5765
node_->get_node_logging_interface(), node_->get_node_parameters_interface()));
5866
}
5967

60-
TEST_F(LowPassFilterTest, TestLowPassFilterThrowsUnconfigured)
68+
TEST_F(FilterTest, TestLowPassFilterThrowsUnconfigured)
6169
{
6270
std::shared_ptr<filters::FilterBase<double>> filter_ =
6371
std::make_shared<control_filters::LowPassFilter<double>>();
6472
double in, out;
6573
ASSERT_THROW(filter_->update(in, out), std::runtime_error);
6674
}
6775

68-
TEST_F(LowPassFilterTest, TestLowPassWrenchFilterThrowsUnconfigured)
76+
TEST_F(FilterTest, TestLowPassWrenchFilterThrowsUnconfigured)
6977
{
7078
std::shared_ptr<filters::FilterBase<geometry_msgs::msg::WrenchStamped>> filter_ =
7179
std::make_shared<control_filters::LowPassFilter<geometry_msgs::msg::WrenchStamped>>();
7280
geometry_msgs::msg::WrenchStamped in, out;
7381
ASSERT_THROW(filter_->update(in, out), std::runtime_error);
7482
}
7583

76-
TEST_F(LowPassFilterTest, TestLowPassWrenchFilterComputation)
84+
TEST_F(FilterTest, TestLowPassWrenchFilterComputation)
7785
{
7886
// parameters should match the test yaml file
7987
double sampling_freq = 1000.0;

0 commit comments

Comments
 (0)