SensorRadar4D — 4D Millimeter-Wave Radar (Physical-Level Raw Data Ingestion)¶
Note
Example directory: [SimOne installation directory]\SimOneAPI\SensorRaw\SensorRadar4D
Overview
Demo code for 4D millimeter-wave radar data transmission. You can use this code as a reference for sending real-time 4D radar simulation point cloud data to your algorithm or controller.
Enter the receiver IP and port on the sensor configuration page; SimOne will send data via UDP.
Receiving 4D Radar Point Cloud Data
The 4D radar point cloud format is SimOne_Streaming_Radar4D_Point. Each point contains four dimensions: azimuth, elevation, range, and doppler velocity. XYZ coordinates are computed via spherical-to-Cartesian conversion:
#include <SimOneStreamingAPI.h>
#include "visualization/cloud_viewer.h"
std::string gIP = "127.0.0.1";
unsigned short gPort = 9966;
// Pre-compute trigonometric lookup tables for performance
void lookup_table_init()
{
cos_lookup_table_.resize(36000);
sin_lookup_table_.resize(36000);
for (uint16_t i = 0; i < 36000; i++) {
double rad = i / 100.0 * M_PI / 180.0;
cos_lookup_table_[i] = std::cos(rad);
sin_lookup_table_[i] = std::sin(rad);
}
}
void dataPointCloudCallback(SimOne_Streaming_Point_Cloud* pPointCloud)
{
std::lock_guard<std::mutex> lock(gDataPointCloudMutex);
gDataPointCloud = *pPointCloud; // Copy frame data
}
int main()
{
lookup_table_init();
SimOneAPI::SetStreamingRadar4DPointCloudUpdateCB(
gIP.c_str(), gPort, dataPointCloudCallback);
while (true) {
std::lock_guard<std::mutex> lock(gDataPointCloudMutex);
if (gDataPointCloud.pointStep == sizeof(SimOne_Streaming_Radar4D_Point)) {
int pointCount = gDataPointCloud.pointCloudDataSize / gDataPointCloud.pointStep;
SimOne_Streaming_Radar4D_Point* pPoint =
(SimOne_Streaming_Radar4D_Point*)gDataPointCloud.pointCloudData;
for (int i = 0; i < pointCount; i++, pPoint++) {
// Spherical → Cartesian coordinate conversion
int az = ((int)(pPoint->azimuth * 100) + 36000) % 36000;
int el = ((int)(pPoint->elevation * 100) - 9000 + 36000) % 36000;
float x = pPoint->range * cos_lookup_table_[el] * cos_lookup_table_[az];
float y = -pPoint->range * cos_lookup_table_[el] * sin_lookup_table_[az];
float z = pPoint->range * sin_lookup_table_[el];
// pPoint->doppler: radial velocity, can be used to determine target motion state
}
}
}
return 0;
}
Build Environment
-
CMakeLists.txt supports generating projects for Windows and Ubuntu.
-
Run
gen_vs_proj.batto generate the Visual Studio project in thebuildfolder, then runbuild_release.bat, and finally runrun_sensor_radar4d_view.bat.
Usage
Run the use case in SimOne, then run the algorithm in Visual Studio.
