TurtleBot3 Navigation 파라미터


1. 기본 주행 파라미터를 먼저 수정해 보는 실습

강의의 첫 시작은 TurtleBot3가 실제로 움직이는 모습을 바꾸는 것부터 진행하시는 것이 좋습니다. 이 단계에서는 복잡한 이론 설명보다 “이 값을 바꾸면 로봇이 이렇게 달라집니다”라는 감각을 잡는 데 집중합니다.

가장 먼저 수정해 볼 파라미터는 controller server의 속도 관련 값입니다.

FollowPath:
  max_vel_x: 0.3
  max_vel_theta: 1.0
  max_speed_xy: 0.3

여기서 max_vel_x는 로봇의 전진 최고 속도입니다. 값이 0.3이면 로봇이 최대 0.3m/s 정도로 전진할 수 있다는 뜻입니다. max_speed_xy도 평면 이동 속도 제한과 관련되므로 max_vel_x와 함께 조정해 주시는 것이 좋습니다. max_vel_theta는 회전 최고 속도입니다. 이 값이 커지면 로봇이 더 빠르게 회전하고, 작아지면 더 천천히 회전합니다.

처음 실습에서는 다음처럼 속도를 낮춰 보시면 됩니다.

max_vel_x: 0.2
max_speed_xy: 0.2
max_vel_theta: 0.7

수강생에게 같은 목표 지점을 찍어 보게 하시고, 기본값일 때와 수정 후의 차이를 직접 관찰하게 하시면 됩니다. 로봇이 느려지지만 더 안정적으로 움직이는 것을 확인할 수 있습니다. 특히 좁은 실내 공간에서는 속도를 낮추는 것만으로도 로봇이 훨씬 안전하게 움직입니다.

그다음에는 반대로 속도를 조금 높여 볼 수 있습니다.

max_vel_x: 0.4
max_speed_xy: 0.4
max_vel_theta: 1.2

이때는 반드시 넓고 안전한 공간에서 진행하셔야 합니다. 수강생은 속도가 올라가면 도착 시간은 줄어들지만, 회전이나 장애물 회피가 불안정해질 수 있다는 점을 확인하게 됩니다. 이 실습을 통해 Navigation 파라미터 튜닝은 단순히 빠르게 만드는 작업이 아니라, 안정성과 속도 사이의 균형을 찾는 작업이라는 것을 이해하게 됩니다.

속도 다음에는 가속도와 감속도를 수정합니다.

acc_lim_x: 3.0
acc_lim_theta: 3.2
decel_lim_x: -2.5
decel_lim_theta: -3.2

acc_lim_x는 전진 방향 가속도 제한입니다. 값이 크면 로봇이 빠르게 출발할 수 있지만, 실제 로봇에서는 급출발처럼 보일 수 있습니다. decel_lim_x는 감속 제한입니다. 값의 절댓값이 크면 급정지에 가까운 움직임이 나올 수 있습니다. acc_lim_thetadecel_lim_theta는 회전 방향의 가속도와 감속도입니다.

실습에서는 다음처럼 값을 낮춰서 비교해 볼 수 있습니다.

acc_lim_x: 1.0
acc_lim_theta: 1.5
decel_lim_x: -1.0
decel_lim_theta: -1.5

이렇게 수정하면 로봇이 출발하고 멈추는 동작이 더 부드러워지는 것을 확인할 수 있습니다. 다만 값이 너무 낮으면 로봇의 반응이 둔해질 수 있습니다. 강의에서는 수강생에게 “부드럽게 움직이는 것”과 “반응이 느려지는 것”의 차이를 관찰하게 하시는 것이 좋습니다.

이 단계에서는 ros2 param get 명령어도 함께 보여주시면 좋습니다. YAML 파일을 수정했다고 해서 바로 적용되었다고 믿으면 안 됩니다. 실제 노드에 적용된 값을 확인하는 습관을 만들어야 합니다.

ros2 param get /controller_server FollowPath.max_vel_x
ros2 param get /controller_server FollowPath.max_vel_theta

