Skip to content

Commit fd79e23

Browse files
Add DynamicParameterPatterns to pose_pogress_checker plugin
Signed-off-by: Nils-Christian Iseke <[email protected]>
1 parent d362e74 commit fd79e23

File tree

2 files changed

+120
-37
lines changed

2 files changed

+120
-37
lines changed

nav2_controller/include/nav2_controller/plugins/pose_progress_checker.hpp

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#include <string>
1919
#include <vector>
20+
#include <memory>
2021
#include "rclcpp/rclcpp.hpp"
2122
#include "nav2_controller/plugins/simple_progress_checker.hpp"
2223
#include "rclcpp_lifecycle/lifecycle_node.hpp"
@@ -31,6 +32,41 @@ namespace nav2_controller
3132

3233
class PoseProgressChecker : public SimpleProgressChecker
3334
{
35+
struct Parameters
36+
{
37+
double required_movement_angle;
38+
};
39+
40+
/**
41+
* @class nav2_controller::PoseProgressChecker::ParameterHandler
42+
* @brief This class handls parameters and dynamic parameter updates for the nav2_controller.
43+
*/
44+
class ParameterHandler
45+
{
46+
public:
47+
ParameterHandler(
48+
rclcpp_lifecycle::LifecycleNode::SharedPtr node,
49+
std::string & plugin_name, rclcpp::Logger & logger);
50+
~ParameterHandler();
51+
Parameters * getParams() {return &params_;}
52+
53+
protected:
54+
rclcpp_lifecycle::LifecycleNode::WeakPtr node_;
55+
56+
void
57+
updateParametersCallback(
58+
std::vector<rclcpp::Parameter> parameters);
59+
60+
rcl_interfaces::msg::SetParametersResult
61+
validateParameterUpdatesCallback(
62+
std::vector<rclcpp::Parameter> parameters);
63+
rclcpp::node_interfaces::PostSetParametersCallbackHandle::SharedPtr post_set_params_handler_;
64+
rclcpp::node_interfaces::OnSetParametersCallbackHandle::SharedPtr on_set_params_handler_;
65+
Parameters params_;
66+
std::string plugin_name_;
67+
rclcpp::Logger logger_ {rclcpp::get_logger("PoseProgressChecker")};
68+
};
69+
3470
public:
3571
void initialize(
3672
const rclcpp_lifecycle::LifecycleNode::WeakPtr & parent,
@@ -50,18 +86,15 @@ class PoseProgressChecker : public SimpleProgressChecker
5086
const geometry_msgs::msg::Pose2D &);
5187

5288
double required_movement_angle_;
53-
54-
// Dynamic parameters handler
55-
rclcpp::node_interfaces::OnSetParametersCallbackHandle::SharedPtr dyn_params_handler_;
89+
Parameters * params_;
5690
std::string plugin_name_;
5791

58-
/**
59-
* @brief Callback executed when a parameter change is detected
60-
* @param parameters list of changed parameters
61-
*/
62-
rcl_interfaces::msg::SetParametersResult
63-
dynamicParametersCallback(std::vector<rclcpp::Parameter> parameters);
92+
rclcpp::Logger logger_ {rclcpp::get_logger("PoseProgressChecker")};
93+
rclcpp_lifecycle::LifecycleNode::WeakPtr node_;
94+
std::unique_ptr<nav2_controller::PoseProgressChecker::ParameterHandler> param_handler_;
6495
};
96+
97+
6598
} // namespace nav2_controller
6699

67100
#endif // NAV2_CONTROLLER__PLUGINS__POSE_PROGRESS_CHECKER_HPP_

nav2_controller/plugins/pose_progress_checker.cpp

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

15-
#include "nav2_controller/plugins/pose_progress_checker.hpp"
1615
#include <cmath>
1716
#include <string>
1817
#include <memory>
1918
#include <vector>
19+
2020
#include "angles/angles.h"
2121
#include "nav_2d_utils/conversions.hpp"
2222
#include "geometry_msgs/msg/pose_stamped.hpp"
2323
#include "geometry_msgs/msg/pose2_d.hpp"
2424
#include "nav2_util/node_utils.hpp"
2525
#include "pluginlib/class_list_macros.hpp"
26+
#include "nav2_controller/plugins/pose_progress_checker.hpp"
27+
#include "nav2_core/controller_exceptions.hpp"
2628

2729
using rcl_interfaces::msg::ParameterType;
2830
using std::placeholders::_1;
2931

