콘텐츠로 건너뛰기
STAGING SERVER
DEVELOPMENT SERVER

이미지 캡처 및 처리#

이 항목에서는 Smart blaze 카메라로 이미지를 캡처하고 처리하는 방법을 설명합니다.

Smart blaze 카메라에서의 이미지 획득 및 처리는 일반 x86 Linux 호스트 컴퓨터에서와 동일한 방식으로 작동합니다. VM과 카메라 간의 가상 네트워크 연결을 통해 이를 수행하므로, 소프트웨어가 호스트에서 실행되든 Smart blaze의 VM에서 실행되든 제어 방식이나 이미지 획득에는 차이가 없습니다.

Smart blaze의 VM 내부에서 실행되는 소프트웨어의 경우, 현재 C++ 및 pypylon이 포함된 Python이 지원됩니다. pylon용 C# 바인딩은 아직 Smart blaze 카메라에서 테스트되지 않았습니다.

이러한 일관된 동작은 VM과 카메라 간에 가상 네트워크 연결을 설정하여 달성되므로, 소프트웨어가 호스트에서 실행되든 Smart blaze의 VM에서 실행되든 제어 또는 이미지 획득에 차이가 없습니다.

문서 및 샘플#

blaze 카메라 구성 및 그랩 루프 설정에 대한 지침은 blaze Programmer's Guide를 참조하십시오. 개발 컴퓨터에 Basler pylon 및 pylon Supplementary Package for blaze를 설치한 후, 다음 설치 디렉토리에서 샘플 코드를 찾을 수 있습니다.

  • /opt/pylon/share/pylon/Samples/blaze/cpp/
  • /opt/pylon/share/pylon/Samples/blaze/Python/pypylon/

Basler 웹사이트에서 Basler pylon 및 Supplementary Package for blaze를 다운로드할 수 있습니다.

CPU 리소스 관리#

Smart blaze 카메라에서 사용 가능한 CPU 리소스(4x Cortex-A53, 1.5 GHz)는 네이티브 카메라 펌웨어와 고객 VM 간에 공유됩니다. 안정적인 이미지 획득 및 깊이 처리를 보장하기 위해 카메라 펌웨어는 실시간 우선순위로 실행되는 반면, 고객 VM은 일반 작업 우선순위로 실행됩니다.

이러한 설계 덕분에 VM의 소프트웨어는 이미지 획득이나 깊이 계산에 영향을 주지 않으면서 4개의 가상 CPU 코어를 모두 최대한 활용할 수 있습니다. 가상 CPU 코어에는 현재 이미지 획득 및 깊이 처리에 필요하지 않은 물리적 코어의 몫만 할당됩니다.

이미지 획득이 진행되는 동안 카메라 펌웨어는 3개의 물리적 코어를 사용합니다. 펌웨어가 프레임 획득 및 처리를 완료하면 VM이 CPU 코어를 거의 독점적으로 사용할 수 있는 시간 창이 생깁니다. 이 시간 창은 다음 프레임 획득이 트리거될 때 끝납니다. 현재 이 시간 창 중 약 20ms가 펌웨어와 VM 간의 가상 네트워크를 통해 이미지 데이터를 전송하는 데 소모되며, 이는 하나의 코어에서 상당한 부분을 차지합니다. 향후 최적화를 통해 이 전송 속도가 빨라지고 리소스 소모가 줄어들 것으로 예상됩니다.

X11 포워딩은 추가적인 지연 시간을 유발하여 그랩 루프를 느리게 만들고 프레임 누락을 초래할 수 있습니다.

애플리케이션이 처리 속도를 따라가지 못하고 프레임 누락이 발생하기 시작하면 프레임 레이트를 낮추는 것을 고려해 보세요.

프레임 레이트 제어#

호스트 컴퓨터의 3D Viewer를 사용하여 수동으로 프레임 레이트를 제어하거나(카메라 전원을 껐다 켜도 설정이 유지되지 않음에 유의) 애플리케이션에서 관련 카메라 파라미터를 구성하여 제어할 수 있습니다.

