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#
Related Topics#
- Field Simulation - EM field propagation
- Results Panel - Visualization options
Previous Topics#
- Component System - Understanding components
- Import 3D Models - Loading geometry