Choose Parameter Values#
A radar profile combines published device specifications, measured calibration
values and simulation settings. Map each operating mode to a scan instance on
an OmniRadar prim, then choose its coverage, resolution, antenna and
processing parameters. Keep the source and uncertainty of each value so the
profile can be validated against the device.
Before you start. Radar generic wpmDmat model, USD Attributes, Run More Than One Scan Pattern.
Note
Per-scan attributes appear here without their
omni:sensor:WpmDmat:scan:<instance>: prefix; waveLengthMm,
traceTreeDepth and cfarMode live under omni:sensor:WpmDmat: and
frameRate under omni:sensor:. Which attribute lives where is
the three namespaces.
Parameter selection#
A radar prim carries three kinds of value: values copied from a datasheet,
values that describe the simulation, and values calibrated against
measurements. The USDA tab authors one of each kind on a prim; the USD Python
tab authors the same prim with usd-core:
#usda 1.0
def OmniRadar "generic_radar" (
prepend apiSchemas = ["OmniSensorGenericRadarWpmDmatAPI"]
)
{
# copied from the datasheet's operating mode
float omni:sensor:WpmDmat:waveLengthMm = 3.9
float omni:sensor:WpmDmat:scan:s001:maxRangeM = 50
float omni:sensor:WpmDmat:scan:s001:maxAzAngDeg = 75
# a simulation approximation: tuned for coverage at an acceptable frame time
float omni:sensor:WpmDmat:scan:s001:raysPerDeg = 8.0
# calibrated against measured return strength; left at its default here
float omni:sensor:WpmDmat:scan:s001:powerFactor = 1.0
}
from pxr import Gf, Sdf
radar = stage.DefinePrim("/generic_radar", "OmniRadar")
radar.AddAppliedSchema("OmniSensorGenericRadarWpmDmatAPI")
# Wavelength and coverage come from the selected device operating mode.
radar.CreateAttribute(
"omni:sensor:WpmDmat:waveLengthMm", Sdf.ValueTypeNames.Float, custom=False
).Set(3.9)
radar.CreateAttribute(
"omni:sensor:WpmDmat:scan:s001:maxRangeM", Sdf.ValueTypeNames.Float, custom=False
).Set(50.0)
radar.CreateAttribute(
"omni:sensor:WpmDmat:scan:s001:maxAzAngDeg", Sdf.ValueTypeNames.Float, custom=False
).Set(75.0)
# Geometric sampling trades coverage against tracing cost.
radar.CreateAttribute(
"omni:sensor:WpmDmat:scan:s001:raysPerDeg", Sdf.ValueTypeNames.Float, custom=False
).Set(8.0)
# Calibrate return strength against measurements; 1.0 is the default.
radar.CreateAttribute(
"omni:sensor:WpmDmat:scan:s001:powerFactor", Sdf.ValueTypeNames.Float, custom=False
).Set(1.0)
This page is about which of the three kinds a value belongs to. The meaning, units and relations of each attribute are on USD Attributes; the types, defaults and allowed tokens are in the generated Sensor API Schemas.
Stay inside one operating mode#
Use values from one published operating mode per scan configuration. Do not combine maximum range, field of view, resolution or waveform values from different modes. Use multiple scans when the device interleaves modes, such as near/far or wide/narrow scans.
Map the datasheet onto attributes#
The table maps specifications from datasheets, manuals, integration guides and antenna files to radar attributes:
Real-sensor information |
Radar attributes |
Mapping guidance |
|---|---|---|
Frame, cycle or scan rate |
|
Author the complete output-frame rate as the rational pair
|
Scan modes |
Scan configuration instances |
Use one instance per published scan mode, and give a scan the device
acquires later in its cycle its delay in |
Carrier frequency or wavelength |
|
Author the wavelength in millimeters, converting a published carrier
frequency with λ = c / f (77 GHz gives |
Maximum range and field of view |
|
|
Range, velocity and angular resolution |
|
These configure separation and bin resolution in |
Explicit bin counts |
|
Read in |
Unambiguous velocity sequence |
|
Preserve the documented sequence when the limit varies across frames or
chirp groups; only a |
Range or angular ambiguity |
|
Enable only when the real operating mode folds ambiguous detections into its unambiguous interval; with both false, contributions outside the interval are discarded. Refer to aliasing. |
Waveform timing and sampling |
|
Use the values of the selected waveform mode when the profile is modeled
in |
Antenna pattern or array geometry |
Tx and Rx custom gain arrays, or patch-array and aperture attributes |
Prefer measured gain grids and documented element spacing, steering and windowing over the defaults, which are only an approximation; refer to antenna data. |
Detection processing |
|
Map these only when the vendor publishes the processing dimensions, guard and test cells and threshold behavior; refer to cfarMode. |
Half-angles#
Warning
The angular limits are half-angles: a 150 degree field of view is authored
as 75, not 150 (the half-angles on the attributes page).
Authoring the total doubles the coverage; Verification shows how
to catch the mistake.
Resolution and measurement noise#
rangeResM, velResMps, boreAzResDeg and boreElResDeg control detection-matrix bin sizes. They affect separation and quantization;
the noise attributes add measurement noise independently. When the four are read, and why angular separation also
needs cfarMode 4D, is resolution and accuracy on the attributes
page.
Calibration and simulation parameters#
The following settings require calibration or control simulation cost:
Tune
raysPerDegfor stable geometric coverage at an acceptable frame time (raysPerDeg).Increase
traceTreeDepthonly when indirect paths are required by the validation scenario.Calibrate
powerFactorandrcsTuningCoefficientsagainst measured return strength or detection probability.Set the measurement-noise and CFAR-noise attributes from error distributions or recordings, not from resolution alone.
Enable range or angular aliasing only when the real operating mode exhibits the corresponding ambiguity.
When measured antenna data is unavailable, treat the analytic antenna modes and array geometry as an approximation and validate sensitivity across the field of view.
Pick txAntennaGainMode
and rxAntennaGainMode from what the vendor gives you: a measured gain grid
is authored as CUSTOM, documented element geometry (element counts,
spacings, steering angles and windows) as PATCH_ARRAY_MODEL, and
CONSTANT or COSINE_FALLOFF (the default) stand in as analytic
approximations when you have neither; the four modes are the antenna. Author the element and aperture
geometry whenever you select PATCH_ARRAY_MODEL or WAVEFORM processing,
because the geometry defaults are placeholders rather than a working array
(the array defaults).
Give a CUSTOM grid exactly len(ElDeg) × len(AzDeg) values per gain
array, in elevation-major order; the layout and the size rules are the
gain grid.
Processing-mode controls#
datacubeMode selects FAST detection-matrix approximation or
WAVEFORM sampled-waveform processing. FAST uses bin and resolution
controls; WAVEFORM uses waveform, sampling, padding, window and aperture
controls. See processing-mode controls for shared attributes,
antenna-mode conditions and CFAR behavior.
The example configures a 77 GHz WAVEFORM scan with an 85 × 14 receiving
aperture and otherwise uses schema defaults. It illustrates the controls;
it is not a calibrated device profile. Aperture attributes
default to zero
and must be supplied. Each padding length must be at least the corresponding
sample or element count. The Python tab authors the same settings on the
radar prim defined above:
#usda 1.0
def OmniRadar "generic_radar"
{
token omni:sensor:WpmDmat:scan:s001:datacubeMode = "WAVEFORM"
uint omni:sensor:WpmDmat:scan:s001:waveformMode = 0
# waveform: each repetition time must be at least chirpDuration
float omni:sensor:WpmDmat:scan:s001:chirpDuration = 2.5e-05
float omni:sensor:WpmDmat:scan:s001:chirpBandwidth = 375e6
float[] omni:sensor:WpmDmat:scan:s001:chirpRepetitionTimeSequence = [3.5e-05]
float omni:sensor:WpmDmat:scan:s001:frequencyStepBetweenChirps = 0.0
float omni:sensor:WpmDmat:scan:s001:supportFactor = 1.0
# sampling, and the transform lengths after zero padding
uint omni:sensor:WpmDmat:scan:s001:slowTimeSamples = 379
uint omni:sensor:WpmDmat:scan:s001:fastTimeSamples = 625
uint omni:sensor:WpmDmat:scan:s001:slowTimePaddingSamples = 512
uint omni:sensor:WpmDmat:scan:s001:fastTimePaddingSamples = 1024
uint omni:sensor:WpmDmat:scan:s001:azimuthPaddingSamples = 128
uint omni:sensor:WpmDmat:scan:s001:elevationPaddingSamples = 32
token omni:sensor:WpmDmat:scan:s001:windowSlowTime = "RECT"
token omni:sensor:WpmDmat:scan:s001:windowFastTime = "RECT"
# the receiving aperture: 85 x 14 elements
uint omni:sensor:WpmDmat:scan:s001:apertureArrayAzimuthElements = 85
uint omni:sensor:WpmDmat:scan:s001:apertureArrayElevationElements = 14
float omni:sensor:WpmDmat:scan:s001:apertureAzimuthElementSpacing = 0.00236
float omni:sensor:WpmDmat:scan:s001:apertureElevationElementSpacing = 0.00332
token omni:sensor:WpmDmat:scan:s001:apertureWindowAzimuth = "RECT"
token omni:sensor:WpmDmat:scan:s001:apertureWindowElevation = "RECT"
}
from pxr import Gf, Sdf
radar = stage.DefinePrim("/generic_radar", "OmniRadar")
radar.CreateAttribute(
"omni:sensor:WpmDmat:scan:s001:datacubeMode", Sdf.ValueTypeNames.Token, custom=False
).Set("WAVEFORM")
radar.CreateAttribute(
"omni:sensor:WpmDmat:scan:s001:waveformMode", Sdf.ValueTypeNames.UInt, custom=False
).Set(0)
# Each chirp repetition time must be at least the chirp duration.
radar.CreateAttribute(
"omni:sensor:WpmDmat:scan:s001:chirpDuration", Sdf.ValueTypeNames.Float, custom=False
).Set(2.5e-05)
radar.CreateAttribute(
"omni:sensor:WpmDmat:scan:s001:chirpBandwidth", Sdf.ValueTypeNames.Float, custom=False
).Set(3.75e08)
radar.CreateAttribute(
"omni:sensor:WpmDmat:scan:s001:chirpRepetitionTimeSequence",
Sdf.ValueTypeNames.FloatArray,
custom=False,
).Set([3.5e-05])
radar.CreateAttribute(
"omni:sensor:WpmDmat:scan:s001:frequencyStepBetweenChirps",
Sdf.ValueTypeNames.Float,
custom=False,
).Set(0.0)
radar.CreateAttribute(
"omni:sensor:WpmDmat:scan:s001:supportFactor", Sdf.ValueTypeNames.Float, custom=False
).Set(1.0)
radar.CreateAttribute(
"omni:sensor:WpmDmat:scan:s001:slowTimeSamples", Sdf.ValueTypeNames.UInt, custom=False
).Set(379)
radar.CreateAttribute(
"omni:sensor:WpmDmat:scan:s001:fastTimeSamples", Sdf.ValueTypeNames.UInt, custom=False
).Set(625)
# Transform lengths include zero padding; keep them at least as large as sample counts.
radar.CreateAttribute(
"omni:sensor:WpmDmat:scan:s001:slowTimePaddingSamples",
Sdf.ValueTypeNames.UInt,
custom=False,
).Set(512)
radar.CreateAttribute(
"omni:sensor:WpmDmat:scan:s001:fastTimePaddingSamples",
Sdf.ValueTypeNames.UInt,
custom=False,
).Set(1024)
radar.CreateAttribute(
"omni:sensor:WpmDmat:scan:s001:azimuthPaddingSamples", Sdf.ValueTypeNames.UInt, custom=False
).Set(128)
radar.CreateAttribute(
"omni:sensor:WpmDmat:scan:s001:elevationPaddingSamples",
Sdf.ValueTypeNames.UInt,
custom=False,
).Set(32)
radar.CreateAttribute(
"omni:sensor:WpmDmat:scan:s001:windowSlowTime", Sdf.ValueTypeNames.Token, custom=False
).Set("RECT")
radar.CreateAttribute(
"omni:sensor:WpmDmat:scan:s001:windowFastTime", Sdf.ValueTypeNames.Token, custom=False
).Set("RECT")
# The receiving aperture has 85 by 14 elements with the spacings below.
radar.CreateAttribute(
"omni:sensor:WpmDmat:scan:s001:apertureArrayAzimuthElements",
Sdf.ValueTypeNames.UInt,
custom=False,
).Set(85)
radar.CreateAttribute(
"omni:sensor:WpmDmat:scan:s001:apertureArrayElevationElements",
Sdf.ValueTypeNames.UInt,
custom=False,
).Set(14)
radar.CreateAttribute(
"omni:sensor:WpmDmat:scan:s001:apertureAzimuthElementSpacing",
Sdf.ValueTypeNames.Float,
custom=False,
).Set(0.00236)
radar.CreateAttribute(
"omni:sensor:WpmDmat:scan:s001:apertureElevationElementSpacing",
Sdf.ValueTypeNames.Float,
custom=False,
).Set(0.00332)
radar.CreateAttribute(
"omni:sensor:WpmDmat:scan:s001:apertureWindowAzimuth",
Sdf.ValueTypeNames.Token,
custom=False,
).Set("RECT")
radar.CreateAttribute(
"omni:sensor:WpmDmat:scan:s001:apertureWindowElevation",
Sdf.ValueTypeNames.Token,
custom=False,
).Set("RECT")
Verification#
Compare the active configuration with the authored values. Request a radar
PointCloud and inspect a returned frame, including one with
Counts[0] == 0. Its
scan parameters report
maxRangeM, minVelMps, maxVelMps, minAzRad, maxAzRad,
minElRad and maxElRad.
Author maxAzAngDeg = 75 on the scan and minAzRad and maxAzRad must
come back as -1.309 and 1.309, ±75 degrees in radians (the limit params are
radians while spherical Coordinates are degrees; refer to angle
units). If they still report the
schema default, ±1.152 for the default half-angle of 66 degrees, check this
attribute’s name, scan-instance segment and effective value. An unchanged
value does not show whether other attributes were applied. See the naming pattern. The check also
catches the half-angle mistake: a datasheet’s 150 degree total field of view
authored directly gives ±2.618, ±150 degrees in radians.
Wait for a radar frame before checking the scan parameters. A scan that
detects no targets still publishes its metadata with Counts[0] == 0;
steps without a radar firing return no radar frame. A zero timestamp is
valid for a scan at time zero; see scan parameters.
Detection counts can vary between frames. A count change does not establish that a parameter edit took effect; use multi-frame comparisons. Then validate the measurements using Validate a Parameterization.
Potential issues#
The field of view is twice as wide as the datasheet says: a total angle was authored into a half-angle attribute. Refer to half-angles.
Tightening
rangeResMorvelResMpsdoes not make the measurements noisier: the resolution attributes set what a scan can separate, not its error. Refer to Resolution and measurement noise.Raising
raysPerDegcosts frame time but does not sharpen angular resolution: it controls geometric sampling density, not angular resolution (raysPerDeg).Waveform or bin values have no effect: they belong to the other
datacubeMode. Refer to the mode split.Targets appear at a plausible but wrong range or angle: range or angular aliasing is enabled for a mode that has no such ambiguity, so out-of-interval contributions are kept rather than discarded, and a
FASTscan folds them into the interval. Refer to aliasing.Targets appear at a plausible but wrong radial velocity: their radial speed exceeds the scan’s unambiguous velocity, the active
maxVelMpsSequenceentry for aFASTscan or the bound the waveform timing sets for aWAVEFORMscan, and radial velocity has no aliasing switch to turn off (aliasing).Two targets at the same range and radial velocity come back as one detection, whatever the angular resolution: the scan is
FASTandcfarModeis2D, which keeps at most one detection per range-velocity cell. Refer to cfarMode.RCS is systematically off across the whole scene: calibrate
powerFactorandrcsTuningCoefficientsagainst measured return strength, not a geometric parameter. Refer to check 4 of Validate a Parameterization.One scan does not use the expected settings: the second scan is at schema defaults because its attributes were never authored, or were authored without its instance segment. Refer to the naming pattern.