Skip to content

Commit 24ce814

Browse files
Add DynamicParameterPatterns to pose_pogress_checker plugin
1 parent d362e74 commit 24ce814

File tree

5 files changed

+191
-38
lines changed

5 files changed

+191
-38
lines changed

nav2_controller/CMakeLists.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,10 @@ target_link_libraries(simple_progress_checker PRIVATE
8585
pluginlib::pluginlib
8686
)
8787

88-
add_library(pose_progress_checker SHARED plugins/pose_progress_checker.cpp)
88+
add_library(pose_progress_checker SHARED
89+
plugins/pose_progress_checker.cpp
90+
plugins/parameter_handler_pose_pogress_checker.cpp
91+
)
8992
target_include_directories(pose_progress_checker
9093
PUBLIC
9194
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
@@ -97,6 +100,7 @@ target_link_libraries(pose_progress_checker PUBLIC
97100
rclcpp_lifecycle::rclcpp_lifecycle
98101
${rcl_interfaces_TARGETS}
99102
simple_progress_checker
103+
100104
)
101105
target_link_libraries(pose_progress_checker PRIVATE
102106
angles::angles
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// Copyright (c) 2023 Dexory
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
#ifndef NAV2_CONTROLLER__PLUGINS__PARAMETER_HANDLER_POSE_PROGRESS_CHECKER_HPP_
16+
#define NAV2_CONTROLLER__PLUGINS__PARAMETER_HANDLER_POSE_PROGRESS_CHECKER_HPP_
17+
18+
#include <string>
19+
#include <vector>
20+
#include "rclcpp/rclcpp.hpp"
21+
#include "nav2_controller/plugins/simple_progress_checker.hpp"
22+
#include "rclcpp_lifecycle/lifecycle_node.hpp"
23+
#include "nav2_util/node_utils.hpp"
24+
25+
namespace nav2_controller
26+
{
27+
struct Parameters
28+
{
29+
double required_movement_angle;
30+
};
31+
32+
/**
33+
* @class nav2_controller::ParameterHandler
34+
* @brief This class handls parameters and dynamic parameter updates for the nav2_controller.
35+
*/
36+
class ParameterHandler
37+
{
38+
public:
39+
ParameterHandler(
40+
rclcpp_lifecycle::LifecycleNode::SharedPtr node,
41+
std::string & plugin_name, rclcpp::Logger & logger);
42+
~ParameterHandler();
43+
Parameters * getParams() {return &params_;}
44+
45+
protected:
46+
rclcpp_lifecycle::LifecycleNode::WeakPtr node_;
47+
48+
void
49+
updateParametersCallback(
50+
std::vector<rclcpp::Parameter> parameters);
51+
52+
rcl_interfaces::msg::SetParametersResult
53+
validateParameterUpdatesCallback(
54+
std::vector<rclcpp::Parameter> parameters);
55+
rclcpp::node_interfaces::PostSetParametersCallbackHandle::SharedPtr post_set_params_handler_;
56+
rclcpp::node_interfaces::OnSetParametersCallbackHandle::SharedPtr on_set_params_handler_;
57+
Parameters params_;
58+
std::string plugin_name_;
59+
rclcpp::Logger logger_ {
60+
rclcpp::get_logger("nav2_controller::PoseProgressChecker")};
61+
};
62+
63+
} // namespace nav2_controller
64+
65+
#endif // NAV2_CONTROLLER__PLUGINS__PARAMETER_HANDLER_POSE_PROGRESS_CHECKER_HPP_

nav2_controller/include/nav2_controller/plugins/pose_progress_checker.hpp

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@
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"
24+
#include "nav2_controller/plugins/parameter_handler_pose_progress_checker.hpp"
2325

2426
namespace nav2_controller
2527
{
@@ -50,18 +52,15 @@ class PoseProgressChecker : public SimpleProgressChecker
5052
const geometry_msgs::msg::Pose2D &);
5153

5254
double required_movement_angle_;
53-
54-
// Dynamic parameters handler
55-
rclcpp::node_interfaces::OnSetParametersCallbackHandle::SharedPtr dyn_params_handler_;
55+
Parameters * params_;
5656
std::string plugin_name_;
5757

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);
58+
rclcpp::Logger logger_ {rclcpp::get_logger("PoseProgressChecker")};
59+
rclcpp_lifecycle::LifecycleNode::WeakPtr node_;
60+
std::unique_ptr<nav2_controller::ParameterHandler> param_handler_;
6461
};
62+
63+
6564
} // namespace nav2_controller
6665

