Regulated Pure Pursuit: nav2 기본 컨트롤러의 3가지 규제 메커니즘 완전 분석
곡률 규제·장애물 근접 규제·선제 충돌 감지 — PP 대비 경로 오차 85% 감소의 비밀
TL;DR
RPP(Regulated Pure Pursuit)는 Samsung Research의 Steve Macenski 등이 2023년 발표한 모바일 로봇 경로 추적 컨트롤러입니다(arXiv:2305.20026). 기존 Pure Pursuit의 고질적인 문제 — 속도 무시, 맹목 코너 충돌, 장애물 근접 시 감속 없음 — 를 세 가지 규제(Regulation) 휴리스틱으로 해결합니다: (1) 곡률 기반 속도 규제: 날카로운 커브 전 자동 감속, (2) 장애물 근접 속도 규제: 장애물 가까워질수록 감속, (3) 선제 충돌 감지: 호(arc) 투영으로 충돌 예측. ROS 2 nav2에 기본 컨트롤러로 탑재됐고, PAL Tiago 실제 로봇에서 기존 Pure Pursuit 대비 경로 추적 오차 0.19m → 0.03m로 85% 감소.
Background: Pure Pursuit의 문제
Pure Pursuit는 1992년 Craig Coulter가 제안한 고전 경로 추적 알고리즘입니다. 원리는 단순합니다:
경로 위에서 현재 위치로부터 lookahead 거리만큼 앞의 점을 찾아
그 점을 향해 원호(circular arc)를 그리며 따라간다.
조향각 = arctan(2L·sin(α) / ld)
L = 로봇 축거(wheelbase)
α = 목표점과 로봇 진행방향 사이 각도
ld = lookahead 거리
단순하고 계산이 가볍지만 실제 배포에서는 문제가 쏟아집니다:
| 문제 | 상황 | 결과 |
| 속도 고려 없음 | 고속에서 날카로운 커브 | 경로 이탈, 미끄러짐 |
| 맹목 코너 | 복도 교차로 진입 | 보행자와 충돌 |
| 장애물 무시 | 사람 옆 통과 | 너무 빠른 속도로 근접 |
| 충돌 감지 없음 | 경로 상 갑작스러운 장애물 | 그대로 돌진 |
Adaptive Pure Pursuit(APP): lookahead 거리를 속도에 비례(ld = v · lt)해 동적으로 조정했지만, 속도 자체를 규제하는 메커니즘은 없었습니다.
RPP는 APP 위에 세 가지 규제를 추가해 이 문제를 해결합니다.
Core Algorithm: Regulated Pure Pursuit
1. Adaptive Lookahead (APP에서 계승)
lookahead 거리:
ld = v · lt (속도 비례 동적 lookahead)
v : 현재 병진 속도
lt : lookahead 시간 게인 (기본 1.5s)
범위: [ld_min, ld_max] = [0.3m, 0.9m] 클램핑
고속에서 더 먼 경로점을 바라보고, 저속에서 가까운 점 → 고속 직진과 저속 회전 모두 안정적.
2. 곡률 기반 속도 규제 (Curvature Regulation)
경로의 곡률(κ)이 임계값(T_κ)을 초과하면 선속도를 자동으로 줄입니다:
κ = 2 · sin(α) / ld (Pure Pursuit의 기하학적 곡률)
곡률 규제:
if κ > T_κ:
v_regulated = v_max · (1 / (κ · regulated_linear_scaling_min_radius))
regulated_linear_scaling_min_radius 기본값: 0.9m
실용적 의미: 복도 교차로나 좁은 U턴 앞에서 자동으로 감속 → "맹목 코너(blind corner)" 진입 속도를 30~50% 줄임.
실험 결과: 동일 코너에서 RPP는 정지 거리가 APP 대비 33% 증가 (충돌 여유 공간 확보).
3. 장애물 근접 속도 규제 (Proximity / Cost Regulation)
costmap의 obstacle cost를 읽어 장애물 근처에서 감속:
if d_obstacle ≤ d_prox:
v' = v · α · (d_obstacle / d_prox)
d_prox : 규제 시작 거리 (기본 0.6m)
α : cost_scaling_gain (기본 1.0)
costmap 기반이라 고정 장애물(벽, 선반) + 동적 장애물(사람) 모두 처리.
실험 결과: confined corridor에서 APP 대비 경로 추적 오차 14% 감소, 장애물 근접 거리 증가.
4. 선제 충돌 감지 (Preemptive Collision Detection)
기존 방식: 현재 위치에서 공간적으로 앞을 확인 (lookahead 거리까지)
RPP 방식: 시간적으로 앞을 투영 — 현재 속도로 T초 동안 이동할 호(arc)를 그리고, 그 경로 위에 장애물이 있으면 정지:
시뮬레이션 호:
for t in [0, T_max]: (T_max 기본 1.0s)
x(t) = x₀ + ∫v·cos(θ) dt
y(t) = y₀ + ∫v·sin(θ) dt
if costmap[x(t), y(t)] > collision_threshold:
STOP
왜 더 나은가: 공간 기반 감지는 고속에서 반응이 늦음. 시간 기반 투영은 속도가 빠를수록 더 먼 미래까지 확인 → 고속 상황에서 안전 마진 자동 증가.
전체 제어 루프
[매 제어 주기]
1. 경로에서 lookahead 점 찾기
ld = clamp(v · lt, ld_min, ld_max)
2. 기본 속도 설정
v = v_max
3. 곡률 규제 적용
κ = curvature(lookahead_point)
if κ > T_κ: v = min(v, v_curvature_regulated)
4. 장애물 근접 규제 적용
d_obs = nearest_obstacle_distance()
if d_obs < d_prox: v = min(v, v_proximity_regulated)
5. 선제 충돌 감지
if arc_collision_check(v): v = 0 (정지)
6. 조향각 계산
ω = v · κ (규제된 v 사용 — APP와 다른 점)
7. 속도 명령 발행: (v, ω)
6번이 핵심 포인트: APP는 최대 속도로 조향각을 계산하고 나서 감속. RPP는 먼저 v를 규제한 뒤 그 v로 ω를 계산 → 속도-조향각 일관성 유지, undershoot 방지.
nav2 파라미터 구조
nav2의 nav2_regulated_pure_pursuit_controller로 탑재된 설정:
RegulatedPurePursuitController:
# Lookahead
use_velocity_scaled_lookahead_dist: true
min_lookahead_dist: 0.3
max_lookahead_dist: 0.9
lookahead_time: 1.5
# 곡률 규제
use_regulated_linear_velocity_scaling: true
regulated_linear_scaling_min_radius: 0.9
# 장애물 근접 규제
use_cost_regulated_linear_velocity_scaling: true
cost_scaling_dist: 0.6
cost_scaling_gain: 1.0
# 충돌 감지
use_collision_detection: true
max_allowed_time_to_collision_up_to_carrot: 1.0
# 속도 한계
desired_linear_vel: 0.5
min_approach_linear_velocity: 0.05
실험 결과
플랫폼
- 시뮬레이션: Turtlebot 3 + Gazebo (이상적 조건, ground truth 사용)
- 실제 로봇: PAL Robotics Tiago (서비스 로봇, 실내 환경)
Experiment 1: 경로 추적 정밀도
| 컨트롤러 | 평균 경로 오차 |
| PP (Pure Pursuit) | 0.19m |
| APP (Adaptive PP) | 0.09m |
| RPP (Regulated PP) | 0.03m |
PP 대비 85% 오차 감소. APP 대비도 67% 개선.
Experiment 2: 맹목 코너 안전성
동일한 코너에서:
- RPP: 정지 거리 33% 증가 (충돌 전 여유 공간 확보)
- 주행 완료 시간은 APP와 거의 동일 (안전성 향상이 속도 저하로 이어지지 않음)
Experiment 3: 좁은 복도 (Confined Corridor)
- RPP: APP 대비 경로 추적 오차 14% 감소
- 속도 분포 시각화: 코너 앞에서만 감속하고 직선 구간은 최대 속도 유지
Experiment 4: 전체 시스템 (캠퍼스 빌딩)
실제 빌딩에서 전체 내비게이션:
- 완료 시간: PP/APP/RPP 모두 85~95초로 유사
- 경로 이탈: RPP가 최소 (0.043m 평균 이탈)
- 결론: 속도 손실 없이 안전성 향상
Key Experiments
경로 추적 오차 vs 안전성 트레이드오프
RPP의 핵심 주장: "속도를 줄여서 안전해지는 게 아니라, 올바른 상황에서만 줄인다."
실험 데이터:
- 전체 주행 시간: PP ≈ APP ≈ RPP (85~95s)
- 경로 오차: RPP가 PP 대비 85% 낮음
- 코너 안전 여유: RPP가 33% 더 큼
→ 속도는 거의 안 줄이면서 안전성과 정밀도를 동시에 향상.
minimum_radius 파라미터 영향
regulated_linear_scaling_min_radius를 0.5m → 1.5m로 변화시키는 실험:
- 값이 작을수록: 적극적 감속, 매우 안전하지만 느림
- 값이 클수록: 감속 거의 없음, 빠르지만 코너 오버슈트 증가
- 기본값 0.9m가 균형점
Limitations — 현장 엔지니어 관점
알고리즘 한계:
차량 동역학 무시: Pure Pursuit 계열 공통 한계. Ackermann 조향(차량형 로봇)에서는 최소 회전 반경 제약이 있는데, 이를 기하학적으로 처리하지 않음. 경로가 "물리적으로 실현 가능한(feasibly drivable)" 형태여야 함.
고속 코너 단축(shortcutting): 급커브에서 경로를 조금씩 단축하는 현상은 남아 있음 (PP, APP 대비 줄었지만 완전히 해결되지 않음).
costmap 의존성: 장애물 근접 규제는 costmap 품질에 의존. 센서 노이즈로 costmap이 부정확하면 불필요한 감속 또는 감속 누락.
순수 반응형: 전방 경로를 기반으로 반응하는 로컬 컨트롤러. 복잡한 글로벌 경로 재계획은 global planner에게 위임.
현장 관점:
nav2에서 즉시 쓸 수 있는 것:
nav2_regulated_pure_pursuit_controller패키지로 바로 사용 가능. 파라미터 3개(min_radius, d_prox, lookahead_time)만 잘 튜닝하면 대부분 환경에서 잘 작동.DWB vs RPP 선택: DWB(Dynamic Window Approach)는 동적 장애물에 더 유연하지만 무겁고 설정 복잡. RPP는 가볍고 예측 가능 → 실내 정적 환경, 서비스 로봇에 적합.
Unitree/이동 로봇: Go2 같은 사족 보행 로봇에 nav2 올릴 때 RPP가 기본 선택지. 단, 사족 보행 특유의 발 미끄러짐을 고려하면 min_lookahead를 좀 더 늘리는 게 경험적으로 좋음.
속도 파라미터 우선 튜닝: 필드 배포 시
desired_linear_vel을 낮게 시작(0.2~0.3m/s)해서 안정성 확인 후 올리는 것이 정석.regulated_linear_scaling_min_radius는 환경 복잡도에 맞게.
The Lineage — RPP의 계보
| 알고리즘/논문 | 관계 |
| Pure Pursuit (Coulter 1992) | 기반 알고리즘 — 단순한 기하학적 lookahead 추적 |
| Adaptive Pure Pursuit (APP) | lookahead를 속도에 비례하도록 적응화 |
| DWB (Dynamic Window Approach) | nav2 대안 컨트롤러 — 동적 제약 포함, 더 무거움 |
| TEB (Timed Elastic Band) | 전체 경로를 시간 파라미터로 최적화, 차량 동역학 포함 |
| RPP (Macenski et al. 2023) | 곡률·근접·충돌 규제 추가 — nav2 기본 컨트롤러 |
| nav2 MPPIController | 샘플 기반 최적화, 더 복잡한 constraint 처리 가능 |
| nav2 GracefulController | 비홀로노믹 제약 포함, 자연스러운 감속 곡선 |
RPP의 위치: 계산 효율과 직관적 파라미터 조정 가능성 덕분에 nav2 배포의 사실상 표준 컨트롤러.
Summary — Key Takeaways
Pure Pursuit + 3가지 규제 = 실용적 안전 컨트롤러 — 곡률 규제(코너 감속), 근접 규제(장애물 감속), 선제 충돌 감지(호 투영). 각각 독립적으로 on/off 가능한 모듈형 설계.
속도-조향각 일관성이 핵심 개선 — APP는 감속 후 조향각을 재계산하지 않아 언더슈트 발생. RPP는 규제된 속도로 조향각 계산 → 실제 궤적이 의도한 경로와 일치.
경로 추적 오차 85% 감소 (PP 대비 0.19m → 0.03m) — 안전성 향상이 주행 시간 증가로 이어지지 않음. 올바른 상황에서만 감속하기 때문.
nav2 기본 탑재 + 고품질 C++ 구현 — 92% 유닛 테스트 커버리지, production-ready. 직접 구현 없이 YAML 파라미터 튜닝만으로 사용 가능.
로컬 반응형 컨트롤러의 한계는 인정 — 차량 동역학, 고속 단축, 글로벌 재계획은 다른 계층(global planner, MPPI)과 조합해 해결. RPP 단독으로 모든 걸 해결하려 하지 않음 — 그게 오히려 강점.
📚 논문: arXiv:2305.20026
🤖 nav2 소스: GitHub nav2_regulated_pure_pursuit_controller
📖 nav2 공식 문서: Regulated Pure Pursuit — Nav2 Docs
다음 포스트: GR00T — NVIDIA의 휴머노이드 범용 정책