모바일 로봇의 전역 planner는 현재 pose에서 목표까지 이어지는 path를 만들고, 로컬 controller는 그 path와 가까운 장애물·odometry·차량 운동학을 사용해 매 주기 속도 명령을 계산합니다. 경로가 있어도 로봇이 움직이지 않는다면 path 유효성·local costmap·controller 제약·progress checker를 나눠 봐야 합니다.
아래에서는 용어의 차이를 실제 시스템 경계, 실패 조건과 검증 순서로 나눠 살펴봅니다.
전역 planner와 로컬 controller는 같은 경로 문제를 풀지 않는다
로봇팔의 configuration space와 궤적 최적화는 모션 플래닝 글에서 다뤘습니다. 모바일 Nav2에서는 planner가 지도 위의 path를 만들고 controller가 그 path를 따라갈 현재 속도 명령을 계산합니다.
planner가 성공했다는 것은 목표까지 셀과 pose의 연결을 찾았다는 뜻이지, 로봇이 즉시 그 곡률과 속도를 실행할 수 있다는 보장은 아닙니다. 두 서버의 입력·출력·주기를 분리해 봐야 정지 원인을 찾을 수 있습니다.
Global planner는 map 프레임에서 목표까지의 path를 계산한다
Nav2 Navigation Concepts는 planner의 일반 역할을 현재 pose에서 목표 pose까지 유효한 path를 계산하는 것으로 설명합니다. global costmap과 로봇 모델, 선택한 plugin의 탐색 규칙이 결과를 결정합니다.
NavFn·Smac·Theta Star처럼 알고리즘은 grid 탐색, 운동학 고려와 path 형태가 다릅니다. 최단 거리만 볼 것이 아니라 통로 폭, 최소 회전 반경, unknown space와 계산 시간 요구에 맞춰 선택합니다.
Local controller는 path를 참고해 매 주기 제어 effort를 만든다
Nav2 Controller Server 공식 문서는 path와 controller·progress·goal checker plugin을 받아 local costmap과 함께 제어 명령을 계산하는 서버 구조를 설명합니다.
controller는 path의 가까운 구간을 처리하고 후보 궤적 또는 제어 법칙을 사용해 장애물과 속도·가속 제한을 만족하는 명령을 고릅니다. 같은 global path도 controller 종류와 파라미터에 따라 코너 진입과 장애물 회피가 달라집니다.
| 구분 | Global planner | Local controller |
|---|---|---|
| 목표 | 목적지까지 path | 다음 주기 속도 명령 |
| 환경 | global costmap | local costmap·odom |
| 주기 | 요청·재계획 시 | 고주기 반복 |
| 실패 | path 없음·timeout | 유효 속도 없음·progress 실패 |
global path는 속도와 시간을 모두 가진 궤적이 아니다
nav_msgs/Path는 pose의 연속으로 목적지까지의 기하학적 안내를 제공합니다. 각 점에 실제 도달 시각과 actuator 명령이 완전히 정의된 trajectory와는 다르므로 controller가 로봇 상태를 보며 시간에 따른 속도를 생성해야 합니다.
경로 점이 너무 성기거나 각도가 급변하면 controller가 진동하거나 정지할 수 있습니다. smoothing을 쓰더라도 장애물 여유와 운동학 제약을 훼손하지 않는지 원본 path와 비교합니다.
로봇 운동학에 맞지 않는 path는 controller에서 막힌다
차동구동은 제자리 회전이 가능할 수 있지만 Ackermann 차량은 최소 회전 반경을 가집니다. 옴니 플랫폼은 횡이동이 가능하므로 planner와 controller가 가정하는 motion model이 실제 base와 맞아야 합니다.
grid에서 연결된 path라도 좁은 코너의 곡률과 방향 전환이 불가능할 수 있습니다. planner 단계에서 운동학을 고려하거나 controller가 처리 가능한 path로 smoothing하고, 실제 footprint를 사용해 회전 swept area를 검사합니다.
로컬 코스트맵은 전역 path 위의 새 장애물을 즉시 반영한다
전역 지도에 없던 사람과 팔레트가 나타나면 controller는 local costmap을 이용해 감속·회피하거나 유효 명령이 없다고 판단합니다. global path를 유지하면서 로컬 회피할지 새 전역 path를 요청할지는 행동트리와 controller 정책에 달려 있습니다.
경로가 벽을 통과하거나 장애물 앞에서 멈춘다면 SLAM 지도만 보지 말고 sensor obstacle, footprint, TF와 local costmap의 신선도를 함께 확인합니다.
Progress checker는 움직이는 척하는 상태를 실패로 바꾼다
controller가 작은 속도를 계속 내거나 바퀴가 미끄러지면 action은 RUNNING이지만 목적지에는 가까워지지 않을 수 있습니다. progress checker는 일정 시간과 거리 안에 실제 진행이 있었는지 확인해 복구 또는 실패 분기를 만들 수 있습니다.
임계값이 너무 엄격하면 좁은 공간의 정밀 회전을 실패로 보고, 느슨하면 정체를 오래 끕니다. odometry drift와 작업 구간별 정상 속도를 고려해 진행 거리와 시간 기준을 정합니다.
Goal checker는 위치와 방향의 완료 조건을 정의한다
목표점 근처에 도착해도 yaw 허용오차가 작으면 제자리 정렬을 계속할 수 있고, 위치 허용오차가 지나치게 크면 도킹·픽업 위치를 놓칠 수 있습니다. 작업에 따라 position과 orientation의 중요도가 다릅니다.
일반 순찰점과 충전기 staging pose에 같은 tolerance를 쓰지 않고 목적별 checker를 선택합니다. 완료 판정 뒤 잔류 속도와 정지 안정성도 실제 base에서 확인합니다.
재계획은 path 변경과 controller 안정성 사이의 균형이다
Nav2 planner·controller 선택 가이드는 서버마다 여러 plugin을 구성하고 작업에 맞게 선택할 수 있음을 설명합니다. 행동트리는 일정 주기, path invalid 또는 목표 변경 조건에서 재계획을 요청할 수 있습니다.
너무 잦은 재계획은 path가 좌우로 바뀌어 controller가 목표 선을 계속 잃게 만들 수 있습니다. 반대로 늦은 재계획은 막힌 길을 오래 추종하므로 path 안정성, 장애물 변화와 계산 부하를 함께 측정합니다.

