개발현황

크레플의 R&D를 소개합니다.

R&D

개발현황

라인스캔 기반 불량 검사 시스템의 거리 동기화 구조 설계

  • 관리자
  • 2025.05.08

작성일시 : 2025년 4월 24일 목요일
작성자 : 정혜성

들어가며

안녕하세요. 크레플에서 비전검사 파트를 담당하고 있는 정혜성입니다.
지난 글에서 라인스캔 카메라 프레임 깨짐 문제 해결 과정에 대해 설명을 드리며 플라스타 원단 검사 장비를 한 번 언급했었는데요,,
이번에는 저희가 플라스타 원단 검사 장비를 제작하면서 마주했던 문제와, 이를 해결하기 위해 어떻게 구조를 설계했는지 공유드리며,
같은 문제로 고민중인 분들에게 조금이나마 도움이 되었으면 하는 마음으로 이 글을 작성하게 되었습니다.


생산라인은 이렇게 구성되어 있습니다.

생산 라인 구조

저희가 만들 비전 설비는 고속으로 흘러가는 원단라인스캔 방식으로 촬영하고,
실시간 검사를 통해 불량을 검출하여 커팅 직후 불량 패치에 대해 배출 신호를 발생시켜야 합니다.
핵심은 이미지 내에서 불량이 발생한 지점이 실제 배출 위치에 도달했을 때, 정확한 타이밍에 배출 신호를 보내야 한다는 것입니다.


라인스캔 방식이 뭔가요?

라인 스캔 방식 vs 에어리어 스캔 방식

일반적인 카메라는 한 번에 전체 이미지를 캡처하지만,
라인스캔 카메라는 한 줄(라인)씩 순차적으로 캡처하면서 움직이는 대상을 스캔합니다.


왜 라인스캔이 고속 이동 원단에 적합할까요?

1. 넓은 영역을 고해상도로 담을 수 있습니다.

고속으로 이동하는 원단은 짧은 순간에도 수십 cm 이상 지나갑니다.
이걸 일반 에어리어 카메라로 한 번에 찍으려면 고해상도 센서와 매우 밝은 조명이 필요하며,
셔터 속도 부족으로 모션 블러(Motion Blur)가 발생하기 쉽습니다.
반면 라인스캔은 한 줄씩 캡처하면서 움직이는 대상과 함께 이미지가 만들어지기 때문에,
고속 이동 중인 대상도 블러 없이 선명한 이미지로 담을 수 있습니다.

모션 블러 예시

2. 검사 대상이 연속적일 때 더 유리합니다.

롤 형태의 원단, 필름, 시트 등 끊기지 않고 계속 흐르는 대상은 라인스캔 방식으로 끝없이 긴 이미지를 만들 수 있어 불량이나 패턴 변화 탐지에 유리합니다.

3. 균일한 밝기의 조명 구현이 더 쉽습니다

에어리어 카메라는 한 번에 넓은 영역을 촬영해야 하므로 조명이 넓은 면적에 고르게 퍼져야 합니다.
하지만 실제 환경에서는 중앙과 가장자리 간 밝기 차이가 생기기 쉽고, 그림자나 반사로 인해 밝기 불균형 문제가 발생할 수 있습니다.
반면 라인스캔 카메라는 한 줄만 비추면 되기 때문에,
조명을 세밀하게 제어할 수 있고 좁은 범위에 균일한 광량을 안정적으로 유지할 수 있습니다.


문제는 여기서 시작됐습니다

원단의 속도는 언제든 변할 수 있고, 수시로 정지 했다가 재가동 될 수 있습니다.
검사 위치와 배출 위치 사이 거리도 1M 이상 떨어져 있었습니다.
심지어 원단을 정지시키거나 속도를 제어할 수 있는 권한이 없었고, 단지 원단의 움직임을 추적하며 검사만 할 수 있는 상황이었습니다.
하부는 공간 제약으로 인해 WD 가 짧은 대신 FOV 가 작은 카메라로 두 대 사용하면서 상/하부 카메라는 서로 분해능이 달라졌습니다.

