35 #include "dwb_plugins/xy_theta_iterator.hpp"
41 #include "nav_2d_utils/parameters.hpp"
42 #include "nav2_util/node_utils.hpp"
46 void XYThetaIterator::initialize(
47 const nav2_util::LifecycleNode::SharedPtr & nh,
48 KinematicsHandler::Ptr kinematics,
49 const std::string & plugin_name)
51 kinematics_handler_ = kinematics;
53 nav2_util::declare_parameter_if_not_declared(
55 plugin_name +
".vx_samples", rclcpp::ParameterValue(20));
56 nav2_util::declare_parameter_if_not_declared(
58 plugin_name +
".vy_samples", rclcpp::ParameterValue(5));
59 nav2_util::declare_parameter_if_not_declared(
61 plugin_name +
".vtheta_samples", rclcpp::ParameterValue(20));
63 nh->get_parameter(plugin_name +
".vx_samples", vx_samples_);
64 nh->get_parameter(plugin_name +
".vy_samples", vy_samples_);
65 nh->get_parameter(plugin_name +
".vtheta_samples", vtheta_samples_);
68 void XYThetaIterator::startNewIteration(
69 const nav_2d_msgs::msg::Twist2D & current_velocity,
72 KinematicParameters kinematics = kinematics_handler_->getKinematics();
73 x_it_ = std::make_shared<OneDVelocityIterator>(
75 kinematics.getMinX(), kinematics.getMaxX(),
76 kinematics.getAccX(), kinematics.getDecelX(),
78 y_it_ = std::make_shared<OneDVelocityIterator>(
80 kinematics.getMinY(), kinematics.getMaxY(),
81 kinematics.getAccY(), kinematics.getDecelY(),
83 th_it_ = std::make_shared<OneDVelocityIterator>(
84 current_velocity.theta,
85 kinematics.getMinTheta(), kinematics.getMaxTheta(),
86 kinematics.getAccTheta(), kinematics.getDecelTheta(),
88 if (!isValidVelocity()) {
89 iterateToValidVelocity();
93 bool XYThetaIterator::isValidVelocity()
95 return kinematics_handler_->getKinematics().isValidSpeed(
96 x_it_->getVelocity(), y_it_->getVelocity(), th_it_->getVelocity());
99 bool XYThetaIterator::hasMoreTwists()
101 return x_it_ && !x_it_->isFinished();
104 nav_2d_msgs::msg::Twist2D XYThetaIterator::nextTwist()
106 nav_2d_msgs::msg::Twist2D velocity;
107 velocity.x = x_it_->getVelocity();
108 velocity.y = y_it_->getVelocity();
109 velocity.theta = th_it_->getVelocity();
111 iterateToValidVelocity();
116 void XYThetaIterator::iterateToValidVelocity()
119 while (!valid && hasMoreTwists()) {
121 if (th_it_->isFinished()) {
124 if (y_it_->isFinished()) {
129 valid = isValidVelocity();