Skip to content

Micro-Epsilon:scanCONTROL

3D 레이저스캐너를 이용한 인라인 품질 검사

Categories

About

scanCONTROL 3D 스캐너는 다양한 고정밀 인라인 3D 측정에 사용됩니다. 스캐너나 대상체를 움직이면서 스캐닝을 하게 되는 데, 스캐너의 중량이 매우 가벼운 까닭에 로봇과 함께 사용되거나 인라인 생산 모니터링 과정에 모두 사용 가능합니다. 해당 3D 레이저스캐너는 우수한 정밀도로 미세한 편차 역시 신속하게 감지 및 측정할 수 있고, 절대 정확도가 매우 우수하고 사이즈 역시 매우 컴팩트하다는 이점이 있습니다. Micro-Epsilon사는 scanCONTROL 3000과 신제품 scanCONTROL 3002 시리즈의 출시로 다양한 측정 영역을 커버할 수 있을 뿐만 아니라 레드 또는 블루 레이저 기술을 적용하거나 폭넓은 액세서리를 갖춘 포괄적인 제품 포트폴리오를 제공할 수 있게 되었습니다.

scanCONTROL 3D 레이저스캐너는 최신 GigE Vision과 GenICam 표준을 기반으로 하며, 이에 따라 다양한 이미지 처리 환경에 통합될 수 있습니다. 더불어 파워풀한 3DInspect 소프트웨어는 파라미터 설정, 평가, 출력에 활용됩니다.

특징

  • 후처리 과정에서 데이터 손실 없는 리얼 3D 포인트 클라우드
  • 최대 10,000 Hz의 고속 3D 스캔
  • 초소형 사이즈의 제품으로 다양한 측정 환경에 사용 가능
  • 작고 컴팩트한 사이즈로 로봇 어플리케이션에 적합
  • 레드 또는 블루 레이저 타입 제공
  • GenICam / GigE Vision 표준을 이용한 편리한 통합
  • 파워풀한 3DInspect 소프트웨어를 이용한 측정, 처리 및 평가
  • Cognex사의 VisionPro와 호환

scanCONTROL 시리즈

Micro-Epsilon의 scanCONTROL 라인은 산업용 레이저 프로파일 스캐너의 대표 제품군이다.

컨트롤러가 센서 하우징 내에 일체화(integrated controller)되어 있고, Ethernet·RS422 인터페이스 및 SDK(LLT.DLL)를 통해 PC 어플리케이션과 직접 통신한다.

scanCONTROL 주요 시리즈 비교

시리즈

X 해상도 (points/profile)

최대 프로파일 주파수

최대 측정 속도

레이저 색상

특징

25x0

640

300 Hz

192,000 pts/s

적색

범용, 저비용

26x0

640

4,000 Hz

2,560,000 pts/s

적색/청색

고속, 컴팩트

29x0

1,280

2,000 Hz

2,560,000 pts/s

적색/청색

고해상도, 고속

30x0

1,280

300 Hz (표준)

적색/청색

대범위, 고정밀

30x2

1,280

2,000 Hz (HS)

2,560,000 pts/s

적색/청색

고성능 2D/3D

3002 (BL)

1,280

2,000 Hz

청색(Blue Laser)

적열 금속·용접 특화

INFORMATION

청색 레이저(BL) 모델 : 파장이 짧아 700 °C 이상의 적열 금속 표면에서도 안정적으로 측정 가능 (적색 레이저로는 센서 포화 발생). 용접 인라인 검사에 필수.

데이터 포맷 및 구조

프로파일(Profile) 데이터 구조

scanCONTROL 센서는 매 스캔마다 1개의 프로파일(단면) 데이터를 생성한다.

Profile (단면 1장)
├── Header
│   ├── Timestamp         (uint32, 10 µs 단위)
│   ├── Profile Counter   (uint32, 누락 검출용)
│   ├── Encoder Value     (int32, 외부 엔코더 값)
│   └── Status Flags      (uint16)
└── Points[N]              (N = 640 또는 1280)
    ├── X (float32, mm)    — 레이저 라인 방향 횡축
    ├── Z (float32, mm)    — 깊이(높이) 측정값
    ├── Intensity (uint16) — 수광 강도
    └── Width (uint16)     — 반사광 선폭 (선택)
  • 유효하지 않은 포인트(측정 불가 영역)는 INVALID_VALUE (통상 −32768 또는 NaN)로 마킹된다.
  • 포인트 배열은 센서 내부 캘리브레이션을 거쳐 실제 물리 단위(mm)로 보정된 값으로 전달된다.