단순히 "불량이 보이면 몇 초 후에 신호를 보내면 된다"는 식으로 간단히 해결할 수 있는 문제가 아니었습니다.
불량을 제대로 검출 하더라도 배출 위치에서 신호를 정확히 보내지 못한다면 그대로 유출이 발생할 수 있는 상황이었습니다.


라인스캔, 생각보다 까다롭습니다

라인스캔을 처음 다뤘을 땐, 단순히 “움직이는 걸 한 줄씩 찍는 카메라구나” 정도로 생각했습니다.
하지만 실제로 시스템에 적용해보니, 생각보다 훨씬 까다로운 점이 많았습니다.

초점 맞추기 어렵습니다.

일반적인 카메라는 정지된 상태에서 찍으면 전체 형상이 보여서 초점을 맞추기 쉽습니다.
하지만 라인스캔 카메라는 정지 상태에서 찍으면 그저 세로로 길쭉한 ‘선’만 찍힙니다.
그래서 움직이면서 초점을 맞춰야 하는데, 이게 생각보다 쉽지 않습니다.

정지상태 이미지비교

속도 맞추기도 어렵습니다.

라인스캔은 ‘속도’가 곧 ‘이미지 품질’입니다.
속도가 빨라지면 이미지가 찌그러지고, 느려지면 늘어납니다.
결국 라인스캔 카메라는 거리 기반으로 얼마나 균일하게 캡처하느냐가 핵심입니다.

속도에 따른 이미지 왜곡 예시

분해능 계산하기도 어렵습니다.

라인스캔에서의 분해능은 단순히 "카메라 몇 픽셀짜리냐"로 계산되지 않습니다.
라인 당 픽셀 수와 라인 간 거리, 그리고 이동 속도까지 함께 고려해야 하기 때문이죠.
게다가 실 사용 환경에서는 카메라 설치 각도와 거리에 따라서 미묘하게 달라집니다.

카메라가 찍은 이미지 자체만으로는 아무것도 판단할 수 없습니다

불량 위치도 거리 기준으로 환산해야 하기 때문에, 거리와 싱크가 맞지 않으면 불량은 맞게 잡아도 배출 타이밍이 틀어집니다.

이처럼 라인스캔 이미지는 항상 거리 정보와 함께 해석돼야 하기에, 저희는 엔코더 기반의 거리 동기화 구조를 별도로 설계하게 되었습니다.


그래서, 우리는 이렇게 설계했습니다

라인스캔 시스템의 특성상 거리 기반 동기화는 선택이 아닌 필수였습니다.
저희는 라인스캔 이미지의 ‘라인 수’가 실제 원단의 이동 거리와 정확히 일치하도록 만들기 위해,
하드웨어와 소프트웨어를 모두 아우르는 구조를 설계했습니다.

엔코더 기반 거리 추적

속도가 아닌 ‘거리’ 기준으로 불량 위치를 추적하기 위해,
저희는 원단이 통과하는 롤러에 고정밀 엔코더를 장착했습니다.
이 엔코더는 원단이 굴러가는 동안 회전하며 펄스 신호를 지속적으로 발생합니다.

엔코더 설치 사진

하지만 중요한 건, 단순히 엔코더를 장착했다고 끝이 아니라는 것입니다.
펄스를 하나도 놓치지 않고, 실시간으로 정확히 수집해야 신뢰할 수 있는 거리 계산이 가능해집니다.

이를 위해 저희는 다음과 같은 구조를 설계했습니다.

  • 전용 엔코더 카운터보드를 사용하여 고속 펄스도 누락 없이 안정적으로 수집합니다.
  • 카운터보드를 제어하고 데이터를 수집할 수 있는 C++ 기반 실시간 제어 프로그램을 별도로 개발했습니다.
  • 작업 현장에서 거리와 속도를 직관적으로 확인할 수 있도록, Flutter 기반의 GUI 프로그램을 제작하여 펄스 수, 이동 거리, 순간 속도 등을 실시간으로 모니터링할 수 있게 했습니다.