이 실습이 끝나면 수강생은 Nav2 파라미터가 실제 로봇 움직임을 직접 바꾼다는 것을 체감하게 됩니다.

2. 목표 도착 기준을 수정해 보는 실습

속도와 가속도 실습이 끝나면 목표 지점에 얼마나 정확히 도착할 것인지를 조정해 봅니다. 이 실습도 눈에 확실히 보이기 때문에 초반 강의에 적합합니다.

수정할 파라미터는 goal checker입니다.

goal_checker:
  stateful: true
  plugin: "nav2_controller::SimpleGoalChecker"
  xy_goal_tolerance: 0.25
  yaw_goal_tolerance: 0.25

xy_goal_tolerance는 목표 위치에 대한 허용 오차입니다. 값이 0.25이면 목표 지점에서 25cm 이내에 들어왔을 때 도착으로 판단할 수 있습니다. yaw_goal_tolerance는 목표 방향에 대한 허용 오차입니다.

먼저 기본값으로 목표를 찍고 로봇이 어디에서 멈추는지 확인합니다. 그다음 값을 줄여 봅니다.

xy_goal_tolerance: 0.10
yaw_goal_tolerance: 0.10

이렇게 하면 로봇이 목표 지점에 더 정확히 접근하려고 합니다. 수강생은 로봇이 더 세밀하게 위치와 방향을 맞추는 모습을 볼 수 있습니다.

더 극단적으로 다음처럼 설정해 볼 수도 있습니다.

xy_goal_tolerance: 0.05
yaw_goal_tolerance: 0.05

이 값은 정밀해 보이지만 실제 로봇에서는 목표 근처에서 흔들리거나 계속 미세 조정하려고 할 수 있습니다. 이때 강의에서는 중요한 개념을 설명하시면 됩니다. Navigation에서 정밀도는 무조건 작게 잡는다고 좋은 것이 아닙니다. 로봇의 오도메트리, AMCL 위치 추정, 바닥 상태, 모터 제어 성능이 그 정밀도를 감당할 수 있어야 합니다.

일반적인 실내 이동에서는 약간 넉넉한 tolerance가 더 안정적일 수 있습니다. 반대로 도킹, 충전 스테이션 접근, 물건 전달 위치처럼 정확한 위치가 필요한 경우에는 tolerance를 줄여야 합니다.

이 단계에서는 수강생에게 같은 목표 지점을 세 번 정도 반복해서 찍어 보게 하시면 좋습니다. 한 번은 0.25, 한 번은 0.10, 한 번은 0.05로 설정해서 도착 위치와 로봇의 흔들림을 비교하게 하면 효과가 큽니다.

3. 장애물 회피 거리를 바꿔 보는 실습

다음으로 진행할 실습은 장애물 회피 거리입니다. 이 실습은 수강생의 반응이 가장 좋은 편입니다. 파라미터를 바꾸면 로봇이 장애물에서 멀리 돌아가거나 가까이 붙어서 지나가기 때문입니다.

핵심 파라미터는 inflation layer입니다.

inflation_layer:
  plugin: "nav2_costmap_2d::InflationLayer"
  inflation_radius: 0.5
  cost_scaling_factor: 5.0

inflation_radius는 장애물 주변을 얼마나 넓게 위험 영역으로 확장할지 결정합니다. 쉽게 말해 로봇이 장애물에서 얼마나 떨어져서 지나가게 할 것인지를 결정하는 값입니다.

기본값으로 먼저 실습합니다.

inflation_radius: 0.5

로봇과 목표 지점 사이에 박스나 의자를 놓고, 로봇이 어떻게 피해 가는지 확인합니다. RViz에서는 costmap에 장애물 주변으로 퍼진 영역이 보입니다.

그다음 값을 줄입니다.

inflation_radius: 0.3

이렇게 하면 로봇이 장애물에 더 가까이 붙어서 지나가려는 경향이 생깁니다. 좁은 통로를 통과하기 쉬워질 수 있지만 충돌 위험은 커질 수 있습니다.

반대로 값을 키워 봅니다.

inflation_radius: 0.7

