Chloros connects the cameras, reads the light, solves reflectance and evaluates the index — then hands the result to your own tooling in formats you already use.
Radiometric multi-spectral array modules, available in your choice of 2 sensors, 2 lenses and 27 filters. Hardware-triggered as one array over a shared sync line.
Connects and configures the hardware, applies each unit’s factory calibration, aligns and stacks the bands, solves reflectance against the measured light, and evaluates the index.
Streaming reflectance and index overlay, a live index table, and index video or GIF recording.
16-bit and 32-bit float TIFF for GIS, .daq sidecars for reprocessing, and a GigE Vision stream your own tools can read.
Chloros started out processing survey flights. LATTICE put the same cameras on benches, gantries, belts and robots — so the software stopped assuming there was a flight at all.
A DAQ measures your LEDs, so reflectance stays anchored indoors. Interval capture runs for weeks.
The global shutter freezes motion. Fastest Capture and the burst recorder keep up with the belt.
Hardware-synced arrays, with alignment and ground-sample-distance binning stamped into every export.
Continuous capture and the live overlay while the platform works between rows, driven from a Jetson on board.
float32 radiance, a savable index sandbox, custom formulas, and per-unit calibration in every file.
Connect two or more LATTICE modules and Chloros elects a master, fires a hardware trigger pulse down the shared sync line, and returns a frame group in which every camera carries the same timestamp and frame ID. PTP keeps the clocks comparable to about a millisecond. The exposure itself is simultaneous in hardware, not stitched together afterwards.
Pick Full 2048×1536, Half or Quarter ROI, and 1×, 2× or 4× hardware binning. Chloros prefers binning over cropping so you keep the full field of view while cutting what goes down the wire.
Before connecting, Chloros projects the sync tier, the frame-rate range, NIC throughput and burst headroom. If the array would over-subscribe the wire, it says so and blocks — instead of quietly shedding packets.
Cross-camera vignette correction and co-registration warps are stamped onto every aligned image and carried into radiance and reflectance exports. Alignment is refused outright on arrays that are not hardware-cable-synced.
One synchronized capture across every selected camera.
Back-to-back until a count or an elapsed duration stops it.
Timelapse bursts on a timer, from seconds to days.
Raw only, processing bypassed — and it still writes the .daq so you can calibrate it later.
Index video and GIF recording. Records the live combined-index composite at 10 fps, LUT baked in — the fastest way to show someone what the field is doing.
Raw Bayer burst. Full sensor rate to disk with per-frame manifests and matched .daq readings, then rebuilt offline into calibrated video and TIFFs.
A camera measures radiance leaving a surface. Reflectance needs the illumination that arrived. A DAQ supplies it — 135 spectral points from 340 to 1010 nm at 5 nm steps, plus CIE XYZ tristimulus, in every frame, in absolute W/m²·nm.
USB serial, found by port scan. Plug it into the machine that is already running the capture.
Bluetooth Low Energy, battery powered, with onboard storage. Mount it away from the computer and stream.
IP67, PoE, discovered over mDNS as daq-e-<id>.local. Streams at up to 10 Hz and carries its calibration onboard, so it works with no internet at all.
Each unit’s factory bundle is fetched from MAPIR Cloud by sensor ID and cached locally. DAQ‑E also stores it onboard.
Recorded without a calibration on hand? The data is kept raw and calibrated later at processing time — not refused, not lost.
Which diffuser cap was fitted is recorded with the measurement, and the matching correction profile is applied from that provenance.
Downwelling is matched to images using the sensor’s own clock and recorded timezone. There is no offset field to get wrong.
The sensor reports 340–1010 nm, but the NIST-traceable calibration spans roughly 374–974 nm. Chloros draws that line explicitly.
A camera band without enough spectral weight inside that range — an F988, say — will not be given an absolute reflectance number off the DAQ. Chloros asks for an in-scene panel instead, and holds your most recent panel capture between sightings. Readings outside the calibrated range are refused, never extrapolated.
Bind a DAQ to each camera and Chloros solves reflectance frame by frame, then evaluates your index on top of it — live, on screen, before anything is written to disk.
No DAQ bound to a camera means no reflectance — Chloros disables the option rather than inventing a number. Rows that runtime state has made unavailable are visibly unavailable.
Each reflectance frame stores the DAQ reading it was matched against in a .daq sidecar, so the whole session can be reprocessed later without guessing at the light.
Where both bands sit near the sensor’s noise floor a normalised index is just amplified speckle, so Chloros leaves those pixels uncoloured on the live view instead of painting false colour. Display only — captures and exports are untouched. Smoothing steadies the rest, and you are warned if an index collapses to a constant.
Point one DAQ at the sky and one at the object and Chloros streams live spectral reflectance straight from the pair — R(λ) = object(λ) / ambient(λ) — with a live vegetation-index table computed from the curve. Ratio indices such as NDVI, GNDVI and ENDVI are always there; absolute-scale indices like EVI, SAVI and LAI appear once both sensors are power-calibrated.
It is a field spectrometer and an index meter, using hardware you already own for the cameras.
Computed from the reflectance curve shown above. Absolute-scale rows require both sensors power-calibrated.
The entire Chloros manual is published in a form language models read directly — a machine-readable index, and every page available as raw Markdown. Point Claude, ChatGPT or Copilot at it and ask for the script you need. The whole system, cameras included, is on the other side of that API.
The backend starts itself. There is no server to launch first, so the assistant cannot forget to.
Whole pipelines are single calls. Fewer moving parts to get wrong than a hand-assembled chain of steps.
Failures are loud. The CLI exits non-zero on problems and a run that produced nothing diagnoses itself, so the assistant gets something real to correct against.
Read before you run. Capture commands drive real hardware. Review anything an assistant writes for you before pointing it at an array in the field.
Any page becomes raw Markdown by adding .md to its URL. CLI and SDK access require a Chloros+ plan.
Chloros is where the measurement is made, not where it has to live. Every level of the pipeline is exportable, the raw camera stream stays open to your own tools, and nothing is locked behind a proprietary container.
16-bit TIFF for photogrammetry and GIS, 32-bit float for scientific work. Ground-sample-distance binning is carried into exports, and alignment transforms travel with every aligned frame.
LATTICE speaks GigE Vision v2.0 over a single PoE cable, so the raw stream is readable by HALCON, LabVIEW, MATLAB or anything else you have already built — no proprietary driver in the way.
The Python SDK drops into Django, Flask, Jupyter or pandas with progress callbacks and context managers, so a Chloros run becomes a step in a pipeline you already own.
The desktop application is free and complete. When the volume grows, the same processing runs headless, on Linux, on a GPU, or on a Jetson strapped to the aircraft.
The full graphical application on Windows 10/11, free, with up to four LATTICE modules.
One-line processing, headless servers, and array capture at parity with the interface.
Drive hardware and processing from code, with the backend starting on first call.
Ubuntu, Debian and NVIDIA JetPack 6.x for edge, robotics and server deployment.
The Index Calculator takes band chips, arithmetic and functions like sqrt() and log(), validates the expression as you type, and previews it against a live histogram before you commit to a batch.
Custom formulas require a Chloros+ plan, and use the same syntax in the GUI, the CLI and the SDK.
The desktop application, the command line and the SDK all speak the same 38 languages, switchable at any time — including the messages that report files which failed to load.
See the full listM3C, Bayer colour — 4 filter sets: FRGB, FRGN, FOCN, FNGB
M3M, monochrome — 23 narrowband filters, F385 to F988, spanning 379–985 nm
Sensor — Sony IMX265 global shutter, 2048×1536
Interface — GigE Vision v2.0 over PoE
Models — Survey3W wide, Survey3N narrow
Filters — RGB, RGN, OCN, NGB, RE, NIR
Image types — RAW+JPG or JPG only
PPK — corrections from DAQ-A-SD log data
Models — DAQ-U (USB), DAQ-M (Bluetooth LE), DAQ-E (Ethernet, PoE)
Spectrum — 135 points, 340–1010 nm at 5 nm, plus CIE XYZ
Units — spectral irradiance in W/m²/nm
Calibrated range — approximately 374–974 nm, NIST-traceable
OS — Windows 10 or 11, 64-bit
RAM — 8 GB minimum, 16 GB or more recommended
GPU — NVIDIA with 4 GB+ VRAM for CUDA (Chloros+)
Surfaces — GUI, CLI and Python SDK
OS — Ubuntu 20.04+ or Debian 11+, x86_64
Install — single .deb package
GPU — NVIDIA with 4 GB+ VRAM for CUDA
Surfaces — CLI and Python SDK, no GUI
Platform — JetPack 6.x, arm64
Models — Nano, Orin Nano, Orin NX, AGX Orin
Memory — 8 GB shared minimum, 16 GB+ recommended
Compute — adapts to the hardware, with thermal throttling for sustained runs
