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 어플리케이션과 직접 통신한다.
| 시리즈 | 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 | | SDK 바이너리 스트림 | 실시간 저장, 재생 |
| CSV | | X, Z, Intensity 컬럼 | Excel 분석, 검증 |
| PCD | | Point Cloud Data (PCL 표준) | Open3D, PCL 처리 |
| PLY | | Polygon File Format | MeshLab, 시각화 |
| STL / OBJ | | 3D 메시 | CAD 비교 |
| HDF5 | | 계층형 바이너리 | 딥러닝 학습 데이터셋 |
- 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) 연동 예제 제공
주요 함수 (개념):
| 함수 | 설명 |
| | 센서 장치 인스턴스 생성 |
| | 센서 연결 |
| | 파라미터(해상도, 주파수 등) 설정 |
| | 현재 파라미터 조회 |
| | 프로파일 스트림 수신 시작 |
| | 최신 프로파일 1장 취득 |
| | 연결 해제 |
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)
포인트 클라우드 세그멘테이션
입력: (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 통합 시 토픽 설계
| 토픽 | 타입 | 방향 | 설명 |
| | | Pub | 실시간 포인트 클라우드 |
| | | Pub | 원시 프로파일 배열 |
| | | Pub | 검사 결과 (결함 클래스 + 파라미터) |
| | | Pub | 심 트래킹 보정량 |
| | 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
- Micro-Epsilon
- Micro-Epsilon:surfaceCONTROL 3D-Snapshot-Sensor
- Micro-Epsilon:reflectCONTROL for shiny surfaces
- Micro-Epsilon:scanCONTROL 3D laser scanners
- LVS
- Machine Vision
Favorite site
- scanCONTROL 3D 레이저스캐너 | Micro-Epsilon
- Micro-Epsilon Software Integration
- Github - sam-xl/scancontrol - ROS2 scanCONTROL 드라이버 (sam-xl, TU Delft)
- - Github - iirob/microepsilon_scancontrol - ROS1 scanCONTROL 드라이버 (iirob)