跳转至

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 的项目工程。

使用流程

  1. 启动 SimOne,新建测试用例并配置传感器

  2. 新建测试主车(配置控制系统为 手动 / API 控制)

  3. 运行用例

  4. 编译并运行示例程序,查看感知数据输出

  5. API 功能支持SensorAPI 功能表