6766
#endif // NAV2_CONTROLLER__PLUGINS__POSE_PROGRESS_CHECKER_HPP_
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
// Copyright (c) 2023 Dexory
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
#include <cmath>
16+
#include <string>
17+
#include <memory>
18+
#include <vector>
19+
#include "angles/angles.h"
20+
21+
#include "geometry_msgs/msg/pose_stamped.hpp"
22+
#include "geometry_msgs/msg/pose2_d.hpp"
23+
#include "pluginlib/class_list_macros.hpp"
24+
25+
#include "nav2_util/node_utils.hpp"
26+
#include "nav2_controller/plugins/parameter_handler_pose_progress_checker.hpp"
27+
#include "nav2_controller/plugins/pose_progress_checker.hpp"
28+
29+
namespace nav2_controller
30+
{
31+
32+
using nav2_util::declare_parameter_if_not_declared;
33+
using rcl_interfaces::msg::ParameterType;
34+
35+
ParameterHandler::ParameterHandler(
36+
rclcpp_lifecycle::LifecycleNode::SharedPtr node,
37+
std::string & plugin_name, rclcpp::Logger & logger)
38+
{
39+
node_ = node;
40+
plugin_name_ = plugin_name;
41+
logger_ = logger;
42+
43+
declare_parameter_if_not_declared(node, plugin_name + ".required_movement_angle",
44+
rclcpp::ParameterValue(0.5));
45+
node->get_parameter(plugin_name + ".required_movement_angle",
46+
params_.required_movement_angle);
47+
on_set_params_handler_ = node->add_on_set_parameters_callback(
48+
[this](const auto & params) {
49+
return this->validateParameterUpdatesCallback(params);
50+
});
51+
post_set_params_handler_ = node->add_post_set_parameters_callback(
52+
[this](const auto & params) {
53+
return this->updateParametersCallback(params);
54+
});
55+
}
56+
ParameterHandler::~ParameterHandler() = default;
57+
58+
void ParameterHandler::updateParametersCallback(
59+
std::vector<rclcpp::Parameter> parameters)
60+
{
61+
for (const auto & param : parameters) {
62+
const auto & name = param.get_name();
63+
const auto & type = param.get_type();
64+
if (name == plugin_name_ + ".required_movement_angle" &&
65+
type == ParameterType::PARAMETER_DOUBLE)
66+
{
67+
params_.required_movement_angle = param.as_double();
68+
}
69+
}
70+
}
71+
rcl_interfaces::msg::SetParametersResult
72+
ParameterHandler::validateParameterUpdatesCallback(std::vector<rclcpp::Parameter> parameters)
73+
{
74+
rcl_interfaces::msg::SetParametersResult result;
75+
for (auto parameter : parameters) {
76+
const auto & type = parameter.get_type();
77+
const auto & name = parameter.get_name();
78+
{
79+
if (name.find(plugin_name_ + ".") != 0) {
80+
continue;
81+
}
82+
if (name == plugin_name_ + ".required_movement_angle" &&
83+
type == ParameterType::PARAMETER_DOUBLE &&
84+
(parameter.as_double() <= 0.0 || parameter.as_double() >= 2 * M_PI))
85+
{
86+
result.successful = false;
87+
result.reason = "The value required_movement_angle is incorrectly set, "
88+
"it should be 0 < required_movement_angle < 2PI. Ignoring parameter update.";
89+
return result;
90+
}
91+
}
92+
}
93+
result.successful = true;
94+
return result;
95+
}
96+
97+
} // namespace nav2_controller

nav2_controller/plugins/pose_progress_checker.cpp

Lines changed: 16 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -12,39 +12,44 @@
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_controller/plugins/parameter_handler_pose_progress_checker.hpp"
28+
#include "nav2_core/controller_exceptions.hpp"
2629

2730
using rcl_interfaces::msg::ParameterType;
2831
using std::placeholders::_1;
2932

3033
namespace nav2_controller
3134
{
32-
35+
using nav2_util::declare_parameter_if_not_declared;
36+
using rcl_interfaces::msg::ParameterType;
3337
void PoseProgressChecker::initialize(
3438
const rclcpp_lifecycle::LifecycleNode::WeakPtr & parent,
3539
const std::string & plugin_name)
3640
{
37-
plugin_name_ = plugin_name;
38-
SimpleProgressChecker::initialize(parent, plugin_name);
3941
auto node = parent.lock();
42+
if (!node) {
43+
throw nav2_core::ControllerException("Unable to lock node!");
44+
}
45+
node_ = parent;
4046

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);
4447

45-
// Add callback for dynamic parameters
46-
dyn_params_handler_ = node->add_on_set_parameters_callback(
47-
std::bind(&PoseProgressChecker::dynamicParametersCallback, this, _1));
48+
plugin_name_ = plugin_name;
49+
logger_ = node->get_logger();
50+
param_handler_ = std::make_unique<ParameterHandler>(node, plugin_name_, logger_);
51+
params_ = param_handler_->getParams();
52+
SimpleProgressChecker::initialize(parent, plugin_name);
4853
}
4954

5055
bool PoseProgressChecker::check(geometry_msgs::msg::PoseStamped & current_pose)
@@ -64,7 +69,7 @@ bool PoseProgressChecker::check(geometry_msgs::msg::PoseStamped & current_pose)
6469
bool PoseProgressChecker::isRobotMovedEnough(const geometry_msgs::msg::Pose2D & pose)
6570
{
6671
return pose_distance(pose, baseline_pose_) > radius_ ||
67-
poseAngleDistance(pose, baseline_pose_) > required_movement_angle_;
72+
poseAngleDistance(pose, baseline_pose_) > params_->required_movement_angle;
6873
}
6974

7075
double PoseProgressChecker::poseAngleDistance(
@@ -74,23 +79,6 @@ double PoseProgressChecker::poseAngleDistance(
7479
return abs(angles::shortest_angular_distance(pose1.theta, pose2.theta));
7580
}
7681

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-
}
9482

9583
} // namespace nav2_controller
9684

0 commit comments

Comments
 (0)