이미지 캡처 및 처리#
Smart Blaze 카메라에서의 이미지 획득 및 처리 방식은 일반 x86 Linux 호스트 컴퓨터와 동일합니다. 이는 가상 머신(VM)과 카메라 간의 가상 네트워크 연결을 통해 가능해지므로, 소프트웨어가 호스트에서 실행되든 Smart Blaze 내의 VM에서 실행되든 제어 방식이나 이미지 획득에는 차이가 없습니다.
Smart Blaze의 가상 머신(VM) 내에서 실행되는 소프트웨어의 경우, 현재 C++과 pypylon을 사용하는 Python이 지원됩니다. pylon용 C# 바인딩은 아직 Smart Blaze 카메라에서 테스트되지 않았습니다.
이러한 일관된 동작은 VM과 카메라 사이에 가상 네트워크 연결을 구축함으로써 구현되므로, 소프트웨어가 호스트에서 실행되든 Smart Blaze의 VM에서 실행되든 제어나 이미지 획득에 차이가 없습니다.
문서 및 예제#
blaze 카메라 구성 및 그랩 루프 설정 방법에 대한 지침은 blaze 프로그래머 가이드를 참조하십시오. 개발용 컴퓨터에 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과 blaze용 보충 패키지를 다운로드할 수 있습니다.
CPU 리소스 관리#
Smart Blaze 카메라에서 사용할 수 있는 CPU 리소스(1.5 GHz의 Cortex-A53 4개)는 네이티브 카메라 펌웨어와 고객 VM 간에 공유됩니다. 안정적인 이미지 획득 및 깊이 처리를 보장하기 위해, 카메라 펌웨어는 실시간 우선순위로 실행되는 반면, 고객 VM은 일반 작업 우선순위로 실행됩니다.
이 설계 덕분에 VM 내의 소프트웨어는 이미지 획득이나 깊이 계산에 영향을 주지 않으면서 4개의 가상 CPU 코어를 모두 최대한 활용할 수 있습니다. 가상 CPU 코어에는 이미지 획득 및 깊이 처리에 현재 필요하지 않은 물리적 코어의 일부만 할당됩니다.
이미지 획득이 진행되는 동안 카메라 펌웨어는 3개의 물리적 코어를 사용합니다. 펌웨어가 한 프레임의 획득 및 처리를 완료하면, VM이 CPU 코어를 거의 독점적으로 활용할 수 있는 시간대가 생깁니다. 이 시간대는 다음 프레임 획득이 시작되면 종료됩니다. 현재 이 시간대 중 약 20ms는 펌웨어와 VM 간 가상 네트워크를 통해 이미지 데이터를 전송하는 데 소요되며, 이로 인해 한 코어의 상당 부분이 점유됩니다. 향후 최적화를 통해 이 전송 속도가 빨라지고 리소스 소모도 줄어들 것으로 기대됩니다.
X11 포워딩은 추가적인 지연 시간을 유발하여, 그랩 루프의 속도를 저하시키고 프레임 누락을 일으킬 수 있습니다.
애플리케이션이 처리 속도를 따라가지 못해 프레임 누락 현상이 발생하기 시작하면, 프레임 속도를 낮추는 것을 고려해 보세요.
프레임 속도 제어#
호스트 컴퓨터의 3D 뷰어를 사용하여 수동으로 프레임 속도를 제어하거나(단, 카메라 전원을 껐다 켰을 때 설정이 유지되지 않는다는 점에 유의하십시오), 애플리케이션에서 관련 카메라 매개변수를 구성하여 프레임 속도를 제어할 수 있습니다.
카메라에서 프레임 캡처를 시작하는 방법에는 여러 가지가 있습니다:
- 하드웨어 트리거: 카메라는 하드웨어 트리거 신호를 수신했을 때만 프레임을 캡처합니다.
- 소프트웨어 트리거: 카메라는 애플리케이션으로부터 소프트웨어 트리거 신호를 수신했을 때만 프레임을 캡처합니다.
- 자유 실행: 카메라는 내장된 주기적 트리거를 사용하여 프레임을 지속적으로 캡처합니다. 자유 실행은 기본 트리거 모드입니다.
프레임 속도 제어를 활성화하거나 비활성화하려면 다음을 사용하십시오. AcquisitionFrameRateEnable 매개변수. 이 기능을 활성화하면 다음을 설정할 수 있습니다. AcquisitionFrameRate 초당 프레임 수(fps) 단위로 원하는 프레임 속도를 지정하는 매개변수입니다. 프리 런 모드에서는 카메라가 요청된 프레임 속도를 달성하기 위해 내부 타이밍을 자동으로 조정합니다.
트리거 모드에서 프레임 레이트 설정은 트리거 신호에 허용되는 최대 주파수를 정의합니다. 트리거 신호가 너무 빠르게 도착하는 경우, 최소 간격보다 먼저 발생하는 신호는 무시됩니다.
소프트웨어 트리거를 사용할 때는 다음을 확인할 수 있습니다. AcquisitionStatus 카메라가 다음 트리거 신호를 수신할 준비가 되었는지 여부를 판단하는 매개변수.
안정적인 접근 방식은 소프트웨어 트리거를 사용하여, 애플리케이션이 다음 프레임을 처리할 준비가 되었을 때만 데이터 수집이 시작되도록 하는 것입니다. 이렇게 하면 VM 내의 애플리케이션이 다음 프레임을 요청하기 전에 사용 가능한 모든 CPU 리소스를 처리에 활용할 수 있습니다.
소프트웨어 트리거링 사용의 시사점
소프트웨어 트리거 방식은 일반적으로 가능한 최대 프레임 속도보다 낮은 프레임 속도를 나타내는데, 이는 한 프레임을 처리하고 다음 프레임을 트리거한 후, 애플리케이션이 노출, 깊이 계산 및 VM으로의 네트워크 전송이 완료될 때까지 기다려야 하기 때문이다.
온도가 정확도에 미치는 영향#
수심 데이터의 정확도는 일정한 작동 온도를 유지하는 데 달려 있습니다. 트리거 주파수의 변동은 온도 변동을 일으켜 수심 정확도에 영향을 미칠 수 있습니다.
이를 방지하기 위해, TriggerThermalDriftStabilization 이 매개변수는 기본적으로 활성화되어 있습니다. 소프트웨어 또는 하드웨어 트리거 모드에서 이 매개변수가 활성화되면, 카메라 펌웨어는 백그라운드에서 일정한 프레임 속도로 지속적으로 이미지를 획득 및 처리하며, 트리거 신호를 수신하면 현재 이미지 또는 다음 사용 가능한 이미지를 전달합니다.
백그라운드 처리는 CPU 자원을 소모하므로, 소프트웨어 트리거 모드에서는 다음 중 하나를 수행해야 합니다. AcquisitionFrameRate 값을 설정하거나 비활성화합니다. TriggerThermalDriftStabilization 파라미터에 HTML 로그 파일(*.html)의 경로와 이름을 지정할 수 있습니다.
동일한 네트워크에서 여러 대의 Blaze 카메라 사용하기#
동일한 네트워크에서 여러 대의 블레이즈 카메라(스마트 블레이즈 또는 블레이즈)를 사용하는 경우, 카메라 열거 과정에서 애플리케이션이 실행 중인 스마트 블레이즈 카메라뿐만 아니라 연결 가능한 다른 블레이즈 카메라들도 함께 탐지될 수 있습니다. 애플리케이션이 실행 중인 스마트 블레이즈 카메라는 “호스트 카메라”라고 합니다.
정보
일련번호 필터 없이 CreateFirstDevice를 사용한다고 해서 반드시 호스트 카메라가 실행되는 것은 아닙니다.
네트워크에 여러 대의 카메라가 있는 경우, 호스트 카메라를 일련번호로 식별할 수 있습니다. 일련번호는 커널 명령줄을 통해 VM으로 전달됩니다. 다음 명령을 실행하여 이를 확인할 수 있습니다:
출력 예시:
$ 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;
}
파이썬 예제: 일련번호를 사용하여 호스트 카메라 열기#
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 카메라 펌웨어를 업데이트해야 할 수도 있습니다. 이는 포트 번호를 통해 소프트웨어 업데이트 웹/REST 인터페이스에 접속하여 수행할 수 있습니다. <cameraip>:8080 가상 머신 내부에서 적절한 파일을 업로드하고 *.swu Basler에서 제공한 파일.
정보
업데이트가 성공적으로 완료되면 실행 중인 VM을 포함하여 카메라가 자동으로 재부팅됩니다. 따라서 VM 내부의 프로세스는 .swu 파일 업로드가 완료된 후 강제적으로 중단되더라도 정상적으로 작동할 수 있도록 견고하게 설계되어야 합니다.
펌웨어 업데이트가 성공적으로 완료되었는지 확인하려면, GenICam 레지스터에서 확인한 현재 펌웨어 버전을 비교해 보십시오. DeviceFirmwareVersion 예상 펌웨어 버전과 함께. 간편성을 위해 현재 펌웨어 버전도 커널 명령줄을 통해 VM으로 전달되며, blazeFirmwareVersion 인수:
출력 예시: