diff --git a/pid_controller/CMakeLists.txt b/pid_controller/CMakeLists.txt index d13bda3751..81cbe6f006 100644 --- a/pid_controller/CMakeLists.txt +++ b/pid_controller/CMakeLists.txt @@ -6,6 +6,7 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "(GNU|Clang)") endif() set(THIS_PACKAGE_INCLUDE_DEPENDS + angles control_msgs control_toolbox controller_interface diff --git a/pid_controller/package.xml b/pid_controller/package.xml index ccfe28aba3..ccbb4b2feb 100644 --- a/pid_controller/package.xml +++ b/pid_controller/package.xml @@ -11,6 +11,7 @@ generate_parameter_library + angles control_msgs control_toolbox controller_interface diff --git a/pid_controller/src/pid_controller.cpp b/pid_controller/src/pid_controller.cpp index c46e9dbab8..373e941d96 100644 --- a/pid_controller/src/pid_controller.cpp +++ b/pid_controller/src/pid_controller.cpp @@ -22,6 +22,7 @@ #include #include +#include "angles/angles.h" #include "control_msgs/msg/single_dof_state.hpp" #include "controller_interface/helpers.hpp" @@ -446,7 +447,7 @@ controller_interface::return_type PidController::update_and_write_commands( { // for continuous angles the error is normalized between -pimsg_.dof_states[i].feedback_dot = measured_state_values_[dof_ + i]; } - state_publisher_->msg_.dof_states[i].error = error; + state_publisher_->msg_.dof_states[i].error = + reference_interfaces_[i] - measured_state_values_[i]; + if (params_.gains.dof_names_map[params_.dof_names[i]].angle_wraparound) + { + // for continuous angles the error is normalized between -pimsg_.dof_states[i].error = + angles::shortest_angular_distance(measured_state_values_[i], reference_interfaces_[i]); + } if (reference_interfaces_.size() == 2 * dof_ && measured_state_values_.size() == 2 * dof_) { state_publisher_->msg_.dof_states[i].error_dot = diff --git a/pid_controller/test/test_pid_controller.cpp b/pid_controller/test/test_pid_controller.cpp index bbb669dd78..11f703a1a4 100644 --- a/pid_controller/test/test_pid_controller.cpp +++ b/pid_controller/test/test_pid_controller.cpp @@ -38,7 +38,6 @@ TEST_F(PidControllerTest, all_parameters_set_configure_success) ASSERT_TRUE(controller_->params_.command_interface.empty()); ASSERT_TRUE(controller_->params_.reference_and_state_interfaces.empty()); ASSERT_FALSE(controller_->params_.use_external_measured_states); - ASSERT_FALSE(controller_->params_.runtime_param_update); ASSERT_EQ(controller_->on_configure(rclcpp_lifecycle::State()), NODE_SUCCESS); @@ -60,7 +59,6 @@ TEST_F(PidControllerTest, all_parameters_set_configure_success) controller_->params_.reference_and_state_interfaces, testing::ElementsAreArray(state_interfaces_)); ASSERT_FALSE(controller_->params_.use_external_measured_states); - ASSERT_FALSE(controller_->params_.runtime_param_update); } TEST_F(PidControllerTest, check_exported_intefaces) @@ -161,11 +159,17 @@ TEST_F(PidControllerTest, reactivate_success) ASSERT_EQ(controller_->on_configure(rclcpp_lifecycle::State()), NODE_SUCCESS); ASSERT_EQ(controller_->on_activate(rclcpp_lifecycle::State()), NODE_SUCCESS); + ASSERT_TRUE(std::isnan(controller_->reference_interfaces_[0])); + ASSERT_TRUE(std::isnan(controller_->measured_state_values_[0])); ASSERT_EQ(controller_->command_interfaces_[0].get_value(), 101.101); ASSERT_EQ(controller_->on_deactivate(rclcpp_lifecycle::State()), NODE_SUCCESS); - ASSERT_TRUE(std::isnan(controller_->command_interfaces_[0].get_value())); + ASSERT_TRUE(std::isnan(controller_->reference_interfaces_[0])); + ASSERT_TRUE(std::isnan(controller_->measured_state_values_[0])); + ASSERT_EQ(controller_->command_interfaces_[0].get_value(), 101.101); ASSERT_EQ(controller_->on_activate(rclcpp_lifecycle::State()), NODE_SUCCESS); - ASSERT_TRUE(std::isnan(controller_->command_interfaces_[0].get_value())); + ASSERT_TRUE(std::isnan(controller_->reference_interfaces_[0])); + ASSERT_TRUE(std::isnan(controller_->measured_state_values_[0])); + ASSERT_EQ(controller_->command_interfaces_[0].get_value(), 101.101); ASSERT_EQ( controller_->update(rclcpp::Time(0), rclcpp::Duration::from_seconds(0.01)), diff --git a/pid_controller/test/test_pid_controller.hpp b/pid_controller/test/test_pid_controller.hpp index 48ffccd737..ab32f5cb48 100644 --- a/pid_controller/test/test_pid_controller.hpp +++ b/pid_controller/test/test_pid_controller.hpp @@ -146,7 +146,7 @@ class PidControllerFixture : public ::testing::Test protected: void SetUpController(const std::string controller_name = "test_pid_controller") { - ASSERT_EQ(controller_->init(controller_name), controller_interface::return_type::OK); + ASSERT_EQ(controller_->init(controller_name, "", 0), controller_interface::return_type::OK); std::vector command_ifs; command_itfs_.reserve(dof_names_.size());