SensorRadar4D 4D 毫米波雷达(原始数据接入)¶
注意
示例目录:[SimOne 安装目录]\SimOneAPI\SensorRaw\SensorRadar4D
用法简述
4D 毫米波雷达数据传输的演示代码,您可以参考此代码来实时发送 4D 毫米波雷达仿真点云数据至您的算法或控制器。
在传感器配置页面正确填写接收端的 IP 和端口,SimOne 将通过 UDP 协议发送数据。
接收 4D 雷达点云示例
4D 雷达点云格式为 SimOne_Streaming_Radar4D_Point,每个点包含方位角(azimuth)、仰角(elevation)、距离(range)和多普勒速度(doppler)四个维度。需通过球坐标转换计算 XYZ:
#include <SimOneStreamingAPI.h>
#include "visualization/cloud_viewer.h"
std::string gIP = "127.0.0.1";
unsigned short gPort = 9966;
// 预计算三角查找表以提高性能
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; // 拷贝帧数据
}
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++) {
// 球坐标 → 笛卡尔坐标转换
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:径向速度,可用于目标运动状态判断
}
}
}
return 0;
}
编译环境
-
CMakeList.txt 支持生成 windows / ubuntu 的项目工程。
-
先运行
gen_vs_proj.bat生成 Visual Studio 工程位于 build 文件夹,再运行build_release.bat,最后运行run_sensor_radar4d_view.bat。
使用流程
在 SimOne 中运行用例,在 VS 中运行算法。
