35 #include "dwb_plugins/xy_theta_iterator.hpp"
43 void XYThetaIterator::initialize(
44 const nav2::LifecycleNode::SharedPtr & nh,
45 KinematicsHandler::Ptr kinematics,
46 const std::string & plugin_name)
48 kinematics_handler_ = kinematics;
50 vx_samples_ = nh->declare_or_get_parameter(
51 plugin_name +
".vx_samples", 20);
52 vy_samples_ = nh->declare_or_get_parameter(
53 plugin_name +
".vy_samples", 5);
54 vtheta_samples_ = nh->declare_or_get_parameter(
55 plugin_name +
".vtheta_samples", 20);
58 void XYThetaIterator::startNewIteration(
59 const nav_2d_msgs::msg::Twist2D & current_velocity,
62 KinematicParameters kinematics = kinematics_handler_->getKinematics();
63 x_it_ = std::make_shared<OneDVelocityIterator>(
65 kinematics.getMinX(), kinematics.getMaxX(),
66 kinematics.getAccX(), kinematics.getDecelX(),
68 y_it_ = std::make_shared<OneDVelocityIterator>(
70 kinematics.getMinY(), kinematics.getMaxY(),
71 kinematics.getAccY(), kinematics.getDecelY(),
73 th_it_ = std::make_shared<OneDVelocityIterator>(
74 current_velocity.theta,
75 kinematics.getMinTheta(), kinematics.getMaxTheta(),
76 kinematics.getAccTheta(), kinematics.getDecelTheta(),
78 if (!isValidVelocity()) {
79 iterateToValidVelocity();
83 bool XYThetaIterator::isValidVelocity()
85 return kinematics_handler_->getKinematics().isValidSpeed(
86 x_it_->getVelocity(), y_it_->getVelocity(), th_it_->getVelocity());
89 bool XYThetaIterator::hasMoreTwists()
91 return x_it_ && !x_it_->isFinished();
94 nav_2d_msgs::msg::Twist2D XYThetaIterator::nextTwist()
96 nav_2d_msgs::msg::Twist2D velocity;
97 velocity.x = x_it_->getVelocity();
98 velocity.y = y_it_->getVelocity();
99 velocity.theta = th_it_->getVelocity();
101 iterateToValidVelocity();
106 void XYThetaIterator::iterateToValidVelocity()
109 while (!valid && hasMoreTwists()) {
111 if (th_it_->isFinished()) {
114 if (y_it_->isFinished()) {
119 valid = isValidVelocity();