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

omni:sensor:frameRate

Author the complete output-frame rate as the rational pair (numerator, denominator); (10, 1) is ten complete scans per second. Refer to the frame rate.

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 timeOffsetUsec (the frame rate); refer to Run More Than One Scan Pattern.

Carrier frequency or wavelength

waveLengthMm

Author the wavelength in millimeters, converting a published carrier frequency with λ = c / f (77 GHz gives 3.8934085). It is the one wavelength of the sensor, for every scan and both processing modes; refer to the wavelength.

Maximum range and field of view

maxRangeM, maxAzAngDeg, maxElAngDeg

maxRangeM is the unambiguous range in meters. The angular attributes are positive half-angles; the total symmetric field of view is twice each value (see the warning below).

Range, velocity and angular resolution

rangeResM, velResMps, boreAzResDeg, boreElResDeg

These configure separation and bin resolution in FAST mode with binsFromSpec true; they are not accuracy values.

Explicit bin counts

rBins, vBins, azBins, elBins

Read in FAST mode when binsFromSpec is false, for a vendor that publishes the detection-matrix dimensions rather than resolutions.

Unambiguous velocity sequence

maxVelMpsSequence

Preserve the documented sequence when the limit varies across frames or chirp groups; only a FAST scan folds radial velocity by the active entry. How the active entry advances with several scans is under the velocity cycle.

Range or angular ambiguity

enableRangeAliasing, enAngAliasing

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

chirpDuration, chirpBandwidth, chirpRepetitionTimeSequence, slowTimeSamples, fastTimeSamples, the padding and window attributes

Use the values of the selected waveform mode when the profile is modeled in WAVEFORM mode or a vendor mode is specified by waveform timing. Check derived values against the published range and velocity behavior.

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

cfarMode and the per-scan CFAR attributes

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 raysPerDeg for stable geometric coverage at an acceptable frame time (raysPerDeg).

  • Increase traceTreeDepth only when indirect paths are required by the validation scenario.

  • Calibrate powerFactor and rcsTuningCoefficients against 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 rangeResM or velResMps does not make the measurements noisier: the resolution attributes set what a scan can separate, not its error. Refer to Resolution and measurement noise.

  • Raising raysPerDeg costs 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 FAST scan 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 maxVelMpsSequence entry for a FAST scan or the bound the waveform timing sets for a WAVEFORM scan, 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 FAST and cfarMode is 2D, which keeps at most one detection per range-velocity cell. Refer to cfarMode.

  • RCS is systematically off across the whole scene: calibrate powerFactor and rcsTuningCoefficients against 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.