Study/[ROS] Navigation

ROS Navigation(4. Path Planning 1)

soohwan_justin 2021. 1. 10. 23:27

이 포스트는 theconstructsim.com의 ROS Navigation in 5 Days 를 참고하였습니다.

이번 포스트에서 다룰 내용은

  • RViz에서 경로 계획(Path Planning)의 시각화
  • move_base node의 기본적인 개념
  • 전역 경로 계획(Global Path Planning)이란?
  • Global Costmap이란?

이번 course에서는 turtlebot simulation package를 사용합니다. 아래 링크를 참조하세요

emanual.robotis.com/docs/en/platform/turtlebot3/simulation/

시뮬레이션 모델은 Waffle 모델을 사용합니다.

waffle 모델을 사용하기 위해서는 환경 변수를 추가하거나, bash shell에 해당 명령을 입력하면 됩니다.

 

$ export TURTLEBOT3_MODEL=waffle

 

또는, ~/.bashrc 를 수정하여 맨 밑에 export TURTLEBOT3_MODEL=waffle 를 추가합니다.

 

여기서 말하는 내비게이션이란, 우리가 일반적으로 차를 운전하면서 사용하는 내비게이션처럼 단순히 길만 찾는것이 아닌, 해당 경로를 따라 주행까지 하는 것을 말합니다.

 

 

 

이제 우리는 로봇을 자세(pose) A 부터 pose B로 움직일 준비가 되었습니다. 이제는 ROS에서의 Path Planning 프로세스와 여기서 발생하는 모든 요소들을 알아볼 것입니다. 

RViz를 이용한 Path Planning의 시각화

우리는 RViz를 사용하여 Path Planning 프로세스를 시각화 할 수 있습니다. 이를 위해서 RViz에는 3가지 요소가 있습니다.

  • Map Display (Costmaps)
  • Path Displays (Plans)
  • 2D Tools

 

 


연습 4.1

 

다음 명령으로 시뮬레이션 node와 Navigation node를 실행하세요. 지난 포스트에서 만들었던 패키지를 사용합니다.

 

$ roslaunch turtlebot3_gazebo turtlebot3_house.launch

$ roslaunch my_amcl_launcher change_map.launch

 

자동으로 띄워지는 RViz창은 무시하고, 새로 RViz설정을 하겠습니다. rviz를 새로 실행합니다.

 

$ rviz

 

필요한 플러그인들을 추가해줍니다.

 

  • RobotModel 
  • PoseArray >> /particlecloud topic 설정
  • LaserScan >> /scan topic 설정
  • Map >> /map topic 설정
  • Map >> /move_base/global_costmap/costmap topic 설정
  • Map >> /move_base/local_costmap/costmap topic 설정
  • Path >> /move_base/NavfnROS/plan topic 설정
  • Path >> /move_base/DWAPlannerROS/locan_plan 설정

 

위와 같이 설정하면, 다음과 같은 결과를 볼 수 있습니다.

그 후, 다음에도 해당 설정을 불러오기 위해 File-Save Config를 클릭하여 ~/catkin_ws/src/my_amcl_launch/rviz 디렉토리에 저장합니다.

 

참고로, Path 플러그인을 추가한 후, 시각화 했을 때 구별하기 쉽도록 색을 바꿔주세요. Rename을 클릭하면 이름도 바꿀 수 있습니다. 

 

 

아래와 같이 change_map.launch 파일을 수정하면, 다음부터 이 설정을 불러오게 됩니다.

 

설정이 끝났으면, 2D Navi Goal을 클릭하여 원하는 목표지점으로 로봇을 보내보세요.

 

 

파란 선은 global path, 노란 선은 local path입니다.

 

연습 4.1 끝


The move_base package

move_base package는 move_base node를 포함합니다.  move_base node는 Navigation 프로세스에서 발생하는 모든 요소들을 이어주기 때문에 ROS Navigation Stack에서 매우 중요한 요소 중 하나입니다.

 

move_base node의 가장 중요한 기능은 로봇을 현재의 위치에서 목표 위치로 움직이도록 하는 것입니다. 기본적으로, 이 node는 geometry_msgs/PoseStamped 메시지 타입의 goal pose를 사용하는 SimpleActionServer입니다. 그러므로, 우리는 SimpleActionClient를 사용하여 해당 node로 목표지점들을 보냅니다. 이 Action Server는 Navigation Stack의 입력으로써 move_base/goal topic을 사용하며, 이 topic은 목표 자세를 제공하기 위해 사용됩니다.

 


