Commit Graph

100 Commits

Author SHA1 Message Date
Peter Bochmann fc507f7407
Give the thermal picture the time its own frame arrived
Both frames of a waypoint used to take the colour frame's time, which made
the thermal one look taken at a moment it was not: it is the newest frame the
camera had, up to max_frame_age_ms old. Each file and CamEvent now has the
time its own frame reached the host; the two of one waypoint share hdg/pit and
are at most that age apart. The docs say to pair them by that.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 19:42:32 +02:00
Peter Bochmann ff89643a4f
Run the thermal camera's NUC while the gimbal moves
The camera recalibrated against its shutter every 30 s and sent no frame for
about 0.7 s meanwhile: a picture falling into that had no thermal image (0.8 %
on tower 111, the 30 s rhythm shown by the new gap logging). The program now
switches the camera's timer off and runs the NUC itself (NUC_Perform, which
returns when it is done) when a move starts and nuc_interval_s (30) has passed,
or after twice that with no move. The scheduler tells the cameras of every move
(ICameraSource::moving), and a picture waits up to 1 s for a camera between
frames (frameReady) rather than go without it. The camera's own timer goes
back on exit; nuc_interval_s = 0 leaves it alone.

Measured on tower 111 before writing it: NUC_Interval = 0 gave 70 s without a
gap; NUC_Perform ran three NUCs of 657-677 ms; NUC_INPROGRESS never changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 19:02:20 +02:00
Peter Bochmann 28ff027950
Note what the thermal camera's SDK costs in CPU on tower 111
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 21:13:55 +02:00
Peter Bochmann 474e3cac8a
Fix what the thermal camera's first run on tower 111 showed
- The thermal frame was numbered camera 0 - label RGB, and the colour file of
  the same time overwritten - because Vimba counts no camera before open().
  The composite now takes each source's configured camera count, and two
  enabled cameras may no longer share a label.
- The SDK switches LC_NUMERIC to de_DE when loaded, which made "hotx":0,4336.
  Its calls now run under a guard that restores the locale, and the JSON's
  numbers no longer go through printf.
- The camera's frame counter is always 0: new frames are told by their time,
  so the stream no longer stops after the first one.
- The LUT is empty for the first frame: it is asked again on later ones.
- The SDK is libirbgrab_x86_64-linux.so in the ld cache.
- The null channel traces the CamEvent payload it would have sent.

Tested on tower 111 with the TarisIR mini, the motors mocked: cap_net_raw is
enough, RGB/TIR pairs with one timestamp, the TIR file decodes to the counts
its CamEvent describes, profile switches 0-1-0. 536/536 in the 22.04 container.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 21:01:33 +02:00
Peter Bochmann 3d90af8490
Take a thermal picture beside the colour one at every waypoint
A TarisIR mini (driver = taris) is a second camera source behind a
CompositeCameraSource: the colour camera is asked first, then the thermal one
for its newest frame, and both frames carry the colour frame's timestamp.
Counts are saved 16-bit lossless under TIR/, and the CamEvent gains cal,
missed, tmax, tmed, hotx and hoty (docs/mqtt-api.md). The SDK is declared in
IrbgrabApi.h and loaded with dlopen, so no SDK file is in the repository; a
missing or unreachable camera stays offline (Health cams_offline) while the
scan goes on. scripts/fgc-setcap gives the binary cap_net_raw after a build.

