35 #include "dwb_plugins/xy_theta_iterator.hpp"
41 #include "nav_2d_utils/parameters.hpp"
42 #include "nav2_util/node_utils.hpp"
48 void XYThetaIterator::initialize(
49 const nav2_util::LifecycleNode::SharedPtr & nh,
50 KinematicsHandler::Ptr kinematics,
51 const std::string & plugin_name)
53 kinematics_handler_ = kinematics;
55 nav2_util::declare_parameter_if_not_declared(
57 plugin_name +
".vx_samples", rclcpp::ParameterValue(20));
58 nav2_util::declare_parameter_if_not_declared(
60 plugin_name +
".vy_samples", rclcpp::ParameterValue(5));
61 nav2_util::declare_parameter_if_not_declared(
63 plugin_name +
".vtheta_samples", rclcpp::ParameterValue(20));
65 nh->get_parameter(plugin_name +
".vx_samples", vx_samples_);
66 nh->get_parameter(plugin_name +
".vy_samples", vy_samples_);
67 nh->get_parameter(plugin_name +
".vtheta_samples", vtheta_samples_);
70 void XYThetaIterator::startNewIteration(
71 const nav_2d_msgs::msg::Twist2D & current_velocity,
74 KinematicParameters kinematics = kinematics_handler_->getKinematics();
75 x_it_ = std::make_shared<OneDVelocityIterator>(
77 kinematics.getMinX(), kinematics.getMaxX(),
78 kinematics.getAccX(), kinematics.getDecelX(),
80 y_it_ = std::make_shared<OneDVelocityIterator>(
82 kinematics.getMinY(), kinematics.getMaxY(),
83 kinematics.getAccY(), kinematics.getDecelY(),
85 th_it_ = std::make_shared<OneDVelocityIterator>(
86 current_velocity.theta,
87 kinematics.getMinTheta(), kinematics.getMaxTheta(),
88 kinematics.getAccTheta(), kinematics.getDecelTheta(),
90 if (!isValidVelocity()) {
91 iterateToValidVelocity();
98 double vmag_sq = x * x + y * y;
99 if (kinematics.getMaxSpeedXY() >= 0.0 && vmag_sq > kinematics.getMaxSpeedXY_SQ() + EPSILON) {
102 if (kinematics.getMinSpeedXY() >= 0.0 && vmag_sq + EPSILON < kinematics.getMinSpeedXY_SQ() &&
103 kinematics.getMinSpeedTheta() >= 0.0 && fabs(theta) + EPSILON < kinematics.getMinSpeedTheta())
107 if (vmag_sq == 0.0 && th_it_->getVelocity() == 0.0) {
113 bool XYThetaIterator::isValidVelocity()
116 x_it_->getVelocity(), y_it_->getVelocity(),
117 th_it_->getVelocity());
120 bool XYThetaIterator::hasMoreTwists()
122 return x_it_ && !x_it_->isFinished();
125 nav_2d_msgs::msg::Twist2D XYThetaIterator::nextTwist()
127 nav_2d_msgs::msg::Twist2D velocity;
128 velocity.x = x_it_->getVelocity();
129 velocity.y = y_it_->getVelocity();
130 velocity.theta = th_it_->getVelocity();
132 iterateToValidVelocity();
137 void XYThetaIterator::iterateToValidVelocity()
140 while (!valid && hasMoreTwists()) {
142 if (th_it_->isFinished()) {
145 if (y_it_->isFinished()) {
150 valid = isValidVelocity();
bool isValidSpeed(double x, double y, double theta)
Check to see whether the combined x/y/theta velocities are valid.
A struct containing one representation of the robot's kinematics.