본문 바로가기
PLC 전기제어 기술자료/모션 기술자료

모션 충돌방지 알고리즘 4편: 누가 양보하나 (적격 판정과 우선권)

by 위치결정JP 2026. 7. 4.
728x90
반응형
이전 시리즈 1편: 이동 영역(Band)으로 충돌 예측
이전 시리즈 2편: 비대칭 마진 최적화와 Follow 추종 제어
이전 시리즈 3편: 데드락과 양보(Yield) 제어

 

두 헤드 충돌 국면에서 한 축만 양보하고 다른 축이 먼저 통과하는 우선권 판정 개념도

 

3편에서 한 축이 park(양보)하면 데드락이 풀린다는 것을 봤습니다.

문제는 누가 양보하느냐 입니다.

양쪽이 다 양보하면 둘 다 멈춰 또 교착이고, 아무도 안 하면 충돌입니다.

이번 편은 정확히 한 축만 양보하도록 만드는 적격 판정과, 동률일 때 순서를 가르는 상호배제 우선권(seal-in) 을 진리표로 풉니다.

1. 추월형 적격 판정: 뒤축이 양보한다

먼저 "양보 후보"를 가립니다.

기준은 하나입니다. 내 목표가 상대의 현재 위치를 지나(너머) 가려는 축입니다.

이 축이 곧 상대를 추월하려는 뒤축이고, 이 축이 양보하면 앞축이 먼저 지나갑니다.

 

단일 레일에서 Ax#1의 목표가 Ax#2 현재 위치를 넘어가는 추월 상황 — 뒤축/앞축 표시 개념도

 

