- 원본 : http://wiki.ros.org/navigation/Tutorials/RobotSetup
1. Robot Setup
내비게이션 스택은 로봇이 달리기 위해 특정한 방식으로 구성된다고 가정한다. 위의 그림은 전체적으로 이러한 구성을 보여준다. 하얀색의 요소들은 이미 구현된 필수 구성 요소들이고, 회색의 요소들은 이미 구현된 선택적 구성 요소들이다. 그리고 파란색 요소들은 각 로봇 플랫폼에서 반드시 생성해야하는 요소들이다. 내비게이션 스택의 사전 요구사항들은 각 요구사항들을 충족하는 방법에 대한 지침과 함께 아래 섹션에 나와있다.
1.1 ROS
내비게이션 스택은 로봇이 ROS를 사용한다고 가정한다. 로봇에 ROS를 설치하는 방법은 ROS documentation를 참조해라.
1.2 Transform Configuration (other transforms)
내비게이션 스택은 로봇이 좌표 프레임들 간의 관계에 대한 정보를 tf를 이용하여 publish하는 것을 요구한다. tf에 대한 자세한 듀토리얼은 Transform Configuration을 참고하라.
1.3 Sensor Information (sensor sources)
내비게이션 스택은 장애물을 피하기 위해 센서의 정보를 이용하고, 이 센서들은 ROS를 통해 sensor_msgs/LaserScan 또는 sensor_msgs/PointCloud 메세지를 pubilsh한다고 가정한다. ROS를 통해 메시지를 publish하는 방법에 대한 자세한 내용은 Publishing Sensor Streams Over ROS tutorial을 참고하라.
1.4 Odometry Information (odometry source)
내비게이션 스택은 tf와 nav_msgs/Odometry 메세지를 이용하여 publish된 odometry 정보를 요구한다. odometry 정보를 publish하는 튜토리얼은 Publishing Odometry Information Over ROS 참고.
1.5 Base Controller (base controller)
내비게이션 스택은 “cmd_vel” 토픽의 로봇 기본 좌표 프레임에 있는 것으로 가정된 geometry_msgs/Twist 메시지를 이용하여 속도 명령을 전송한다고 가정한다. 이것은 (vx, vy, vtheta) <===> (cmd_vel.linear.x, cmd_vel.linear.y, cmd_vel.angular.z) 속도를 취하여 모바일 base에 전송하기 위해 모터 명령으로 변환할 수 있는 “cmd_vel” 토픽을 subscribe하는 노드가 있어야 한다는 것을 의미한다.
1.6 Mapping (map_server)
내비게이션 스택을 작동하기 위해 map을 요구하지 않지만, 이 튜토리얼의 목적을 위해 지도가 있다고 가정하자. 사용자 환경의 map을 만드는 방법에 대한 자세한 내용은 building a map tutorial을 참고.
2. Navigation Stack Setup
이 섹션은 로봇 내비게이션 스택의 설정 및 구성 방법을 묘사하고 있다. 로봇 설정을 위한 위의 모든 요구사항은 만족되었다고 가정한다. 구체적으로는 로봇이 tf를 이용하여 좌표 프레임 정보를 publish하고, 내비게이션 스택에 사용할 모든 센서들로부터 sensor_msgs/LaserScan 또는 sensor_msgs/PointCloud 메시지를 수신하며, tf와 nav_msgs/Odometry 메세지를 모두 이용하여 base로 전송하기 위한 속도 명령을 수신함과 동시에 odometry 정보를 publish해야함을 의미한다. 만약 로봇에서 이러한 요구사항이 하나가 충족되지 않으면 위의 Robot Setup 섹션을 참고하라.
2.1 Creating a Package
이 튜토리얼의 첫 번째 단계는 내비게이션 스택의 모든 구성과 launch 파일들을 저장할 패키지를 생성하는 것이다. 이 패키지는 위의 Robot Setup 섹션의 요구사항을 충족하는 데 사용되는 패키지와 내비게이션 스택에 대한 고급 인터페이스를 포함하는 move_base 패키지에 종속된다. 따라서 패지지 장소를 정하고 아래의 명령어를 실행해라.
$ catkin_create_pkg my_robot_name_2dnav move_base my_tf_configuration_dep my_odom_configuration_dep my_sensor_configuration_dep
이 명령어는 로봇의 내비게이션 스택을 작동하기 위해 필요한 의존성과 함께 패키지를 생성할 것이다.
2.2 Creating a Robot Configuration Launch File
이제 모든 구성을 위한 작업 공간을 가졌으니, 로봇이 필요로 하는 모든 하드웨어와 transform을 publish하는 roslaunch 파일을 생성하자. 편집기를 켜고, 아래의 글을 my_robot_configuration 파일에 붙여넣어라.
<launch>
<node pkg="sensor_node_pkg" type="sensor_node_type" name="sensor_node_name" output="screen">
<param name="sensor_param" value="param_value" />
</node>
<node pkg="odom_node_pkg" type="odom_node_type" name="odom_node" output="screen">
<param name="odom_param" value="param_value" />
</node>
<node pkg="transform_configuration_pkg" type="transform_configuration_type" name="transform_configuration_name" output="screen">
<param name="transform_configuration_param" value="param_value" />
</node>
</launch>
이것은 launch 파일의 템플릿이다. 하지만 특정 로봇에 맞게 채워야한다. 아래의 각 섹션을 따라가면서 필요한 부분을 변경해보자.
<launch>
<node pkg="sensor_node_pkg" type="sensor_node_type" name="sensor_node_name" output="screen">
이 부분에서는 로봇이 내비게이션하는 데 필요한 센서들을 불러올 것이다. "sensor_node_pkg"을 센서의 패키지 이름으로, "sensor_node_type"을 패키지 타입으로, "sensor_node_name"을 희망하는 센서 node 이름으로 "sensor_param"은 node가 가지는 파라미터들로 수정하라. 만약 내비게이션 스택의 정보를 전송하기 위해 여러 개의 센서를 사용할 생각이라면, 이 부분에 모두 넣어야한다.
</node>
<node pkg="odom_node_pkg" type="odom_node_type" name="odom_node" output="screen">
<param name="odom_param" value="param_value" />
</node>
이 부분에서는 base의 odometry를 launch할 것이다. 위와 같이 실제로 실행할 노드와 관련된 pkg, type, name, param 사양들을 수정해라.
<param name="transform_configuration_param" value="param_value" />
</node>
이 부분에서는 로봇의 transform 구성을 실행할 것이다. 위와 같이 실제로 실행할 노드와 관련된 pkg, type, name, param 사양들을 수정해라.
2.3 Costmap Configuration (local_costmap) & (global_costmap)
내비게이션 스택은 환경의 장애물 정보를 저장하기 위해 두 개의 costmap을 사용한다. 하나의 costmap은 전체 환경의 장기계획(long-term plan) 생성을 의미하는 global planning을 위해 사용되며, 다른 하나는 local planning와 장애물 회피을 위해 사용된다. 두 가지 costmap 모두 따라야 할 구성 옵션과 각 map에 개별적으로 설정해야할 구성 옵션이 있다. 그러므로 costmap 구성을 위한 공통 구성 옵션, global 구성 옵션, local 구성 옵션 이렇게 3개의 섹션이 아래에 있다.
참고 : 아래의 섹션은 costmap을 위한 오직 기초 구성 옵션을 다루므로, 자세한 건 costmap_2d documentation을 참고하라.
2.3.1 Common Configuration (local_costmap) & (global_costmap)
내비게이션 스택은 환경의 장애물 정보를 저장하기 위해 costmap을 사용한다. 이를 제대로 수행하기 위해서는, costmap를 업데이트를 위해 청취해야하는 센서 토픽에 맞춰야 할 필요가 있다. 아래와 같이 costmap_common_params.yaml 파일을 생성해보자.
obstacle_range: 2.5
raytrace_range: 3.0
footprint: [[x0, y0], [x1, y1], ... [xn, yn]]
#robot_radius: ir_of_robot
inflation_radius: 0.55
observation_sources: laser_scan_sensor point_cloud_sensor
laser_scan_sensor: {sensor_frame: frame_name, data_type: LaserScan, topic: topic_name, marking: true, clearing: true}
point_cloud_sensor: {sensor_frame: frame_name, data_type: PointCloud, topic: topic_name, marking: true, clearing: true}
위의 파일을 쪼개서 살펴보자.
obstacle_range: 2.5
raytrace_range: 3.0
이 파라미터들은 costmap에 입력되는 장애물 정보에 대한 임계값을 설정한다. "obstacle_range" 파라미터는 costmap에 들어가는 장애물 결과를 초래하는 최대 범위 센서 판독값을 결정한다. 여기서는 2.5m로 설정했고, 이것은 로봇이 오직 base로부터 2.5m내의 장애물 정보를 지도에 업데이트할 것을 의미한다. "raytrace_range" 파라미터는 센서값을 읽을 때 freespace를 광선추적할 범위를 결정한다. 위와 같이 3.0m로 설정하면, 센서값을 읽을 때 로봇이 3.0m 떨어진 곳까지 공간을 비우려 한다는 것을 의미한다.
footprint: [[x0, y0], [x1, y1], ... [xn, yn]]
#robot_radius: ir_of_robot
inflation_radius: 0.55
여기에서는 로봇의 footprint 또는 원형인 경우 로봇의 반경을 설정한다. footprint를 지정하는 경우, 로봇의 중심은 (0.0, 0.0)으로 가정되며, 시계 방향 및 시계 반대 방향 사양이 모두 지원된다. 또한 costmap에 대한 inflation_radius도 설정한다. inflation_radius는 cost를 발생시키는 장애물로부터의 최대 거리로 설정되어야 한다. 예를 들어, inflation_radius를 0.55m로 설정하면 로봇이 장애물로부터 0.55m 이상 떨어진 모든 경로를 동일한 장애물 비용을 가진 것으로 처리한다는 것을 의미한다.
observation_sources: laser_scan_sensor point_cloud_sensor
"observation_sources" 매개변수는 공백으로 구분된 costmap에 정보를 전달하는 센서들의 목록을 정의한다. 각 센서는 다음 줄에 정의된다.
laser_scan_sensor: {sensor_frame: frame_name, data_type: LaserScan, topic: topic_name, marking: true, clearing: true}
이 줄은 observation_sources에서 언급된 센서의 파라미터를 설정한다. 그리고, 이 예시는 laser_scan_sensor를 정의하고 있다. "frame_name" 파라미터는 센서의 좌표 프레임 이름으로, "data_type" 파라미터는 토픽이 사용하는 메시지에 따라 LaserScan 또는 PointCloud으로, "topic_name" 파라미터는 센서가 데이터를 publish하는 토픽 이름으로 설정되어야 한다. "marking"과 "clearing" 파라미터는 센서를 사용하여 costmap에 장애물 정보를 추가하거나, 지우거나, 둘 다 수행할지 여부를 결정한다.
2.3.2 Global Configuration (global_costmap)
아래와 같이 파일을 만들어 global costmap에 해당하는 구성 옵션을 저정한다. 편집기로 global_costmap_params.yaml 파일을 열고, 아래와 같이 붙여넣어라.
global_costmap:
global_frame: /map
robot_base_frame: base_link
update_frequency: 5.0
static_map: true
“global_frame” 파라미터는 costmap이 실행할 좌표 프레임을 정의한다. 위의 경우에는 /map 프레임을 선택한다. "robot_base_frame" 파라미터는 costmap이 로봇의 base에 대해 참조해야 하는 좌표 프레임을 정의한다. "update_frequency" 파라미터는 costmap이 업데이트 루프를 실행할 주파수(Hz)를 결정한다. "static_map" 파라미터는 map_server에 의해 제공되는 지도를 기반으로 costmap을 초기화해야 하는지 여부를 결정한다. 만약 기존 map 또는 map server를 사용하지 않는 경우, static_map 파라미터를 false로 설정한다.
2.3.3 Local Configuration (local_costmap)
아래와 같이 파일을 만들어 local costmap에 해당하는 구성 옵션을 저정한다. 편집기로 local_costmap_params.yaml 파일을 열고, 아래와 같이 붙여넣어라.
local_costmap:
global_frame: odom
robot_base_frame: base_link
update_frequency: 5.0
publish_frequency: 2.0
static_map: false
rolling_window: true
width: 6.0
height: 6.0
resolution: 0.05
"global_frame", "robot_base_frame", "update_frequency", "static_map" 파라미터는 위의 Global Configuration 섹션에서 묘사된 것과 동일하다. "publish_frequency" 파라미터는 costmap이 시각화 정보를 publish하는 속도(rate(Hz))를 결정한다. "rolling_window" 파라미터를 true로 설정하면, 로봇이 움직일 때 costmap이 로봇 중심으로 유지됨을 의미한다. "width", "height", "resolution" 파라미터는 costmap의 너비(m), 높이(m), 분해능(m/cell)을 설정한다. 이러한 그리드의 분해능은 static map의 분해능과 다를 수 있지만, 대부분의 경우 동일한 분해능으로 설정하는 경향이 있다.
2.3.4 Full Configuration Options
이 최소 구성으로 작업을 시작하고 실행할 수 있지만, costmap에 사용할 수 있는 구성 옵션에 대한 자세한 내용은 costmap_2d documentation를 참고하라.
2.4 Base Local Planner Configuration
base_local_planner는 높은 수준의 계획(high-level plan)이 주어진 로봇의 모바일 base를 전송하기 위해 속도 명령을 계산하는 역할을 한다. 시작 및 작동을 위해 로봇 사양을 기반으로 몇 가지 구성 옵션을 설정할 필요가 있다. base_local_planner_params.yaml 파일을 열고 아래의 글을 붙여넣어라.
참고 : 이 섹션은 TrajectoryPlanner를 위한 오직 기초 구성 옵션을 다루므로, 자세한 건 base_local_planner documentation을 참고하라.
TrajectoryPlannerROS:
max_vel_x: 0.45
min_vel_x: 0.1
max_vel_theta: 1.0
min_in_place_vel_theta: 0.4
acc_lim_theta: 3.2
acc_lim_x: 2.5
acc_lim_y: 2.5
holonomic_robot: true
위의 첫 번째 섹션의 파라미터는 로봇의 속도 제한을 정의하고, 두 번째 섹션의 파라미터는 로봇의 가속도 제한을 정의한다.
2.5 Creating a Launch File for the Navigation Stack
이제 모든 구성 파일이 준비되었으므로, 모든 구성 파일을 내비게이션 스택의 launch 파일로 가져와야한다. 편집기로 move_base.launch 파일을 열고, 아래와 같이 붙여넣어라.
<launch>
<master auto="start"/>
<!-- Run the map server -->
<node name="map_server" pkg="map_server" type="map_server" args="$(find my_map_package)/my_map.pgm my_map_resolution"/>
<!--- Run AMCL -->
<include file="$(find amcl)/examples/amcl_omni.launch" />
<node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">
<rosparam file="$(find my_robot_name_2dnav)/costmap_common_params.yaml" command="load" ns="global_costmap" />
<rosparam file="$(find my_robot_name_2dnav)/costmap_common_params.yaml" command="load" ns="local_costmap" />
<rosparam file="$(find my_robot_name_2dnav)/local_costmap_params.yaml" command="load" />
<rosparam file="$(find my_robot_name_2dnav)/global_costmap_params.yaml" command="load" />
<rosparam file="$(find my_robot_name_2dnav)/base_local_planner_params.yaml" command="load" />
</node>
</launch>
이 파일에 대해 오직 변경해야하는 것은 사용자가 만든 지도에 맞게 map server를 변경하고, 만약 differential drvie robot이라면 "amcl_omni.launch"를 "amcl_diff.launch"로 변경하는 것이다. 지도 제작 듀토리얼은 building a map을 참고하라.
2.6 AMCL Configuration (amcl)
AMCL은 현지화(localization) 성능에 영향을 미치는 많은 구성 옵션을 가지고 있다. AMCL에 대한 자세한 정보는 amcl documentation을 참고하라.
3. Running the Navigation Stack
이제 모든 것이 준비되었으므로, 내비게이션 스택을 실행할 수 있다. 이를 위해 로봇에서 2개의 터미널 창이 필요하다. 하나의 터미널 창에는 my_robot_configuration.launch 파일을 실행할 것이고, 다른 하나에는 move_base.launch 파일을 실행할 것이다.
Terminal 1:
$ roslaunch my_robot_configuration.launch
Terminal 2:
$ roslaunch move_base.launch
이제 내비게이션 스택이 실행될 것이다. 그래픽 인터페이스를 통해 내비게이션 스택으로 목적지를 전송하는 방법은 rviz and navigation tutorial을 참고하라. 만약 코드를 대신 이용하여 내비게이션 스택으로 목적지를 전송하고 싶다면 Sending Simple Navigation Goals tutorial을 참고하라.
4. Troubleshooting
내비게이션 스택을 실행할 때 맞닥뜨리는 일반적인 문제는 navigation stack troubleshooting 페이지를 참고하라.
내비게이션 스택은 장애물 정보를 저장하기 위해 2개의 costmap을 사용
1. global_costmap : long-term plan
2. local_costmap : 장애물 회피
costmap 튜닝하기
1. 공통 설정 (둘다에 해당) :
costmap_common_params.yaml 파일
- obstacle_range : 장애물 감지 범위
- raytrace_range : freespace 추적 범위
- footprint : 로봇 크기의 범위
- robot_radius : 로봇 크기의 반경
- inflation_radius : 장애물로부터의 최대 거리
- observation_sources : costmap에 정보를 전달하는 센서들 목록
2. Global_costmap
global_costmap_params.yaml 파일
- global_frame : costmap이 실행할 좌표 프레임 (/map)
- robot_base_frame : 로봇 base 프레임 (base_link)
- update_frequency : costmap의 업데이트 루프를 실행할 주파수
- static_map : map 또는 map_server 사용 여부
3. Local_costmap
local_costmap_params.yaml 파일
- publish_frequency : costmap이 시각화 정보를 publish하는 속도
- rolling_window : costmap이 로봇 중심으로 유지 여부
- width : costmap의 너비 (m)
- height : costmap의 높이 (m)
- resolution : costmap의 분해능 (m/cell) = static map의 분해능
'번역' 카테고리의 다른 글
Basic Navigation Tuning Guide (0) | 2022.05.10 |
---|