Wave Propagation Model (WPM)#

DRIVE Sim provides a generic wave propagation model utility that can be used along with the RtxSensor ideal ray tracing interface.

It is intended for users who are not interested in fully controlling every aspect of rays generation, continuation … etc. it abstracts from the user the need to do reflection and transmission physics and tracking ray properties (ex: power, polarization .. etc) with ray bounces of the environment, also the need to build data structures for the tracing.

Introduction#

This extension implements the IWpm interface providing a generic wave propagation model, the wave propagation model is a utility that can be used along with the RtxSensor ideal ray tracing interface. it has the following overview:

  • It is intended for users who are not interested in fully controlling every aspect of rays generation, continuation … etc. it abstracts from the user the need to do reflection and transmission physics and tracking ray properties (ex: power, polarization .. etc) with ray bounces of the environment, also the need to build data structures for the tracing.

  • It allows users to define their sensor, its transmitters, receivers, ray patterns, detector patterns … etc

  • It allows users to build a trace definition that has a description of primary rays, initial ray physical properties, which transmitters target which receivers, which rays target which detectors, trace tree depth (number of bounces), … etc

  • The utility then generate for the user the required rays to trace for each batch of the RtxSensor. Users give it the returns from each traced batch and it handles physics, material interactions, updating tracing data structures … etc and generates the next batch to trace

  • At the end of a trace the user has access to a data structure containing all “contributions” from all “bounces” of traced rays in the scene. This data structure can be used to build arbitrary outputs (ex: waveforms, ADC/IQ data … etc)

  • WPM was designed with different sensor modalities in mind, in Nvidia it is intended for (lidar , radar, ultrasonic) sensor models

Concept#

Utility#

Each Sensor model that is not interested in doing it’s own wave propagation, reflection, refraction … etc. can instantiate a wpm object, and use it to generate the firings to trace, and feed it the returns from tracing.

using the WPM doesn’t prevent the user from still being able to access the raw RtxSensor API and do any low level work needed.

Behavior#

To understand the behavior of wave propagation that the WPM targets to realize, please consider the following animation:

WPM_EM_PULSE

this was generated by an EM solver, showing an EM pulse bouncing amongst 2 conductors in the scene. the WPM targets to capture the multiple back scatters seen with a ray tracing approach.

users build a trace definition describing the sensor motion and the constituent parts of their sensor (transmitter, and the rays they produce, receivers and detectors within receivers)

WPM_TRACE_DEF

the wpm uses this definition to generate the set of primary rays to trace, then these rays interact with the environment and with each interaction contributions are gathered at detectors.

WPM_CONTRIBUTIONS

hit interactions are defined with special material plugins that are plugged into materials framework. these Material plugins are wpm compatible and specify BSDF behavior and are parameterized. (see non-visual Materials framework)

in the end the user can receive a compound trace result struct that has all contributions from all ray bounces towards all detectors, this can be used for further post processing

Usage guide#

Sensor model development#

to instantiate the WPM the sensor model needs to acquire the carbonite IWpmFactory interface, and use the create instance method::

m_wpm = carb::getFramework()->acquireInterfaceomni::sensors::wpm::IWpmFactory()->createInstance();

the user should then specify the cuda device to be used::

m_wpm->setCudaDevice(cudaDevice);

if it was desired to use pure CPU mode the previous step should be skipped

the user should now configure the wpm object (by providing a config struct) and upon successful configuration receive a pointer to a trace definition struct::

m_traceDef = m_wpm->getTraceDefinition(m_wpmCfg);

with this trace definition struct the user can define the behavior of each trace. in this struct the user can define:

  • trace tree depth (related to number of returns/bounces in the scene)

  • sensor motion through out the trace

  • transmitters

  • ray patterns

  • receivers

  • detector patterns

  • mapping between transmitters and detectors

For detailed description of the meaning of each member in this struct please refer to the API documentation.

The user can modify the wpm behavior in runtime, changes take effect at the beginning of each new trace

The user can then setup the material mapping::

m_wpm->setupMaterials(matIds.data(), matName.data(), 10);

this maps every RtxSensor material Id to a named material, users need to care for material name collisions, and users can create their custom materials.

this concludes all what’s needed to initialize the wpm object

the rest of the interfaces are runnable interfaces that would execute within the runnable APIs from the RtxSensor here is an overview of the RtxSensor Api and how the WPM APIs relate

WPM_RTX_SENSOR_API

within the interface openTrace() users can use the wpm utility utilGetNumBatches() to get the needed number of batches::

numBatches = utilGetNumBatches(m_traceDef);

the user can also store the sensor motion data to be used to update the trace definition, normally updating the trace definition can done at this point or at the following batchBegin()

within the batchBegin() interface users can use the wpm object to fill the needed firings::

m_wpm->fillFirings(firings);

within the interface batchEnd() users should feed the wpm object with the trace results::

m_wpm->setReturns(returns);

in the interface traceClose() it is mandatory that users call the interface getTraceResult() to get the results but also to indicate to the wpm the imminent start of a new trace::

traceResults = m_wpm->getTraceResult();

Please read the API documentation for more insight on the function of each constituent of the interface