35 #include "dwb_plugins/xy_theta_iterator.hpp"
41 #include "nav2_ros_common/node_utils.hpp"
45 void XYThetaIterator::initialize(
46 const nav2::LifecycleNode::SharedPtr & nh,
47 KinematicsHandler::Ptr kinematics,
48 const std::string & plugin_name)
50 kinematics_handler_ = kinematics;
52 nav2::declare_parameter_if_not_declared(
54 plugin_name +
".vx_samples", rclcpp::ParameterValue(20));
55 nav2::declare_parameter_if_not_declared(
57 plugin_name +
".vy_samples", rclcpp::ParameterValue(5));
58 nav2::declare_parameter_if_not_declared(
60 plugin_name +
".vtheta_samples", rclcpp::ParameterValue(20));
62 nh->get_parameter(plugin_name +
".vx_samples", vx_samples_);
63 nh->get_parameter(plugin_name +
".vy_samples", vy_samples_);
64 nh->get_parameter(plugin_name +
".vtheta_samples", vtheta_samples_);
67 void XYThetaIterator::startNewIteration(
68 const nav_2d_msgs::msg::Twist2D & current_velocity,
71 KinematicParameters kinematics = kinematics_handler_->getKinematics();
72 x_it_ = std::make_shared<OneDVelocityIterator>(
74 kinematics.getMinX(), kinematics.getMaxX(),
75 kinematics.getAccX(), kinematics.getDecelX(),
77 y_it_ = std::make_shared<OneDVelocityIterator>(
79 kinematics.getMinY(), kinematics.getMaxY(),
80 kinematics.getAccY(), kinematics.getDecelY(),
82 th_it_ = std::make_shared<OneDVelocityIterator>(
83 current_velocity.theta,
84 kinematics.getMinTheta(), kinematics.getMaxTheta(),
85 kinematics.getAccTheta(), kinematics.getDecelTheta(),
87 if (!isValidVelocity()) {
88 iterateToValidVelocity();
92 bool XYThetaIterator::isValidVelocity()
94 return kinematics_handler_->getKinematics().isValidSpeed(
95 x_it_->getVelocity(), y_it_->getVelocity(), th_it_->getVelocity());
98 bool XYThetaIterator::hasMoreTwists()
100 return x_it_ && !x_it_->isFinished();
103 nav_2d_msgs::msg::Twist2D XYThetaIterator::nextTwist()
105 nav_2d_msgs::msg::Twist2D velocity;
106 velocity.x = x_it_->getVelocity();
107 velocity.y = y_it_->getVelocity();
108 velocity.theta = th_it_->getVelocity();
110 iterateToValidVelocity();
115 void XYThetaIterator::iterateToValidVelocity()
118 while (!valid && hasMoreTwists()) {
120 if (th_it_->isFinished()) {
123 if (y_it_->isFinished()) {
128 valid = isValidVelocity();