이 경우 로봇은 장애물을 더 멀리 피하려고 합니다. 안전해 보이지만 좁은 통로에서는 지나갈 수 있는 길도 못 지나갈 수 있습니다.

이 실습에서는 cost_scaling_factor도 함께 보여줄 수 있습니다.

cost_scaling_factor: 3.0
cost_scaling_factor: 8.0

cost_scaling_factor는 장애물에서 멀어질수록 위험 비용이 얼마나 빨리 줄어드는지를 결정합니다. 이 값은 RViz에서 costmap 색상 분포로 확인하는 것이 좋습니다.

이 단계에서는 반드시 RViz에서 local costmap과 global costmap을 켜고 진행하시는 것이 좋습니다. 수강생이 눈으로 장애물 주변 비용 영역을 봐야 inflation layer를 제대로 이해할 수 있습니다.

4. 로봇 크기 파라미터를 수정해 보는 실습

장애물 회피 거리 실습 후에는 로봇의 실제 크기를 costmap에 반영하는 실습을 진행합니다. 이 단계에서는 robot_radius를 다룹니다.

robot_radius: 0.1

robot_radius는 로봇을 원형으로 단순화했을 때의 반지름입니다. 이 값이 실제 로봇보다 작으면 로봇은 지나갈 수 있다고 판단하지만 실제로는 부딪힐 수 있습니다. 반대로 너무 크게 잡으면 안전하긴 하지만 좁은 통로를 지나가지 못할 수 있습니다.

실습에서는 먼저 TurtleBot3의 실제 폭을 줄자로 측정합니다. 예를 들어 로봇의 최대 폭이 28cm라면 반지름은 14cm입니다. 여기에 안전 여유를 2cm 정도 더하면 다음처럼 설정할 수 있습니다.

robot_radius: 0.16

수강생에게 기본값과 수정값으로 좁은 통로를 통과시켜 보게 하시면 됩니다. 이 실습을 통해 로봇의 실제 물리 크기가 Navigation에 반드시 반영되어야 한다는 것을 이해할 수 있습니다.

이 단계에서 중요한 설명은 다음입니다. Navigation은 가상의 점이 이동하는 것이 아니라 실제 크기를 가진 로봇이 이동하는 것입니다. 따라서 로봇 위에 카메라, 배터리팩, 브래킷, 적재함 등을 추가했다면 robot_radius 또는 footprint 설정을 반드시 다시 확인해야 합니다.

5. Nav2 기본 상태를 확인하는 실습

이제 수강생이 파라미터 변경에 익숙해졌다면, Navigation이 정상 동작하기 위한 기본 상태를 확인하는 실습으로 넘어갑니다. 이 단계에서는 단순히 값을 바꾸는 것보다 “현재 시스템이 정상인지 확인하는 방법”을 익히는 데 집중합니다.

먼저 파라미터 파일 구조를 확인합니다.

node_name:
  ros__parameters:
    parameter_name: value

수강생에게 amcl, controller_server, local_costmap, global_costmap, planner_server, behavior_server, velocity_smoother 같은 노드 이름을 찾게 합니다. 그리고 각 노드 아래의 ros__parameters 구조를 확인하게 합니다.

그다음 실제 실행 중인 노드를 확인합니다.

ros2 node list

파라미터 목록도 확인합니다.

ros2 param list /controller_server
ros2 param list /amcl

이 실습에서 수강생은 YAML 파일에 적힌 값과 실제 실행 중인 노드의 파라미터를 연결해서 이해하게 됩니다.

다음으로 TF 좌표계를 확인합니다.

base_frame_id: "base_footprint"
global_frame_id: "map"
odom_frame_id: "odom"

Navigation에서 중요한 좌표계는 map, odom, base_link, base_footprint입니다. 이 좌표계가 끊기면 로봇 위치 추정과 경로 계획이 모두 불안정해집니다.

TF 확인 명령어는 다음과 같습니다.

ros2 run tf2_tools view_frames
ros2 run tf2_ros tf2_echo map base_link

RViz에서는 TF, RobotModel, Map, LaserScan을 켜고 로봇 모델이 지도 위에 정상 표시되는지 확인합니다.

