전역 경로와 지역 제어는 서로 다른 질문에 답한다
전역 경로는 시작에서 목표까지 갈 기하적 경로를 제공한다. 지역 제어는 현재 pose·속도와 주변 자료를 사용해 그 경로를 따라갈 명령을 만든다. 경로는 모터에 적용된 결과가 아니며 명령 속도 역시 실제 속도 측정과 다르다. 같은 경로를 두고도 장애물 갱신, 위치 추정, 구동 제한과 제어 알고리즘에 따라 행동이 달라질 수 있다.
이 단위의 Nav2 기준은 Jazzy다. planner가 반환한 path와 controller가 사용하는 path의 ID·frame·갱신 시각을 연결한다. 새 장애물이 나타나면 지역 제어가 지금 낼 수 있는 명령이 없어질 수 있고, 더 넓은 경로 변경이 필요하면 재계획을 요청할 수 있다. 모든 장애물 변화에 반드시 같은 방식으로 반응하거나 항상 지나간 경로로 돌아간다고 일반화하지 않는다. 선택한 plugin과 BT가 처리 흐름을 정한다.
한 번의 경로 생성 성공은 이후 모든 시각의 유효성을 보장하지 않는다. 반대로 잠시 기다린다고 지도·TF 오류가 반드시 해결되는 것도 아니다. 현재 관측과 costmap, 경로·목표 버전, 적용 명령과 실제 pose를 함께 남기면 계획 실패인지 제어 실패인지, 자료 문제인지 과업 조건 문제인지 나눌 수 있다. 실패한 계층을 구분하는 것이 복구의 시작이다.
도착 조건은 plugin과 설정으로 정의한다
도착은 화면에서 목표 점에 가까워 보인다는 인상이 아니라 명시한 조건이다. Jazzy SimpleGoalChecker는 위치와 yaw 허용 오차를 검사한다. 여기서는 xy_goal_tolerance=0.1 m, yaw_goal_tolerance=0.2 rad, stateful=false, symmetric_yaw_tolerance=false라는 교육용 설정을 제공한다. 실제 기본값을 복사한 예가 아니다.
목표 (x_g,y_g,θ_g)=(1,0,0)를 같은 map 기준으로 주고 현재 pose가 (0.94,0.04,0.25)라면 위치 오차는 다음과 같다. x,y는 m이고 θ는 rad다.
위치는 0.1 m 이내지만 yaw 오차 0.25 rad가 0.2를 넘으므로 이 설정의 도착 조건은 실패다. 같은 위치에서 yaw만 0.15 rad가 되면 두 조건을 통과한다. 각도 차이는 원의 가장 짧은 방향으로 정규화해서 비교해야 하며 +π와 −π 부근의 단순 뺄셈을 그대로 쓰지 않는다. 이 예는 작은 각도여서 오차가 곧 0.25/0.15다.
stateful=true를 쓰는 경우에는 위치 허용 범위에 들어온 이력을 사용해 이후 yaw 정렬 중 xy 재검사를 생략할 수 있다. 따라서 현재 위치·방향을 매번 함께 검사하는 본문 설정과 같다고 가정하면 안 된다. 실제 선택한 checker와 reset·과업 경계, 상태 유지 조건을 함께 기록한다. 다른 goal checker에서는 도착의 의미가 달라질 수 있다.
SimpleGoalChecker의 이 함수는 속도 입력을 도착 조건으로 검사하지 않는다. 위 통과 순간의 실제 선속도가 0.2 m/s라면 pose 조건은 통과해도 정지했다는 사실은 확인되지 않는다. 정지·안정된 도킹이 과업 요구라면 그 조건을 처리하는 checker나 별도의 관측·검증이 필요하다. Action 결과도 선택한 조건과 자료에 따른 결과이며 실제 pose·구동 상태의 신뢰성을 대신하지 않는다.
진행 검사와 목표 접근·도착은 다르다
Jazzy SimpleProgressChecker는 기준 pose 이후 필요한 이동을 했는지 시간과 함께 본다. 이 단위의 설정은 required_movement_radius=0.05 m, movement_time_allowance=10 s다. baseline은 비교 기준 위치와 그 기준을 설정한 시각이다. 기준에서의 위치 이동이 0.05 m보다 클 때 기준을 새로 잡는다. 방향 회전만으로는 이 위치 이동을 만족하지 않는다.
별도의 합성 실행에서 기준은 t=0 s의 (0,0) m다. t=5 s의 위치가 (0.03,0), t=11 s가 (0.04,0)이라고 하자. 둘 다 기준 이동이 0.05 m보다 작아 기준이 갱신되지 않는다. 5 s에서는 허용 시간 안이지만 11 s에서는 10 s를 넘었으므로 진행 검사 실패다. 최신 pose가 주어졌다는 사실과 필요한 이동을 했다는 사실을 구별한다.
반대로 11 s의 위치가 (0.06,0)이고 그 검사 전까지 별도 실패 종료를 하지 않았다는 입력이면 이동이 반경보다 커 기준을 갱신하고 통과한다. 이 함수는 충분한 이동을 먼저 확인한 뒤 시간을 검사한다. 실제 제어기가 그 이전 시각에 이미 실패를 반환했는지까지 생략하고 이 한 호출을 전체 실행 성공으로 쓰면 안 된다. 정확히 0.05 m라면 '보다 크다'가 아니므로 기준을 갱신하지 않는다.
이 기준은 목표까지 거리가 줄었는지나 최단 경로를 따랐는지 직접 검사하지 않는다. 목표 반대쪽으로 움직이거나 제자리 주변을 도는 경우에도 위치 이동 기준이 갱신될 수 있다. progress 통과는 도착이나 충돌 회피의 충분조건이 아니다. 궤적과 목표 관계, goal checker 및 과업 결과를 함께 봐야 한다.
Recovery는 원인을 지우는 만능 동작이 아니다
복구는 실패 뒤 계속할 수 있는 조건을 회복하려는 과업 처리다. Jazzy Behavior Server는 Spin, BackUp, Wait 등 행동을 제공한다. 과거 자료에서 Recovery Server라는 이름을 보더라도 현재 선택 버전의 실제 패키지·노드·인터페이스를 확인한다. recovery라는 역할 이름과 어떤 행동을 수행하는 서버인지 구별한다.
TF나 clock이 틀렸다면 먼저 좌표·시각·추정 자료를 복구해야 한다. 그런 근거 없이 회전이나 후진을 요청한다고 좌표 연결이 생기지 않는다. 센서 단절이면 관측과 준비 상태를 확인하고, 일시적 통행 방해라면 새 관측으로 통로가 비었는지 확인하거나 적절한 대기·재계획을 검토할 수 있다. 실제로 막힌 통로를 무한히 같은 경로로 재시도하는 것은 원인을 해결하지 못한다.
costmap 지움은 장애물의 실제 제거가 아니다. 오래된 흔적을 다시 관측하도록 모델을 초기화할 수 있지만, 사람이 계속 앞에 있다면 새 관측으로 다시 표시되어야 한다. 지운 화면을 근거로 통행 가능을 확정하거나 충돌 검사를 약하게 만들어 실패를 숨기지 않는다. 실제 복구 동작에도 현재 형상·공간과 자료의 유효성, 적용·정지 관측이 필요하다. 이 활동은 그런 동작을 실행하는 지시가 아니라 로그로 근거를 구분하는 연습이다.
재시도의 범위와 재개 조건을 기록한다
Jazzy 기본 재계획·복구 BT XML은 주기적 계획과 제어, 오류에 따른 복구 분기와 유한 재시도를 구성한다. 이 파일의 설정을 모든 Nav2 실행의 고정 정책이라고 쓰지 않는다. 어떤 XML과 plugin·오류 조건이 적용됐는지 확인하고 실패를 복구 가능한 것으로 분류한 근거를 남긴다.
합성 로그 P는 유효한 path가 있지만 map→odom 조회 실패와 clock 세대 변경을 기록했다. Q는 TF·센서가 유효하고 앞 통로에 사람이 계속 관측돼 제어 명령을 찾지 못했다. R은 pose 조건을 통과했지만 속도 0.2 m/s와 정지 확인 기록 없음이다. P에서는 시각·추정·TF 준비를 먼저 확인하고 과거 명령의 세대를 구분한다. Q에서는 사람과 공간에 관한 새 근거, 유효한 대안·대기와 제한된 재시도 정책이 필요하다. R은 pose 조건 통과와 안정 정지를 별도로 보고한다.
취소 수락이나 노드 비활성화도 물리 정지의 관측은 아니다. 복구 종료 후에는 현재 pose·속도, 최신 센서·TF와 지도·목표 버전, 이전 동작의 종료·명령 적용 상태를 확인해 재개를 판단한다. 기존 6.4 안전 배포 감독기 및 6.7 트러블슈팅 매트릭스으로 단계별 진단을 연결한다. 아래 계산 통과는 실제 Nav2 주행·복구 성과를 뜻하지 않는다.