跳转至

HDMap 示例

注意

示例目录:[SimOne 安装目录]\SimOneAPI\Tutorial\HDMap

算法构思

(1)启动仿真用例:当 SimOne 仿真用例启动时,系统会生成一个 URL 地址,并发送到 HDMap API 端。

(2)加载地图文件:HDMap API 使用接收到的 URL 地址发起 HTTP 请求,从数据平台中加载仿真用例运行时指定的.xodr地图文件。地图文件被加载到内存中以供后续使用。

(3)实时数据提供:基于主车在静态地图上的动态位置,HDMap API 实时返回关键地图数据给第三方驾驶算法,这些数据包括:地图真值数据、道路路网信息、车道及车道线类型等。

算法流程图

HDMap API

注意

【SimOne 安装位置】/SimOne/SimOneAPI/include/SimOneHDMapAPI.h

  • 获取主车当前位置最近车道示例伪代码:
#include "SimOneServiceAPI.h"
#include "SimOneHDMapAPI.h"
#include "SimOneSensorAPI.h"
#include "SSD/SimPoint3D.h"
#include "SSD/SimString.h"

int main(int argc, char* argv[])
{
        const char* mv_id = "0"; // 主车Id
        bool isJoinTimeLoop = false; // 是否加入帧同步
        const char* serverIP = "127.0.0.1"; // BridgeIO IP

    // Step1: 初始化 SimOne API
    InitSimOneAPI(mv_id, isJoinTimeLoop, serverIP);

    // Step2: 加载高精度地图,地图文件由 SimOne 仿真 Web 端建立用例时指定
        int timeout = 20; // HDMap加载超时时间设置,若超时函数将返回推出
        if (!SimOneAPI::LoadHDMap(timeout)) // 从数据平台获取运行用例地图文件并加载到内存
        {
                std::cout << "LoadHDMap Failed!" << std::endl;
        return 0;
        }

        std::unique_ptr<SimOne_Data_Gps> pGPS = std::make_unique<SimOne_Data_Gps>();
        while (true)
        {
        // Step3: 获取主车GPS信息
                if (!GetGps(0/*vehicleId*/, pGPS.get()))
                {
                        std::cout << "Get GPS Failed!" << std::endl;
                }
        else
        {
            // 传入参数 主车当前位置(3D 点)
            SSD::SimPoint3D pos(pGps->posX, pGps->posY, pGps->posZ);
            // 传出参数 车道线ID,格式为 roadId_sectionIndex_laneId E.g.道路参考线右侧第一条车道表示为"1_0_-1";左侧第二条车道表示为"1_0_2"
            SSD::SimString laneId;
            // 传出参数 主车位置相对检出车道的s-t坐标值
            double s, t;
            // 传出参数 主车位置相对检出车道所在道路中心线的s-t坐标值 (模糊值),通过调用 GetRoadST API 可获取更为精确的值
            double s_toCenterLine, t_toCenterLine;

            // Step 4: 获取最接近输入点的车道,所属车道优先
            if (!GetNearMostLane(pos, laneId, s, t, s_toCenterLine, t_toCenterLine))
                {
                std::cout << "Error: lane is not found." << std::endl;
                }
            else
            {
                std::cout << "lane id: " << laneId.GetString() << std::endl;;
                std::cout << "s: " << s << "    t: " << t << std::endl;
                std::cout << "s_toCenterLine: " << s_toCenterLine << "  t_toCenterLine: " << t_toCenterLine << std::endl;
            }
        }

                std::this_thread::sleep_for(std::chrono::milliseconds(100));
        }

        return 0;
}

编译环境

  • HDMap API Tutorial 示例工程目录结构
Tutorial
    ├── bin
    │   ├── DynamicsTest
    │   ├── HDMap
    │   ├── logServer.txt
    │   ├── log_taskImage.txt
    │   ├── PNCSample
    │   ├── SensorSample
    │   └── SensorV2X
    ├── Build
    │   ├── build_debug.bat
    │   ├── build_release
    │   ├── build_release.bat
    │   ├── CMakeLists.txt
    │   ├── gen_make_debug.sh
    │   ├── gen_make_release.sh
    │   ├── gen_vs_proj_debug.bat
    │   ├── gen_vs_proj_release.bat
    │   ├── rebuild_debug.sh
    │   └── rebuild_release.sh
    ├── HDMap
    │   ├── CMakeLists.txt
    │   ├── gen_vs_proj.bat
    │   ├── include
    │   ├── src

    bin:目标生成目录
    Build: 编译目录
    V2X: V2X API 示例源码目录

编译:

CMakeList.txt 支持生成 windows / ubuntu 的项目工程

  • Windows:

  • 进入 Build 目录,运行 gen_vs_proj_debug.batgen_vs_proj_release.bat 生成 Visual Studio 工程

  • 打开 Visual Studio 示例工程, 选择 HDMap 工程编译

  • Linux:

  • cd Build

  • ./gen_make_debug.sh (或 ./gen_make_release.sh

  • cd build_debug(或 cd build_release

  • make -j4

使用流程

  • 调用相应 HDMap API API 功能支持

  • API 测试:

  • 启动 SimOne,新建测试用例

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

  • 运行用例(选择主车为该主车)

  • 编译测试代码,bin 目录下生成可执行文件

  • 运行示例程序,查看运行结果