이 단계에서는 수강생에게 “Navigation 문제를 만났을 때 바로 파라미터부터 바꾸지 말고, TF와 topic부터 확인해야 한다”는 습관을 만들어 주시는 것이 좋습니다.

6. Map Server와 지도 불러오기 실습

기본 상태 확인 후에는 Map Server 실습을 진행합니다. Navigation은 지도를 기준으로 동작하므로, 지도 파일이 정상적으로 불러와지는지 확인하는 과정이 필요합니다.

대상 파라미터는 다음입니다.

map_server:
  ros__parameters:
    yaml_filename: "map.yaml"

실습에서는 저장된 map.yaml을 불러오고 RViz에서 지도가 정상 표시되는지 확인합니다.

실행 예시는 다음과 같습니다.

ros2 launch turtlebot3_navigation2 navigation2.launch.py map:=/path/to/map.yaml

수강생은 RViz에서 지도가 표시되는지 확인하고, 라이다 점이 지도상의 벽과 잘 맞는지 확인합니다. 라이다 점과 지도 벽이 어긋나면 AMCL이 위치를 제대로 잡기 어렵습니다.

지도 저장 실습까지 포함한다면 map_saver도 함께 다룰 수 있습니다.

map_saver:
  ros__parameters:
    save_map_timeout: 5.0
    free_thresh_default: 0.25
    occupied_thresh_default: 0.65

지도 저장 명령은 다음과 같습니다.

ros2 run nav2_map_server map_saver_cli -f my_map

저장 후에는 반드시 다시 불러와서 확인해야 합니다. 지도는 한 번 저장했다고 끝나는 것이 아닙니다. 실제 환경과 지도상의 벽 위치가 맞는지 확인해야 Navigation이 안정적으로 동작합니다.

7. AMCL 초기 위치와 ParticleCloud 확인 실습

이 단계부터는 위치 추정 실습으로 들어갑니다. AMCL은 로봇이 지도 위에서 자기 위치를 찾는 기능입니다.

핵심 파라미터는 다음입니다.

amcl:
  ros__parameters:
    min_particles: 500
    max_particles: 2000
    base_frame_id: "base_footprint"
    global_frame_id: "map"
    odom_frame_id: "odom"

먼저 RViz에서 2D Pose Estimate를 사용해 초기 위치를 지정합니다. 수강생에게 실제 로봇 위치와 지도상의 위치를 맞춰서 클릭하도록 안내합니다.

그다음 RViz에서 ParticleCloud를 표시합니다. 파티클이 로봇 주변에 모이면 AMCL이 위치를 안정적으로 잡고 있는 것입니다. 파티클이 넓게 퍼져 있거나 엉뚱한 위치에 몰려 있으면 초기 위치, 라이다 정합, 지도 품질, 오도메트리 상태를 확인해야 합니다.

이 실습에서는 로봇을 약간 전진시키고 제자리 회전도 시켜 봅니다. 로봇이 움직인 후에도 파티클이 로봇 주변에 유지되는지 확인합니다.

수강생에게 강조할 점은 다음입니다. AMCL이 불안정하면 planner와 controller를 아무리 조정해도 Navigation은 안정될 수 없습니다. 위치 추정은 Navigation의 출발점입니다.

8. AMCL 파티클 수를 변경하는 실습

초기 위치 확인이 끝나면 AMCL 파티클 수를 수정해 봅니다.

min_particles: 500
max_particles: 2000

파티클은 로봇이 있을 수 있는 위치 후보입니다. 파티클 수가 많으면 위치 추정이 안정적일 수 있지만 CPU 사용량이 증가합니다. 파티클 수가 너무 적으면 위치 추정은 가벼워지지만 불안정할 수 있습니다.

실습에서는 먼저 값을 줄여 봅니다.

min_particles: 300
max_particles: 1000

RViz에서 ParticleCloud의 분포와 로봇 위치 추정 안정성을 확인합니다.

그다음 값을 늘려 봅니다.

min_particles: 800
max_particles: 3000

