diff --git a/homer_navigation/config/homer_navigation.yaml b/homer_navigation/config/homer_navigation.yaml index 24e17193ca3af68fce77a34c7eb405381f9e1a7f..ec0f632d83446bc00e37810277a909cb426c51ac 100644 --- a/homer_navigation/config/homer_navigation.yaml +++ b/homer_navigation/config/homer_navigation.yaml @@ -17,7 +17,7 @@ ### check path on map update /homer_navigation/check_path: true # toggles if the calculated path will be checked for obstacles while navigating -/homer_navigation/check_path_max_distance: 2 # m maximal distance from robot position in which the path is being checked for obstacles +/homer_navigation/check_path_max_distance: 3 # m maximal distance from robot position in which the path is being checked for obstacles ### speed parameters /homer_navigation/min_turn_angle: 0.1 # rad values lower than this angle will let the navigation assume reaching the designated position @@ -29,7 +29,7 @@ ### caution factors values near 0 mean high caution values greater values mean less caution ### if any factor equals 0 the robot can't follow paths !! /homer_navigation/map_speed_factor: 0.7 # factor for the max speed calculation of the obstacleDistancemap -/homer_navigation/waypoint_speed_factor: 10 # factor for the max speed calculation with the distance to the next Waypoint +/homer_navigation/waypoint_speed_factor: 2 # factor for the max speed calculation with the distance to the next Waypoint /homer_navigation/obstacle_speed_factor: 0.5 # factor for the max speed calculation with the last laser max movement distance /homer_navigation/target_distance_speed_factor: 0.4 # factor for the max speed calculation with the distance to target diff --git a/homer_navigation/src/homer_navigation_node.cpp b/homer_navigation/src/homer_navigation_node.cpp index 4f7d241f2807f0b6f8df1952158e04e84b680f21..69a7c88831ade4479411779f862a6892f04de5d9 100644 --- a/homer_navigation/src/homer_navigation_node.cpp +++ b/homer_navigation/src/homer_navigation_node.cpp @@ -417,20 +417,33 @@ bool HomerNavigationNode::obstacleOnPath() { for (auto const& scan : m_scan_map) { std::vector<geometry_msgs::Point> scan_points; scan_points = map_tools::laser_msg_to_points( - scan.second, m_transform_listener, "/map"); + scan.second, m_transform_listener, "/map"); - for (unsigned i = 0; i < m_pixel_path.size() - 1; i++) { + for (unsigned i = 1; i < m_pixel_path.size() - 1; i++) { + geometry_msgs::Point lp= + map_tools::fromMapCoords(m_pixel_path.at(i-1), m_map); geometry_msgs::Point p = map_tools::fromMapCoords(m_pixel_path.at(i), m_map); if (map_tools::distance(m_robot_pose.position, p) > - m_check_path_max_distance) { + m_check_path_max_distance * 2) { return false; } - for (auto const& sp : scan_points) { - if (map_tools::distance(sp, p) < - m_AllowedObstacleDistance.first) { - ROS_INFO_STREAM("Found obstacle"); - return true; + for(int k = 0; k < 4; k++) + { + geometry_msgs::Point t; + t.x =lp.x + (p.x - lp.x) * k/ 4.0; + t.y =lp.y + (p.y - lp.y) * k/ 4.0; + for(const auto &sp: scan_points) + { + + if (map_tools::distance(sp, t) < + m_AllowedObstacleDistance.first - m_map->info.resolution) { + if(map_tools::distance(m_robot_pose.position, sp)< m_check_path_max_distance) + { + ROS_INFO_STREAM("Found obstacle"); + return true; + } + } } } } @@ -593,12 +606,19 @@ void HomerNavigationNode::performNextMove() { m_obstacle_speed_factor; float max_map_distance_speed = m_max_move_speed * obstacleMapDistance * m_map_speed_factor; + + float max_waypoint_speed = 1; + if(m_waypoints.size() > 1) + { + float angleToNextWaypoint = angleToPointDeg(m_waypoints[1].pose.position); + max_waypoint_speed = (1 - (angleToNextWaypoint / 180.0)) * distanceToWaypoint * m_waypoint_speed_factor; + } + m_act_speed = std::min( {std::max((float)0.1, m_distance_to_target * m_target_distance_speed_factor), m_max_move_speed, max_move_distance_speed, - max_map_distance_speed, - distanceToWaypoint * m_waypoint_speed_factor}); + max_map_distance_speed, max_waypoint_speed}); std_msgs::String tmp; std::stringstream str; str << "m_obstacle_speed " << max_move_distance_speed