컨테이너(Container) 모드

여러 프로파일을 묶어 한 번에 전송하는 Container Set 방식을 지원한다.

항목

설명

Container Size

한 번에 묶어 전송하는 프로파일 수 (1 ~ N, 설정 가능)

전송 단위

Array 또는 Matrix 형태

용도

고속 측정 시 네트워크 오버헤드 절감, 배치 처리 최적화

바이너리 버퍼 레이아웃 (SDK 기준)

LLT SDK가 반환하는 바이너리 버퍼는 프로파일 하나당 다음 구조를 가진다.

오프셋

크기

타입

설명

0

4

uint32

Profile Counter

4

4

uint32

Timestamp (× 10 µs)

8

4

int32

Encoder / Trigger Value

12

2

uint16

Status / Flag

14

2

uint16

(Reserved)

16

N × 4

float32[]

X 좌표 배열 (mm)

16 + N×4

N × 4

float32[]

Z 좌표 배열 (mm)

16 + N×8

N × 2

uint16[]

강도(Intensity) 배열

16 + N×10

N × 2

uint16[]

Width 배열 (옵션)

WARNING

마지막 4바이트는 타임스탬프가 덮어쓰는 경우가 있음 → ROS 드라이버 등에서 마지막 포인트 누락 이슈 존재.

3D 포인트 클라우드 조합

단일 프로파일은 2D 단면이므로, 센서를 물리적으로 이동(로봇 암 또는 컨베이어)시키면서 Y축 좌표를 추가하여 3D 포인트 클라우드를 구성한다.

# LVS 프로파일 → 3D 포인트 클라우드 변환 예시
# LVS profile → 3D point cloud conversion example

import numpy as np

def profiles_to_pointcloud(profiles: list[dict], y_step_mm: float) -> np.ndarray:
    """
    profiles: [{'x': np.array, 'z': np.array, 'intensity': np.array}, ...]
    y_step_mm: 각 프로파일 간 Y 이동 거리 (mm)
    반환: (N, 4) 배열 [x, y, z, intensity]
    """
    points = []
    for i, prof in enumerate(profiles):
        x = prof['x']                          # X 좌표 배열 (mm)
        z = prof['z']                          # Z 높이 배열 (mm)
        y = np.full_like(x, i * y_step_mm)    # Y는 이동 거리로 계산
        intensity = prof['intensity'].astype(np.float32)

        # 유효 포인트만 필터링 (Filter valid points only)
        valid = np.isfinite(x) & np.isfinite(z) & (z > -32767)
        pts = np.stack([x[valid], y[valid], z[valid], intensity[valid]], axis=-1)
        points.append(pts)

    return np.concatenate(points, axis=0)  # shape: (N, 4)

파일 저장 포맷

포맷

확장자

설명

용도

Binary Profile

.llt / .bin

SDK 바이너리 스트림

실시간 저장, 재생

CSV

.csv

X, Z, Intensity 컬럼

Excel 분석, 검증

PCD

.pcd

Point Cloud Data (PCL 표준)

Open3D, PCL 처리

PLY

.ply

Polygon File Format

MeshLab, 시각화

STL / OBJ

.stl / .obj

3D 메시

CAD 비교

HDF5

.h5

계층형 바이너리

딥러닝 학습 데이터셋

  • scanCONTROL 3D-View 소프트웨어를 통해 PCD, PLY, STL, CSV 포맷으로 내보내기 지원.
  • 딥러닝 파이프라인용 대용량 데이터셋은 HDF5 포맷 권장.

통신 인터페이스

Ethernet (GigE)

항목

내용

프로토콜

UDP (프로파일 데이터 스트림), TCP (설정·제어)

표준

GeniCam / GenApi 기반

IP 설정

센서 Config 소프트웨어로 고정 IP 할당

포트