이때 위치 추정은 안정적으로 보일 수 있지만, 시스템 부하가 늘어날 수 있습니다. 수강생에게 CPU 사용량도 함께 확인하도록 안내하시면 좋습니다.

이 실습은 “정확도를 높이려면 무조건 값을 키우면 된다”는 생각이 틀렸다는 것을 보여주기에 좋습니다. 로봇에서는 항상 성능과 연산량 사이의 균형이 필요합니다.

9. 라이다와 지도 정합 및 max_beams 수정 실습

다음은 라이다 데이터와 지도 정합을 확인하고, AMCL의 라이다 사용량을 조정하는 실습입니다.

대상 파라미터는 다음입니다.

laser_model_type: "likelihood_field"
max_beams: 60
laser_likelihood_max_dist: 2.0
sigma_hit: 0.2

먼저 RViz에서 LaserScan을 켭니다. 라이다 점들이 지도상의 벽과 잘 겹치는지 확인합니다. 이 정합이 맞지 않으면 AMCL은 위치를 제대로 추정하기 어렵습니다.

그다음 max_beams 값을 수정합니다.

max_beams: 30

값을 줄이면 AMCL이 사용하는 라이다 빔 수가 줄어듭니다. 계산량은 줄어들지만 위치 추정이 거칠어질 수 있습니다.

다음으로 값을 늘려 봅니다.

max_beams: 100

값을 늘리면 더 많은 라이다 정보를 사용하지만 연산량이 증가할 수 있습니다.

이 단계에서는 수강생이 RViz에서 라이다 점, 지도, 파티클을 동시에 보게 하시는 것이 좋습니다. 라이다 점이 지도와 잘 맞고, 파티클이 로봇 주변에 안정적으로 모이면 위치 추정이 정상이라고 볼 수 있습니다.

10. Local Costmap과 Global Costmap 비교 실습

AMCL이 안정적으로 동작하면 Costmap 실습으로 넘어갑니다. 이 단계에서는 값을 많이 바꾸기보다 두 costmap의 역할 차이를 눈으로 확인하게 합니다.

Local Costmap 관련 설정은 다음과 같습니다.

local_costmap:
  local_costmap:
    ros__parameters:
      global_frame: odom
      rolling_window: true
      width: 3
      height: 3
      resolution: 0.05

Global Costmap 관련 설정은 다음과 같습니다.

global_costmap:
  global_costmap:
    ros__parameters:
      global_frame: map
      track_unknown_space: true
      resolution: 0.05

Local Costmap은 로봇 주변을 따라다니는 작은 비용 지도입니다. rolling_window: true이기 때문에 로봇이 움직이면 costmap도 함께 움직입니다.

Global Costmap은 전체 지도 기준으로 유지되는 비용 지도입니다. 전역 경로 계획에 사용됩니다.

실습에서는 RViz에서 local costmap과 global costmap을 동시에 켭니다. 로봇을 움직였을 때 local costmap이 로봇을 따라 움직이는지 확인하고, global costmap은 지도 기준으로 유지되는지 확인합니다.

이 실습을 통해 수강생은 장애물 회피 문제와 전역 경로 계획 문제를 구분할 수 있게 됩니다.

11. Local Costmap 크기를 수정하는 실습

Costmap의 역할을 이해한 뒤에는 local costmap 크기를 수정해 봅니다.

width: 3
height: 3
resolution: 0.05

먼저 기본값 3m x 3m 상태에서 RViz에 표시되는 local costmap 영역을 확인합니다.

그다음 값을 줄여 봅니다.

width: 2
height: 2

이렇게 하면 로봇 주변에서 보는 영역이 줄어듭니다. 장애물을 더 가까운 범위에서만 고려하게 되므로 빠른 주행에서는 대응이 늦어질 수 있습니다.

다음으로 값을 늘려 봅니다.

width: 5
height: 5

이 경우 더 넓은 주변 영역을 볼 수 있지만 계산량이 늘어날 수 있습니다.

