diff --git a/docs/tower-installation.md b/docs/tower-installation.md index edfff4d..447eb19 100644 --- a/docs/tower-installation.md +++ b/docs/tower-installation.md @@ -734,11 +734,12 @@ itself when a camera has `ExposureTimeAbs` and no `ExposureTime`: frame trigger off (the legacy cameras booted with `TriggerMode = On`, `Line1`), `BayerRG8` on the colour camera and `Mono8` on a mono one, 60 MB/s each, the frame rate at the camera's maximum (rietschen's RGB camera came set to 0.955 fps), and -auto-exposure on the frame mean (`ExposureAutoAlg = Mean`) at 50 % +- 5 %, down -to 20 us by day. That last one matters: the keep rule waits for the frame mean -to reach 50 % +- 5 %. At the cameras' old target of 25 every waypoint ran into -`frame_timeout_ms`, and so it did with the RGB camera's `FitRange` and 10 % -tolerance, which fit the histogram wherever its mean lands. +auto-exposure on the frame mean (`ExposureAutoAlg = Mean`) at 35 % +- 5 %, down +to 20 us by day. The keep rule waits for the frame mean to reach the camera's +own target and tolerance, read once the camera is open. With the RGB camera's +`FitRange`, which fits the histogram wherever its mean lands, no waypoint +settled. 35 rather than the Alvium's 50: at 50 the sky over the horizon burnt +out at noon, where smoke would rise; the old program ran these cameras at 23-25. Give `--camera` the id: with several cameras the first one the SDK lists is not the colour one, and the order changes from run to run. `install.sh diff --git a/scripts/export_camera_profile.py b/scripts/export_camera_profile.py index 2b972b4..f572fb5 100755 --- a/scripts/export_camera_profile.py +++ b/scripts/export_camera_profile.py @@ -151,15 +151,15 @@ _GIGE_COMMON = [ ("ExposureTimeAbs", 1000.0), ("AcquisitionFrameRateAbs", 1000.0), # clamped to the camera's maximum ("ChunkModeActive", False), - # The keep rule waits for the frame mean to reach the camera's target. The - # host starts on its default band of 50 % - rietschen's cameras were set to - # 25, and every waypoint then ran into frame_timeout_ms (7.5 s, 2026-10-20). - # The camera has to aim at the mean, and stop adjusting only inside the same - # +-5 %: the RGB camera came with FitRange (which fits the histogram, wherever - # the mean lands) and a 10 % tolerance, and no waypoint settled (2026-10-21). + # The keep rule waits for the frame mean to reach the camera's target, +- its + # tolerance, which it reads from the camera. The camera has to aim at the + # mean: the RGB camera came with FitRange (which fits the histogram, wherever + # the mean lands) and no waypoint settled (2026-10-21). 35 % rather than the + # Alvium's 50: at 50 the sky over the horizon burnt out at noon, where smoke + # would rise; the old program ran these cameras at 23-25. ("ExposureAutoAlg", "Mean"), ("ExposureAutoAdjustTol", 5), - ("ExposureAutoTarget", 50), + ("ExposureAutoTarget", 35), ("ExposureAuto", "Continuous"), ("GainAuto", "Continuous"), ] diff --git a/src/core/Application.cpp b/src/core/Application.cpp index 7d94ba2..11cbb1b 100644 --- a/src/core/Application.cpp +++ b/src/core/Application.cpp @@ -3627,6 +3627,12 @@ struct Application::Impl { return 3; // distinct from the config (1) and lock (2) exits } + // Again, now the camera is open: the keep rule reads the camera's own + // auto-exposure target, tolerance and limits, and before open() it got + // none of them and judged every frame against its 50 +- 5 % default - + // until the first profile switch. Rietschen's cameras aim at 35 %. + configureSettle(); + pipeline->start(); channel->publishStatus(static_cast(Mode::Manual)); // until [Startup] mode says otherwise