본문 바로가기

ROS

[ROS] Move Base (4) Global Planner 개념

  • 아래 사이트를 참고해서 포스팅 하였다.

http://wiki.ros.org/global_planner

 

global_planner - ROS Wiki

kinetic melodic noetic   Show EOL distros:  EOL distros:   hydro indigo jade lunar hydro: Documentation generated on August 27, 2015 at 02:07 PM (doc job).indigo: Documentation generated on March 03, 2019 at 11:32 AM (doc job).jade: Documentation gene

wiki.ros.org

Global Planner

  • 책임
    • global costmap을 확인하고, goal까지의 path를 만들어 낸다.

여기서, 전체 맵을 하나의 graph로 간주하고, 목적지 까지의 경로를 graph탐색으로 찾아내는 방법을 많이 사용한다.

move base에서는 carrot_planner와 navfnm global_planner란 plugin이 있으며 다음과 같다.

carrot_planner

목적지까지의 vector를 만든 다음에 로봇이 진행할 수 있는 곳까지 만 vector를 따라 이동한다.

global_planner

navfn은 global_planner에서 dijkstar를 사용한 version이므로 함께 설명한다.

global_planner는 기본적으로 graph search를 dijkstart를 사용하며, 선택적으로 A*를 사용할 수 있으며 그에 대한 차이점은 아래 그림과 같다.

  • Dijkstar 사용시

  • A* 사용시

planning에 있어 다음과 같은여러 옵션들이 존재한다.

  • parameters
    • allow_unknown
      • map 상에서 unknown(회색을 표현되는 부분)을 가는걸 허용
    • use_dijkstar
      • true로 설정하면 dijkstar를 사용하고, 아니면 A*를 사용한다.
    • use_quadratic
      • potential을 계산하는 방식이 바뀐다.
      • documentation에선 Slightly different calculation for the potential. Note that the original potential calculation from navfn  is a quadratic approximation. Of what, the maintainer of this package has no idea. 이라고 소개되어 있다.
    • use_grid_path
      • true로 설정되면 path가 grid로 만들어지게 된다.
    • old_navfn_behavior
      • true로 설정시 navfn이 plan한 것 과 동일한 path가 나온다.
    • cost_factor
      • cost에 계산되는 인자이다.
      • costmap의 value에 cost factor를 곱해서 사용한다.
    • neutral_cost
      • cost에 기본적으로 offset을 주는 값이다.
      **** global_planner의 cost 계산법 : cost_neutral + cost_factor * costmap_value
    • lethal_cost
      • 로봇이 움직일 수 없다고 판단하는 Cost이다.
      • 너무 작으면 path를 생성할 수 없다.
    • default_tolerance
      • path를 생성할 때 목적지에 대한 tolerance이다.
      • 0.0이 default이며, 이상적으로 생각도 맞다.
    • visualize_potential
      • potential을 나타내기 위한것이다.
    • planner_window_x ,planner_window_x
      • 아무 역할 하지 않는다.

Base Global Planner

move base에서는 nav_core package안에 global planner plugin에 대한 base class인 base global planner의 인터페이스가 명시돼 있으며 다음과 같다.

class BaseGlobalPlanner{
    public:
      virtual bool makePlan(const geometry_msgs::PoseStamped& start, 
          const geometry_msgs::PoseStamped& goal, std::vector<geometry_msgs::PoseStamped>& plan) = 0;
      virtual bool makePlan(const geometry_msgs::PoseStamped& start, 
                            const geometry_msgs::PoseStamped& goal, std::vector<geometry_msgs::PoseStamped>& plan,
                            double& cost)
      {
        cost = 0;
        return makePlan(start, goal, plan);
      }
      virtual void initialize(std::string name, costmap_2d::Costmap2DROS* costmap_ros) = 0;
      virtual ~BaseGlobalPlanner(){}
    protected:
      BaseGlobalPlanner(){}
  };
  • makePlan()
    • start point와 goal point가 주어졌을 때, path를 vector array로 반환하는 함수를 제공해야 한다.
  • initialize
    • costmap과 name이 주어졌을 때, global planner가 작동하기 위해 initialize를 할 수 있게 함수를 제공해야 한다.