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#