이 실습에서는 수강생에게 “넓게 본다고 무조건 좋은 것이 아니다”라는 점을 설명하시면 됩니다. 로봇의 속도, 센서 범위, 컴퓨터 성능에 맞춰 적절한 costmap 크기를 정해야 합니다.

12. Obstacle Layer의 marking과 clearing 확인 실습

이제 장애물이 costmap에 어떻게 표시되고 제거되는지 확인합니다.

대상 파라미터는 다음입니다.

obstacle_layer:
  plugin: "nav2_costmap_2d::ObstacleLayer"
  enabled: true
  observation_sources: scan
  scan:
    topic: /scan
    clearing: true
    marking: true
    data_type: "LaserScan"

marking: true는 라이다가 감지한 장애물을 costmap에 표시한다는 의미입니다. clearing: true는 더 이상 장애물이 없다고 판단되면 costmap에서 지운다는 의미입니다.

실습에서는 로봇 앞에 박스를 놓습니다. RViz에서 local costmap에 장애물이 표시되는지 확인합니다. 그다음 박스를 치우고 장애물 표시가 사라지는지 확인합니다.

토픽도 함께 확인합니다.

ros2 topic echo /scan

장애물이 표시되지 않으면 /scan 데이터가 정상인지, 라이다 TF가 맞는지, costmap의 observation source가 올바른지 확인해야 합니다.

이 실습은 Navigation 디버깅에서 매우 중요합니다. 로봇이 장애물을 피하지 못한다고 해서 바로 controller를 수정하면 안 됩니다. 먼저 costmap에 장애물이 보이는지 확인해야 합니다.

13. Obstacle Range와 Raytrace Range 확인 실습

Obstacle Layer를 확인한 뒤에는 장애물을 등록하는 거리와 빈 공간을 지우는 거리를 비교합니다.

대상 파라미터는 다음입니다.

raytrace_max_range: 3.0
obstacle_max_range: 2.5

obstacle_max_range는 장애물로 등록할 최대 거리입니다. 여기서는 2.5m입니다.

raytrace_max_range는 빈 공간을 지우는 데 사용할 최대 거리입니다. 여기서는 3.0m입니다.

실습에서는 장애물을 로봇 앞 1m, 2m, 2.5m 근처에 차례대로 놓고 costmap에 표시되는지 확인합니다. 그리고 장애물을 치웠을 때 costmap에서 지워지는지도 확인합니다.

이 실습은 수강생에게 센서 데이터가 costmap에 바로 그대로 들어가는 것이 아니라, 거리 제한과 clearing 조건을 거쳐 반영된다는 점을 이해시키기에 좋습니다.

14. Planner의 A* 옵션 변경 실습

장애물 회피와 costmap을 이해한 뒤에는 planner server 실습으로 넘어갑니다.

대상 파라미터는 다음입니다.

planner_server:
  ros__parameters:
    planner_plugins: ["GridBased"]
    GridBased:
      plugin: "nav2_navfn_planner::NavfnPlanner"
      tolerance: 0.5
      use_astar: false
      allow_unknown: true

먼저 use_astar: false 상태에서 목표 지점을 찍고 RViz에서 global path를 확인합니다.

그다음 값을 변경합니다.

use_astar: true

Nav2를 재실행한 뒤 같은 목표 지점을 찍습니다. global path의 모양이 달라지는지 확인합니다.

수강생에게 설명할 핵심은 다음입니다. Planner는 실제 속도 명령을 만드는 것이 아니라, 지도 위에서 갈 길을 계산합니다. 로봇이 그 길을 실제로 따라가게 만드는 것은 controller입니다. 따라서 경로가 이상하면 planner와 global costmap을 봐야 하고, 경로는 괜찮은데 로봇 움직임이 이상하면 controller와 local costmap을 봐야 합니다.

15. Unknown Space 허용 여부 실습

Planner 실습과 함께 allow_unknown도 다루면 좋습니다.

allow_unknown: true

이 값이 true이면 알려지지 않은 영역으로도 경로를 만들 수 있습니다. 반대로 false이면 unknown 영역을 통과하는 경로를 만들지 않습니다.