적격(Ax#1) = (현재 D49000 < 상대현재 D49050  AND  목표 D49002 > 상대현재 D49050)   ; 오른쪽으로 통과
          OR (현재 D49000 > 상대현재 D49050  AND  목표 D49002 < 상대현재 D49050)   ; 왼쪽으로 통과
;  (Ax#2 는 상대현재 = D49000 으로 대칭)

 

풀어 보면 이렇습니다.

내 현재 위치는 상대의 이쪽에 있는데, 내 목표는 상대의 저쪽에 있다.

그러면 나는 상대를 가로질러 가야 하므로, 내가 뒤축(추월 시도)입니다.

💡 TIP

비교 기준은 상대의 Band 가 아니라 상대의 "현재 위치"(D49050)입니다.
두 Band 가 깊이 겹치는 추월 상황에서 상대 Band 를 기준으로 삼으면 양쪽 다 부적격이 되어 안 풀립니다.
현재 위치를 기준으로 삼아야 "누가 누구를 지나가려 하는가"가 정확히 갈립니다.

이 방식의 장점은 충돌 방향과 무관하게 자동 해소된다는 점입니다.

Ax#1이 오른쪽으로 추월하든 왼쪽으로 추월하든, "상대를 지나가려는 쪽"이 적격이 되어 양보합니다.

한 축만 양보 대상으로 고정할 필요가 없습니다.

2. 마진범위 적격: 티칭 잔차를 흡수한다

위 식은 목표와 상대 현재를 정확한 값으로 크기 비교(목표 > 상대현재)합니다.

그런데 실제 설비에서는 이게 위태롭습니다.

두 로봇의 티칭 좌표에는 글로벌 캘리브레이션(2편 §6) 후에도 미세한 잔차가 남습니다.

목표가 상대 현재 위치와 아슬아슬하게 붙어 있을 때, 이 잔차가 적격 판정을 뒤집어 버릴 수 있습니다.

그래서 정본은 정확값 대신 상대 현재 ± 마진 허용 범위로 적격을 판정합니다.

이때 LOOSEN(느슨) 방향으로 넓혀야 합니다. 목표가 마진 범위에 닿기만 해도 적격으로 봅니다.

 

오른쪽 통과 적격: 목표 D49002 > (상대현재 − 마진) = D_lo
왼쪽 통과 적격:   목표 D49002 < (상대현재 + 마진) = D_hi

 

임계값 D_lo/D_hi는 매 스캔 미리 계산해 둡니다(설치 방향에 따라 Back/Front 마진을 §4 Band 와 동일하게 스왑).

⚠️ 주의

반대로 TIGHTEN(엄격)으로 좁히면 영구 데드락에 빠집니다.
"마진을 확실히 넘어야 적격"(목표 > 상대현재 + 마진)으로 좁히면, 목표가 상대 자리 근처인 케이스(서로의 자리로 수렴)에서 양쪽 다 부적격이 됩니다.
그러면 우선권 판정으로 넘어가 비우선축이 그 자리에 park 해 길을 막고, 아무도 못 지나가는 영구 교착이 됩니다.
LOOSEN 은 그 축을 적격 → 양보시켜 상대가 먼저 자리를 비우게 함으로써 교착을 풉니다.

💡 TIP

이 마진 범위(상대 현재 ± 작은 마진)는 충돌 판정용 Band 와 다릅니다.
충돌 Band 는 상대의 전체 이동 영역이고, 여기서 쓰는 마진 범위는 티칭 잔차를 흡수하기 위한 tolerance 입니다.
적격의 기준 자체는 여전히 "상대의 현재 위치"입니다.

3. 동률 tie-break: 상호배제 seal-in 우선권

적격 판정만으로는 한 가지 상황이 안 풀립니다.

두 헤드가 같은 자리로 수렴하면(공유 zone), 양쪽이 동시에 적격이거나 동시에 부적격인 동률이 됩니다.

이때는 "먼저 지령한 축"에게 우선권을 주고, 나머지가 양보하게 합니다.

이 우선권을 상호배제 seal-in(자기유지) 회로로 구현합니다.

축마다 우선 비트를 하나씩 둡니다(Ax#1 = M49010, Ax#2 = M49060).

 

상호배제 seal-in 우선권 래더 캡처 — SET 항(내 요청 AND 상대 미우선), HOLD 항(자기유지 AND 충돌국면), 상대 우선 비트로 배타 차단되는 부분

 

; 지령순 우선 = 상호배제 seal-in  (Ax#1 관점)
M49010 = (M49000 AND /M49060)              ; SET : 내가 요청 & 상대가 아직 미우선
      OR (M49010 AND (M49000 OR M49050))   ; HOLD: 자기유지 (충돌 국면이 유지되는 동안)

 

세 가지 동작으로 나뉩니다.

 

  • SET — 내가 요청(M49000)했고 상대가 아직 우선을 안 잡았으면(/M49060) 내가 우선을 잡습니다.
  • HOLD — 한 번 잡은 우선은 충돌 국면(둘 중 하나라도 요청 중)이 이어지는 동안 자기유지됩니다.
  • RESET — 둘 다 idle(요청 없음)이 되면 우선이 풀려 다음 국면을 위해 초기화됩니다.

 

핵심은 SET 항의 /M49060(상대 우선 비트 B접점) 입니다.

상대가 이미 우선을 잡았으면 내 SET는 원천 차단됩니다.

그래서 두 축이 동시에 우선을 잡는 일이 구조적으로 불가능합니다.

4. 데드락 불가 진리표: 우선은 항상 XOR

상호배제 seal-in 이 왜 데드락을 막는지 진리표로 보겠습니다.

충돌 국면에서 두 우선 비트(M49010, M49060)의 상태를 전부 나열합니다.

케이스 요청 상황 M49010 (Ax#1 우선) M49060 (Ax#2 우선) 결과
A Ax#1 만 먼저 요청 1 (SET) 0 (상대 우선이라 SET 차단) Ax#1 통과 · Ax#2 양보
B Ax#2 만 먼저 요청 0 1 Ax#2 통과 · Ax#1 양보
C 완전 동시 요청 1 (Ax#1 선실행 SET) 0 (직후 /M49010로 차단) Ax#1 통과 (축번호 우선)
D 우선 확보 후 상대도 요청 1 (HOLD 유지) 0 (뒤늦은 SET 차단) 먼저 지령한 Ax#1 계속 우선

네 케이스 모두 정확히 하나만 1입니다.

즉 충돌 국면에서 우선 비트는 항상 M49010 XOR M49060 이고, 둘 다 1인 상태(both=1)는 도달 불가입니다.

 

충돌 국면 불변식:  M49010 XOR M49060 = 1   (both=1 은 도달 불가)

 

이것이 데드락 불가의 핵심입니다.

둘 다 우선이 되는 일이 없으니, 동률 상황에서 반드시 한 축만 양보하고 다른 축은 통과합니다.

양보 판정(M49012)은 이 우선 비트를 이렇게 조합합니다.

 

M49012(양보) = (M49011 AND /M49061)               ; 나만 적격 = 추월 뒤축 → 내가 양보
            OR ( 동률[양쪽 적격 OR 양쪽 부적격] AND 상대우선축 M49060 )  ; 동률이면 비우선축이 양보

 

  • 한 축만 적격이면 그 축이 양보(뒤축이 앞축을 먼저 보냄).
  • 동률이면 seal-in 이 가린 비우선축만 양보.

 

두 경로 모두 "정확히 한 축"으로 수렴합니다.

5. 실행 순서 우선: 완전 동시엔 축번호로 가른다

완전히 같은 스캔에 두 축이 요청하면 어떻게 될까요(케이스 C).

이건 P0 서브루틴의 호출 순서로 자동 해결됩니다.

 

P0 서브루틴을 Ax#1·Ax#2 순서로 2회 XCALL 하는 메인 루틴 구조 래더 캡처

 

P0 호출 순서에 따른 두 번째 축 판정 실행 래더 캡처

 

메인 루틴
  Ax#1 목표 로드
  | SM400 |----[ XCALL P0 ]      ; 호출(1) — Sv-1(Ax#1) 판정 먼저
  Ax#2 목표 로드
  | SM400 |----[ XCALL P0 ]      ; 호출(2) — Sv-2(Ax#2) 판정 나중

 

Ax#1(Sv-1) 판정이 먼저 실행되므로, 완전 동시 요청이라도 Ax#1이 그 스캔에서 우선을 먼저 잡습니다.

그 다음 Ax#2 판정 때는 이미 M49010이 서 있어, Ax#2의 SET가 /M49010으로 차단됩니다.

결과적으로 축번호가 낮은 축이 우선(tie-break)이 되는 결정적 규칙이 생깁니다.

💡 TIP

상용 라이브러리도 같은 원리를 씁니다.
Beckhoff TwinCAT 의 충돌 회피 기능(Tc3_McCollisionAvoidance)도 한 레일을 공유할 때 "먼저 지령한 축만 목표까지 이동"하는 우선 규칙을 씁니다.
다른 점은, 상용은 우선 규칙이 블랙박스라는 것이고 여기서는 그 우선권을 진리표로 공개하고 미쓰비시 래더로 직접 구현한다는 점입니다.

이 tie-break 는 실제로 자주 일어나는 공유 zone 수렴(같은 위치로 가려는 경합)만 순차화합니다.

⚠️ 주의

양쪽이 서로의 목표로 자리를 맞바꾸는 "진짜 교차"는 알고리즘 대상 밖입니다.
한 레일 위에서 두 헤드가 서로를 완전히 통과해 자리를 바꾸는 것은 물리적으로 불가능합니다.
충돌방지(P0)는 "지령된 목표를 안전하게 갈지"만 담당하고, 한 레일 위 헤드 좌우 순서 유지(교차 지령 금지)는 상위 응용 시퀀스(Job 스케줄러·반송 흐름)의 책임입니다.

6. 정리: 적격 + 우선권으로 한 축만 양보

  • 적격 판정 — 내 목표가 상대 현재 위치를 통과하려는 축(추월 뒤축)이 양보 후보. 충돌 방향 무관 자동 해소.
  • 마진범위 적격(LOOSEN) — 정확값 비교의 티칭 잔차 취약성을 상대현재 ± 마진으로 흡수. TIGHTEN 은 영구 데드락이라 불채택.
  • 상호배제 seal-in — 동률(공유 zone 수렴)일 때 SET 항의 /상대우선 B접점으로 우선을 배타 확보.
  • 데드락 불가 불변식 — 충돌 국면에서 항상 M49010 XOR M49060. both=1 은 도달 불가라 반드시 한 축만 양보.
  • 완전 동시엔 축번호 tie-break — P0 를 Ax#1 → Ax#2 순서로 2회 호출해 낮은 축번호가 먼저 우선 확보.

 

여기까지 "정확히 한 축만 양보한다"가 완성됐습니다.

그런데 실제 설비에 올리면 질문이 또 생깁니다.

park 한 축은 언제, 어떻게 복귀할까요? 미러로 설치된 축은? park 중에 상위 시퀀스가 목표를 바꾸면?

다음 편(모션 충돌방지 알고리즘 5편: 견고한 양보 (복귀·설치방향·N축 확장))에서 실 설비 견고성을 다룹니다.

이전 편(3편: 데드락과 양보(Yield) 제어)이 궁금하시면 함께 보시길 권합니다.

테스트해 보시고 문제점이 있다면 댓글로 피드백 주시면 감사드리겠습니다. ^^

728x90
반응형