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

PLC로 구현하는 경로충돌방지 알고리즘 (영역기반 충돌방지 설계)

by 위치결정JP 2026. 4. 22.
반응형

 

동일한 축에 수많은 헤드가 달린 구조의 로봇 제어 경험, 다들 있으실거라고 생각합니다.

이런 경우 여러 헤드를 제 각각 서로 충돌을 하지 않게끔 인터락 조건으로만 구성하는 업무는 절대로 쉽지가 않죠.

그렇다면 어떻게 이를 쉽게 해결할수 있을까요?

"현재 위치가 아니라, 이동 경로까지 고려한 충돌 검출 로직" 을 고려해야 하지 않을까요?

1. 개념

 

 

예시1. 헤드A 가 -30 위치에서 목표위치 120 까지 이동 하려하는데 B 로봇이 40 위치에 존재한다면

예시2. 헤드A가 -30 위치에서 120 으로 이동하려고 하는데, 헤드B가 200에서 40 위치로 이동하려고 한다면

예시3. 헤드D가 260위치에서 320 위치로 이동하려고 한다면

등등 다양한 예시를 들수있습니다.

각 위치에 따라서 모든 상황을 체크하려면 인터락을 모두 걸어야해서 복잡한 로직이 완성되어 버릴수 있고 그 조차 쉬운일은 아닙니다.

또한 현재 시점의 위치에서만 보면 기동이 가능하거나 문제가 없어서 출발을 했는데 실제로는 움직이는 도중에 충돌이 발생하곤 하죠.

이를 해결 하기 위해 헤드의 현재 위치에서 이동 하려는 위치 까지의 좌표를 밴드로 관리하여 다른 헤드와 겹침이 발생하는지 검출 하는 로직을 구현 한다면, 움직이기전 사전에 충돌 방지를 예측하고 안전하게 모션제어가 가능할 것 입니다.

2. 기존 방식의 한계점 (인터락 구조의 모션제어)

기존 인터락 기반 모션 제어는 두 가지 전제 위에서 동작합니다.

 

[기존 인터락 방식의 전제]
 1) 현재 위치 기준의 인터락
 2) 특정 포인트(지점)만 체크

       │
       ▼  이 전제 때문에 발생하는 한계

 → 움직이는 대상의 미래 충돌을 예측 불가
 → 동시 기동 시 충돌 가능
 → 위치값이 추가·변경되면 프로그램 수정 필요

 

현재 위치와 고정된 체크 포인트에만 의존하기 때문에, 이동 중에 벌어지는 충돌이나 동시 기동 상황을 사전에 막지 못합니다. 위치 조건이 늘어날 때마다 인터락을 새로 손봐야 하는 유지보수 부담도 큽니다.

3. 해결 핵심 컨셉

로봇의 위치를 포인트(점) 으로 보는게 아니라 밴드(영역) 으로 본다

 

 

밴드는 현재 위치와 목표위치를 말하며 여기에 로봇의 실제 구조에 따른 마진을 더하여 계산합니다.

 

Band = [현재 위치 ~ 목표 위치] + Margin

현재위치_MIN = 현재위치 - Margin
현재위치_MAX = 현재위치 + Margin

목표위치_MIN = 목표위치 - Margin
목표위치_MAX = 목표위치 + Margin


Band_Min = 현재위치_Min or 목표위치_Min 중 작은값
Band_Max = 현재위치_Max or 목표위치_Max 중 큰값

 

밴드에는 최소값과 최대값이 존재합니다.

밴드의 최소값은 현재위치, 목표위치의 MIN 값 중 더 작은값이 될 것이며,

밴드 최대값은 현재위치, 목표위치의 MAX 값 중 더 큰값이 될 것입니다.

그러면 밴드 (이동영역) 을 계산하여 얻었다면 이를 통해서 충돌할지 여부를 예측할수 있습니다.

 

[----나----]                                 [----나----]	
      [----상대----]                      [----상대----]
충돌발생 = (내_Max >= 상대_Min) AND (내_Min <= 상대_Max)


[----나----]     [----상대----]                [----상대----]     [----나----]
분리상태 = (내_Max < 상대_Min) OR (내_Min > 상대_Max)

 

