diff --git a/src/ackermann_planner_ros.cpp b/src/ackermann_planner_ros.cpp index 8ebd7d5d4822f17d29acd6d1cee80c7cf42941c9..5bb412f241d18e3553d9032fd0df90a71ee7e5b2 100644 --- a/src/ackermann_planner_ros.cpp +++ b/src/ackermann_planner_ros.cpp @@ -273,7 +273,17 @@ bool AckermannPlannerROS::isGoalReached(void) else if(this->stuck) return true; else - return false; + { + double yaw=tf::getYaw(current_pose_.pose.orientation); + if(yaw<0.0) + yaw+=3.14159*2.0; + if(forward && ((transformed_plan.back().pose.position.x-current_pose_.pose.position.x)*cos(yaw)+(transformed_plan.back().pose.position.y-current_pose_.pose.position.y)*sin(yaw))<0.0) + return true; + else if(!forward && ((transformed_plan.back().pose.position.x-current_pose_.pose.position.x)*cos(yaw)+(transformed_plan.back().pose.position.y-current_pose_.pose.position.y)*sin(yaw))>0.0) + return true; + else + return false; + } } else return false; @@ -314,7 +324,7 @@ bool AckermannPlannerROS::computeVelocityCommands(geometry_msgs::Twist& cmd_vel) static int stuck_count=0; static int replan_count=0; static bool new_segment=false; - bool forward; + bool forward,goal_passed,goal_reached; // dispatches to either ackermann sampling control or stop and rotate control, depending on whether we have been close enough to goal if ( ! costmap_ros_->getRobotPose(current_pose_)) @@ -361,15 +371,28 @@ bool AckermannPlannerROS::computeVelocityCommands(geometry_msgs::Twist& cmd_vel) // update plan in ackermann_planner even if we just stop and rotate, to allow checkTrajectory dp_->update_plan_and_local_costs(current_pose_, transformed_plan,forward); + double yaw=tf::getYaw(current_pose_.pose.orientation); + if(yaw<0.0) + yaw+=3.14159*2.0; + if(forward && ((transformed_plan.back().pose.position.x-current_pose_.pose.position.x)*cos(yaw)+(transformed_plan.back().pose.position.y-current_pose_.pose.position.y)*sin(yaw))<0.0) + goal_passed=true; + else if(!forward && ((transformed_plan.back().pose.position.x-current_pose_.pose.position.x)*cos(yaw)+(transformed_plan.back().pose.position.y-current_pose_.pose.position.y)*sin(yaw))>0.0) + goal_passed=true; + else + goal_passed=false; odom_helper_.get_odom(odom); - if(this->stuck || base_local_planner::isGoalReached(*tf_, - transformed_plan, - *costmap_ros_->getCostmap(), - costmap_ros_->getGlobalFrameID(), - current_pose_, - odom, - current_config_.rot_stopped_vel,current_config_.trans_stopped_vel, - current_config_.xy_goal_tolerance,current_config_.yaw_goal_tolerance)) + if(base_local_planner::isGoalReached(*tf_, + transformed_plan, + *costmap_ros_->getCostmap(), + costmap_ros_->getGlobalFrameID(), + current_pose_, + odom, + current_config_.rot_stopped_vel,current_config_.trans_stopped_vel, + current_config_.xy_goal_tolerance,current_config_.yaw_goal_tolerance)) + goal_reached=true; + else + goal_reached=false; + if(this->stuck || goal_reached || goal_passed) { if(planner_util_.set_next_path()) {