경로는 있는데 움직이지 않을 때는 controller 경계부터 본다
path frame과 timestamp, 첫 pose가 현재 로봇과 연결되는지 확인하고 local costmap에서 footprint 주변이 free인지 봅니다. 다음으로 controller plugin 상태, odometry, velocity threshold와 acceleration·collision constraint를 확인합니다.
cmd_vel이 0이면 controller가 유효 후보를 못 찾았는지 안전 제한이 잘랐는지 구분하고, 명령이 있는데 base가 정지하면 하위 drive controller와 통신 경로를 봅니다. planner를 바꾸기 전에 실패 층을 확정해야 합니다.
시험은 경로 품질과 추종 성능을 별도 지표로 기록한다
planner는 성공률, path 길이·곡률·장애물 여유·계산 시간을 기록합니다. controller는 cross-track error, 속도·가속, 최소 장애물 거리, progress failure와 목표 정지 오차를 측정합니다.
직선·좁은 문·급코너·동적 장애물·막힌 통로·goal 방향 정렬을 장면별로 반복합니다. 같은 path를 여러 controller로 재생하고 같은 controller에 여러 planner path를 주면 어느 층의 개선인지 분리할 수 있습니다.
| 장면 | Planner 지표 | Controller 지표 |
|---|---|---|
| 직선 | 길이·계산 시간 | 추종 오차·속도 |
| 급코너 | 곡률·회전 가능 | 진동·감속·정지 |
| 동적 장애물 | 재계획 시간 | 최소 거리·회피 |
| 목표 도착 | 끝 pose | 위치·yaw·정지 오차 |
현장 인수 기준은 플랫폼·속도·통로 조건에 맞춰야 한다
AMR과 AGV의 경로 차이처럼 자율 우회가 필요한 환경에서는 전역 계획과 로컬 제어가 함께 작동해야 합니다. 단순히 goal 성공률 하나로는 벽에 붙는 경로, 급정지와 반복 진동을 구분할 수 없습니다.
고주기 controller는 ROS 2 실시간 제어의 scheduling과 deadline 영향도 받습니다. 파라미터·plugin·지도·footprint 버전을 묶고 동일 장면의 지표를 비교해야 업데이트 뒤 주행 회귀를 찾을 수 있습니다.

모바일 로봇 전역 경로와 로컬 제어 차이에서 자주 묻는 질문
Global planner가 만든 path를 로봇이 그대로 주행하나요?
아닙니다. local controller가 현재 odometry와 가까운 장애물, 속도·운동학 제한을 반영해 매 주기 실행 명령을 계산합니다.
경로가 보이는데 로봇이 멈춰 있는 이유는 무엇인가요?
local costmap에 여유가 없거나 path가 운동학적으로 어렵고 controller가 유효 속도를 찾지 못했을 수 있습니다. cmd_vel과 오류 코드를 확인해야 합니다.
Planner와 controller는 같은 알고리즘 계열로 맞춰야 하나요?
반드시 같을 필요는 없지만 path 형태와 motion model, controller의 추종 능력이 호환돼야 합니다. 실제 장면에서 조합을 시험해야 합니다.
재계획 주기는 빠를수록 좋은가요?
환경 변화에는 빠르게 반응하지만 계산량과 path 흔들림이 늘 수 있습니다. 장애물 변화 속도와 controller 안정성으로 정합니다.
목표점 근처에서 계속 도는 이유는 무엇인가요?
goal checker의 yaw tolerance, controller의 rotate 동작, localization noise와 최소 속도 설정이 맞지 않을 수 있습니다.
Nav2 plugin과 기본 파라미터는 배포판에 따라 달라질 수 있습니다. 실제 속도 명령은 독립적인 충돌 감시와 하드웨어 안전 제한 아래에서 시험해야 합니다.