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초간 대기 후 다시 경로 재계산
💡 파라미터 튜닝 흐름 한눈에 보기
위 설정을 바탕으로 환경에 맞게 nav2_params.yaml을 커스텀하여 내비게이션을 운용해 보세요!