Sensor API 示例¶
注意
示例目录:[SimOne 安装目录]\SimOneAPI\Tutorial\Sensor
与原始传感器数据接入的区别
本节介绍通过 SimOneAPI 逻辑层获取目标级传感器数据(GPS、障碍物列表、雷达检测等),适用于感知融合算法开发。 若需接收物理级原始数据流(图像帧、点云等),请参考 原始传感器数据接入。
算法构思
通过 SimOneSensorAPI 获取主车的 GPS 定位、障碍物检测、雷达目标、超声波雷达等感知数据,支持轮询模式(主动查询)和回调模式(事件驱动)两种获取方式。
初始化¶
#include "SimOneServiceAPI.h"
#include "SimOneSensorAPI.h"
// 初始化 SimOne API,连接仿真服务
SimOneAPI::InitSimOneAPI("0", false, "127.0.0.1");
GPS 数据获取¶
轮询模式:
std::unique_ptr<SimOne_Data_Gps> pGps = std::make_unique<SimOne_Data_Gps>();
int lastFrame = 0;
while (true)
{
bool flag = SimOneAPI::GetGps("0", pGps.get());
if (flag && pGps->frame != lastFrame)
{
lastFrame = pGps->frame;
// 处理 GPS 数据:pGps->posX, pGps->posY, pGps->posZ 等
}
if (!flag)
{
std::cout << "Get GPS Fail" << std::endl;
}
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
回调模式:
auto gpsCallback = [](const char* mainVehicleId, SimOne_Data_Gps* pGps) {
// 每帧 GPS 更新时触发,处理 pGps 数据
};
SimOneAPI::SetGpsUpdateCB(gpsCallback);
障碍物(Ground Truth)获取¶
轮询模式:
std::unique_ptr<SimOne_Data_Obstacle> pDetections = std::make_unique<SimOne_Data_Obstacle>();
int lastFrame = 0;
while (true) {
bool flag = SimOneAPI::GetGroundTruth("0", pDetections.get());
if (flag && pDetections->frame != lastFrame)
{
lastFrame = pDetections->frame;
// 遍历 pDetections->objects[i] 获取各障碍物信息
}
if (!flag)
{
std::cout << "GetGroundTruth Failed!" << std::endl;
}
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
回调模式:
auto gtCallback = [](const char* mainVehicleId, SimOne_Data_Obstacle* pObstacle) {
// 每帧障碍物数据更新时触发
};
SimOneAPI::SetGroundTruthUpdateCB(gtCallback);
雷达目标检测¶
// 轮询模式(sensorId 为传感器配置名称,如 "objectBasedRadar1")
std::unique_ptr<SimOne_Data_RadarDetection> pDetections = std::make_unique<SimOne_Data_RadarDetection>();
int lastFrame = 0;
while (true)
{
bool flag = SimOneAPI::GetRadarDetections("0", "objectBasedRadar1", pDetections.get());
if (flag && pDetections->frame != lastFrame)
{
lastFrame = pDetections->frame;
// 处理 pDetections->detections[i]
}
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
传感器融合目标检测¶
// sensorId 可为 "sensorFusion1" / "objectBasedCamera1" / "objectBasedLidar1" / "perfectPerception1"
std::unique_ptr<SimOne_Data_SensorDetections> pGroundtruth = std::make_unique<SimOne_Data_SensorDetections>();
int lastFrame = 0;
while (true)
{
bool flag = SimOneAPI::GetSensorDetections("0", "perfectPerception1", pGroundtruth.get());
if (flag && pGroundtruth->frame != lastFrame)
{
lastFrame = pGroundtruth->frame;
// 处理融合感知结果
}
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
环境参数设置与获取¶
// 获取当前环境参数
std::unique_ptr<SimOne_Data_Environment> pEnvironment = std::make_unique<SimOne_Data_Environment>();
if (SimOneAPI::GetEnvironment(pEnvironment.get()))
{
// pEnvironment->timeOfDay, rainDensity, fogDensity 等
}
// 设置环境参数
SimOne_Data_Environment env;
env.timeOfDay = 1200; // 正午 12:00
env.rainDensity = 3; // 降雨强度
env.fogDensity = 3; // 雾浓度
env.snowDensity = 0;
env.windDensity = 3;
env.windDirection = 180;
env.longitude = 121.4737;
env.latitude = 31.2304;
env.timeZone = 8;
// ... 更多参数见 SimOne_Data_Environment 结构体定义
if (!SimOneAPI::SetEnvironment(&env))
{
std::cout << "SetEnvironment Failed!" << std::endl;
}
编译环境
CMakeLists.txt 支持生成 Windows / Ubuntu 的项目工程。
使用流程
-
启动 SimOne,新建测试用例并配置传感器
-
新建测试主车(配置控制系统为 手动 / API 控制)
-
运行用例
-
编译并运行示例程序,查看感知数据输出
-
API 功能支持:SensorAPI 功能表