ROS2 Nav2(Navigation2) 스택 실행 시 로봇의 주행 특성, 장애물 회피 범위, 위치 추정 정확도, 정밀 도착 오차 등을 제어하는 핵심 파라미터 설정 파일인 **nav2_params.yaml**의 주요 노드별 설정법과 실무 튜닝 가이드입니다.


1. 커스텀 nav2_params.yaml 작성 및 적용 방법

Nav2 런치 실행 시 기본 파라미터 대신 직접 작성한 커스텀 파라미터 파일을 전달하여 실행합니다.

ros2 launch nav2_bringup bringup_launch.py \
  use_sim_time:=true \
  map:=$HOME/my_map.yaml \
  params_file:=$HOME/my_nav2_params.yaml

2. AMCL (위치 추정) 파라미터 설정

amcl 노드는 파티클 필터(Particle Filter)를 이용하여 맵 상에서 로봇의 실시간 위치를 추정합니다.

amcl:
  ros__parameters:
    use_sim_time: True
    alpha1: 0.2                  # 오도메터 회전 운동 잡음 비율
    alpha2: 0.2                  # 오도메터 직진 운동 잡음 비율
    alpha3: 0.2
    alpha4: 0.2
    base_frame_id: "base_footprint"
    global_frame_id: "map"
    odom_frame_id: "odom"
    min_particles: 500           # 최소 파티클 수 (위치 추정 기본 성능)
    max_particles: 2000          # 최대 파티클 수 (위치 교정 시 사용)
    update_min_d: 0.25           # 파티클 갱신을 위한 최소 이동 거리 (0.25m)
    update_min_a: 0.20           # 파티클 갱신을 위한 최소 회전 각도 (rad)
    laser_min_range: 0.15        # 센서 데이터 반영 최소 거리
    laser_max_range: 12.0        # 센서 데이터 반영 최대 거리
    laser_model_type: "likelihood_field" # 라이다 스캔 매칭 알고리즘
  • 튜닝 팁: CPU 점유율이 높다면 max_particles를 줄이고, 위치 추정이 불확실하고 튄다면 min_particles를 1000 이상으로 올려줍니다.

3. Costmap (글로벌 / 로컬 코스트맵) 설정

코스트맵은 로봇 주변의 장애물 위험도를 격자 지도 상의 비용(Cost)으로 변환합니다.

3.1. 로봇 외형 크기 설정 (Footprint vs Radius)

  • 원형 로봇인 경우 robot_radius, 직사각형/특수 형태인 경우 footprint를 지정합니다.
# 원형 로봇 예시 (반지름 0.22m)
robot_radius: 0.22

# 직사각형 로봇 예시 (좌측하단 -> 우측하단 -> 우측상단 -> 좌측상단 순 좌표)
footprint: "[ [0.25, 0.20], [0.25, -0.20], [-0.25, -0.20], [-0.25, 0.20] ]"

3.2. Inflation Layer (장애물 마진 설정)

장애물 주변으로 안전 버퍼 구역을 형성합니다.

global_costmap:
  global_costmap:
    ros__parameters:
      update_frequency: 1.0
      publish_frequency: 1.0
      global_frame: "map"
      robot_base_frame: "base_footprint"
      use_sim_time: True
      robot_radius: 0.22
      plugins: ["static_layer", "obstacle_layer", "inflation_layer"]

      inflation_layer:
        plugin: "nav2_costmap_2d::InflationLayer"
        cost_scaling_factor: 3.0   # 비례 감쇄율 (숫자가 작을수록 안전 마진이 넓어짐)
        inflation_radius: 0.55     # 장애물 주변 최대 비용 팽창 반지름 (미터)

      obstacle_layer:
        plugin: "nav2_costmap_2d::ObstacleLayer"
        enabled: True
        observation_sources: scan
        scan:
          topic: /scan
          max_obstacle_height: 2.0
          clearing: True           # 장애물이 사라지면 지도에서 제거
          marking: True            # 장애물이 감지되면 지도에 등록
          data_type: "LaserScan"
          raytrace_range: 3.0      # 레이트레이싱으로 통로 확인 거리
          obstacle_range: 2.5      # 장애물 감지 반영 거리에 한함
  • 튜닝 팁: 로봇이 넓은 길에서도 장애물에 너무 민감하게 반응하여 통과하지 못하면 cost_scaling_factor를 올리고(예: 5.0), 좁은 통로를 잘 지나가게 하려면 inflation_radius를 로봇 크기에 맞게 조절합니다.

