Tune Intensity#
The Lidar generic wpm model can report raw or range-normalized intensity. Choose the convention, scale and optional lookup table to match the device’s output encoding. These controls change the intensity assigned to detected returns; they do not determine which returns are detected.
The Lidar generic core model intensity controls use different names, modes and scales.
Before you start. The controls are intensityProcessing, intensityMappingType,
intensityScale and intensityMappingEncoding, all under
omni:sensor:LidarWpm:. See USD Attributes and
Sensor API Schemas for values and defaults. Range normalization
depends on the selected return-processing mode.
Intensity encoding#
Intensity is a float32 channel encoded after detection. Encoding does
not change peak selection, return counts, ordering or scan merging, and
cannot recover rejected returns. Detection depends on the processing mode and
thresholds defined in USD Attributes.
Accepted edits to the four intensity attributes preserve the scan and apply to detected returns at the next publication. See Retune the Sensor While It Runs.
Raw and range-normalized intensity#
intensityProcessing selects one of two conventions. Both end in the same
presentation stage: a base intensity between 0 and 1 is passed through the
mapping selected by intensityMappingType and multiplied by
intensityScale.
raw:
Intensity = intensityScale * map(clamp(rawDetectorIntensity, 0, 1))
rangeNormalized, intensityScale > 0:
fraction = clamp(apparentReflectivity / intensityScale, 0, 1)
Intensity = intensityScale * map(fraction)
With raw, base intensity is the detector’s normalized response, clamped
to [0, 1]. The same surface generally produces a weaker response at a
greater range.
With rangeNormalized (default), base intensity is apparent reflectivity
divided by intensityScale. Apparent reflectivity is the reflectivity an
ideal diffuse surface facing the sensor would need to produce the detected
signal at that range, relative to the model’s reference signal.
Normalization removes the modeled range and calibration response. In
waveform and directDetector modes it also removes aperture response,
but retains detector noise. In directMaterial mode it removes range,
gain and divergence factors while retaining detector angular response.
Apparent reflectivity therefore depends on viewing angle, specularity and
model calibration; it is not a vendor-independent measurement or the material’s
reflectivity alone.
Surface response depends on its non-visual material labels
(Non-Visual Sensor Materials). When
omni:sensor:LidarWpm:useVisualMaterialInputs is on, the visual material is
consulted as well; refer to USD Attributes.
Non-linear mapping#
intensityMappingType = linear (the default) applies no lookup-table
adjustment to the base intensity.
nonlinear and nonlinearEncodingOnly use intensityMappingEncoding,
a table of finite values. For each return, the selected entry has index
floor(baseIntensity * (encodingCount - 1)), where encodingCount is the
number of table entries.
The table length determines how the selected entry is used:
Fewer than
intensityScale * 100entries: add it to the base intensity.At least
intensityScale * 100entries: replace the base intensity with it.
At the default scale, the threshold is 255 entries. The mapped value is then
multiplied by intensityScale.
nonlinear and nonlinearEncodingOnly require a non-empty
intensityMappingEncoding. An empty table (the default) rejects the whole
parameter set; see Retune the Sensor While It Runs
for rejection behavior. nonlinearDecodingOnly requires no table and acts
like linear because this model has no decoding table.
Note
The base intensity is clamped to the unit range before the lookup; the
entries of the table are not. Author the table so that the mapped value
stays in the unit range: replacement entries between 0 and 1, correction
entries small enough that base plus entry stays between 0 and 1. Every
published value then lies between 0 and intensityScale, as it does
with linear mapping.
Calculation example#
With linear mapping and the default scale of 2.55, apparent
reflectivities of 8%, 10%, 100%, 180% and 255% are published as 0.08,
0.10, 1.0, 1.8 and 2.55. Values at or above 255% clamp to
2.55: the scale is the full scale, and, read as a fraction, the apparent
reflectivity at which the value saturates. A scale of 1.0 publishes the
apparent reflectivity itself, saturating at 100%. A zero scale publishes zero
intensity for every return, in every mode.
Verification#
Read Intensity within Counts[0] and select entries with the
VALID bit set in Flags.
Check the following:
Every value lies between 0 and
intensityScale.Face two plates of the same material to the sensor at two different ranges, both far enough that neither reads the full scale in
raw: a plate close to the sensor saturates the detector response and reads the full scale whatever its range. InrangeNormalizedthe two plates read about the same apparent reflectivity; inrawthe farther plate reads smaller. If switching the convention leaves both values unchanged, check saturation and the update log; unchanged output alone does not establish that the edit was rejected.Switch
intensityProcessingwhile the sensor runs. The new encoding applies at the next publication. It changes intensity for the same detected returns, preserving their count and order. Consecutive publications can still have different detections because of scene motion, scan timing or noise; a changed count alone says nothing about whether the edit was accepted.
Potential issues#
Intensity saturates. Check the convention first,
rawagainstrangeNormalized, thenintensityScale, thenomni:sensor:LidarWpm:calibrationGain, the detector field of view and the material assignment of the surfaces, before touching the detection thresholds: mapping cannot recover a signal the return pipeline already rejected, and a threshold edit changes which returns exist.The values are on a different scale than the consumer expects. A consumer has to know which processing mode and scale were selected, because no separate
Reflectivitychannel is published; see theIntensitydescription in Outputs.An intensity edit appears to do nothing. Either the table is not read, because only
nonlinearandnonlinearEncodingOnlyreadintensityMappingEncoding, or the parameter set was refused:intensityScalemust be finite and non-negative, every entry ofintensityMappingEncodingmust be finite, the values ofintensityProcessingandintensityMappingTypemust be spelled exactly as the schema lists them, andnonlinearornonlinearEncodingOnlyneeds a non-empty table. The reason is logged as an error; refer to Retune the Sensor While It Runs for what a refused set leaves in place and to Sensor Definition Validation.
See also the Symptom Index.