콘텐츠로 바로 가기
STAGING SERVER
DEVELOPMENT SERVER

Synchronous Free Run (blaze)#

Synchronous Free Run 기능을 사용하면 동일한 네트워크에 연결된 여러 대의 블레이즈 카메라를 광원이 서로 간섭하지 않도록 동시에 작동할 수 있습니다.

기능 사용#

사용 이유 Synchronous Free Run#

여러 대의 블레이즈 카메라로 동일한 장면을 촬영하려면, 각 카메라의 광원이 서로 간섭하지 않도록 노출 시점을 엇갈리게 설정해야 합니다. 주변광과 마찬가지로, 각 카메라의 광원 역시 화질 저하를 초래합니다.

이를 활용하면 PTP기능을 사용하면, 여러 대의 카메라가 동기화된 자유 주행 모드로 이미지를 촬영하되, 노출 시작 시점을 정확히 시간 정렬된 간격으로 순차적으로 설정하여 시간 순서대로 촬영할 수 있습니다. 이렇게 하면 한 대의 카메라에서 들어오는 빛이 다른 카메라들의 측정 결과에 간섭을 일으키지 않습니다.

작동 방식#

동기식 프리런을 구성하는 방법에는 두 가지가 있습니다. 어떤 옵션이 가장 적합한지 결정하기 위해서는, 이미지 획득과 관련하여 블레이즈 카메라의 일반적인 작동 원리를 이해해야 합니다.

이미지를 촬영할 때, 각 프레임은 8개의 서브프레임으로 구성됩니다( Fast Mode 이 활성화된 경우 4개)로 구성됩니다. 각 서브프레임은 별도의 노출로 간주할 수 있는데, 이는 각 서브프레임의 노출이 완료된 후 조명이 꺼지고 센서가 초기화되기 때문입니다.

프레임 노출 단계#

노광 과정에서는 다음과 같은 단계들이 진행됩니다:

  • 시작: 이는 첫 번째 및 다섯 번째 서브프레임 이전에 발생합니다.
  • 재설정: 센서가 재설정됩니다. 이는 각 서브프레임을 수집하기 전에 수행됩니다.
  • 노출: 셔터가 열리고 센서에 빛이 들어오게 됩니다. 이 과정은 각 서브프레임마다 반복됩니다.
  • 읽어내기: 서브프레임 동안 수집된 데이터가 센서에서 읽어집니다.

카메라는 노출 단계에서만 빛을 방출합니다.

다음 그림은 프레임 노출의 여러 단계를 보여줍니다(서브프레임 1, 2, 8만 표시됨).

프레임 노출의 단계

Synchronous Free Run#

카메라를 프리 런 모드로 작동한다는 것은 카메라가 내장된 주기적 트리거 타이머를 사용하여 스스로 트리거된다는 것을 의미합니다.

동기식 자유 실행 모드에서는 카메라 클럭이 다음을 사용하여 동기화됩니다 PTP를 사용하여 동기화됩니다. 클럭이 동기화되면 내부 트리거 타이머도 함께 동기화됩니다.

동기식 프리 런을 위해 카메라를 설정할 때, 각 카메라의 촬영 시작 시간을 개별적으로 지정하여 카메라들의 촬영 시점을 맞출 수 있습니다. 카메라의 촬영 시작 시간(다음에 의해 지정된)이 SyncFreeRunTimerStartTimeHigh 및 SyncFreeRunTimerStartTimeLow (매개변수)에 도달하면 내부 트리거 타이머가 시작되고, 카메라는 고정된 프레임 속도로 데이터를 수집합니다.

정보

과거의 시각을 시작 시간으로 설정할 수 있습니다. 이 경우, 내부 타이머가 과거에 시작된 것으로 간주됩니다.

정보

카메라는 다음 조건이 충족될 때까지 촬영을 시작하지 않습니다. AcquisitionStart command가 실행됩니다.

blaze 및 ace/ace 2 카메라 동기화

  • 애플리케이션 설정에 ace camera가 포함된 경우, 시작 시간은 가까운 미래 시간이어야 합니다.
  • 애플리케이션 설정에 ace 2 camera가 포함된 경우, blaze 카메라의 시작 시간은 0이어야 합니다.

Synchronous Free Run을 사용하는 방법에는 두 가지가 있습니다.

인터리브 모드#

blaze 카메라 두대를 동시에 작동하려면 interleaved 모드를 선택하세요. 이 모드에서는 한 카메라가 빛을 방출하는 동안 다른 카메라는 센서 readout을 수행합니다.

Interleaved Synchronous Free Run

정보

카메라의 센서 타이밍은 동일해야 합니다. 즉, 다음 항목에 대해 동일한 값을 설정해야 합니다. ExposureTime, FastMode및 HDRMode 매개변수.

