RFDT Solver and WiTwin Simulator are undergoing internal testing as we prepare for public release. The functions are limited. Sign up to receive updates.

Radar Simulation

Simulate FMCW radar systems and analyze received signals

Under Construction

This tutorial is currently being developed and will be available soon.

Overview#

WiTwin provides comprehensive tools for simulating automotive radar systems, including FMCW (Frequency-Modulated Continuous Wave) radars. This tutorial demonstrates how to set up a radar simulation, configure radar parameters, and analyze the received signals.

Basic Radar Setup#

Creating a Radar Object#

from witwin import Scene, Console
 
scene = Scene()
 
# Create a radar-equipped vehicle
radar_vehicle = scene.create_object("RadarVehicle")
radar_vehicle.add_component("Mesh", mesh_type="Cube")
radar_vehicle.transform.scale = [4.5, 1.5, 2.0]
 
# Add Radar component
radar_vehicle.add_component("Radar")
radar = radar_vehicle.get_component("Radar")
 
# Configure radar parameters
radar.frequency = 77e9        # 77 GHz (automotive radar band)
radar.bandwidth = 4e9         # 4 GHz bandwidth
radar.tx_power = 10.0         # 10 dBm transmit power
radar.num_chirps = 128        # Number of chirps per frame
radar.num_samples = 256       # Samples per chirp
radar.fov = 120.0             # Field of view (degrees)
radar.max_range = 200.0       # Maximum detection range (meters)
 
Console.log(f"Radar configured at {radar.frequency/1e9:.1f} GHz")

Adding Target Objects#

from witwin import Scene, Console
 
scene = Scene()
 
# Create target objects
target1 = scene.create_object("Target1")
target1.add_component("Mesh", mesh_type="Cube")
target1.transform.position = [50, 0, 0]
target1.transform.scale = [2.0, 1.5, 1.5]
 
# Set material properties (affects radar cross-section)
target1.add_component("Material")
material = target1.get_component("Material")
material.permittivity = 3.0
material.conductivity = 0.5
 
Console.log(f"Target created at {target1.transform.position}")

Running the Simulation#

Simulate and Capture Data#

from witwin import Console, Results
import numpy as np
 
# Run radar simulation
radar = radar_vehicle.get_component("Radar")
result = radar.simulate()
 
# Access received signal
rx_signal = result["rx_signal"]  # Complex baseband signal
range_fft = result["range_fft"]  # Range FFT
doppler_fft = result["doppler_fft"]  # Range-Doppler map
 
Console.log(f"Simulation complete: {rx_signal.shape}")
Console.log(f"Detected {len(result['detections'])} targets")
 
# Visualize results
range_bins = np.arange(range_fft.shape[0])
range_values = np.abs(range_fft[:, 0])
 
Results.plot(
    range_bins.tolist(),
    range_values.tolist(),
    title="Range Profile",
    xlabel="Range Bin",
    ylabel="Magnitude"
)
Results.commit(message="Range Profile")

Visualizing Results#

Range-Doppler Map#

from witwin import Results
import numpy as np
 
# Get range-Doppler data
rd_map = np.abs(result["doppler_fft"])
 
# Display as heatmap
Results.imshow(
    rd_map.tolist(),
    title="Range-Doppler Map"
)
Results.commit(message="Range-Doppler Map")

Detection List#

from witwin import Results
 
# Show detections in table
detections = result["detections"]
table_data = {
    "Range (m)": [d["range"] for d in detections],
    "Velocity (m/s)": [d["velocity"] for d in detections],
    "Azimuth (°)": [d["azimuth"] for d in detections],
    "SNR (dB)": [d["snr"] for d in detections],
}
Results.table(table_data, title="Detected Targets")
Results.commit(message="Detection List")

Continue Learning#

Previous Topics#