기본 50000 (데이터), 50001 (제어) — 모델별 상이

지연 (latency)

< 1 ms (LAN 환경)

최대 대역폭

1 Gbps (GigE Vision)

RS422

  • 저속 설정·결과 전송 또는 동기화·트리거 신호 전용으로 사용
  • Modbus 프로토콜 지원 → PLC 직결 가능
  • 핀 배열 : 6-pole 커넥터, 120 Ω 내장 종단 저항

트리거 입력 (External Trigger)

  • 고속 외부 트리거 입력 단자 보유
  • 단위: 10 µs (셔터 시간 및 유휴 시간 설정)
  • 프로파일 주파수 = 100,000 / (shutter_time + idle_time) Hz
  • 멀티-스캐너 동기화(Synchronization) 지원

엔코더 입력

  • 이동 방향 Y축 좌표 계산을 위한 로터리 엔코더 신호 입력
  • 엔코더 카운터 값이 각 프로파일 헤더에 포함됨
  • 이를 통해 정확한 Y 스텝 계산 → 고품질 3D 재구성 가능

SDK / API

LLT SDK (Windows)

  • 라이브러리: LLT.DLL (C/C++, stdcall/cdecl 모두 지원)
  • 정적/동적 로딩 모두 지원
  • C#, LabVIEW, Python(ctypes/cffi) 연동 예제 제공

주요 함수 (개념):

함수

설명

CreateLLTDevice()

센서 장치 인스턴스 생성

Connect()

센서 연결

SetFeature()

파라미터(해상도, 주파수 등) 설정

GetFeature()

현재 파라미터 조회

TransferProfiles()

프로파일 스트림 수신 시작

GetActualProfile()

최신 프로파일 1장 취득

Disconnect()

연결 해제

Linux C++ SDK / Open Source

  • GeniCam 표준 기반 C++ 라이브러리 제공
  • ARM 임베디드 PC(Raspberry Pi 등) 제한적 지원
  • ROS/ROS2 드라이버 오픈소스: sam-xl/scancontrol (GitHub)
    • ROS2 Humble (Ubuntu 22.04), Jazzy (Ubuntu 24.04) 검증 완료
    • 출력 토픽: sensor_msgs/PointCloud2
    • 서비스: set_feature, get_feature, get_resolutions

Python 연동 예시

# scanCONTROL SDK Python 연동 예시 (ctypes 기반)
# scanCONTROL SDK Python binding example via ctypes

import ctypes
import numpy as np

# DLL 로드 (Load DLL)
llt = ctypes.WinDLL("LLT.dll")

HANDLE = ctypes.c_void_p
N_POINTS = 1280  # 센서 해상도에 따라 변경

def get_profile(handle: HANDLE) -> dict:
    """
    단일 프로파일 취득 (Get single profile)
    Returns: {'x': np.array, 'z': np.array, 'intensity': np.array}
    """
    buf_size = N_POINTS * 10 + 16           # X(4) + Z(4) + Intensity(2) + Header
    buf = (ctypes.c_uint8 * buf_size)()

    ret = llt.GetActualProfile(handle, buf, buf_size)
    if ret < 0:
        raise RuntimeError(f"GetActualProfile 실패: {ret}")

    # 헤더 파싱 (Parse header)
    counter   = ctypes.c_uint32.from_buffer_copy(buf,  0).value
    timestamp = ctypes.c_uint32.from_buffer_copy(buf,  4).value  # ×10 µs
    encoder   = ctypes.c_int32.from_buffer_copy(buf,   8).value

    # 데이터 추출 (Extract data arrays)
    x   = np.frombuffer(buf, dtype=np.float32, count=N_POINTS, offset=16)
    z   = np.frombuffer(buf, dtype=np.float32, count=N_POINTS, offset=16 + N_POINTS*4)
    inten = np.frombuffer(buf, dtype=np.uint16, count=N_POINTS, offset=16 + N_POINTS*8)

    return {
        'counter':   counter,
        'timestamp': timestamp * 1e-5,      # 초 단위 변환 (convert to seconds)
        'encoder':   encoder,
        'x':         x.copy(),
        'z':         z.copy(),
        'intensity': inten.copy()
    }