센서 타이밍은 센서의 Property이므로 변경할 수 없는 Sensor Readout Time에 의해서도 결정됩니다. 그러나 Sensor Readout Time은 카메라의 하드웨어 리비전에 따라 다를 수 있습니다. 이 경우 대신 consecutive 모드를 사용하세요.

연속 모드#

대부분의 상황에서 interleaved 모드로 두 대를 초과하는 카메라를 작동하는 것은 실용적이지 않습니다. 네트워크 패킷이 연속으로 빠르게 전송되기 때문에 네트워크 패킷이 누락되어 데이터를 불완전하게 취득할 가능성이 높습니다. 더 나은 결과를 얻으려면 카메라가 차례대로 프레임을 연속해서 취득하는 consecutive 모드를 사용하세요.

이 모드는 센서 타이밍이 다른 여러 카메라를 동시에 작동하려는 경우에도 사용해야 합니다.

Consecutive Synchronous Free Run

달성 가능한 프레임 레이트를 극대화하기 위해, 카메라의 Acquisition Start 시간을 이전 카메라의 readout 단계 중 특정 시간으로 설정할 수 있습니다.

카메라 구성#

정보

pylon Supplementary Package for blaze에는 MultiCamHelper C++ 라이브러리가 포함되어 있습니다. 이 라이브러리는 C++ 샘플 컬렉션의 일부이며 MultiCam/MultiCamHelper 폴더에 있습니다.

이 라이브러리는 다음을 제공합니다. BlazeSynchronousFreeRunHelper 클래스. Basler는 여러 blaze 카메라를 Synchronous Free Run으로 설정하고, 데이터를 캡처하며, 시간순으로 일치하는 프레임을 매칭하는 데 이 클래스를 사용할 것을 권장합니다. 이 클래스 사용법은 다음 예제에서 보여줍니다. 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번째 카메라의 Sensor Readout Time 지속 시간.
  • 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을 시작하려면:

  1. 각 카메라에서 PTP를 활성화하고, 마스터 클록 선택이 완료되고 클록이 충분히 동기화될 때까지 기다립니다.
    자세한 내용은 Precision Time Protocol (blaze)을 참조하십시오.

  2. 각 카메라에서 다음 항목에 대한 원하는 설정을 구성합니다. ExposureTime, FastMode및 HDRMode.

    정보

    인터리브된 Synchronous Free Run 모드로 카메라를 설정할 때 다음 항목에 대해 동일한 값을 설정해야 합니다. ExposureTime, FastMode및 HDRMode.

  3. 가능한 최대 프레임 레이트 계산 fps_max 설명된 대로 아래.

  4. 각 카메라에서 다음을 설정합니다. AcquisitionFrameRateEnable 파라메터 true 다음 파라미터를 설정하여 원하는 프레임 레이트를 지정합니다. AcquisitionFrameRate 파라미터 값은 다음 값과 같거나 작아야 합니다. fps_max.

    정보

    모든 카메라에서 동일한 프레임 레이트를 지정해야 합니다.

  5. 각 카메라에 대해 필요한 트리거 오프셋을 계산하고 아래 설명된 대로 결과 Acquisition Start 시간을 설정합니다.

  6. 애플리케이션의 그랩 루프를 준비합니다.

  7. 각 카메라에서 다음 명령을 실행합니다. StartAcquisition command.

  8. 각 카메라에서 이미지를 그랩합니다.

최대 프레임 속도 결정#

연속 Synchronous Free Run을 사용할 때 카메라당 최대 프레임 레이트는 카메라 수와 각 카메라의 프레임 지속 시간에 의해 제한됩니다.

인터리브된 Synchronous Free Run을 사용할 때 카메라는 가능한 최대 프레임 레이트로 작동할 수 있습니다.

이하에서 fps_max[i] 는 i번째 카메라의 다음 파라미터에 대해 허용되는 최대값을 나타냅니다. AcquisitionFrameRate 읽어오기 fps_max[i] 에 대한 카메라 i pylon SDK의 API를 사용하여 다음 코드 조각을 활용할 수 있습니다:

C++

auto max = camera[i].AcquisitionFrameRate.GetMax();

C#

var max = camera[i].Parameters[PLBlaze.AcquisitionFrameRate].GetMaximum();

인터리브 모드#

인터리브 모드에서는 센서 타이밍이 모든 카메라에서 동일해야 하므로, fps_max 을(를) 두 카메라 중 하나의 최대 프레임 레이트 값으로 설정하십시오.

연속 모드#

최대 프레임 레이트는 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] 애플리케이션이 모든 카메라를 구성하고 그랩 루프를 설정하기 전에 카메라가 획득을 시작하지 않도록 미래의 특정 시점으로 설정해야 합니다. 카메라 한 대를 구성하는 데 약 400ms를 고려해야 합니다.

다음 의사 코드 조각은 카메라의 트리거 오프셋을 계산하고 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