4. Planner Server (전역 경로 계획 - Global Planner)

시작점에서 최종 목적지까지 전체 맵 상의 최적 경로를 계산합니다.

planner_server:
  ros__parameters:
    expected_planner_frequency: 20.0
    use_sim_time: True
    planner_plugins: ["GridBased"]
    GridBased:
      plugin: "nav2_navfn_planner/NavfnPlanner"
      use_astar: True             # A* 알고리즘 사용 (False 시 Dijkstra 사용)
      allow_unknown: True          # 미탐색 구역 경로 생성 허용 여부

5. Controller Server (국소 주행 & 회피 - Local Controller)

실시간으로 장애물을 피하며 계산된 경로를 따라 로봇에 속도 명령(cmd_vel)을 보냅니다. (기본: DWB 또는 Regulated Pure Pursuit)

controller_server:
  ros__parameters:
    use_sim_time: True
    controller_frequency: 20.0
    min_x_velocity_threshold: 0.001
    min_theta_velocity_threshold: 0.001
    failure_tolerance: 0.3
    progress_checker_plugin: "progress_checker"
    goal_checker_plugins: ["general_goal_checker"]
    controller_plugins: ["FollowPath"]

    # 목표지점 도착 판정 오차범위 (Goal Checker)
    general_goal_checker:
      stateful: True
      plugin: "nav2_controller::SimpleGoalChecker"
      xy_goal_tolerance: 0.15     # 최종 위치 도착 허용 오차 (15cm)
      yaw_goal_tolerance: 0.15    # 최종 각도 도착 허용 오차 (rad)

    # DWB Controller 설정
    FollowPath:
      plugin: "dwb_core::DWBLocalPlanner"
      debug_trajectory_details: True
      min_vel_x: 0.0
      max_vel_x: 0.3              # 최대 직진 속도 (m/s)
      max_vel_theta: 1.0          # 최대 회전 속도 (rad/s)
      acc_lim_x: 2.5              # 가속도 제한
      acc_lim_theta: 3.2
      decel_lim_x: -2.5
      decel_lim_theta: -3.2
      vx_samples: 20
      vtheta_samples: 20
      critics: ["RotateToGoal", "Oscillation", "BaseObstacle", "GoalAlign", "PathAlign", "PathDist", "GoalDist"]
      BaseObstacle.scale: 0.02
      PathAlign.scale: 32.0
      PathDist.scale: 32.0
      GoalAlign.scale: 24.0
      GoalDist.scale: 24.0

6. Behavior Server (복구 동작 - Recovery Behaviors)

주행 도중 경로가 막히거나 갇혔을 때 자동 수행할 예외 처리 동작(Recovery)을 정의합니다.

behavior_server:
  ros__parameters:
    costmap_topic: local_costmap/costmap_raw
    footprint_topic: local_costmap/published_footprint
    cycle_frequency: 10.0
    behavior_plugins: ["spin", "backup", "drive_on_heading", "wait"]

    spin:
      plugin: "nav2_behaviors/Spin"
      target_yaw: 1.57            # 90도 회전하여 소켓 및 장애물 재확인
    backup:
      plugin: "nav2_behaviors/BackUp"
      target_x: -0.15             # 경로 정체 시 15cm 후진
      target_speed: 0.05
    wait:
      plugin: "nav2_behaviors/Wait"
      wait_duration: 2            # 2초간 대기 후 다시 경로 재계산

💡 파라미터 튜닝 흐름 한눈에 보기

[[[[1234....fixmonyaof_xtlg_p│▼a│▼o│▼vrtaeiillno__tntx_o/rl/aerdraaiacduncisc_uels&i도m정c착_확ox히s허t용구측_동정s오부]c차a스l현펙i실에n화g맞_(춰f1a0상c~한t2o0지rc정m]조)정](안전마진형성)]

위 설정을 바탕으로 환경에 맞게 nav2_params.yaml을 커스텀하여 내비게이션을 운용해 보세요!