로봇이 맵을 기반으로 자율주행 하기 위해 먼저 활성화되어 있어야 하는 노드는 map_server와 amcl이다.
/map으로 발행하여 로봇이 주변환경 인식 map - base_link 프레임 간 변환 제공
파라미터 변경 실시간으로 확인하기
rqt - Plugins - Parameter Reconfigure
planner_server는 /map 기반으로 로봇의 시작위치에서 목표지점까지 도달하기 위한 전역 경로를 생성한다.
planner_server:
ros__parameters:
expected_planner_frequency: 20.0
use_sim_time: True
planner_plugins: ["GridBased"]
GridBased:
plugin: "nav2_navfn_planner/NavfnPlanner"
tolerance: 0.5
use_astar: false
allow_unknown: true
expected_planner_frequency : 20🌱 플러그인이란?
코드를 수정하지 않고 기존 프로그램에 새로운 기능을 추가하거나 기존 기능을 수정할 수 있도록 하는 모듈

planner server는 자체적으로 경로를 생성하는 것이 아니라, 전역 경로 생성을 위한 다양한 알고리즘 플러그인을 로드하여 경로를 생성을 맡긴다. 따라서 ,플러그인을 교체함으로써 전역 경로 생성 방식을 바꿀 수 있다.
NavFn은 Dijkstra 알고리즘을 기반으로 하며, 선택적으로 A* 알고리즘도 사용할 수 있다.


GridBased:
plugin: "nav2_navfn_planner/NavfnPlanner"
tolerance: 0.5
use_astar: false
allow_unknown: true
tolerance: 0.5
allow_unknown: true
controller_server는 전역 경로를 기반으로 실시간 장애물을 고려한 로컬 경로를 생성한다. 센서 데이터를 통해 장애물을 감지하고 회피하면서 로봇이 안전하게 이동할 수 있게 한다.
controller_server:
ros__parameters:
use_sim_time: False
controller_frequency: 20.0
min_x_velocity_threshold: 0.001
min_y_velocity_threshold: 0.5
min_theta_velocity_threshold: 0.001
failure_tolerance: 0.3
progress_checker_plugin: "progress_checker"
goal_checker_plugins: ["general_goal_checker"] # "precise_goal_checker"
controller_plugins: ["FollowPath"]
controller_frequency: 20.0min_x_velocity_threshold: 0.001min_y_velocity_threshold: 0.5min_theta_velocity_threshold: 0.001failure_tolerance: 0.3
로봇이 목표 지점을 향해 진전을 이루고 있는지 확인하는 플러그인이다. 로봇이 너무 오랫동안 같은 위치에 머무르거나 움직이지 않는 경우를 감지한다.
progress_checker:
plugin: "nav2_controller::SimpleProgressChecker"
required_movement_radius: 0.5
movement_time_allowance: 10.0
required_movement_radius: 0.5movement_time_allowance: 10.0
로봇이 목표 지점에 도착했는지 확인하는 플러그인이다.
goal_checker:
plugin: "nav2_controller::SimpleGoalChecker"
xy_goal_tolerance: 0.25
yaw_goal_tolerance: 0.25
stateful: True
xy_goal_tolerance: 0.25
yaw_goal_tolerance: 0.25
stateful: True

이미지처럼 너무 작은(0.01) xy_goal_tolerance 값은 로봇이 목표에 도달해도 계속 움직이게 만들 수 있다.

controller_plugin은 전역 플래너가 생성간 경로를 따라가기 위해 로컬 속도 명령/cmd_vel을 생성한다.
# DWB parameters
FollowPath:
plugin: "dwb_core::DWBLocalPlanner"
debug_trajectory_details: True
min_vel_x: 0.0
min_vel_y: 0.0
max_vel_x: 0.26
max_vel_y: 0.0
max_vel_theta: 1.0
min_speed_xy: 0.0
max_speed_xy: 0.26
min_speed_theta: 0.0
# Add high threshold velocity for turtlebot 3 issue.
# https://github.com/ROBOTIS-GIT/turtlebot3_simulations/issues/75
acc_lim_x: 2.5
acc_lim_y: 0.0
acc_lim_theta: 3.2
decel_lim_x: -2.5
decel_lim_y: 0.0
decel_lim_theta: -3.2
vx_samples: 20
vy_samples: 5
vtheta_samples: 20
sim_time: 1.7
linear_granularity: 0.05
angular_granularity: 0.025
transform_tolerance: 0.2
xy_goal_tolerance: 0.25
trans_stopped_velocity: 0.25
short_circuit_trajectory_evaluation: True
stateful: True
critics: ["RotateToGoal", "Oscillation", "BaseObstacle", "GoalAlign", "PathAlign", "PathDist", "GoalDist"]
BaseObstacle.scale: 0.02
PathAlign.scale: 32.0
PathAlign.forward_point_distance: 0.1
GoalAlign.scale: 24.0
GoalAlign.forward_point_distance: 0.1
PathDist.scale: 32.0
GoalDist.scale: 24.0
RotateToGoal.scale: 32.0
RotateToGoal.slowing_factor: 5.0
RotateToGoal.lookahead_time: -1.0
◾ 속도 파라미터
min_vel_x, min_vel_y, max_vel_x, max_vel_ymin_vel_x를 음수로 설정하면 로봇이 후진 가능 max_vel_theta, min_speed_thetamin_spedd_xy, max_speed_xy◾ 가속/감속 파라미터
acc_lim_x, acc_lim_y, acc_lim_thetadecel_lim_x, decel_lim_y, decel_lim_theta◾ Trajectory 샘플링 파라미터
vx_samples, vy_samples, vtheta_samplessim_timelinear_granularity, angular_granularitytransform_toleranceshort_circuit_trajectory_evaluation : True🌱 Trajectory(경로) 샘플링이란
DWB Controller에서 로봇의 속도를 다양한 값으로 샘플링 한후 움직임 궤적을 시뮬레이션하여 가장 비용이 낮은 최적의 경로를 선택
◾ 목표 지점 감지 및 정지 파라미터
xy_goal_tolerancetrans_stopped_velocitystateful◾ critics
DWB Controller에서 로봇의 경로를 평가하고 최적의 경로를 선택하는데 사용되는 비용 함수
1.
map_server와amcl을 통해 맵을 불러오고 로봇의 현재 위치 추적
2.planner_server에서 맵의 기존 장애물 데이터를 바탕으로NavFn을 사용해 전역 경로 생성
3.controller_server에서 실시간 센서 데이터로 로컬 경로를 생성하고 장애물 회피
4.DWB Controller를 통해 최적의 경로를 정하고 이를 따라갈 속도 명령/cmd_vel생성
5.goal_checker와progress checker를 통해 목표 도달 여부와 경로 진행 상태를 지속적으로 확인
로봇의 자율주행은 Controller Server가 핵심이다 ^_^