Skip to content

AcresLidarPhysics.h#

Acres/Source/Acres/AcresLidarPhysics.h Generated

Engine-free pieces of the LiDAR radiometry that the Helios calibration added (Calibration/Polaris/lidar_results.md): the Minnaert incidence law, the peak loss of an echo stretched by a grazing footprint, the in-plane divergence of an elliptical beam, and a deterministic footprint-scale surface micro-slope. Plain C++ (no Unreal types) so that Tools/LidarModel/lidar_tests.cpp can check them against the Python fit (Calibration/Polaris/lidar_model.py). AcresLidarModel.cpp and AcresSensors.cpp call these; every function is inline and allocation-free.

MinnaertBackscatter#

Diffuse backscatter of a surface seen at incidence cosine Cos with the Minnaert (1941) law rho cos^k.

k = 1 is Lambertian; k = 0 a surface whose apparent reflectance does not change with incidence, which is what the Polaris' Helios reports for asphalt, concrete, gravel and grass (its calibrated reflectivity is flat for cos 0.1-0.6). Rough and porous surfaces tend to k < 1: shadow-hiding and the opposition effect brighten them in the backscatter direction (Hapke 1981).

Argument Description
Rho Diffuse reflectance at normal incidence, 0-1.
Cos Cosine of the incidence angle; its absolute value is clamped to [1e-4, 1].
Exponent Minnaert exponent k >= 0.

Returns: rho |cos|^k.

inline double MinnaertBackscatter(double Rho, double Cos, double Exponent) ;

InPlaneDivergence#

Divergence of an elliptical beam in the plane of incidence.

The footprint's range extent grows along the direction in which the surface recedes from the beam (the projection of the surface normal perpendicular to the beam). CosPsi is the cosine of the angle between that direction and the beam's vertical axis: 1 for ground seen by a level sensor (the vertical divergence counts), 0 for a wall seen obliquely in azimuth (the horizontal one counts). The two full angles combine as a Gaussian beam's widths do: beta^2 = (beta_v cos psi)^2 + (beta_h sin psi)^2.

Argument Description
CosPsi See above; clamped to [0, 1].

Returns: The in-plane full-angle divergence, rad.

inline double InPlaneDivergence(double BetaHRad, double BetaVRad, double CosPsi) ;

FootprintRangeSpreadM#

Range extent of the beam's footprint on a plane: dR = R tan(theta) beta.

A beam of full divergence beta meets a plane at incidence theta; across the footprint the path length differs by about R beta tan(theta), which is metres for the Helios' 6.9 mrad beam on ground 30 m away (3.8 deg grazing).

Argument Description
RangeM Range to the surface, m.
Cos Cosine of the incidence angle (clamped to [1e-4, 1]).
BetaRad Full-angle divergence in the plane of incidence, rad.

Returns: The range extent, m (0 at normal incidence).

inline double FootprintRangeSpreadM(double RangeM, double Cos, double BetaRad) ;

PulsePeakFactor#

Peak of an echo stretched in time by the footprint, relative to an echo from a surface at normal incidence.

The received pulse is the emitted pulse (range length L, the pulse's FWHM x c / 2) convolved with the footprint's range profile (extent dR): the energy stays, the width grows to about sqrt(L^2 + dR^2) and the peak - which the receiver thresholds - falls in proportion (Jutzi and Stilla 2003; Wagner et al. 2006). The reported reflectivity is an energy measure and does not fall.

Argument Description
PulseLengthM L, m; <= 0 turns stretching off (factor 1).
SpreadM dR, m.

Returns: L / sqrt(L^2 + dR^2), in (0, 1].

inline double PulsePeakFactor(double PulseLengthM, double SpreadM) ;

RoughRangeSigmaM#

Range scatter of a return from rough ground: RoughnessM |cos theta|^-1.5 (|cos| clamped at 0.05).

A height offset dz along a beam at incidence theta moves the range by dz / cos(theta). The footprint also grows as 1 / cos(theta), and on a self-affine surface (Hurst exponent H = 0.5, Brownian relief: gravel, soil, grass) the rms height over a patch grows as its size^H, so the scatter grows as cos^-(1 + H). The Helios data follow this law for gravel, soil and grass (rms log error 0.08-0.28 against 0.24-0.36 for cos^-1).

Argument Description
RoughnessM Rms relief height seen by a footprint at normal incidence, m.
Cos Cosine of the incidence angle.

Returns: The standard deviation of the range, m.

inline double RoughRangeSigmaM(double RoughnessM, double Cos) ;

TiltedCos#

Cosine of the incidence angle after tilting the local surface by DeltaRad in the plane of incidence (theta' = theta + delta, clamped to [0, pi / 2)).

inline double TiltedCos(double Cos, double DeltaRad) ;

Mix64#

64-bit mix (SplitMix64 finalizer, Steele et al. 2014): a well-distributed hash of an integer key.

inline uint64_t Mix64(uint64_t X) ;

HashUniform#

Uniform number in (0, 1) from a hash (53 bits).

inline double HashUniform(uint64_t H) ;

PlaceNormal#

Standard normal number attached to a place: the micro-slope of the ground at a point.

The ground is cut into CellM cells; each cell gets a fixed N(0, 1) value from a hash of its integer coordinates and Seed (Box-Muller on two hashed uniforms). The same place always has the same micro-slope, from scan to scan and run to run, as real surface relief does, and no random stream is consumed.

Argument Description
CellM Cell size, m (> 0).
Seed Stream selector.

Returns: A standard normal value.

inline double PlaceNormal(double XM, double YM, double CellM, uint64_t Seed) ;