이 구조 덕분에 저희는 원단의 누적 이동 거리와 현재 속도를 정확하게 계산할 수 있었고,
이후 라인스캔 이미지 내에서 검출된 불량의 위치를 거리 기준으로 환산하는 기반이 마련되었습니다.

핵심은 엔코더 롤러 둘레, 250mm

원의 둘레를 구하는 공식은 C = 2πr입니다.
여기서 π는 소수점 아래가 무한히 이어지는 무리수로,
보통 계산에서는 3.14 혹은 3.1416 등으로 반올림하여 사용합니다.

하지만 이처럼 반올림한 값을 사용하면,
미세한 오차가 누적되어 전체 거리 계산에 영향을 줄 수 있습니다.
특히 수천 라인, 수만 펄스가 쌓이는 라인스캔 시스템에서는 이 누적 오차가 무시할 수 없는 수준이 됩니다.

그래서 저희는 거리 동기화의 정밀도를 보장하기 위해
엔코더가 연결된 롤러의 둘레 자체를 정확히 250mm로 정밀 가공했습니다.
즉, 계산이 아니라 실측을 기준으로 삼아 오차를 원천 차단한 것입니다.

이 부분이 진짜 핵심인 이유는 두 가지 입니다.

1. 펄스 거리 정합 세팅이 단순해집니다

  • 실측 기준으로 롤러 둘레를 딱 250mm로 맞추면, 5000펄스 기준으로 1펄스 = 정확히 0.05mm가 되어 거리 단위를 시스템에 정확하고 단순하게 적용할 수 있습니다.
  • 누적 오차를 무시할 수 있는 구조가 되므로, 펄스 신호를 1:1로 사용하지 않고도 거리 동기화가 가능합니다.

2. 분해능 오차를 무시할 수 있습니다

  • 라인스캔 시스템에서는 일반적으로 라인 수 × 라인 간 거리 = 촬영된 거리로 계산합니다.
  • 그런데 실제 환경에서는 카메라 설치 높이, 렌즈 초점, FOV 차이 등에 따라 픽셀당 물리적 거리(분해능)에 미세한 차이가 발생합니다. (현실적으로 오차 없이 세팅하는 것 자체가 불가능합니다.)
  • 하지만 저희 시스템은 1펄스 = 0.05mm 기준으로 라인당 촬영 트리거를 발생시키고 있기 때문에, 실제로 이미지 상 1픽셀이 정확히 0.05mm가 아니어도 괜찮습니다.
  • 왜냐하면, 라인 자체가 0.05mm 간격으로 촬영되었다는 것이 하드웨어적으로 보장되기 때문입니다.
  • 즉, 이미지의 해상도나 픽셀 분해능과 무관하게, 우리는 정확히 0.05mm마다 한 줄씩 촬영했다는 사실만으로 거리 해석이 가능합니다.

이처럼, 실측 기반의 둘레 250mm 정밀 가공은 단순히 수치 맞추기가 아니라 거리 동기화 전반의 정확성과 유지보수 편의성을 모두 보장해주는 구조적 기반이었습니다.

검사 장비 구성
검사장비구성

위 그림을 기준으로 다시 정리해보면 다음과 같습니다.

엔코더 펄스 신호는 신호 분배기를 통해 두 경로로 나뉘어 전달됩니다.
하나는 엔코더 카운터보드로 연결되어, 실시간 거리 계산에 활용됩니다.
다른 하나는 조명 컨트롤러로 전달되어, 라인스캔 카메라에 트리거 신호를 발생시킵니다.

조명 컨트롤러는 각 카메라에 필요한 주기로 트리거를 전송하는데, 이때 카메라별 해상도 특성을 고려해 펄스 신호를 조정합니다.
즉, 펄스를 1:1로 사용하지 않고 일정 비율로 나누어 사용해 각 카메라가 설정한 라인 수만큼 정확한 거리 기준을 유지하도록 만든 구조입니다.