Built and tested in an Ubuntu 22.04 container (mock, MQTT, Vimba+MQTT,
534/534), plus a mock run with RGB/TIR pairs. Not yet run against the camera.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 20:37:25 +02:00
pgdalmeida 6fa43f1e08
Slow down, then pause, the scan when the tower computer runs hot or cannot keep up 2026-10-08 17:21:58 +02:00
pgdalmeida ded1eb7464
Deploy only the files git knows about, so ignored folders no longer reach the tower 2026-10-07 15:42:34 +02:00
pgdalmeida 1edca07293
Compare today's RGB8 file with the 12-bit file at the same quality setting in the 12-bit report 2026-10-07 14:09:33 +02:00
pgdalmeida a723646928
Compare 8-bit and 12-bit pictures on a dark forest scene from the Stäffelsberg tower in the 12-bit report 2026-10-07 12:25:04 +02:00
pgdalmeida 19c5873df6
Merge cancelling homing and shutting down cleanly when the program is stopped during homing 2026-10-06 19:49:15 +02:00
pgdalmeida eb91f470dd
Cancel homing and shut down cleanly when the program is stopped during homing 2026-10-06 19:41:19 +02:00
pgdalmeida ce6ef3f79a
Keep each tower's config, scan grid and camera profiles in ~/.config/fire_gimbal_control, out of a deploy's reach 2026-10-05 22:02:49 +02:00
pgdalmeida 9f02b70dae
List every module in the module reference, including the self-test, config-editing and remote-command ones 2026-10-05 13:12:09 +02:00
pgdalmeida 70a30132bf
Merge counting the picture interval from the last picture and waiting for a slow camera's next frame 2026-10-05 13:02:13 +02:00
pgdalmeida 2e6609eb1d
Explain in the 12-bit report why the brightness rule picks the right picture, and add a background file for discussing the report with Claude 2026-10-05 12:25:05 +02:00
pgdalmeida 4e8413bda6
Explain in the 12-bit report where the extra bits make a real difference and where they do not 2026-10-05 12:05:33 +02:00
pgdalmeida 4abfd7cbb2
Explain the raw mosaic and planes layouts in the 12-bit report, and spell out every term in its figure and table captions 2026-10-05 11:39:31 +02:00
pgdalmeida 1fc87bf1ee
Rewrite the 12-bit camera test report as a numbered paper with an abstract, figure and table captions, and units 2026-10-05 11:28:52 +02:00
pgdalmeida cfd8ba9978
Save raw 12-bit camera frames as 12-bit colour images, keep a waypoint's picture once the image has settled, and hold the scan when saving falls behind 2026-10-05 10:14:53 +02:00
pgdalmeida d5b037a241
Add camera and image-saving test results for towers 121 and 111, the test tools, and a plan for saving 12-bit images 2026-10-05 08:47:34 +02:00
pgdalmeida fb0f5117df
Count the picture interval from the last picture, and let a settle wait of 0 wait for the exposure to settle 2026-10-02 18:28:40 +02:00
pgdalmeida 4488a2181d
Set in config.ini whether the tower homes and which mode it starts in, instead of the --init and --start flags 2026-09-30 16:42:48 +02:00
pgdalmeida f2c61e030e
Let a yaw-only tower aim with gimbal move, and stop it publishing a made-up pitch 2026-09-29 19:50:39 +02:00
pgdalmeida 895c2f22fd
Add a command to keep taking pictures where the gimbal points, drop unused camera commands, and fit the help on one page 2026-09-29 15:48:07 +02:00
pgdalmeida a21be0d4e8
Take the scan waypoints only from the CSV file, never generate them 2026-09-29 15:02:19 +02:00
pgdalmeida ab9fa3dbb0
Let a tower set its encoder scale, and send no speed after a failed homing 2026-09-28 18:21:37 +02:00
pgdalmeida 4b73199e8e
Leave a newly installed tower in manual: home at boot, capture only after auto is chosen 2026-09-28 16:20:39 +02:00
pgdalmeida da9a9867ed
Add a one-file tower bootstrap and a legacy-tower survey, and use an SDK already installed 2026-09-28 16:14:26 +02:00
pgdalmeida 8d81e03a3f
Support the legacy towers' DHT11 and fan, and fix the installer's reflash and test steps 2026-09-28 14:43:05 +02:00
pgdalmeida e41234f69c
Retake the plain-console screenshot with the mode commands 2026-09-25 19:27:08 +02:00
pgdalmeida 4ad6fb6646
Retake the README screenshots for the new dashboard keys and panel names 2026-09-25 19:23:28 +02:00
pgdalmeida 79225bc3cd
Rework the dashboard keys: a/p/m for modes, n for connectivity, page keys to scroll, heading setup in the activity strip 2026-09-25 18:57:25 +02:00
pgdalmeida f4e67666d8
Give the tower three modes, auto, pan and manual, switched by command 2026-09-25 17:50:48 +02:00
pgdalmeida 4a69d65afb
Take any console command over MQTT, and answer it 2026-09-25 16:43:45 +02:00
pgdalmeida 9dc9b90f6d
Call the dashboard's messaging panel COMMS, to match its m key 2026-09-25 15:33:39 +02:00
pgdalmeida 50273779a3
Rewrite the README around running a tower, with screenshots and diagrams 2026-09-25 14:59:32 +02:00
pgdalmeida d8d2fee8af
Test the camera with forced dark and bright settings, and recover a camera that stops sending frames 2026-09-24 17:35:37 +02:00
pgdalmeida 5a0515ab13
Test that the camera delivers frames and follows its settings to black and white 2026-09-24 15:47:58 +02:00
pgdalmeida e8293f736d
Record that tower 111 comes back by itself after a reboot 2026-09-24 15:06:10 +02:00
pgdalmeida 91cc8af915
Rewrite the running and installing guides for how towers are set up now 2026-09-24 14:59:04 +02:00
pgdalmeida 08c749ca06
Finish migrating tower 111, and check only the pins hardware.ini declares 2026-09-24 09:52:14 +02:00
pgdalmeida 6824a0d580
Migrate tower 111's host, and resume capture after a test instead of leaving it stopped 2026-09-24 09:01:05 +02:00
pgdalmeida b7c80794b4
Record the flash cost on the Delta board, and the reboot check on tower 121 2026-09-23 23:39:28 +02:00
pgdalmeida 53fa96fb54
Start the program at boot through fgc, so the dashboard still works 2026-09-23 22:39:18 +02:00
pgdalmeida 32ea820877
Add an installer that sets up a tower from scratch or repairs one 2026-09-23 21:15:00 +02:00
pgdalmeida 86f930a671
Add a one-shot test command and a tool that edits the config files safely 2026-09-23 18:52:44 +02:00
pgdalmeida 4049a85b9b
Check the firmware was built with the pins hardware.ini lists 2026-09-23 18:26:14 +02:00
pgdalmeida 7a7e7ab0a5
Record tower 111 has no hardware.ini; BOOTSEL and USB preconditions are solved 2026-09-23 16:49:37 +02:00
pgdalmeida b6308c1eda
Check the tower is running its own settings, not the firmware's fallback 2026-09-23 16:07:07 +02:00
pgdalmeida 12e23a5fb6
Correct what the plans claim is done, and warn that a pull deletes .deploy.env 2026-09-23 08:31:43 +02:00