80 const geometry_msgs::msg::PoseStamped & start,
const geometry_msgs::msg::PoseStamped & goal,
81 std::function<
bool()> )
83 RCLCPP_INFO(
nh_->get_logger(),
"[Forward Global Planner] planning");
87 RCLCPP_INFO(
nh_->get_logger(),
"[Forward Global Planner] getting start and goal poses");
89 geometry_msgs::msg::PoseStamped transformedStart;
90 nav_2d_utils::transformPose(
tf_,
costmap_ros_->getGlobalFrameID(), start, transformedStart, ttol);
91 transformedStart.header.frame_id =
costmap_ros_->getGlobalFrameID();
93 geometry_msgs::msg::PoseStamped transformedGoal;
94 nav_2d_utils::transformPose(
tf_,
costmap_ros_->getGlobalFrameID(), goal, transformedGoal, ttol);
95 transformedGoal.header.frame_id =
costmap_ros_->getGlobalFrameID();
98 RCLCPP_INFO(
nh_->get_logger(),
"[Forward Global Planner] creating plan vector");
99 nav_msgs::msg::Path planMsg;
100 std::vector<geometry_msgs::msg::PoseStamped> plan;
107 double dx = transformedGoal.pose.position.x - transformedStart.pose.position.x;
108 double dy = transformedGoal.pose.position.y - transformedStart.pose.position.y;
110 double length = sqrt(dx * dx + dy * dy);
112 geometry_msgs::msg::PoseStamped prevState;
116 RCLCPP_INFO(
nh_->get_logger(),
"1 - heading to goal position pure spinning");
117 double heading_direction = atan2(dy, dx);
127 prevState = transformedStart;
130 RCLCPP_INFO(
nh_->get_logger(),
"3 - heading to goal orientation");
131 double goalOrientation = angles::normalize_angle(tf2::getYaw(transformedGoal.pose.orientation));
133 planMsg.poses = plan;
134 planMsg.header.stamp = this->
nh_->now();
135 planMsg.header.frame_id = this->
costmap_ros_->getGlobalFrameID();
138 nh_->get_logger(),
"[Forward Global Planner] generated plan size: " << plan.size());
141 bool acceptedGlobalPlan =
true;
144 nh_->get_logger(),
"[Forward Global Planner] checking obstacles in the generated plan");
145 nav2_costmap_2d::Costmap2D * costmap2d = this->
costmap_ros_->getCostmap();
146 for (
auto & p : plan)
149 costmap2d->worldToMap(p.pose.position.x, p.pose.position.y, mx, my);
150 auto cost = costmap2d->getCost(mx, my);
157 if (cost >= nav2_costmap_2d::INSCRIBED_INFLATED_OBSTACLE)
160 nh_->get_logger(),
"[Forward Global Planner] pose " << p.pose.position.x <<
", "
162 <<
" rejected, cost: " << cost);
163 acceptedGlobalPlan =
false;
168 if (acceptedGlobalPlan)
171 nh_->get_logger(),
"[Forward Global Planner] accepted plan: " << plan.size());
177 RCLCPP_INFO(
nh_->get_logger(),
"[Forward Global Planner] plan rejected");
178 planMsg.poses.clear();
geometry_msgs::msg::PoseStamped makePureStraightSubPlan(const geometry_msgs::msg::PoseStamped &startOrientedPose, const geometry_msgs::msg::Point &goal, double length, std::vector< geometry_msgs::msg::PoseStamped > &plan)