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.
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.
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).
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].
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.
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)).
Mix64#
64-bit mix (SplitMix64 finalizer, Steele et al. 2014): a well-distributed hash of an integer key.
HashUniform#
Uniform number in (0, 1) from a hash (53 bits).
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.