카메라에서 프레임 획득을 트리거하는 방법에는 여러 가지가 있습니다.

  • 하드웨어 트리거: 카메라는 하드웨어 트리거 신호를 수신할 때만 프레임을 획득합니다.
  • 소프트웨어 트리거: 카메라는 애플리케이션으로부터 소프트웨어 트리거 신호를 수신할 때만 프레임을 획득합니다.
  • 프리런(Free run): 카메라는 내부 주기적 트리거를 사용하여 지속적으로 프레임을 획득합니다. 프리런은 기본 Trigger Mode입니다.

프레임 레이트 제어를 활성화 또는 비활성화하려면 다음을 사용하십시오. AcquisitionFrameRateEnable 파라미터. 활성화된 경우, AcquisitionFrameRate 파라미터를 설정하여 초당 프레임 수(fps) 단위로 원하는 프레임 레이트를 지정할 수 있습니다. 프리런 모드에서 카메라는 요청된 프레임 레이트를 달성하기 위해 내부 타이밍을 자동으로 조정합니다.

트리거 모드에서 프레임 레이트 설정은 허용되는 트리거 신호의 최대 주파수를 정의합니다. 트리거 신호가 너무 빠르게 도착하면 최소 간격보다 빨리 발생한 신호는 무시됩니다.

소프트웨어 트리거를 사용할 때 AcquisitionStatus 파라미터를 확인하여 카메라가 다음 트리거를 수용할 준비가 되었는지 확인할 수 있습니다.

안정적인 접근 방식은 소프트웨어 트리거를 사용하여 애플리케이션이 다음 프레임을 처리할 준비가 되었을 때만 획득이 시작되도록 하는 것입니다. 이를 통해 VM의 애플리케이션은 다음 프레임을 요청하기 전에 처리에 사용 가능한 모든 CPU 리소스를 사용할 수 있습니다.

소프트웨어 트리거 사용 시의 영향

소프트웨어 트리거 방식은 일반적으로 가능한 최대 프레임 레이트보다 낮은 프레임 레이트를 초래합니다. 이는 한 프레임을 처리하고 다음 프레임을 트리거한 후, 애플리케이션이 노출, 깊이 계산, 그리고 VM으로의 네트워크 전송이 완료될 때까지 기다려야 하기 때문입니다.

온도가 정확도에 미치는 영향#

깊이 데이터의 정확도는 일정한 작동 온도를 유지하는 것에 달려 있습니다. 트리거 주기의 변동은 온도 변동을 유발하여 깊이 정확도에 영향을 줄 수 있습니다.

이를 방지하기 위해, TriggerThermalDriftStabilization 파라미터가 기본적으로 활성화되어 있습니다. 소프트웨어 또는 하드웨어 Trigger Mode에서 이 기능이 활성화되면, 카메라 펌웨어는 백그라운드에서 일정한 프레임 레이트로 이미지를 지속적으로 취득 및 처리하며 트리거 수신 시 현재 또는 다음 사용 가능한 이미지를 전달합니다.

백그라운드 처리는 CPU 리소스를 소모하므로, 소프트웨어 트리거 모드에서는 AcquisitionFrameRate 값을 줄이거나 다음 기능을 비활성화해야 합니다. TriggerThermalDriftStabilization 파라미터.

동일 네트워크에서 여러 대의 blaze 카메라 사용하기#

동일 네트워크에서 여러 대의 blaze 카메라(Smart blaze 또는 blaze)를 사용할 때, 카메라 열거(Enumeration) 과정에서 애플리케이션이 실행 중인 Smart blaze 카메라뿐만 아니라 네트워크 내의 다른 도달 가능한 blaze 카메라들도 함께 찾아낼 수 있습니다. 애플리케이션이 실행 중인 Smart blaze 카메라는 "호스트 카메라"라고 부릅니다.

정보

일련번호(Serial Number) 필터 없이 CreateFirstDevice를 사용하는 경우 반드시 호스트 카메라가 열린다고 보장할 수 없습니다.