카메라는 트리거 1회 당 1라인을 촬영하며 1000 라인이 완성되면 하나의 프레임을 반환하도록 설정합니다.

상부 카메라는 프레임당 1000 라인을 고정으로 촬영하며, 1라인당 0.1mm, 총 10cm의 실제 거리를 하나의 프레임으로 캡처합니다.
반면 하부 카메라는 같은 1000라인이지만, 라인 간 거리를 0.075mm로 설정해 한 프레임당 7.5cm의 실제 거리를 커버하도록 구성했습니다.


불량, 이제는 거리로 계산하고 정확히 배출합니다

이제 거리 기반 동기화 구조를 통해, 저희는 라인스캔 이미지 내에서 검출된 불량이 실제 원단 상 어디에서 발생했는지를 정확히 계산할 수 있게 되었습니다.

1. 불량의 상대 거리 계산

불량이 검출된 프레임 내에서, 해당 불량이 몇 번째 라인에 위치해 있는지를 기준으로 상대 거리값을 계산합니다.

예를 들어, 한 프레임이 1000라인이고, 해당 불량이 250라인 지점에서 발생했다면,

1라인당 거리가 0.1mm일 경우,
→ 불량은 해당 프레임 시작 지점으로부터 25mm 떨어진 위치에서 발생한 것이 됩니다.

프레임 내 상대거리

2. 절대 거리값으로 환산

이전 프레임 누적 거리값 + 현재 프레임 상대 거리값 = 절대 거리값 으로 불량의 절대 거리값을 계산할 수 있습니다.

예를 들어, 해당 프레임이 4번째 프레임이었다고 가정하면,
앞서 누적된 거리값 300mm에 상대 거리값을 더해
300mm + 25mm = 325mm가 됩니다.

절대거리 계산

3. 배출 시점 판단

엔코더 카운터보드(정확히는 제어프로그램)는 현재까지 이동한 거리를 계산하고 있습니다.
현재 배출 위치 176mm는 원단이 흘러갈 수록 점점 증가할 겁니다.
배출 위치 거리값이 불량 절대 거리값과 같아지는 순간, 불량이 배출 위치에 도달했다고 판단하고 불량 배출 신호를 발생시키면 됩니다.

배출 시점 판단


정리해보면

플라스타 원단 검사 장비를 설계하면서 저희가 직면한 가장 근본적인 과제는 두 가지였습니다.

  1. 여러 대의 라인스캔 카메라를 사용하는 상황에서, 불량의 위치를 원단 내 절대 거리를 기준으로 정확히 계산해야 한다는 점
  2. 불량이 발생한 지점이 정확히 배출 위치에 도달했을 때, 딱 맞는 타이밍에 신호를 보내야 한다는 점

이를 해결하기 위해

  • 라인스캔 카메라의 구조적 한계를 이해하고,
  • 엔코더 기반 거리 동기화 구조를 정밀하게 설계했으며,
  • 하드웨어, 소프트웨어, GUI까지 아우르는 통합 시스템을 구축했습니다.

특히,

  • 250mm로 정밀 가공된 엔코더 롤러,
  • 1펄스 = 0.05mm의 정합 거리 단위,
  • 프레임 단위 거리 정합을 고려한 분해능 설계,
  • 불량의 상대 위치 → 절대 거리 환산 → 거리 도달 시점의 배출 제어 흐름을 통해

라인스캔 기반 시스템에서 속도 변화나 정지와 관계없이, 정확한 위치에서 불량을 제거할 수 있는 구조를 만들어 냈습니다.


마치며

이번 프로젝트는 단순한 비전검사 장비 구축을 넘어서, '거리 동기화'를 중심으로 비전, 제어, 트리거 시스템을 하나의 기준으로 통합해낸 구조적 설계 경험이었습니다.

비슷한 문제로 고민 중이신 분들께 이 글이 작은 힌트가 되길 바라며 이만 마치도록 하겠습니다.

긴 글 읽어주셔서 감사합니다.