실습에서는 unknown 영역이 있는 지도를 사용합니다. 먼저 allow_unknown: true 상태에서 unknown 영역 근처 또는 너머에 목표를 찍습니다. 경로가 생성되는지 확인합니다.

그다음 다음처럼 수정합니다.

allow_unknown: false

같은 목표를 다시 찍고 경로 생성 여부를 비교합니다.

이 실습에서는 로봇의 목적에 따라 설정이 달라질 수 있다는 점을 설명하시면 됩니다. 탐색 로봇이라면 unknown 영역을 허용해야 할 수 있습니다. 하지만 이미 만들어진 실내 지도에서 안전하게 이동하는 로봇이라면 unknown 영역을 피하는 것이 더 안전할 수 있습니다.

16. Progress Checker 확인 실습

다음으로 로봇이 실제로 진행하고 있는지 판단하는 Progress Checker를 확인합니다.

대상 파라미터는 다음입니다.

progress_checker:
  plugin: "nav2_controller::SimpleProgressChecker"
  required_movement_radius: 0.1
  movement_time_allowance: 10.0

이 설정은 로봇이 10초 동안 0.1m 이상 움직이지 못하면 진행 실패로 판단할 수 있다는 의미입니다.

실습에서는 로봇에게 목표 지점을 보낸 뒤, 앞을 안전하게 막아서 이동하지 못하게 합니다. 로봇이 일정 시간 후 실패 상태로 넘어가는지 확인합니다. 이후 behavior server의 복구 행동이 실행되는지도 관찰합니다.

이 실습에서 중요한 점은 로봇이 제자리에서 계속 바퀴만 도는 상황을 막는 것입니다. Progress Checker는 Navigation 시스템이 “지금 제대로 가고 있는가”를 판단하는 장치입니다.

17. Behavior Server 복구 행동 확인 실습

Progress Checker 이후에는 behavior server의 복구 행동을 확인합니다.

대상 파라미터는 다음입니다.

behavior_plugins: ["spin", "backup", "drive_on_heading", "wait", "assisted_teleop"]

로봇이 경로를 따라가지 못하거나 장애물에 막히면 Nav2는 복구 행동을 수행할 수 있습니다. spin은 제자리 회전, backup은 후진, wait는 대기입니다.

실습에서는 넓고 안전한 공간에서만 진행해야 합니다. 로봇 앞에 장애물을 두고 목표를 보낸 뒤, 로봇이 막혔을 때 어떤 복구 행동을 하는지 확인합니다.

관련 회전 파라미터도 함께 설명할 수 있습니다.

max_rotational_vel: 1.0
min_rotational_vel: 0.4
rotational_acc_lim: 3.2

이 값들은 복구 행동 중 회전 속도와 가속도에 영향을 줍니다.

수강생에게는 복구 행동이 편리한 기능이지만, 실제 로봇에서는 안전 문제가 있으므로 반드시 제한된 공간에서 테스트해야 한다고 설명하셔야 합니다.

18. Waypoint Follower 실행 실습

기본 Navigation과 안전 기능이 끝나면 응용 단계로 waypoint follower를 진행합니다.

대상 파라미터는 다음입니다.

waypoint_follower:
  ros__parameters:
    loop_rate: 20
    stop_on_failure: false
    waypoint_task_executor_plugin: "wait_at_waypoint"

Waypoint에 도착했을 때 대기하는 설정은 다음입니다.

wait_at_waypoint:
  plugin: "nav2_waypoint_follower::WaitAtWaypoint"
  enabled: true
  waypoint_pause_duration: 200

실습에서는 여러 개의 목표 지점을 보내고 로봇이 순서대로 이동하는지 확인합니다. 첫 번째 지점에 도착한 뒤 잠시 대기하고, 다음 지점으로 이동하는 흐름을 확인하면 됩니다.

이 실습은 배송 로봇, 순찰 로봇, 안내 로봇 예제로 확장하기 좋습니다. 강의에서는 “단일 목표 이동”에서 “여러 지점 순차 이동”으로 수준이 올라가는 구간으로 배치하시면 좋습니다.

Leave a Comment