용접 품질검사 적용

측정 항목

LVS를 이용한 용접 비드(Weld Bead) 검사에서 추출하는 주요 형상 파라미터:

측정 항목

기호

단위

설명

비드 높이

h

mm

모재 기준면 대비 비드 최고점

비드 폭

w

mm

비드 풋프린트(접선) 폭

비드 단면적

A

mm²

단면 프로파일 면적 적분

언더컷 깊이

u

mm

비드 경계부 모재 함몰 깊이

오버랩(Overlap)

mm

비드가 모재 위로 과도하게 덮인 양

기공(Porosity)

프로파일 불연속점, 함몰 패턴

크랙

급격한 Z값 불연속 패턴

직진도

mm/m

비드 중심선 편차

시작/종료점 위치

mm

용접 시작·끝점 위치 오차

인라인 검사 배치 구성

[용접 토치]
     ▼ (이동 방향 Y)
[scanCONTROL 센서]  ←── 토치 후방 장착 (Post-weld inspection)
     │  또는
     └── 토치 전방 장착 (Pre-weld seam tracking)

        레이저 라인 (X축)
        ─────────────────────────────
        ▲ Z (높이)
        └──────────────────────── X
  • Pre-weld : 이음새 위치 추적(Seam Tracking) → 용접 토치 실시간 위치 보정
  • Post-weld : 비드 형상 측정 → 품질 합/불 판정, 결함 분류

환경 고려사항

항목

내용

적열 금속

청색 레이저(BL) 모델 필수 (700 °C 이상 안정 측정)

용접 스패터

보호 유리 / Air Purge(에어 퍼지) 장착 권장

연기·흄

대기 중 미립자로 레이저 산란 → 필터링 or 배기 시스템 구성

진동

센서 고정 구조 강화, 프로파일 평균화(Averaging) 적용

반사율 편차

HDR(High Dynamic Range) 모드 활용 (scanCONTROL 3000 시리즈)

온도 영향

센서 주변 온도 보상 or 워밍업 후 영점 조정

딥러닝 모델 적용

입력 데이터 표현 방식

LVS 데이터를 딥러닝 모델에 입력할 때 주요 표현 방식은 다음과 같다.

표현 방식

설명

적합 모델

장단점

2D 프로파일 이미지

프로파일을 이미지(H×W)로 적층

CNN, ResNet, U-Net

기존 2D 모델 재사용 가능; 3D 기하 정보 일부 손실

Depth Map

Z값을 그레이스케일 이미지로 표현

CNN 계열

구현 간단; 국소 이상 탐지 용이

Multi-channel Map

X, Z, Intensity를 별도 채널로 구성 (3-ch)

CNN 계열

풍부한 특징; 채널 설계 중요

Raw Point Cloud

(X, Y, Z, I) 포인트 집합

PointNet, PointNet++, PTv3

기하 보존; 불규칙 샘플링 처리 필요

Voxel Grid

포인트 클라우드를 3D 복셀로 변환

3D-CNN, VoxNet

공간 관계 학습 용이; 메모리 집약적

Cross-section Sequence

연속 프로파일을 시계열로 처리

LSTM, Transformer

용접 진행 방향 패턴 학습

권장 딥러닝 아키텍처

이상 탐지 (Anomaly Detection)

입력: Depth Map 또는 Multi-channel Map (H × W × C)
모델: Autoencoder (CNN 기반)
  Encoder → Bottleneck → Decoder
출력: 재구성 오차(Reconstruction Error) → 임계값 초과 = 불량

적용 사례:
  - 기공(Porosity) 탐지
  - 언더컷 탐지
  - 비드 형상 이상 탐지

결함 분류 (Defect Classification)

입력: 비드 단면 프로파일 Crop (고정 크기)
모델: ResNet-18 / EfficientNet-B0 (경량)
출력: 결함 클래스 (정상 / 기공 / 언더컷 / 크랙 / 오버랩 / 미용접)

형상 파라미터 회귀 (Regression)

입력: 프로파일 단면 배열
모델: 1D-CNN + FC 레이어
출력: [비드폭, 비드높이, 단면적, 언더컷깊이] (mm 단위)

포인트 클라우드 세그멘테이션