연습 4.2

 

연습 4.1과 같이 내비게이션의 목표를 지정해보고, move_base/goal topic을 확인해보세요

 

 

연습 4.2. 끝


즉, 우리가 2D Nav Goal tool을 사용할 때마다, move_base/goal topic으로 새로운 메시지가 publish됩니다.

move_base Action Server에서 사용하는 topic 종류는 다음과 같습니다.

  • move_base/goal (move_base_msgs/MoveBaseActionGoal)
  • move_base/cancel (actionlib_msgs/GoalID)
  • move_base/feedback (move_base_msgs/MoveBaseActionFeedback)
  • move_base/status (actionlib_msgs/GoalStatusArray)
  • move_base/result (move_base_msgs/MoveBaseActionResult)

 


연습 4.3.

 

로봇의 내비게이션이 실행되는 동안, 위 5가지의 topic을 확인해보세요.

 

move_base/goal

 

move_base/feedback

 

move_base/status

 

move_base/result

 

 

move_base/cancel topic은 내비게이션을 도중에 취소해야 publish됩니다.

 

- 연습 4.3 끝


 

The Global Planner

move_base node가 새로운 목표 지점을 받으면, 이 목표는 즉시 global planner로 보내집니다. 다음으로, global planner는 목표 지점으로 도착하는 안전한 경로를 계산합니다. 이 경로는 로봇이 움직이기 전에 계산되며, 따라서 이 동안의 센서 데이터는 고려하지 않습니다. global planner에 의해 새로운 경로가 계획될때마다, 이 경로는 /plan topic으로 publish 됩니다.

 

Navfn

Navfn planner는 ROS Navigation에서 가장 흔한 planner 입니다. 이는 초기 위치로부터 목표 위치까지의 최단거리를 다익스트라(Dijkstra) 알고리즘으로 계산합니다. 이 알고리즘이 어떻게 동작하는지는 다음 그림을 보면 이해가 쉽습니다.

 

 

 

Carrot Planner

Carrot planner는 목표 지점이 장애물 안에 있는지를 확인합니다. 만약 장애물 안에 있다면, 해당 지점으로부터 로봇의 위치를 잇는 벡터를 따라서 장애물 밖으로 나올때까지 되돌아갑니다. 그 후, 이 지점을 목표 지점으로 정하고 이를 local planner 또는 controller에게 전달합니다. 그러므로, 이 planner는 어떠한 global path planning도 하지 않습니다. 이 path planner는 로봇이 갈 수 없는 곳에 목표지점이 있다고 하더라도, 해당 위치에 더 가깝게 갈 수 있도록 해줍니다. 이는 복잡한 실내 환경에서는 크게 실용적이지는 않습니다. 예를 들어, 이 알고리즘은 예를 들어 테이블 같이 어떤 장애물에 최대한 가깝게 움직이고 싶을 때 유용할 수 있습니다.

Global Planner

global planner는 navfn planner를 위한 좀 더 유연한 대안입니다. 이는 navfn에 의해 사용된 알고리즘(다익스트라 알고리즘)을 바꿔서 다른 경로를 계산할 수 있게 해줍니다. 이 옵션들 중에는 A* 알고리즘, quadratic approximation, toggling grid path이 있습니다.

 

  • /allow_unknown (default: true): navfn이 알 수 없는 공간(unknwon space)을 지나는 경로를 만들 수 있도록 할지 설정합니다. 
  • /planner_window_x (default: 0.0): planner가 사용할 수 있는 window의 x 크기를 조절합니다. 이는 큰 costmap에서 NavFn이 작은 크기의 window에서만 동작하도록 제한할 때 유용할 수 있습니다.
  • /planner_window_y (default: 0.0): planner가 사용할 수 있는 window의 y 크기를 조절합니다.
  • /default_tolerance (default: 0.0): 목표 지점과의 오차 허용 범위를 정합니다. NavFn은 목표 지점과 가능한 가까워지려고 하며, default_tolerance값 보다는 멀어지지 않습니다.
  • cost_factor
  • neutral_cost
  • lethal_cost

