- 06 Jul, 2026 7 commits
-
-
Andrey Filippov authored
Andrey's clutter rule: calibration force-rerun = erase the file, not a config checkbox. pose_recalc removed everywhere (field/dialog/properties/ copy; old configs' leftover key is ignored harmlessly), poseSequencePass lost its allow_recalc parameter. Every file-gated reuse now prints the delete-to-recalculate hint: - TILE-CALIB: 'reusing ... delete <name>-POSE-RT-TILE-CALIB.tiff to recalculate' - RT-STATE dc_center: 'delete <name>-RT-STATE.json (or its dc_center field)' - FPN (CorrectionFPN): 'reusing saved <name>-FPN.tiff - delete it to recalculate (verify Rotation period first - a mismatch bakes an azimuth-sector content ghost into the FPN)' Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
Andrey's ruling: the pose stage normally ALWAYS runs (it is part of the RT cycle, not a mutually-exclusive test) - the last run had rend_test ON which silently skipped the pose stage (old precedence) and left TILE-CALIB unbuilt. Now: pose_test runs FIRST, rend_test render follows when also ON, cond_test stays standalone (only when nothing else ran). Dialog/tooltips updated ('CUAS RT render (full product)'). Verified meanwhile (POSE-11 renders): frozen per-sequence DC cut the RT-RENDER horizon wobble 234 -> 42.4 counts pk-pk (5.5x), exactly to the oracle DBG floor - the residual at 1-rev period is the shared FPN ghost; FPN.tiff still Jun-1 vintage because cuas_calc_fpn was OFF (the '(Re)calculate FPN' checkbox) - the rot_period=164.9 recompute has not actually run yet. Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
POSE-10 forensics: RT-RENDER merged horizon pk-pk 234 counts (sky 187) with the dominant period 165.7 scenes = EXACTLY one camera revolution (21.83 rpm @ 60 fps -> 164.9); POSE-RT-COMPOSITE real slices the same. Cause: the per-SCENE zero-DC sky median (Config.dc_level=NaN auto) oscillates with azimuth as warm terrain sweeps through the sky half; downstream temporal averages convert the wobble into content-correlated residuals - the faint rotating ghost ('real image treated as FPN'). Oracle MERGED-DBG shows a separate, 3-6x smaller wobble at the same period (pre-existing, prepared path - not addressed here). Fix (Andrey's rule: one constant per sequence, from the average scene): - CuasRT.sequenceDcLevel(): manual curt.dc_center override when nonzero, else the RT-STATE value derived by appropriateCenter() from the borrowed center (= the sequence average) - scenes and center shift by the IDENTICAL constant. - CuasPoseRT (A2 ingest) + CuasRender (render test) now pass a Config with that dc_level instead of null; NaN fallback (per-scene) kept but warns loudly. Config.dc_level doc updated. Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
New checkbox 'Save oracle DBG renders (11GB)' (default ON - current behavior preserved): gates the EXTRA per-sensor -CUAS-INDIVIDUAL-CUAS-DBG render pass and the -CUAS-MERGED-CUAS-DBG save in CuasRanging.prepareFpixels (the merged render itself stays - it is the production imp_targets input). Turn OFF to save render time and disk once -CUAS-RT-RENDER (rend_test, the RT-chain full render) is the trusted full product. Also refreshed the stale dc_center GUI tooltip (RT-STATE.json semantics). Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
Missing-file rule (Andrey): calibrations are FILE-gated; missing -> rebuild (slow first run), present -> reuse, erase -> force. Config keeps parameters only. - TILE-CALIB bootstrap: testPoseSequence = wrapper over poseSequencePass; missing -POSE-RT-TILE-CALIB (or pose_recalc ON) -> FULL pass generates and saves it, then AUTOMATICALLY re-runs filtered (~150 cluster tiles) - first run on a v013_min copy ends in the warmed-system state, per sequence (mixed-state batches self-serve). Bootstrap re-run ignores pose_recalc; pose_full still never reads/writes the calibration. - NEW CuasRtState (-RT-STATE.json, Gson): per-sequence RT-only persistent variables in the CENTER model dir; global params stay with quadCLT_main / corr-xml (GUI save + compare/combine). Data-pure (paths, no QuadCLT), forward-compatible, failure-safe load. First tenant: dc_center - AUTO now reuses/derives-and-stores per sequence; the corr-xml config is never mutated (nonzero = manual override). - INTERFRAME is QuadCLT-workflow/POSES ONLY (Andrey): rtPhotometricCalibration no longer writes the ref INTERFRAME; photometric persists via the explicit corr-xml save after a calib-ON run (quadCLT_main carries the values). Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
- NEW cuas/rt/CuasRT.java: the ENTIRE CUAS RT mode moved out of OpticalFlow.buildSeries (curt_en branch) into one readable top method: 1. INITIALIZATION (ingest, photometric calibration, center appropriation) 2. DIAGNOSTICS (rend/pose/cond tests - exclusive, never grow the top) 3. PRODUCTION (detection; the MVP per-scene jp4 loop will replace the bulk oracle ingest without changing this structure). - Borrow boundary (Andrey ruling): all transforms of borrowed QuadCLT data happen at CuasRT initialization ONLY. appropriateCenter() zeroes the center CLT IN MEMORY (setCenterClt; -CLT-UPDATED is saved upstream, so the zeroed copy never persists) - the pose test drops its per-run GPU appropriation and uploads an already-zeroed reference. The pure math is CuasConditioning.zeroDcClt(fclt, pattern, level) - knows no QuadCLT. - FIX (POSE-09 silent no-op): the DC-pattern uniform image must be set on gpuQuad.getQuadCLT() - what both backends actually read (GpuQuadJna setBayerImages(center=true), JCuda base, CorrectionFPN recipe) - not on center_CLT; plus an all-zero-pattern guard (warn loudly, never fake-offset). - FIX (POSE-09 1470-count per-sensor sky spread vs 17 calibrated): rtPhotometricCalibration applies the fit to the ALREADY-SPAWNED per-scene instances too (created by ingest before the calib step). The recalibrated photometric persists only via ref INTERFRAME + a config save after a calib-ON run - all current configs still carry the stale values. Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
getCenterAverage() is null in the pose flow, so the auto DC level silently no-op'd (composite virtual sky stayed at -4511). Derive the level from the reference buffer render itself - perSensorImagesFromTD(gpuQuad, true)[0] sky-half median - i.e. the exact data being zeroed, right after setReferenceGPU uploads it. Failure-safe warnings preserved; explicit curt.dc_center and adoption/persistence semantics unchanged. Verify: pose run -> console 'AUTO center DC level', composite virtual sky ~0. Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
- 05 Jul, 2026 13 commits
-
-
Andrey Filippov authored
Three coupled improvements from tonight's design discussion with Andrey: 1. ZERO-DC in CuasConditioning (Config default ON): LWIR microbolometers are ADDITIVE (fixed tau=8ms exposure, F#~1 for NETD, ~100 counts/K) - day/night and seasons SHIFT the level, never scale it; the MCLT has no clean DC/AC separation, so a large DC (current ~-3500 counts under ~300 counts AC) spreads over many TD points and costs float32 mantissa bits. Subtract ONE common constant from all 16 sensors (pure shift, never rescale). AUTO level = MEDIAN OF THE TOP (SKY) HALF, robust to the snowy-ground-vs-summer- calibration mismatch and to targets. 2. RT-DECOUPLED FAT ZERO (curt.fz_inter=10000, curt.fz_intra=2000 reserved): the lean code erroneously used the INTRA getGpuFatZero (2000) instead of the INTER value - Andrey's FZ sweep (200/1000/3000/10000: corrRMS .54/.39/.37/.31, roll bias +.80/+.62/+.50/+.39) independently rediscovered the oracle's INTER operating point (10000). RT now owns its FZ pair, no AUX switch; legacy gpu_fatz*/FOPEN configs untouched. Sweep recorded as characterization: FZ tolerant over a broad range; revisit only together with the argmax method redesign (sharp peaks starve the centroid). 3. BORROWED-CENTER APPROPRIATION (curt.dc_center, 0=auto): the restored CenterClt reflects its own footage vintage - offset it ONCE at the borrow boundary (firewall: never re-compensate downstream) to match the zero-sky scenes. Auto level = sky-half median of the borrowed center average, ADOPTED into curt.dc_center (persisted with the config - borrowable later like the photometric calibration). Mechanics: DC pattern = CLT of a uniform image via the existing back-propagation convert (setImageCenter + no_kernels + use_center_image, the CorrectionFPN recipe); failure-safe (any missing piece leaves the reference unchanged, with a warning). Roadmap recorded: per-pixel offset (recalibrated per-sensor + FPN) and per-pixel scale maps to the GPU; the average stored in TD AFTER LoG (aberration+LoG combined kernels) for fpixels subtraction - possibly for poses too; center-average window length trades reference stability vs extremely-slow-target detectability. Verified: mvn -DskipTests clean package OK. Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
Per Andrey: restore the pose test using the new (certified) data. - Disparity: ONE source for all of RT - the plain DSI slice through CuasRender.conditionDisparityCuas (defined for ALL tiles, sky=infinity, negatives clamped). The use_lma_dsi gate removed from the pose test (the LMA slice is NaN over the sky and silently shrank the usable set). - leanMeasure/leanFitScene: MB compensation (lean v2) - the same certified machinery as CuasRender: setInterTasksMotionBlur two task sets + the erase-first interCorrTDMotionBlur double convert (undefined tiles NaN for the consolidation), gated by imp.mb_en, vectors from the existing per-scene getMotionBlur block (previously computed but unused by lean). - pose_stored branch gets the same MB treatment. Expected in the next lean run (LMA, 150-cluster selection, mb_en ON): az/tilt wobble (v*tau, 0.5 px rotating) collapses toward the MBEN oracle (0.029/0.021 mrad), corr RMS toward ~0.08; roll bias = the remaining open question (FPN-mask lead). Verified: mvn -DskipTests clean package OK. Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
Per Andrey: the sky has nothing to match but is the BACKGROUND FOR DRONES - it must render (at infinity), NaN acceptable only outside the image. Root of the NaN tiles in -CUAS-RT-RENDER: use_lma_dsi=true selected the LMA DSI slice, which is NaN wherever the LMA did not fit (the whole sky) -> tiles dropped from the task list. The plain slice has no NaN but carries garbage (crazy < -1 tiles in the sky, negatives near the sign post). Fix: NEW static QuadCLT-free conditionDisparityCuas() (the legacy conditionInitialDS takes a QuadCLT instance - out per the RT rules): plain slice 0, NaN -> 0.0 (infinity), negatives -> 0.0. testRenderSequence now uses it unconditionally (not gated by use_lma_dsi - that gate is for the pose measurement, not rendering). Verified: mvn -DskipTests clean package OK. Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
Per Andrey: undefined tiles (= not in the task list; the fixed-length 5120 arrays represent them as nulls) must be handled by the channel consolidation - weighted-by-existing average, all-NaN tile when no sensor has it (now Java CuasTD.consolidateSensorsTD, later the CUDA clt_average_sensors kernel). The consolidation detects missing by NaN, but the MB double convert ran with erase=-1, leaving STALE (valid-looking) data at undefined tiles. - ImageDtt.interCorrTDMotionBlur: new erase-capable overload (erase_clt_first: >0 NaN, 0 zeros, <0 legacy no-erase) - erases before the FIRST (SET) convert only; the SECOND (negative-scale SUBTRACT) never erases. Legacy signature delegates with -1: oracle/SfM callers byte-identical. - CuasRender MB path uses erase_clt_first=1: the GPU TD buffer's NaN pattern now mirrors the task-list membership, so consolidation + renders see undefined tiles as NaN - never the previous scene. Verified: mvn -DskipTests clean package OK. Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
Per Andrey: of the 3 expected render-vs-oracle mismatch causes, the legitimate one is the better photometric calibration; the other two - ERS and motion blur - must be implemented in the RT chain: - ERS: NEW CuasConditioning.conditionSceneToGpuCuas(scene, cfg, omegas, velocities, ...) - the ONE place per-scene motion enters the ingest. Sets the scene ERS rates (fully-preserved ErsCorrection path); velocities = provision ({0,0,0}/null for the rotation-only camera). In production the omegas come analytically from wobble radius + RPM; the GPU corr_vector imu_rot/imu_move feed is the future upgrade (after the double-application check vs CPU pXpYD ERS). Legacy conditionSceneToGpu delegates (unchanged behavior for the pose loop). - MB: renderSceneVirtual takes mb_vectors/mb_tau/mb_max_gain; when enabled uses the ORACLE machinery (setInterTasksMotionBlur two-task-set + interCorrTDMotionBlur double convert: positive original + negative shifted scale pair summing to 1, ratio from 1-pix-time/tau, offset stretched when scales would exceed mb_max_gain). No erased re-convert in MB mode (would destroy the accumulation) - comparisons must mask to task tiles. - testRenderSequence: MB gated by imp.mb_en (matching the oracle DBG products: ON -> compare vs MB DBG, OFF -> vs -NOMB DBG); vectors from the same OpticalFlow.getMotionBlur at borrowed pose + stored rates; ingest via the new wrapper. Verified: mvn -DskipTests clean package OK. Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
Per Andrey (2026-07-05): today's problems came from jumping over the standalone certification of conditionSceneToGpu (single caller inside the pose test, never image-tested by itself). Test and debug the ingest+render chain FIRST, only then return to the pose test. NEW class cuas/rt/CuasRender (the start of the dedicated renderer per the spec in imagej-elphel-internal handoffs/2026-07-05_cuas_rt_dataflow_and_grids.md par.6: virtual uniform grid always, raw center DSI disparity, jp4+CuasConditioning pixels, QuadCLT borrow-only, static methods): - renderSceneVirtual(): tasks at pose (ALL valid-disparity tiles) -> convert (erase=1, NaN outside tasks) -> 16 per-sensor renders + consolidated (NaN-aware weighted average) merged render. No correlation. - testRenderSequence(): per scene raw /jp4/ -> conditionSceneToGpu -> render at BORROWED stored pose + stored ERS rates (the exact sources the oracle DBG renders use) -> saves <center>-CUAS-RT-RENDER.tiff hyperstack [t: s00..s15, merged][z: scenes], slice-by-slice comparable to -CUAS-INDIVIDUAL-CUAS-DBG / -CUAS-MERGED-CUAS-DBG. New checkbox "CUAS RT render test (ingest+render)" (curt.rend_test), takes precedence over the pose test in the curt_en branch. Verified: mvn -DskipTests clean package OK. Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
LEAN-07 (stored poses, all tiles, sum-scaled input): sqrt_l0 3.22 -> 5.58 (wider, not the predicted ~2.1), corr RMS 0.82 -> 1.005. At 16x signal-to- fat-zero the normalize amplifies the blur-decorrelated high frequencies - the fat zero was regularizing usefully. Root of the misdiagnosis: the width comparison used the MB-COMPENSATED oracles (FILT150A 2.08, MBEN 2.75); the correct no-MB control (NOMB oracle) has sqrt_l0 3.58 ~ lean's 3.22 - lean peak shapes were normal all along, and Andrey's "there was no 16x difference" was right where it mattered. Consequences: (1) correlator input back to the true weighted average (the same data as the -POSE-RT-COMPOSITE debug render - single upload again); (2) the "fz-broadened peak content pull" roll-bias mechanism is falsified - the +0.52/+0.33 mrad roll bias needs a new suspect (remaining engine differences vs the NOMB oracle: neighbor consolidation min_str_neib, min_confidence gates, peak-extraction parameters); (3) MB compensation in lean (v2) is the main quality lever - MBEN sharpens peaks 3.6 -> 2.8 and removes the 0.5 px wobble. Verified: mvn -DskipTests clean package OK. Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
Per Andrey's input-verification methodology: the -POSE-RT-COMPOSITE "real" component must be the weighted 16-sensor average (comparable to the virtual render), while the correlator receives the per-tile SUM (379b3cf6 fix). Render moved BEFORE the sum scaling (extra H2D + imclt in debug mode only); the post-correlation render (which would now show the count-stepped sum) removed. Verified: mvn -DskipTests clean package OK. Co-Authored-By:
Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
CLAUDE: lean pose FIX: consolidated TD scaled to per-tile sensor SUM (oracle fat-zero operating point) The lean conj-multiply fed the plain 16-sensor AVERAGE into the same FZ-normalize (same absolute fat zero; JNA drops per-tile weights) that the oracle feeds with the unweighted SUM of pair products - 1/16 the amplitude, so the effective fat zero was 16x larger. Invisible in output scale (the normalize hides it) but measured in peak shape: sqrt_l0 3.22 vs oracle 2.08 and sqrt_l1 5.83 vs 4.15 on identical tiles, corr RMS 0.46 vs 0.33 - and suspected as the roll-bias mechanism (asymmetric-content centroid pull on broadened peaks; +0.52 mrad @ 150 edge-weighted tiles, +0.33 @ all tiles). Fix: multiply each consolidated tile by its per-sensor count (SUM semantics, matching the oracle exactly incl. partial tiles). consolidateSensorsTD itself unchanged (A2 validation still uses the true average). Expected in LEAN-05 (normal LMA run): sqrt_l0 ~2.1 in the HYPER eigen slices, corr RMS toward ~0.33, roll bias collapse if the mechanism is confirmed (survival = clean falsification). Verified: mvn -DskipTests clean package OK. Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
Andrey's diagnosis: the composite-vs-DBG sub-pixel warp field (static, sy- dominated: uniform 0.24px, x-shear, +0.3% y-scale ~ tilt_rate*frame_time) comes from the ErsCorrection infrastructure - the render path sets each scene's ERS from the STORED scenes_<ts>_dt (xyz_dt AND atr_dt, renderSceneSequence/OpticalFlow:10555) while the pose loop used finite- difference ATR-only rates with xyz_dt=0. Different scene-side ERS by construction. (Virtual center's own ERS rates confirmed ZERO in corr-xml; GPU corr_vector imu_rot/imu_move ERS support confirmed present but dormant.) pose_stored mode now sets setErsDt from ers_center.getSceneErsXYZ_dt/ getSceneErsATR_dt - the exact calls the render uses - so the decoupled measurement/render applies IDENTICAL poses AND ERS as CUAS-MERGED-CUAS-DBG. If the warp field collapses in the next pose_stored run, the divergence is proven. Live (LMA) mode unchanged: finite-difference rates - to be replaced by rates computed from pose + rotation model (RT design: ErsCorrection preserved fully, thin non-QuadCLT plumbing; per-sensor ERS available on GPU via corr_vector imu when fed). Verified: mvn -DskipTests clean package OK. Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
Per Andrey: static per-tile dx offsets found in -POSE-RT-HYPER (e.g. tile x=15,y=41: dx mean +0.92 constant over all 497 scenes, far tile disp 0.02; tile x=71,y=51: dx +0.86 dy +1.91, near tile disp 13.2 - neighbors with similar disparity are near zero) -> suspect broken per-tile task data. New checkbox "Pose test stored poses (no LMA)" (curt.pose_stored): every scene is measured/rendered at its STORED (oracle-vintage) pose, the LMA is skipped entirely. -POSE-RT-HYPER/-CORR2D/-COMPOSITE come from that single measurement; CSV rms column = weighted RMS of the measured offsets. The -POSE-RT-COMPOSITE "real" component must then match the oracle CUAS-MERGED-CUAS-DBG per-scene renders tile-for-tile (and "virtual" its [average] slice) - any mismatch localizes the broken tiles in the task/render/correlation chain, independent of the solver. Observability only - the fitting paths are unchanged. Verified: mvn -DskipTests clean package OK. Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
Per Andrey (no blind fixes - see what is going on): save the composite (TD-averaged, grid-transformed) scenes actually correlated against the virtual center, WITH the virtual render for comparison: - curt.pose_img_save (checkbox "Pose test save composite scenes"): -POSE-RT-COMPOSITE.tiff hyperstack [t: real, virtual][z: scene] - the virtual-center render repeated for every scene so the component slider blink-compares at any z. z aligned with -POSE-RT-HYPER/-CORR2D. - leanMeasure img_out holder: when requested, re-runs execConvertDirect with erase_clt=1 (NaN outside task tiles - the standard interCorrTD erase=-1 leaves the previous scene's tiles as ghosts in a render; correlation itself unaffected), then imclt renders sensor slot 0 = the consolidated average (last LMA cycle, converged pose). - Virtual component = imclt of the reference buffer (what the conj-multiply actually sees), not a re-render from prepared data. Observability only - processing unchanged, roll-bias symptom preserved. Verified: mvn -DskipTests clean package OK. Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
Per Andrey's debug approach (same as used on the oracle): render the actual scene-vs-virtual-center correlations in the pixel domain and save them as a scene sequence. Observability only - NO processing changes, the roll-bias symptom is preserved. - curt.pose_corr_save (checkbox "Pose test save 2D correlations"): save -POSE-RT-CORR2D.tiff - z=scenes (aligned with -POSE-RT-HYPER incl. NaN slices for failed/coasted scenes), tile grid of 16x16-pix cells, last LMA cycle per scene, ImageDtt.corr_partial_dbg convention as CuasMotion CORR2D. Lean engine only (the oracle does not expose its correlation tiles). - curt.pose_full (checkbox "Pose test ALL tiles (ignore calibration)"): temporarily drop the 150-tile filter and use all strength-selected (~1074) tiles; -POSE-RT-TILE-CALIB is neither read NOR written so a debug run never pollutes the persistent tile calibration. - leanMeasure/leanFitScene: optional corr_pd_out holder (last-cycle PD tiles). Context: lean run v013-LEAN-01 confirmed the v*tau signature on az/tilt (implied tau = 8.4/8.0 ms = mb_tau) but showed a constant +0.52 mrad roll bias; peaks ~50% wider than oracle on common tiles (suspect: consolidation averages /16 while oracle sums pairs -> effective fat-zero 16x larger). These debug outputs are for inspecting exactly that before changing the processing. Verified: mvn -DskipTests clean package OK. Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
- 04 Jul, 2026 16 commits
-
-
Andrey Filippov authored
Per Andrey: insert an XML comment right after <properties> in every modified file with the absolute path of the script that did the migration + timestamp (absolute path intentional; adjust per machine). Java loadFromXML ignores XML comments (verified with a real load: 4153 entries) but drops them on re-save. Applied to the live config LV396-v013-...-POSEJP4-ENMB.corr-xml: 87 keys renamed, .bak kept, Java load verified. Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
Per Andrey: CuasRtParameters should be instantiated like the other parameter classes at CLTParameters:1175..1185 (img_dtt/ofp/imp/ilp/...), not nested inside IntersceneMatchParameters. Changes: - CLTParameters: new peer field curt, set/getProperties wiring, own "CUAS RT" dialog tab right after imp's questions/answers (tab content unchanged; tab position moves from inside imp's tab row to after it). - IntersceneMatchParameters: the six curt wiring sites removed (field, dialogQ/A, set/getProperties, clone). - Access rename: clt_parameters.imp.curt.X -> clt_parameters.curt.X (105 sites: OpticalFlow, CuasDetectRT, CuasPoseRT). - corr-xml keys change _imp_curt_* -> _curt_*. getProperties keeps a legacy fallback (reads _imp_curt_* first, _curt_* overrides), so old configs still load unmigrated. - NEW scripts/migrate_curt_config.py: renames _imp_curt_* keys in existing corr-xml files (in-place with .bak, --dry-run, idempotent, drops duplicate legacy entries with a warning). Validated on a copy of LV396-v013-...-POSEJP4-ENMB.corr-xml: 87 keys renamed, byte-identical otherwise. Verified: mvn -DskipTests clean package OK; no imp.curt references remain. Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
The reader was at 63291/65535 (bloated by ~1103 non-CUAS getProperty reads, not curt). Split its second half into a private getProperties2(prefix, properties) continuation (same pattern as the earlier getPropertiesCuasRT split): getProperties 63291->33327, getProperties2 29970 - both comfortably under the limit. Behavior identical (order preserved, same args). All IMP methods now safely under 64K (largest = setProperties 52127). mvn compile clean. Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
Per Andrey: move every curt_* parameter out of IntersceneMatchParameters into its own class (like CLTParameters.imp/ofp/... peers), held as IntersceneMatchParameters.curt = new CuasRtParameters(). All 61 params: field decls, dialogQuestions/Answers, set/getProperties, clone. Access changes imp.curt_X -> imp.curt.X (114 external sites across OpticalFlow/CuasDetectRT/ CuasPoseRT); short field names (curt_ prefix dropped, class name conveys it). corr-xml COMPATIBLE (no conversion needed): delegated as curt.set/getProperties(prefix+"curt_", props) with short keys, so full keys stay ..._imp_curt_X byte-identical (verified: 61 old == 61 new). Verified: compiles clean; 61 params in every section; dialogQ add* == dialogA getNext* == 61, verbatim order (pairing preserved); interleaved non-curt air_/fgnd_ decls intact. Relieves setProperties 54865->52127, dialogQuestions 22385->21267, clone -503B (the methods our pose work grows). NOTE: getProperties READER stays 63291/65535 - its bloat is ~1103 NON-curt getProperty reads (curt reads were already in getPropertiesCuasRT since 06/12); relieving it needs a separate non-curt extraction (flagged for Andrey). Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
TD-average the 16 sensors BEFORE correlation (multiply averages, not average products), single conj-multiply vs the persistent virtual-center TD. Zero new CUDA - assembled from proven pieces: - CuasPoseRT.leanMeasure(): interCorrTD(sensor_mask=0) = tasks(pose)+offsets+ convert_direct only -> getCltData/CuasTD.consolidateSensorsTD/setCltData (the validated CPU bridge, future clt_average_sensors kernel) -> setSensorMaskInter(1)+execCorr2D_inter_TD (single conj-multiply) -> TDCorrTile.getFromGpu + convertTDtoPD (JNA-validated CuasMotion path, FZ-normalize + PD) -> Correlation2d.getMaxXYCmEig (peak+eigen, the GPU argmax kernel oracle). Correlation stages are geometry-blind - projection/ distortion is baked into the average-camera tasks (per Andrey). - CuasPoseRT.leanFitScene(): same IntersceneLma solver + exit rules as the oracle engine; fills lma_rms/coord_motion_rslt so CSV/-POSE-RT-HYPER are unchanged (A2-03 = direct oracle). - curt_pose_lean checkbox 'Pose test lean correlation (B)'. v1 differences from oracle (documented): NO motion-blur compensation (compare vs NOMB baseline: 0.287/0.282/0.106 mrad), no FPN peak masking (input is FPN-subtracted by A2 conditioning), no moving-object filter, min_confidence=0. mvn compile clean. Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
Per Andrey: the name must make it obvious this is a CALIBRATION file that has to be preserved with the model (reliable_tiles are derived from it). New saves use -POSE-RT-TILE-CALIB; the old -POSE-RT-MAXDXY is still read as a fallback, so existing model dirs keep working. Tooltips/comments updated. Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
Per Andrey: bypass the QuadCLT image_data mechanics entirely and feed the GPU directly - the permanent RT shape (more data becomes GPU-memory-resident; QuadCLT stays for geometry/poses only). - CuasMotion.readRawImageData(): raw /jp4/ reader extracted from perSensorFromRawJp4 (oracle getJp4Tiff, one thread/sensor, instrumentation); perSensorFromRawJp4 rewired, behavior unchanged. - CuasConditioning.conditionSceneToGpu(): raw read -> condition() with the CURRENT calibration (curt_calib-updated lwir scales/offsets/scales2 + per-pixel FPN from the scene QuadCLT) -> bind scene (saveQuadClt, conditional) -> clear hasNewImageData -> setBayerImages(data,true) force-H2D. The bayer guard (ebef0b23 fix) keeps the upload alive through interCorrPair's own setBayerImages(false). TELL if the guard ever breaks: results become identical to the prepared-data path. - CuasPoseRT: curt_pose_raw flag (new checkbox 'Pose test raw-jp4 ingest (A2)') runs the ingest per scene before the fit; ingest failure coasts the prediction and records an empty CSV/hyper row (fail=-1). Acceptance (recorded): A2 legitimately diverges from phase A (old Photogrammetric Calibration was broken, frozen from unrelated footage) - judge by A2's OWN dstored/corr-RMS/convergence; systematically worse = red flag. mvn compile clean. Co-Authored-By:
Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
Phase A2/B building block: consolidate the 16 per-sensor CLT channels into ONE averaged TD channel (average images BEFORE correlation - multiply averages, not average products). Per-tile granularity: sum sensors that have the tile (first element NaN = absent), count, divide; count plane returned as the weight; a stray in-tile NaN poisons the whole result tile (fail-visible). Not available on GPU (combine_inter only sums correlation PRODUCTS) - this CPU implementation + get/setCltData D2H/H2D is the A2 bridge and the bit oracle for the future clt_average_sensors kernel. - CuasTD.validateConsolidation(): linearity oracle - imclt(TD-avg) must equal pixel-average of per-sensor imclt renders (same GPU imclt both sides); prints count-plane stats + max|diff|/RMS, saves -CUAS-TDAVG-CHECK 3-slice stack, restores original TD. Wired into the curt_cond_test branch after perSensorFromRawJp4 (uses its raw-jp4 16-sensor TD). - GpuQuadJna.getCltData() override added (base derefs null gpu_clt_h on JNA shells - the known un-overridden-accessor class); uses tp_proc_get_clt. mvn compile clean. Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
Findings from the FILT150 run: (1) scattered rank-150 selection starved the per-scene neighbor consolidation (min_str_neib/eig_str_neib) - only ~57 tiles with accidental neighbors were measured per scene (neighbors-vs-measured corr 0.78); (2) roll degraded (RMS 0.106 vs 0.059 mrad, bias +0.073) - the selection carried only 11% of the full set's roll information. deriveSelection() stage 2 now picks disjoint 3x3 CLUSTERS of gate-passing tiles (>=CLUSTER_MIN_ELIGIBLE=6 of 9), round-robin from three pools: LEFTMOST, RIGHTMOST (per Andrey - edge tiles have the most roll influence), BEST-QUALITY (median member fmax), until the tile budget is filled; scattered best tiles fill any remainder. Offline simulation on the real calibration: 24 clusters (8/8/8), 150 tiles, mean 3.97 in-selection neighbors, roll info +48% vs scattered rank-150. Measurement code untouched (oracle identical). mvn compile clean. Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
Per Andrey: (1) calibration reuse is now automatic - if -POSE-RT-MAXDXY exists it is used (filtered run), else a full run generates it; new curt_pose_recalc flag forces regeneration (replaces the backwards curt_pose_use_filt enable). Matches the FPN reuse pattern. (2) MAXDXY stores NaN instead of +inf for NaN-in-any-scene tiles - deriveSelection rejects NaN and +inf identically (non-finite), and NaN keeps the TIFF viewable in ImageJ (+inf broke min/max autoscaling). mvn compile clean (Eyesis closed). Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
Replaces the absolute curt_pose_max_dxy with the scale-free scheme (Andrey's histogram rule formalized + robustness for worse footage): - Calibration artifact -POSE-RT-MAXDXY.tiff: per-tile max-over-scenes residual, +inf where any scene NaN (auto-reject, mergeable across runs by max), NaN where unmeasured. Saved only from FULL-selection runs (a filtered run never shrinks coverage). Continuous statistic persisted, boolean selection derived at load - policy can change without re-measuring. - deriveSelection(): stage 1 outlier gate keep max <= median + k*NMAD of finite per-tile maxes (curt_pose_dxy_k=0.75; on the reference footage: MBEN gate 0.477 keeps 595, degraded NOMB self-adapts to 0.728 keeps 626 - same ~65%); stage 2 rank-N budget keep curt_pose_num_tiles=150 best (threshold-free). - curt_pose_use_filt now loads MAXDXY and derives; missing -> full run generates it (FPN-style reuse pattern). Importance-greedy (3x3 information matrix) ranking = next step. mvn compile clean. Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
Per Andrey: a selected tile is BAD if its measured dxy is NaN in any scene or exceeds curt_pose_max_dxy (absolute, default 0.25 pix) in at least one scene. Survivors saved as -POSE-RT-RELIABLE-FILT.tiff; curt_pose_use_filt loads it on a next run and ANDs with the strength selection (two-pass workflow: full run calibrates the selection, subsequent runs use ~191 clean tiles instead of 1074 on the reference footage; kept-tile mean dxy 0.087 pix). Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
Exercises the existing MB machinery in the RT iterator: when imp.mb_en is ON, per-scene blur vectors from OpticalFlow.getMotionBlur (FD-based rates) send interCorrPair down the setInterTasksMotionBlur/interCorrTDMotionBlur path - convert_direct runs twice, the second run subtracting the shifted+scaled copy via negative TpTask.scale (LWIR bolometer exponential-tail removal). mb_en OFF keeps the single-run path, giving a one-checkbox A/B. Same getMotionBlur usage as offline setInitialOrientationsCuas (stored truth was produced WITH MB on). mvn compile clean (Eyesis closed). Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
Per Andrey: (1) fitted-vs-stored deltas reported in PIXELS (the informative unit), using the same scales as the LMA par_scales - az/tilt = focal/pixelSize, roll = distortionRadius/pixelSize; mrad kept secondary. (2) A 'CuasPoseRT scene i (of N) <timestamp> Done/FAILED' line after each fit so the unlabeled LMA iteration prints above it are attributable to a scene (SYSTEM_OUT-01.log had iterations but no index/timestamp). Per-scene line also shows dstored in pix. Verified with standalone javac (Eyesis live - no mvn). Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
Per Andrey: characterize the per-scene measurement, incl. the eigenvector data. -POSE-RT-HYPER (80x64, z=scenes, t=components, make_hyper layout): dx, dy, strength, dxy=|dx,dy| from vector_XYS; sqrt_l0, sqrt_l1 (peak-ellipse half-axes, pix), elong=sqrt(l1/l0) (linear-feature indicator), eig0_ang (precise-axis direction, [0,PI)) from coord_motion eigen {eig_x,eig_y,l0,l1} - NaN unless imp.eig_use. Data = last LMA cycle's coord_motion via the existing coord_motion_rslt out-param. -POSE-RT-RELIABLE = tile selection mask. Verified with standalone javac against target/classes (Eyesis live - no mvn; Eclipse rebuilds on restart). Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
Top-level scene iterator re-generating per-scene 3-angle poses against the persistent virtual-center reference, RT-style: ascending time order, zero-order prediction seeding (fit anchored to the center, prediction only warm-starts the LMA), single pass on the final combo DSI (no refinement pass - it only existed because disparity arrived after initial orientations offline). Measurement engine = proven Interscene.adjustPairsLMAInterscene (reference GPU data set once); phase B will swap it for the lean TD-average x virtual-center path with GPU argmax+eigen kernels, keeping this iterator + CSV as the oracle. - new cuas/rt/CuasPoseRT.testPoseSequence(): reference prep (strength> curt_pose_str tile selection, setReferenceGPU with center CLT), stored-pose seed/truth from center ErsCorrection scenes_poses, per-scene fit with 3-angle param_select (XYZ locked), ERS dt from pose finite differences (disable_ers), MB off, coast-on-failure; writes -POSE-RT-TEST.csv + fitted-vs-stored summary - params curt_pose_test (bool) + curt_pose_str (1.0) - 6 plumbing sites - OpticalFlow curt_en branch: curt_pose_test runs INSTEAD of detection Build: mvn compile clean. Runtime validation pending (Eclipse/Eyesis run on sequence 1773135476_186641, truth = re-adjusted stored poses). Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
- 03 Jul, 2026 4 commits
-
-
Andrey Filippov authored
CLAUDE: self-documenting comments: TpTask bridge role, differential rectification, offset composition Comment-only (no code change; mvn compile clean). Documents, from Andrey's explanation: TpTask as the Java<->CUDA work-list bridge; the per-sensor xy offset as the differential-rectification composed shift (factory kernel offset + misalignment + disparity + relative pose) split integer/fractional; historic host-side vs current GPU-side geometry fill; updateTasks() D2H; disp_dist[cam][4] = d(x,y)/d(disp,ndisp) Jacobian consumed by Corr2dLMA and lazy-eye/ERS. Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
New curt_calib parameter (CUAS RT dialog, saved/restored) runs/bypasses the per-sensor photometric (re)calibration as the first step of the CUAS RT processing flow, before detection (no longer tied to the diagnostic). Extracted CuasMotion.rtPhotometricCalibration() = convertFromData() (upload + own uniform grid convert, split out of perSensorFromData) + fit + apply/ save. Production step converts and calibrates without saving stacks; the curt_cond_test diagnostic (replaces detection) keeps the raw-vs-conditioned stack compare and makes the calibration step save -CUAS-PERSENSOR[-ADJ]. Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
The virtual -CENTER INTERFRAME corr-xml only carries poses/velocities, so saving the recalculated 16+16 lwir offsets/scales there was futile. Follow the established photometric machinery (runPhotometric()/photoEach()) and the top-menu save/restore convention instead: set the new values on master_CLT (immediate use), quadCLTs[ref_index] (physical photometric owner, its <scene>-INTERFRAME.corr-xml is saved) and quadCLT_main (applied to next sequences and saved in the main configuration file). Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-
Andrey Filippov authored
curt_cond_test rework: both PERSENSOR stacks now converted with the test's own uniform sensor-domain task grid (scale 1.0) instead of leftover GPU state (MB secondary tasks with negative fractional scales made 'raw' renders = -1/6 x input; leftover virtual-view grid lost the same border ROI on every sensor). perSensorFromRawJp4 no longer overwrites the scene's conditioned image_data. GpuQuadJna.setBayerImages(force,center) restored the base-class skip-guard via a native-side jna_bayer_set flag (gpuTileProcessor is null in JNA shell instances): every execConvertDirect unconditionally re-pulled quadCLT.getResetImageData(), silently clobbering explicit uploads - made the raw baseline bit-identical to the conditioned render. CuasMotion.perSensorLinearFit(): per-sensor a+b*x photometric fit over safe tiles (weak strength<0.5 or far disparity<1 from -INTER-INTRA-LMA, inner rect, 8x8 tile->pixel map) against the cross-sensor mean, gauge keep_averages (mean offset 0, mean scale 1), 3-sigma outlier rejection. Validated on 1773135476_186641: sensor-mean spread 1353->5 counts, cross-sensor RMS 358->17 (inliers), b in 0.83..1.11. CuasMotion.applyLwirLinearCalibration(): folds the fit into the 16+16 lwir offsets/scales (scale'=b*scale, offset'=offset-a/scale'), updates the center instance + photometric_scene provenance, saves -INTERFRAME.corr-xml. Applied the standard way at load they compensate the remaining per-sensor mismatch of the raw /jp4/ tiffs. Co-Authored-By:Claude Fable 5 <noreply@anthropic.com>
-