입력: (N, 4) — [x, y, z, intensity]
모델: PointNet++ / PTv3 (Point Transformer v3) / Concerto
출력: 포인트별 클래스 레이블 (비드 영역 / 모재 / 결함)

데이터 전처리 파이프라인

# LVS 데이터 전처리 파이프라인
# LVS data preprocessing pipeline

import numpy as np
import cv2

class LVSPreprocessor:
    """
    LVS 프로파일 데이터 전처리기
    LVS profile data preprocessor
    """
    def __init__(
        self,
        n_points: int = 1280,       # 프로파일 포인트 수
        n_profiles: int = 512,      # 수집할 프로파일 수 (Y 방향 길이)
        z_min: float = -5.0,        # Z 유효 범위 최솟값 (mm)
        z_max: float = 10.0,        # Z 유효 범위 최댓값 (mm)
    ):
        self.n_points = n_points
        self.n_profiles = n_profiles
        self.z_min = z_min
        self.z_max = z_max

    def build_depth_map(self, profiles: list[dict]) -> np.ndarray:
        """
        프로파일 리스트 → Depth Map (H × W) float32
        Profile list → Depth Map (H × W) float32
        """
        depth = np.full((self.n_profiles, self.n_points), np.nan, dtype=np.float32)
        for i, prof in enumerate(profiles[:self.n_profiles]):
            z = prof['z'].copy()
            # 범위 밖 값 무효 처리 (Invalidate out-of-range values)
            z[(z < self.z_min) | (z > self.z_max)] = np.nan
            depth[i] = z

        # NaN을 0으로 대체 후 정규화 (Replace NaN with 0, then normalize)
        valid_mask = np.isfinite(depth)
        depth = np.where(valid_mask, depth, 0.0)
        depth = (depth - self.z_min) / (self.z_max - self.z_min)   # [0, 1]
        depth = np.clip(depth, 0.0, 1.0)
        return depth  # shape: (H, W)

    def build_multichannel(self, profiles: list[dict]) -> np.ndarray:
        """
        프로파일 리스트 → 3채널 맵 (H × W × 3)
        Channel 0: Z (깊이), Channel 1: Intensity, Channel 2: X (가로 위치)
        """
        dm = self.build_depth_map(profiles)
        intensity_map = np.zeros((self.n_profiles, self.n_points), dtype=np.float32)
        x_map = np.zeros_like(intensity_map)

        for i, prof in enumerate(profiles[:self.n_profiles]):
            inten = prof['intensity'].astype(np.float32)
            intensity_map[i] = inten / 65535.0   # uint16 정규화
            x_map[i] = (prof['x'] - prof['x'].min()) / (prof['x'].ptp() + 1e-8)

        return np.stack([dm, intensity_map, x_map], axis=-1)   # (H, W, 3)

    def extract_bead_roi(
        self,
        depth_map: np.ndarray,
        roi_width_px: int = 200
    ) -> np.ndarray:
        """
        비드 중심 자동 감지 후 ROI 크롭
        Auto-detect bead center and crop ROI
        """
        # 열 방향 평균으로 비드 중심 추정 (Estimate bead center via column mean)
        col_mean = np.nanmean(depth_map, axis=0)
        center = int(np.argmax(col_mean))
        left  = max(0, center - roi_width_px // 2)
        right = min(depth_map.shape[1], left + roi_width_px)
        return depth_map[:, left:right]

학습 데이터셋 설계

항목

권장 내용

레이블 체계

ISO 5817 또는 AWS D1.1 기준 결함 등급 (A / B / C / D)

클래스 불균형

Oversampling(SMOTE 적용) 또는 Focal Loss 사용

Augmentation

Z축 노이즈 추가, 프로파일 좌우 반전, Y방향 이동, 랜덤 크롭

저장 포맷

HDF5 (datasets: depth_map, label, params, metadata)

Train/Val/Test 분할

7 : 1 : 2 (용접 조건별 Stratified Split)

최소 샘플 수

클래스당 최소 500장 이상 (결함 클래스 포함)

평가 지표

지표

수식 / 설명

용도

Accuracy

(TP + TN) / Total

전체 정확도

Precision

TP / (TP + FP)

불량 검출 정밀도 (오탐 최소화)

Recall (Sensitivity)

TP / (TP + FN)

불량 검출 재현율 (미탐 최소화) ← 핵심

F1-Score

2 × (P × R) / (P + R)

불균형 클래스 종합 지표

IoU (Segmentation)

TP / (TP + FP + FN)

결함 영역 세그멘테이션 품질

MAE (Regression)

Σ|y_pred − y_true| / N

형상 파라미터 회귀 오차 (mm)

RMSE (Regression)

√(Σ(y_pred − y_true)² / N)

형상 파라미터 회귀 오차 (mm)

플랫폼 아키텍처 (권장)

전체 데이터 플로우

[scanCONTROL 센서]
        │ GigE (UDP/TCP)
[Edge PC / 임베디드 호스트]
  ├── scanCONTROL SDK (LLT.DLL / Linux C++)
  ├── ROS2 Driver (선택 사항)
  ├── 실시간 프리프로세싱 (Depth Map / Point Cloud 변환)
  └── gRPC 스트림 → [CVP 서비스]
[CVP 추론 서버]
  ├── 딥러닝 모델 (TorchScript / ONNX / TensorRT)
  ├── 형상 파라미터 추출
  └── 결함 분류 / 이상 점수 계산
[Supabase DB]                [Prometheus / Grafana]
  ├── 검사 결과 저장            └── 실시간 모니터링
  ├── 결함 이미지/포인트클라우드 S3
  └── RLS 정책 (라인별 접근 제어)
[CVP 대시보드 (React / TypeScript)]
  ├── 실시간 프로파일 시각화
  ├── 통계 리포트 (합/불 추이)
  └── 결함 맵 오버레이 표시

ROS2 통합 시 토픽 설계

토픽

타입

방향

설명

/scancontrol/pointcloud

sensor_msgs/PointCloud2

Pub

실시간 포인트 클라우드

/scancontrol/profile_raw

std_msgs/Float32MultiArray

Pub

원시 프로파일 배열

/inspection/result

std_msgs/String (JSON)

Pub

검사 결과 (결함 클래스 + 파라미터)

/robot/weld_correction

geometry_msgs/Twist

Pub

심 트래킹 보정량

/scancontrol/set_feature

Service

Sub

센서 파라미터 런타임 변경

주요 파라미터 레퍼런스

센서 설정 파라미터

파라미터

단위

기본값

설명

Shutter Time

10 µs

모델별 상이

노출 시간 (짧을수록 모션 블러 감소)

Idle Time

10 µs

모델별 상이

셔터 간 대기 시간

Profile Frequency

Hz

계산값

= 100,000 / (shutter + idle)

Container Size

count

1

묶음 전송 프로파일 수

Resolution

points

1280

X축 포인트 수 (640 / 1280 선택)

Partial Profile Start

index

0

유효 프로파일 시작 인덱스

Partial Profile Points

count

1280

유효 포인트 수

Flip X

bool

False

X 좌우 반전

Flip Z

bool

True

Z 상하 반전 (기본 True)

Laser Power

%

100

레이저 출력 (20–100%)

유효 측정 범위 (모델별 참고)

모델

Z 측정 범위

X 측정 범위

Z 기준 해상도

X 해상도

scanCONTROL 2600-25

25 mm

12 mm

1 µm

~18 µm

scanCONTROL 2600-100

100 mm

55 mm

2 µm

~86 µm

scanCONTROL 2900-25

25 mm

12 mm

0.5 µm

~9 µm

scanCONTROL 2900-100

100 mm

55 mm

1 µm

~43 µm

scanCONTROL 3000-100

100 mm

55 mm

1 µm

~43 µm

scanCONTROL 3002-100/BL

100 mm

55 mm

1 µm

~43 µm

Documentations

  • Klarák et al., Autoencoders for Point Cloud Reconstruction, Sensors 2023
  • Nature Scientific Reports: Weld seam object detection via 2D+3D fusion, 2024
  • ScienceDirect: Graph Neural Networks for patterned welds detection, 2025
  • ACM Computing Surveys: Point Cloud Deep Learning in Industrial Production, 2025

See also

Favorite site