네트워크에 여러 대의 카메라도 존재할 경우, 일련번호를 통해 호스트 카메라를 식별할 수 있습니다. 일련번호는 커널 명령줄을 통해 VM으로 전달됩니다. 다음 명령을 실행하여 이를 확인할 수 있습니다.

cat /proc/cmdline

출력 예시:

$ cat /proc/cmdline
root=/dev/vda1 rw console=ttyAMA0 earlycon rootwait ip=192.168.1.127:::255.255.255.0:::off:: blazeSerial=40560199 blazeFirmwareVersion=fw-6.0.0-20260428134100;fw-6.0.0+gf1b86064cda6
C++ 예시: 일련번호로 호스트 카메라 열기#
#include <regex>
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
#include <pylon/PylonIncludes.h>
#include <pylon/BlazeInstantCamera.h>

using namespace Pylon;
int main() {
    std::string serial_number = "40560199";
    std::string cmdline = (std::stringstream() << std::ifstream("/proc/cmdline").rdbuf()).str();
    std::smatch match;
    if (std::regex_search(cmdline, match, std::regex("blazeSerial=(\\d+)")))
        serial_number = match[1];
    PylonInitialize();
    CBlazeInstantCamera camera(CTlFactory::GetInstance().CreateFirstDevice(
        CDeviceInfo().SetDeviceClass(BaslerGenTlBlazeDeviceClass).SetSerialNumber(serial_number.c_str())));
    camera.RegisterConfiguration(new CBlazeDefaultConfiguration, RegistrationMode_ReplaceAll, Cleanup_Delete);
    camera.Open();
    std::cout << "Connected to camera " << camera.GetDeviceInfo().GetFriendlyName() << std::endl;
    std::cout << "Serial Number: " << camera.GetDeviceInfo().GetSerialNumber() << std::endl;
}
Python 예시: 일련번호로 호스트 카메라 열기#
rom pypylon import pylon
import re

serial_number = "40560199" # default
with open("/proc/cmdline") as f:
    match = re.search(r'blazeSerial=(\d+)', f.read())
    if match:
        serial_number = match.group(1)
factory = pylon.TlFactory.GetInstance()
device_info = pylon.DeviceInfo()
device_info.SetSerialNumber(serial_number)
camera = pylon.InstantCamera(factory.CreateDevice(device_info))
camera.Open()
print(f"Connected to camera {camera.GetDeviceInfo().GetFriendlyName()}")
print(f"Serial Number: {camera.GetDeviceInfo().GetSerialNumber()}")

Smart blaze 펌웨어 관리#

경우에 따라 VM 내부에서 Smart blaze 카메라 펌웨어를 업데이트해야 할 수도 있습니다. 이는 VM 내부에서 포트의 소프트웨어 업데이트 웹/REST 인터페이스에 액세스하고 <cameraip>:8080 Basler가 제공하는 적절한 *.swu 파일을 업로드하여 수행할 수 있습니다.

정보

업데이트가 성공적으로 완료되면 실행 중인 VM을 포함하여 카메라가 자동으로 재부팅됩니다. 따라서 VM 내부의 프로세스는 .swu 파일 업로드 완료 후 강제로 중단되더라도 안정적으로 대처할 수 있어야 합니다.

펌웨어 업데이트가 성공했는지 확인하려면 GenICam 레지스트리에서 가져온 현재 펌웨어 버전을 DeviceFirmwareVersion 예상 펌웨어 버전과 비교하십시오. 편의를 위해 현재 펌웨어 버전은 다음을 통해 커널 명령줄로도 VM에 전달됩니다. blazeFirmwareVersion 인수:

cat /proc/cmdline

출력 예시:

$ cat /proc/cmdline
root=/dev/vda1 rw console=ttyAMA0 earlycon rootwait ip=192.168.1.127:::255.255.255.0:::off:: blazeSerial=40560199 blazeFirmwareVersion=fw-6.0.0-20260428134100;fw-6.0.0+gf1b86064cda6