143 const Eigen::Vector3f & pos,
const Eigen::Vector3f & vel,
float maxdist,
float maxanglediff,
144 float maxtime,
float dt, std::vector<Eigen::Vector3f> & outtraj)
149 Eigen::Vector3f currentpos = pos;
160 auto dx = newpos[0] - currentpos[0];
161 auto dy = newpos[1] - currentpos[1];
162 float dist, angledist;
165 dist = sqrt(dx * dx + dy * dy);
174 angledist = fabs(angles::shortest_angular_distance(currentpos[2], newpos[2]));
175 if (angledist > maxanglediff)
182 outtraj.push_back(newpos);
221 visualization_msgs::msg::Marker marker;
223 marker.header.frame_id =
costmapRos_->getGlobalFrameID();
224 marker.header.stamp =
nh_->now();
225 marker.ns =
"my_namespace2";
227 marker.type = visualization_msgs::msg::Marker::ARROW;
228 marker.action = visualization_msgs::msg::Marker::ADD;
229 marker.pose.orientation.w = 1;
230 marker.lifetime = rclcpp::Duration(1.0s);
232 marker.scale.x = 0.1;
233 marker.scale.y = 0.3;
234 marker.scale.z = 0.1;
235 marker.color.a = 1.0;
238 marker.color.b = 1.0;
240 geometry_msgs::msg::Point start, end;
244 end.x = x + 0.5 * cos(phi);
245 end.y = y + 0.5 * sin(phi);
247 marker.points.push_back(start);
248 marker.points.push_back(end);
250 visualization_msgs::msg::MarkerArray ma;
251 ma.markers.push_back(marker);
274 rclcpp::Node::SharedPtr nh_, geometry_msgs::msg::Twist & cmd_vel,
double max_linear_x_speed_,
275 double max_angular_z_speed_)
277 if (max_angular_z_speed_ == 0 || max_linear_x_speed_ == 0)
return;
279 if (cmd_vel.angular.z == 0)
281 cmd_vel.linear.x = max_linear_x_speed_;
285 double kurvature = cmd_vel.linear.x / cmd_vel.angular.z;
287 double linearAuthority = fabs(cmd_vel.linear.x / max_linear_x_speed_);
288 double angularAuthority = fabs(cmd_vel.angular.z / max_angular_z_speed_);
289 if (linearAuthority < angularAuthority)
292 cmd_vel.linear.x = max_linear_x_speed_;
293 cmd_vel.angular.z = kurvature / max_linear_x_speed_;
295 nh_->get_logger(),
"k=" << kurvature <<
"lets go to maximum linear capacity: " << cmd_vel);
300 cmd_vel.angular.x = max_angular_z_speed_;
301 cmd_vel.linear.x = kurvature * max_angular_z_speed_;
302 RCLCPP_WARN_STREAM(nh_->get_logger(),
"lets go to maximum angular capacity: " << cmd_vel);
314 const geometry_msgs::msg::PoseStamped & currentPose,
315 const geometry_msgs::msg::Twist & , nav2_core::GoalChecker * goal_checker)
319 if (this->
plan_.size() > 0)
322 nh_->get_logger(),
"[ForwardLocalPlanner] Current pose frame id: "
323 <<
plan_.front().header.frame_id
324 <<
", path pose frame id: " << currentPose.header.frame_id);
326 if (
plan_.front().header.frame_id != currentPose.header.frame_id)
328 RCLCPP_ERROR_STREAM(
nh_->get_logger(),
"[ForwardLocalPlanner] Inconsistent frames");
336 geometry_msgs::msg::Pose posetol;
337 geometry_msgs::msg::Twist twistol;
338 if (goal_checker->getTolerances(posetol, twistol))
346 <<
", yaw_goal_tolerance_: "
352 nh_->get_logger(),
"[ForwardLocalPlanner] could not get tolerances from goal checker");
356 geometry_msgs::msg::TwistStamped cmd_vel;
359 nh_->get_logger(),
"[ForwardLocalPlanner] ----- COMPUTE VELOCITY COMMAND LOCAL PLANNER ---");
368 const geometry_msgs::msg::Point & p = pose.pose.position;
370 tf2::fromMsg(pose.pose.orientation, q);
373 double dx = p.x - currentPose.pose.position.x;
374 double dy = p.y - currentPose.pose.position.y;
375 double dist = sqrt(dx * dx + dy * dy);
377 double pangle = tf2::getYaw(q);
378 double angle = tf2::getYaw(currentPose.pose.orientation);
379 double angular_error = angles::shortest_angular_distance(pangle, angle);
387 "current index: %d, carrot goal percentaje: %lf, dist: %lf, maxdist: %lf, angle_error: "
399 nh_->get_logger(),
"[ForwardLocalPlanner] selected carrot pose index "
405 cmd_vel.twist.linear.x = 0;
406 cmd_vel.twist.angular.z = 0;
415 const geometry_msgs::msg::PoseStamped & finalgoalpose =
plan_.back();
417 const geometry_msgs::msg::Point & goalposition = carrot_goalpose.pose.position;
419 tf2::Quaternion carrotGoalQ;
420 tf2::fromMsg(carrot_goalpose.pose.orientation, carrotGoalQ);
424 double betta = tf2::getYaw(carrot_goalpose.pose.orientation) +
betta_offset_;
425 double dx = goalposition.x - currentPose.pose.position.x;
426 double dy = goalposition.y - currentPose.pose.position.y;
429 double rho_error = sqrt(dx * dx + dy * dy);
431 tf2::Quaternion currentOrientation;
432 tf2::convert(currentPose.pose.orientation, currentOrientation);
435 double theta = tf2::getYaw(currentOrientation);
436 double alpha = atan2(dy, dx);
439 double alpha_error = angles::shortest_angular_distance(alpha, theta);
440 double betta_error = angles::shortest_angular_distance(betta, theta);
450 vetta =
k_rho_ * rho_error;
460 RCLCPP_DEBUG(
nh_->get_logger(),
"GOAL REACHED");
486 cmd_vel.twist.linear.x = vetta;
487 cmd_vel.twist.angular.z = gamma;
492 nh_->get_logger(),
"Forward local planner,"
494 <<
" theta: " << theta << std::endl
495 <<
" betta: " << betta << std::endl
496 <<
" err_x: " << dx << std::endl
497 <<
" err_y:" << dy << std::endl
498 <<
" rho_error:" << rho_error << std::endl
499 <<
" alpha_error:" << alpha_error << std::endl
500 <<
" betta_error:" << betta_error << std::endl
501 <<
" vetta:" << vetta << std::endl
502 <<
" gamma:" << gamma << std::endl
508 assert(currentPose.header.frame_id ==
"odom" || currentPose.header.frame_id ==
"map");
509 auto global_pose = currentPose;
512 auto yaw = tf2::getYaw(global_pose.pose.orientation);
514 auto & pos = global_pose.pose.position;
516 Eigen::Vector3f currentpose(pos.x, pos.y, yaw);
517 Eigen::Vector3f currentvel(
518 cmd_vel.twist.linear.x, cmd_vel.twist.linear.y, cmd_vel.twist.angular.z);
520 std::vector<Eigen::Vector3f> trajectory;
522 currentpose, currentvel, 0.8 , M_PI / 8 , 3.0 , 0.05 ,
526 bool aceptedplan =
true;
532 for (
auto & p : trajectory)
534 float dx = p[0] - finalgoalpose.pose.position.x;
535 float dy = p[1] - finalgoalpose.pose.position.y;
537 float dst = sqrt(dx * dx + dy * dy);
544 costmap2d->worldToMap(p[0], p[1], mx, my);
554 if (costmap2d->getCost(mx, my) >= nav2_costmap_2d::INSCRIBED_INFLATED_OBSTACLE)
563 bool success =
false;
568 RCLCPP_DEBUG(
nh_->get_logger(),
"simulated trajectory is accepted.");
572 RCLCPP_DEBUG(
nh_->get_logger(),
"simulated trajectory is not accepted. Stop command.");
575 cmd_vel.twist.linear.x = 0;
576 cmd_vel.twist.angular.z = 0;
580 RCLCPP_DEBUG(
nh_->get_logger(),
"Start waiting obstacle disappear");
588 nh_->get_logger(),
"waiting obstacle disappear, elapsed: %lf seconds",
589 waitingduration.seconds());
594 nh_->get_logger(),
"TIMEOUT waiting obstacle disappear, elapsed: %lf seconds",
595 waitingduration.seconds());
605 "[ForwardLocalPlanner] object detected waiting stopped until it disappears.");
608 cmd_vel.header.stamp =
nh_->now();