3032
namespace nav2_controller
3133
{
34+
using nav2_util::declare_parameter_if_not_declared;
35+
using rcl_interfaces::msg::ParameterType;
36+
37+
38+
PoseProgressChecker::ParameterHandler::ParameterHandler(
39+
rclcpp_lifecycle::LifecycleNode::SharedPtr node,
40+
std::string & plugin_name, rclcpp::Logger & logger)
41+
{
42+
node_ = node;
43+
plugin_name_ = plugin_name;
44+
logger_ = logger;
45+
46+
declare_parameter_if_not_declared(node, plugin_name + ".required_movement_angle",
47+
rclcpp::ParameterValue(0.5));
48+
node->get_parameter(plugin_name + ".required_movement_angle",
49+
params_.required_movement_angle);
50+
on_set_params_handler_ = node->add_on_set_parameters_callback(
51+
[this](const auto & params) {
52+
return this->validateParameterUpdatesCallback(params);
53+
});
54+
post_set_params_handler_ = node->add_post_set_parameters_callback(
55+
[this](const auto & params) {
56+
return this->updateParametersCallback(params);
57+
});
58+
}
59+
PoseProgressChecker::ParameterHandler::~ParameterHandler() = default;
60+
61+
void PoseProgressChecker::ParameterHandler::updateParametersCallback(
62+
std::vector<rclcpp::Parameter> parameters)
63+
{
64+
for (const auto & param : parameters) {
65+
const auto & name = param.get_name();
66+
const auto & type = param.get_type();
67+
if (name == plugin_name_ + ".required_movement_angle" &&
68+
type == ParameterType::PARAMETER_DOUBLE)
69+
{
70+
params_.required_movement_angle = param.as_double();
71+
}
72+
}
73+
}
74+
rcl_interfaces::msg::SetParametersResult
75+
PoseProgressChecker::ParameterHandler::validateParameterUpdatesCallback(
76+
std::vector<rclcpp::Parameter> parameters)
77+
{
78+
rcl_interfaces::msg::SetParametersResult result;
79+
for (auto parameter : parameters) {
80+
const auto & type = parameter.get_type();
81+
const auto & name = parameter.get_name();
82+
{
83+
if (name.find(plugin_name_ + ".") != 0) {
84+
continue;
85+
}
86+
if (name == plugin_name_ + ".required_movement_angle" &&
87+
type == ParameterType::PARAMETER_DOUBLE &&
88+
(parameter.as_double() <= 0.0 || parameter.as_double() >= 2 * M_PI))
89+
{
90+
result.successful = false;
91+
result.reason = "The value required_movement_angle is incorrectly set, "
92+
"it should be 0 < required_movement_angle < 2PI. Ignoring parameter update.";
93+
return result;
94+
}
95+
}
96+
}
97+
result.successful = true;
98+
return result;
99+
}
32100

33101
void PoseProgressChecker::initialize(
34102
const rclcpp_lifecycle::LifecycleNode::WeakPtr & parent,
35103
const std::string & plugin_name)
36104
{
105+
auto node = parent.lock();
106+
if (!node) {
107+
throw nav2_core::ControllerException("Unable to lock node!");
108+
}
109+
node_ = parent;
37110
plugin_name_ = plugin_name;
111+
logger_ = node->get_logger();
112+
param_handler_ = std::make_unique<ParameterHandler>(node, plugin_name_, logger_);
113+
params_ = param_handler_->getParams();
38114
SimpleProgressChecker::initialize(parent, plugin_name);
39-
auto node = parent.lock();
40-
41-
nav2_util::declare_parameter_if_not_declared(
42-
node, plugin_name + ".required_movement_angle", rclcpp::ParameterValue(0.5));
43-
node->get_parameter_or(plugin_name + ".required_movement_angle", required_movement_angle_, 0.5);
44-
45-
// Add callback for dynamic parameters
46-
dyn_params_handler_ = node->add_on_set_parameters_callback(
47-
std::bind(&PoseProgressChecker::dynamicParametersCallback, this, _1));
48115
}
49116

50117
bool PoseProgressChecker::check(geometry_msgs::msg::PoseStamped & current_pose)
@@ -64,7 +131,7 @@ bool PoseProgressChecker::check(geometry_msgs::msg::PoseStamped & current_pose)
64131
bool PoseProgressChecker::isRobotMovedEnough(const geometry_msgs::msg::Pose2D & pose)
65132
{
66133
return pose_distance(pose, baseline_pose_) > radius_ ||
67-
poseAngleDistance(pose, baseline_pose_) > required_movement_angle_;
134+
poseAngleDistance(pose, baseline_pose_) > params_->required_movement_angle;
68135
}
69136

70137
double PoseProgressChecker::poseAngleDistance(
@@ -74,23 +141,6 @@ double PoseProgressChecker::poseAngleDistance(
74141
return abs(angles::shortest_angular_distance(pose1.theta, pose2.theta));
75142
}
76143

77-
rcl_interfaces::msg::SetParametersResult
78-
PoseProgressChecker::dynamicParametersCallback(std::vector<rclcpp::Parameter> parameters)
79-
{
80-
rcl_interfaces::msg::SetParametersResult result;
81-
for (auto parameter : parameters) {
82-
const auto & type = parameter.get_type();
83-
const auto & name = parameter.get_name();
84-
85-
if (type == ParameterType::PARAMETER_DOUBLE) {
86-
if (name == plugin_name_ + ".required_movement_angle") {
87-
required_movement_angle_ = parameter.as_double();
88-
}
89-
}
90-
}
91-
result.successful = true;
92-
return result;
93-
}
94144

95145
} // namespace nav2_controller
96146

0 commit comments

Comments
 (0)