나의 밴드 MAX 값이 상대 밴드 MIN 값 보다 크고, 나의 밴드 MIN 값이 상대 밴드 MAX 값 보다 작다면

서로의 밴드가 겹침이 발생한 상황이므로 이동중 충돌 할수 있습니다.

반대로 나의 밴드 MAX 값이 상대 밴드 MIN 값 보다 작다면,

혹은 나의 밴드 MIN 값이 상대 밴드 MAX 값 보다 크다면

서로 밴드가 분리되어있어 충돌하지않고 안전하다는 의미가 됩니다.

 

SAFE = 모든 로봇과 “분리 상태”일 때 ON

이동지령 AND SAFE → Move Ok!

 

이 SAFE 신호를 비트로 처리하여 실제 위치결정기동의 인터락으로 사용하면, 밴드가 겹친 상황의 기동 자체를 차단하여 충돌을 원천적으로 방지할 수 있습니다.

! 핵심 포인트 : 포인트 비교 현재위치 기반 인터락 → 구간 비교 이동 영역 기반 충돌 예측

4. PLC 프로그램 업로드 및 설명

 

Motion Crash Detect_260423.gxw
1.12MB
Motion Crash Detect_260422.prx
0.43MB

 

그러면 이제 지금까지 설명한 대로 "밴드 기반 충돌 방지" 알고리즘을 PLC 로직으로 어떻게 구현할 수 있을까요?

본 글에 업로드된 샘플프로그램 기반으로 설명을 해보도록 하겠습니다.

- 여러 헤드가 하나의 축을 공유
- 충돌 없이 동시에 동작
- 단순 인터락이 아닌 “예측 기반” 제어

4-1. 위치결정기동 지령시 방향체크 및 충돌 검출 체크 프로그램 실행

 

 

M40020~M40029 각 위치별 기동지령 이벤트가 발생하면 M40070 을 살려 체크 프로세스를 실행합니다.

4-2. 위치결정기동 지령의 진행 방향 검출 및 인터락 구현

 

 

타겟 위치와 현재위치의 차를 이용하여 결과값이 양수라면 양수(+) 방향 기동, 음수라면 음수(-) 방향 기동임을 검출하고

필요시 방향에 따라 추가적인 인터락 (M40073, M40074) 를 구현합니다.

현재는 필요 없으니 SM400 으로 인터락 조건을 상시 ON 하였습니다.

4-3. 현재 위치와 목표 위치 확보

 

 

모든 계산의 시작은 "현재 위치" 와 "목표 위치" 입니다.

D40000 디바이스에는 서보모터에서 올라오는 현재 위치값이 저장되며,

D40036 디바이스에는 위치결정으로 기동할 지령위치값이 저장될것입니다.

이에 여러 헤드들의 위치값을 동기화 하기 위한 글로벌 좌표계 오프셋 (ZR40096) 을 가산/감산하여

글로벌 좌표계(현재위치 D40070, 목표 위치 D40072)를 연산합니다.

 

💡 TIP

각 헤드의 로컬 좌표를 하나의 글로벌 좌표계로 환산하는 이 과정은 정밀 정렬 장비의 위치 연산과 같은 원리입니다. 좌표 변환(평행 이동 + 회전 분해)을 단일 스테이지에 적용한 사례는 UVW 스테이지 위치값 연산에서 자세히 다룹니다.

 

4-4. 밴드 (이동 영역) 생성

 

 

앞서 연산한 글로벌 좌표계 (현재좌표 D40070, 목표좌표 D40072) 에 로봇의 몸체 사이즈를 마진 (ZR40098) 으로 적용 하여 각각 최소값(MIN) 과 최대값(MAX) 을 구합니다.

현재 위치의 마진값 (최소값 D40074, 최대값 D40076), 목표위치의 마진값 (최소값 D40078, 최대값 D40080) 을 구하였다면

이중 가장 작은값이 밴드(이동영역)의 최소값 D40082, 이중 가장 큰값이 밴드(이동영역)의 최대값 D40084 이 됩니다.