지도가 주어졌을 때, 목표 지점으로 가기 위한 경로 계획 방법 중에는 costmap을 사용하는 방법이 있습니다. costmap은 로봇에게 안전한 구역을 grid cell로 나타냅니다. 일반적으로, costmap의 값들은 binary이며, 자유 공간, 또는 로봇이 충돌할 수 있는 공간을 나타냅니다. costmap의 각각의 cell들은 0부터 255까지의 정수 값을 가지며, 해당 범위에서 자주 사용되는 특별한 값들이 있습니다.

 

  • 255 (NO_INFORMATION): 충분한 정보가 없기 때문에 보류된 cell
  • 254 (LETHAL_OBSTACLE): 충돌이 일어나는 장애물이 있는 cell
  • 253 (INSCRIBED_INFLATED_OBSTACLE): 장애물은 없으나, 해당 cell이 로봇의 중심에 가면 충돌이 일어날 수 있는 cell
  • 0 (FREE_SPACE): 장애물이 없는 cell

costmap에는 global costmap, local costmap 이렇게 두 가지가 있습니다. 이 둘의 가장 큰 차이점은 어떻게 만들어졌는가? 입니다.

  • global costmap은 static map으로부터 만들어집니다
  • local costmap은 센서 값으로부터 만들어집니다

먼저, global planner가 사용하는 global costmap먼저 알아보겠습니다. global palnner는 경로를 계산하기 위해 global costmap을 사용합니다.

 


- 연습 4.4

 

turtlebot 시뮬레이션 및 navigation node를 실행하고, costmap의 설정을 바꿔서 global map을 확인해보세요

 

- 연습 4.4 끝


 

Global Costmap

 global costmap은 사용자가 생성한 static map(slam으로 만든 지도)에 의해 만들어집니다. 이 경우, costmap은 static map에 의해 제공된 너비, 높이, 장애물의 정보에 맞게 초기화됩니다. 이 설정은 보통 amcl같은 localization system과 함께 조합됩니다. global costmap또한 파라미터를 가지고 있으며, YAML파일에 정의됩니다. 다음은 global costmap 파라미터 파일의 예시입니다

 

costmap 파라미터들은 3개의 파일들로 정의됩니다.

  • 위의 예시같은 global costmap을 위한 파라미터들은 global_costmap_params.yaml 파일에 정의합니다.
  • local costmap을 위한 파라미터들은 local_costmap_params.yaml 파일에 정의합니다.
  • global costmap, local costmap 모두 다 사용하는 파라미터들은 common_costmap_params.yaml에 정의합니다.

Global Costmap Parameters

  • global_frame (default: "/map"): costmap이 작동할 때의 global frame.
  • static_map (default: true): costmap을 초기화 할 때 static map사용 여부를 설정.
  • rolling_window (default: false): costmap의 rolling window version 사용 여부를 설정. 만약 static_map 파라미터가 true이면, 이 파라미터는 false이어야 합니다.
  • plugins: 레이어 당 하나씩, 플러그인 specifications의 순서입니다. 각각의 specification은 이름과 타입 형식의 딕셔너리입니다. 이 이름은 플러그인을 위한 파라미터 네임스페이스를 정의하기 위해 사용됩니다. 이 값들은 common_costmap_parameters.yaml파일에서 정의될 것입니다. 

 

costmap의 설정을 간단하고 명확하게 하기 위해 ROS는 layer를 사용합니다. layer는 관련된 파라미터들의 "블록(block)"과 같습니다. 예를 들어, static map, 감지된 장애물, inflation들은 모두 다른 layer들로 분리됩니다. 이 layer들은 common_costmap_parameters.yaml 파일에 정의되고, local_costmap_params.yaml파일과, global_costmap_params.yaml파일에 추가됩니다. costmap의 configuration file을 추가하기 위해, 우리는 바로 위의 예시 사진과 같이 plugins area를 만듭니다.

 

예를 들어, global costmap의 경우, 다음과 같이 두 가지 layer를 사용합니다.

  • costmap_2d::StaticLayer: static map으로부터 costmap을 초기화하기 위해 사용
  • costmap_2d::InflationLayer: 장애물을 inflate하기 위해 사용

 

'Study > [ROS] Navigation' 카테고리의 다른 글

ROS Navigation(4. Path Planning 2)  (0) 2021.01.12
ROS Navigation(3. Localization)  (0) 2021.01.10
ROS Navigation(2. Map Creation)  (1) 2021.01.10
ROS Navigation(1. Basic Concept)  (0) 2021.01.05