diff --git a/homer_mapnav_msgs/msg/NavigateToPOI.msg b/homer_mapnav_msgs/msg/NavigateToPOI.msg index 342f1d1fd3d0aaaa3af0e24c1b911b31934c6f57..485fdc841ae996d0f3cadeb3213eaed6aeeb7ec9 100644 --- a/homer_mapnav_msgs/msg/NavigateToPOI.msg +++ b/homer_mapnav_msgs/msg/NavigateToPOI.msg @@ -1,3 +1,4 @@ string poi_name float32 distance_to_target bool skip_final_turn +bool stop_before_obstacle diff --git a/homer_navigation/include/homer_navigation/homer_navigation_node.h b/homer_navigation/include/homer_navigation/homer_navigation_node.h index 8239a574a406e14cde7a6b30272cfbbe3f86268c..53447adf4a13e21d6e02a60cf679be2166916e6d 100644 --- a/homer_navigation/include/homer_navigation/homer_navigation_node.h +++ b/homer_navigation/include/homer_navigation/homer_navigation_node.h @@ -273,7 +273,7 @@ class HomerNavigationNode { /** do not replan if lisa avoids an obstacle, instead send target * unreachable*/ - bool m_no_replanning_on_collision; + bool m_stop_before_obstacle; bool m_avoided_collision; diff --git a/homer_navigation/src/homer_navigation_node.cpp b/homer_navigation/src/homer_navigation_node.cpp index e56dca631c484a434ca3d2172571b2fa36840dc8..d99b8ee16a86a156da2cfdc9998e9eef04004086 100644 --- a/homer_navigation/src/homer_navigation_node.cpp +++ b/homer_navigation/src/homer_navigation_node.cpp @@ -97,8 +97,6 @@ void HomerNavigationNode::loadParameters() { m_collision_distance_near_target, (float)0.2); ros::param::param("/homer_navigation/backward_collision_distance", m_backward_collision_distance, (float)0.5); - ros::param::param("/homer_navigation/no_replanning_on_collision", - m_no_replanning_on_collision, (bool)false); // cmd_vel config values ros::param::param("/homer_navigation/min_turn_angle", m_min_turn_angle, @@ -224,9 +222,6 @@ void HomerNavigationNode::calculatePath() { if (m_last_calculations_failed > 8) { sendTargetUnreachableMsg( homer_mapnav_msgs::TargetUnreachable::NO_PATH_FOUND); - if (m_initial_path_reaches_target) { - // TODO(mroosen) temp obstacle in path - } } } else { m_last_calculations_failed = 0; @@ -268,13 +263,6 @@ void HomerNavigationNode::startNavigation() { targetPositionReached(); return; } - if (m_initial_path_reaches_target && m_no_replanning_on_collision) { - ROS_INFO_STREAM( - "Collision avoided and option no_replanning_on_collision is set."); - ROS_INFO_STREAM("Sending target unreachable."); - sendTargetUnreachableMsg( - homer_mapnav_msgs::TargetUnreachable::LASER_OBSTACLE); - } ROS_INFO_STREAM("Distance to target still too large (" << m_distance_to_target << "m; requested: " << m_desired_distance << "m)"); @@ -285,6 +273,25 @@ void HomerNavigationNode::startNavigation() { m_explorer->setOccupancyMap(m_width, m_width, m_origin, &(*m_last_map_data)[0]); + + // check if there still exists a path to the original target + if (m_avoided_collision && m_initial_path_reaches_target && + m_stop_before_obstacle) { + m_explorer->setStart( + map_tools::toMapCoords(m_robot_pose.position, m_origin, m_resolution)); + + bool success; + m_pixel_path = m_explorer->getPath(success); + if (!success) { + ROS_INFO_STREAM( + "Initial path would have reached target, new path does not. " + << "Sending target unreachable."); + sendTargetUnreachableMsg( + homer_mapnav_msgs::TargetUnreachable::LASER_OBSTACLE); + return; + } + } + m_explorer->setStart( map_tools::toMapCoords(m_robot_pose.position, m_origin, m_resolution)); Eigen::Vector2i new_target_approx = m_explorer->getNearestAccessibleTarget( @@ -966,6 +973,7 @@ void HomerNavigationNode::downlaserDataCallback( void HomerNavigationNode::startNavigationCallback( const homer_mapnav_msgs::StartNavigation::ConstPtr& msg) { + ROS_INFO_STREAM("This is MY node."); m_avoided_collision = false; m_target_point = msg->goal.position; m_target_orientation = tf::getYaw(msg->goal.orientation); @@ -1062,6 +1070,7 @@ void HomerNavigationNode::navigateToPOICallback( m_fast_path_planning = false; m_new_target = true; m_target_name = msg->poi_name; + m_stop_before_obstacle = msg->stop_before_obstacle; ROS_INFO_STREAM("Navigating to target " << m_target_point.x << ", " << m_target_point.y