이렇게 본인측 로봇을 계산하였다면 같은 방법으로 상대 로봇도 밴드(이동영역)의 최소값과 최대값을 계산합니다.

4-5. 충돌 여부 판정

 

 

[----나----]                                 [----나----]	
      [----상대----]                      [----상대----]
충돌발생 = (내_Max >= 상대_Min) AND (내_Min <= 상대_Max)


[----나----]     [----상대----]                [----상대----]     [----나----]
분리상태 = (내_Max < 상대_Min) OR (내_Min > 상대_Max)

 

본인로봇과 상대로봇의 분리상태를 비교문을 통하여 분리가 되었는지 체크합니다. (안전 M40075)

이때 본인로봇의 밴드와 상대로봇의 밴드를 비교하여 영역의 겹침을 검출합니다.

핵심 비교 원칙은 상대로봇 역시 현재 위치가 아니라 “이동 영역(Band)” 기준으로 비교해야 한다는 것입니다.

 

 

이를 기동시 인터락 조건으로 활용한다면 기동전 현재위치와 목표위치를 기반으로한 충돌 검출 알고리즘의 완성!

1축용 충돌방지 래더 프로그램 전체보기

 

 

5. HMI 를 활용한 시뮬레이션

실제 모션으로 테스트하면 더 좋겠지만 이를 테스트하기 위해 간단하게 프로페이스 HMI 를 이용하여 가상환경에서 위치기동을 할수있도록 구현해보았습니다.

본 글에 업로드되어있는 PLC 래더프로그램 (GX WORKS2) 와 HMI 프로페이스 파일을 활용하여 테스트해보시면 좋을듯합니다.

5-1. 글로벌 좌표 오프셋과 마진, 구동 방향 설정

 

 

 

  1. 각 축의 글로벌 좌표계를 설정합니다.

 

오프셋을 넣은만큼 각 서보모터의 내부 엔코더 위치를 글로벌 좌표로 환산합니다.

 

 

  1. 마진은 로봇의 사이즈를 상정하여 임의로 기입합니다.

 

 

  1. 글로벌 좌표계가 움직일 +방향이 양수방향인지, 음수방향인지 설정합니다.

 

1축의 경우 +방향이 양수 방향으로 기동하므로 양수(POSI) 로 설정하며, 2축의 경우 +방향이 음수 방향으로 기동하므로 음수(NEGA) 로 설정합니다.

5-2. 조그기동 테스트

 

 

5-3. 위치결정 기동 테스트

 

 

테스트

 

 

# 핵심 재요약

- 현재 위치가 아니라 이동 영역으로 판단한다
- 영역은 Min/Max로 정의한다
- 영역이 겹치면 충돌, 분리되면 안전!

이러한 방식의 모션 제어는 단순 인터락을 넘어
- 예약 기반 모션 제어
- 다축 충돌 방지
- 모션 경로 제어
등으로 응용 및 확장이 가능할 것으로 생각합니다.

 

⚠️ 주의

밴드 비교는 헤드가 늘수록 비교해야 할 쌍의 수가 빠르게 증가합니다(n개 헤드 → 최대 n(n-1)/2 쌍). 헤드 수가 많거나 스캔타임이 빠듯한 설비라면 인접 헤드 쌍만 비교하거나 검사 주기를 분산하는 최적화를 함께 고려하세요.

 

💡 TIP

같은 Mitsubishi Q-series 로 시리얼 통신·CRC 검증 등 또 다른 실무 알고리즘을 구현하는 과정은 Modbus 입문 가이드 1편에서 정리했습니다.

 

※ 개인적인 목표는 이것이 완성이 아닙니다. 실제 리니어모션시스템(LMS) 에서 제공되는 따라가기 제어, 더 나아가 X축 1D 에서만 구현되는 충돌검출 알고리즘이 아닌 XY테이블 같은 2D 제어 환경에서로 확장 까지도 구현을 하고싶네요.

그럼 테스트해보시고 활용 할수있다면 적절히 활용 해보시길 바라며, 문제점을 발견하신다면 피드백도 댓글 통해서 주시면 감사드리겠습니다. ^^

반응형