Synchronous Free Run (blaze)#
기능 사용법#
Synchronous Free Run을 사용하는 이유#
여러 blaze 카메라를 사용하여 동일한 장면을 캡처하려는 경우, 광원이 서로 간섭하지 않도록 개별 카메라의 노출을 엇갈리게 설정해야 합니다. 주위 광(ambient light)과 마찬가지로, 개별 카메라의 광원 역시 이미지 Quality 저하를 유발합니다.
PTP를 사용하면 일련의 카메라 그룹이 synchronous free run으로 이미지를 캡처할 수 있도록 하되, 정확하게 시간이 동기화된 간격과 시간순에 따라 노출이 연속적으로 시작되도록 할 수 있습니다. 이를 통해 한 카메라의 빛이 다른 카메라의 측정에 간섭하지 않도록 합니다.
작동 원리#
synchronous free run을 구성하는 방법에는 두 가지가 있습니다. 사용자에게 가장 적합한 옵션을 결정하려면 이미지 취득과 관련하여 blaze 카메라의 일반적인 작동 원리를 이해해야 합니다.
이미지를 취득할 때 각 프레임은 8개의 서브프레임으로 구성됩니다(Fast Mode가 활성화된 경우 4개의 서브프레임). 각 서브프레임은 개별 노출로 볼 수 있는데, 각 서브프레임 노출 후 조명이 꺼지고 센서가 리셋되기 때문입니다.
프레임 노출 단계#
노출 중에는 다음과 같은 단계가 진행됩니다.
- 시작(Startup): 첫 번째 및 다섯 번째 서브프레임 이전에 발생합니다.
- 리셋(Reset): 센서가 리셋됩니다. 각 서브프레임 취득 이전에 발생합니다.
- 노출(Exposure): 셔터가 열리고 센서가 노출됩니다. 각 서브프레임마다 발생합니다.
- 리드아웃(Readout): 서브프레임 동안 수집된 데이터가 센서에서 읽혀집니다.
카메라는 노출 단계에서만 빛을 방출합니다.
다음 그림은 프레임 노출의 각 단계를 보여줍니다(서브프레임 1, 2, 8만 표시됨).
Synchronous Free Run#
프리런 모드에서 카메라를 운용한다는 것은 내부 주기적 Timer를 사용하여 카메라가 스스로 트리거한다는 것을 의미합니다.
synchronous free run 모드에서는 PTP를 사용하여 카메라 클록이 동기화됩니다. 동기화된 클록으로 인해 내부 트리거 Timer 또한 동기화됩니다.
synchronous free run용 카메라를 설정할 때, 카메라의 개별 Acquisition Start 시간을 지정하여 카메라 취득을 정렬할 수 있습니다. 카메라의 Acquisition Start 시간( SyncFreeRunTimerStartTimeHigh 및 SyncFreeRunTimerStartTimeLow 파라미터에 의해 지정됨)에 도달하면 내부 트리거 Timer가 시작되고 카메라는 고정된 프레임 레이트로 데이터를 취득합니다.
정보
과거 시점에 해당하는 시작 시간을 설정하는 것도 가능합니다. 이 경우 내부 Timer가 과거에 시작된 것과 같이 처리됩니다.
정보
카메라는 다음 시점까지 취득을 시작하지 않습니다. AcquisitionStart 명령이 발행됩니다.
blaze 및 ace/ace 2 카메라 동기화
- 애플리케이션 설정에 ace camera가 포함된 경우, 시작 시간은 가까운 미래 시간으로 설정해야 합니다.
- 애플리케이션 설정에 ace 2 camera가 포함된 경우, blaze 카메라의 시작 시간은 0이어야 합니다.
Synchronous Free Run을 사용하는 방법에는 두 가지가 있습니다.
Interleaved Mode#
두 대의 blaze 카메라를 동시에 작동하려면 interleaved 모드를 선택하십시오. 이 모드에서는 한 카메라도 빛을 방출하는 동안 다른 카메라는 센서 판독을 수행합니다.
정보
카메라의 센서 타이밍은 동일해야 합니다. 즉, 다음 항목에 대해 동일한 값을 설정해야 합니다. ExposureTime, FastMode및 HDRMode 파라미터의 상태를 업데이트합니다.
센서 타이밍은 센서 Readout Time에 의해서도 결정되며, 이는 센서의 Property이므로 변경할 수 없습니다. 그러나 센서 Readout Time은 카메라의 하드웨어 리비전에 따라 다를 수 있습니다. 이 경우 대신 consecutive 모드를 사용하십시오.
Consecutive Mode#
대부분의 상황에서 두 대를 초과하는 카메라를 interleaved 모드로 작동하는 것은 실용적이지 않습니다. 네트워크 패킷이 너무 가깝게 연속되므로 네트워크 패킷 손실이 발생하여 결과적으로 데이터가 불완전하게 수집될 가능성이 높습니다. 더 나은 결과를 얻으려면 카메라가 프레임을 연속적으로 하나씩 수집하는 consecutive 모드를 사용하십시오.
이 모드는 센서 타이밍이 다른 여러 카메라를 동시에 작동하려는 경우에도 사용해야 합니다.
달성 가능한 프레임 속도를 극대화하기 위해 카메라의 Acquisition Start 시간을 이전 카메라의 판독 단계 내 시간으로 설정할 수 있습니다.
카메라 구성#
정보
pylon Supplementary Package for blaze에는 MultiCamHelper C++ 라이브러리가 포함되어 있습니다. 이 라이브러리는 C++ 샘플 컬렉션의 일부이며 MultiCam/MultiCamHelper 폴더에 있습니다.
이 라이브러리는 다음을 제공합니다. BlazeSynchronousFreeRunHelper 클래스. Basler에서는 Synchronous Free Run을 위해 여러 blaze 카메라를 설정하고, 데이터를 캡처하며, 시간순으로 일치하는 프레임을 매칭하기 위해 이 클래스를 사용할 것을 권장합니다. 이 클래스를 사용하는 방법은 다음에서 확인할 수 있습니다. SynchronousFreeRun C++ 샘플.
MultiCamHelper 라이브러리는 또한 blaze와 2D GigE 카메라를 동기화하려는 경우 유용한 GenericSynchronousFreeRunHelper 클래스를 제공합니다. 이 클래스를 사용하는 방법은 Multicam/ColorAndDepth 폴더의 샘플에서 시연합니다.
C++가 아닌 다른 프로그래밍 언어를 사용하거나 MultiCamHelper 라이브러리에서 제공하는 클래스를 사용하지 않으려는 경우, 이 섹션에서는 Synchronous Free Run을 위해 카메라를 구성하는 절차를 설명합니다. 이 절차는 interleaved 및 consecutive 모드를 구성하는 데 사용할 수 있습니다.
사용된 변수#
t_startup[i]: i번째 카메라의 프레임 시작 시간 지속 시간.t_reset[i]: i번째 카메라의 리셋 시간 지속 시간(리셋은 각 서브프레임의 시작 부분에서 발생함).t_exp[i]: 단일 서브프레임에 대한 i번째 카메라의 Exposure Time 지속 시간.t_read[i]: 단일 서브프레임에 대한 i번째 카메라의 판독 시간 지속 시간.t_frame[i]: i번째 카메라가 프레임의 모든 서브프레임을 획득하는 데 필요한 총 시간입니다.
실제 값은 카메라에서 검색할 수 있습니다. 다음 표에는 읽어야 할 파라미터 이름이 나와 있습니다.
| Variable | Camera Parameter |
|---|---|
t_startup | StartupTime |
t_reset | ResetTime |
t_exp | ExposureTime |
t_read | ReadoutTime |
t_frame | FrameDuration |
위에 나열된 모든 카메라 파라미터는 마이크로초(µs) 단위의 값을 반환합니다.
카메라를 구성하고 Synchronous Free Run을 시작하려면 다음을 수행하십시오.
-
각 카메라에서 PTP를 활성화하고 마스터 클록 선택이 완료되고 클록이 충분히 동기화될 때까지 기다립니다.
자세한 내용은 Precision Time Protocol (blaze)을(를) 참조하십시오. -
각 카메라에서 원하는 설정 구성:
ExposureTime,FastMode및HDRMode.정보
인터리브 Synchronous Free Run 모드용 카메라를 설정할 때 다음 항목에 대해 동일한 값을 설정해야 합니다.
ExposureTime,FastMode및HDRMode. -
최대 가능한 프레임 레이트 계산
fps_max설명된 대로 아래. -
각 카메라에서 다음 설정:
AcquisitionFrameRateEnable매개변수:true다음 설정을 통해 원하는 프레임 레이트 지정:AcquisitionFrameRate파라미터를 다음 값과 같거나 작게 설정:fps_max.정보
모든 카메라에서 동일한 프레임 레이트를 지정해야 합니다.
-
각 카메라에 대해 필요한 트리거 오프셋을 계산하고 아래에 설명된 대로 결과 Acquisition Start 시간을 설정합니다.
-
애플리케이션의 그랩 루프를 준비합니다.
-
각 카메라에서 다음 실행:
StartAcquisition명령입니다. -
각 카메라에서 이미지를 그랩합니다.
최대 프레임 레이트 결정#
연속 Synchronous Free Run을 사용하는 경우 카메라당 최대 프레임 레이트는 카메라 수와 각 카메라의 프레임 지속 시간에 의해 제한됩니다.
인터리브 Synchronous Free Run을 사용하는 경우 카메라는 가능한 최대 프레임 레이트로 작동할 수 있습니다.
이하에서 fps_max[i] 은(는) i번째 카메라의 허용되는 최대값을 나타냅니다. AcquisitionFrameRate 파라미터. 다음을 읽어오려면 fps_max[i] 대상: 카메라 i pylon SDK의 API를 사용하여 다음 코드 조각을 활용할 수 있습니다:
C++
C#
Interleaved Mode#
인터리브 모드에서는 모든 카메라의 센서 타이밍이 동일해야 하므로 다음을 설정하세요 fps_max 두 카메라 중 하나의 최대 프레임 레이트 값으로 설정합니다.
Consecutive Mode#
다음 의사 코드 조각에 나타난 대로 fps_max 연속 모드에서 최대 프레임 레이트를 계산할 수 있습니다:
fmax_min = min(fps_max[0], ... ,fps_max[n-1])
t_total = 0
for i = 0 to n-1
t_total = t_total + t_frame[i] - t_startup[i] - t_reset[i] - t_read[i]
endif
t_total = t_total + t_startup[0] + t_reset[0]
fps = 1e6 / t_total
fps_max = min(fps, fmax_min)
트리거 오프셋 계산 및 Acquisition Start 설정#
개별 Acquisition Start 시간이 엇갈리게 설정되어야 하는 시간 간격은 센서 타이밍과 인터리브 또는 연속 Synchronous Free Run 모드 중 어떤 방식을 사용하느냐에 따라 달라집니다.
Acquisition Start 시간은 t_acq_start[i] 응용 프로그램이 모든 카메라를 구성하고 그랩 루프를 설정하기 전에 카메라가 촬영을 시작하지 않도록 미래의 특정 시점으로 설정해야 합니다. 카메라 한 대를 구성하는 데 약 400 ms를 고려해야 합니다.
다음 의사 코드 조각은 카메라의 트리거 오프셋을 계산하고 Acquisition Start 시간을 설정하는 방법을 보여줍니다.
사용된 변수의 의미:
n: 카메라 수.camera[]: 카메라 배열.t_0: 현재 PTP Timestamp [ns]. 카메라만 연결된 경우 Timestamp는 마스터 장치가 켜진 이후의 틱 수를 세어 나타냅니다. 즉, 타임스케일은 임의적이고 상대적이며 이 네트워크 내에서만 유효합니다. 절대적인 타임스케일을 사용하려면 협정 세계시(예: TAI 또는 UTC)에 동기화된 장치를 연결하세요.fps_max: 최대 가능 프레임 레이트 [Hz].trigger_offset: 이전 카메라에 비해 카메라의 트리거가 지연되는 시간.t_acq_start[]: Acquisition Start 시간 [ns].t_safety: 지터(jitter)를 보정하기 위해 촬영을 추가로 지연시켜야 하는 시간 [µs]. 권장 값: 250 µs.
camera[0].TimestampLatch.Execute()
t_0 = camera[0].TimestampLatchValue.GetValue()
t_acq_start[0] = t_0 + n * 400 * 1000000
for i = 0 to n-1
camera[i].SyncFreeRunTimerStartTimeLow.SetValue(t_acq_start[i] & 0xffffffff)
camera[i].SyncFreeRunTimerStartTimeHigh.SetValue(t_acq_start[i] >> 32)
camera[i].SyncFreeRunTimerUpdate.Execute()
camera[i].SyncFreeRunEnable.SetValue(true)
if i < n-1
if interleaved_mode
trigger_offset = 1000 * (t_safety + t_exp[i])
else
trigger_offset =
1000 * (t_safety + t_frame[i] - t_read[i] - t_startup[i+1] - t_reset[i+1]
endif
t_acq_start[i+1] = t_acq_start[i] + trigger_offset
endif
endfor