Skip to content

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.bat to generate the Visual Studio project in the build folder, then run build_release.bat, and finally run run_sensor_radar4d_view.bat.

Usage

Run the use case in SimOne, then run the algorithm in Visual Studio.