API调用参考示例 ¶
注意
[SimOne-安装路径]\SimOne\SimOneAPI 中的范例代码根据目录分类,演示了 SimOne 仿真产品的各类 API 在客户本地算法程序中的应用。如需编译参考 算法接入 。
注意
例如:调用传感器 API 来获取【目标级别】或者是【物理级别】传感器的数据,然后传送到客户的算法程序里面来测试【无人驾驶算法】,客户也可以使用【传感器数据】来作为传感器融合的 raw data。
目录结构如下所示
| 示例 | 文件夹 | 描述 | 子文件夹 | 描述 |
|---|---|---|---|---|
| 算法示例 | ADAS | ADAS 基础算法对接 SimOne 仿真平台接口应用示例。 | ACC | 自适应巡航控制算法示例。 |
| AEB | 自动紧急制动算法示例。 | |||
| AEB-Daemon | 云仿真环境连续案例运行 AEB 算法示例。 | |||
| AEB-Evaluation | 以 AEB 算法为例,展示如何在用户算法内输出评价所需要的信号数据。 | |||
| AVP | 自动泊车算法示例。 | |||
| bin | ADAS 算法应用程序生成目录。 | |||
| Build | 用于存放构建和编译项目产生的文件目录。 | |||
| LKA | 自动车道保持巡航算法示例。 | |||
| TestEvaluation | 用于测试和示范如何利用 EvaluationAPI 获取评价所需要的数据。 | |||
| TrajectoryControl | 控制车辆行驶轨迹的系统或算法。 | |||
| util | 包含一系列辅助工具和实用程序的目录。 | |||
| Autopilot | 自动驾驶算法综合 | CurveSample | 全局路径规划和局部路径调整示例 | |
| LimitChangeLaneSample | 前方有障碍物示例 | |||
| TrafficLightSample | 获取场景中交通灯的相位状态示例 | |||
| 库 | include | 包含 SimOne 自带的库和第三方的调用的依赖库文件,主要包括一些 .h 和 .hpp 。 | ||
| lib | 包含 运行 SimOne 需要依赖的动态库,C++API 的头文件、数据结构文件,PythonAPI 的头文件、数据结构文件,PythonAPI 的算法示例。 | |||
| 适配第三方中间件 | Cyber | Apollo(r6.0.0)对接 SimOne 仿真平台基于 Cyber 中间件的接口示例。 | ||
| Matlab | SimOneAPI 在 Simulink 中的封装,包含模块接口和示例。 | |||
| ROS | 对接 SimOne 仿真平台基于 ROS1 中间件的接口示例。 | |||
| ROS2 | 对接 SimOne 仿真平台基于 ROS2 中间件的接口示例。 | |||
| SensorRaw | 物理级数据可视化接口示例。 | 3rdparty | 第三方插件 opencv,pcl | |
| SensorCamera | 物理级摄像头数据传输示例 | |||
| SensorLidar | 物理级激光雷达数据传输示例 | |||
| SensorLidarROS | 物理级激光雷达数据传输至 ROS 示例 | |||
| SensorRadar4D | 4D 毫米波雷达数据传输示例 | |||
| 功能模块示例 | Tutorial | SimOneAPI C++ 接口基础调用方法示例。 | Dynamics | 动力学 使用示例 |
| HDMap | HDMapAPI 使用示例 | |||
| PNC | PNCAPI 使用示例 | |||
| Sensor | 传感器 使用示例 | |||
| Traffic | 交通流 API 使用示例 | |||
| V2X | V2X 使用示例 | |||
1. 算法示例 ¶
1.1 ADAS 基础算法 ¶
1.1.1 ACC 自适应巡航控制算法 ¶
注意
Adaptive Cruise Control(自适应巡航控制),一种可自动调整车速以维持与前车安全距离的系统。
算法构思
自适应巡航控制算法。
算法流程图
添前车行驶车辆。
编译环境
CMakeList.txt 支持生成 windows / ubuntu 的项目工程。
使用流程
在 SimOne 中运行案例,在 VS 中运行算法。
1.1.2 AEB 自动紧急制动算法 ¶
注意
Automatic Emergency Braking(自动紧急制动算法),在检测到潜在碰撞风险时,系统会自动执行制动来防止或减轻撞击的后果。
注意
目录在 [SimOne 安装目录]\SimOne\SimOneAPI\ADAS\AEB
注意
紧急刹车演示代码(c++、python)位于 src 文件夹中,您可以参考此代码来考虑接入您的算法到 SimOne 仿真场景中去。
算法构思
获取对手车离主车的距离然后根据 AEB 算法来刹车。
算法流程图
编译环境
CMakeList.txt 支持生成 windows / ubuntu 的项目工程。
使用流程
在 SimOne 中运行案例,在 VS 中运行算法。
1.1.3 AEB-Daemon ¶
注意
云仿真环境,连续案例运行 AEB 算法示例。
1.1.4 AEB-Evaluation ¶
暂无介绍
1.1.5 AVP 自动泊车算法 ¶
注意
Automated Valet Parking(自动代客泊车),指可以自动驾驶汽车前往车位并完成停车的技术。
算法构思
自动泊车算法。
算法流程图
寻找停车区域,然后泊车算法运行。
编译环境
CMakeList.txt 支持生成 windows / ubuntu 的项目工程。
使用流程
在 SimOne 中运行案例,在 VS 中运行算法。
1.1.6 LKA 自动车道保持巡航算法 ¶
注意
Lane Keeping Assist(车道保持辅助),指可以帮助驾驶员保持在当前车道的系统。
算法构思
自动车道保持巡航算法。
算法流程图
添加道路中心线的顶点来循迹。
编译环境
CMakeList.txt 支持生成 windows / ubuntu 的项目工程。
使用流程
在 SimOne 中运行案例,在 VS 中运行算法。
1.1.7 TestEvaluation ¶
暂无说明
1.1.8 TrajectoryControl 轨迹控制 ¶
注意
ADAS/TrajectoryControl 示例程序演示如何使用轨迹控制主车的运动。
-
如何运行该示例
由于示例程序中的轨迹为固定的,为了运行该示例,需要建立一个案例。
-
新建一个标准案例进行编辑,下图为案例的配置信息。地图使用 三车道路口 ,主车选择 API 控制 ,主车的初始位置设置为 轨迹开始的位置 ,初始速度为 轨迹第一个点的初始速度 。
-
编辑保存后,运行该案例,然后启动示例程序,可以看到车辆沿着程序中定义的轨迹运动,先直线前进 140 米左右向右变道,然后右拐。
-
-
通过轨迹控制主车的 API
-
轨迹控制主车的 API 原型如下:
bool SetDriveTrajectory(const char* mainVehicleId, SimOne_Data_Control_Trajectory *pControlTrajectory)-
用户的 轨迹规划模块 根据主车当前的 位置朝向状态 ,规划出主车接下来的运动轨迹,轨迹包含一系列的 轨迹点 。规划出来的一条轨迹只需要通过 API 发送一次。
-
每一个 轨迹点 包含:① 车辆期望的位置和朝向(Yaw),② 当前主车的速度、加速度,以及 ③ 该轨迹点相对于当前轨迹起点的相对距离和相对时间。轨迹起点的相对距离和相对时间都为 0。
-
示例中的三条轨迹是依次连接的,但用户的轨迹可以有重叠的部分,这样也更能保证车辆运动的连贯性。
-
-
轨迹控制的内部实现
-
SimOne 内置了一个控制模块,根据用户轨迹得到车辆的控制信号,然后使用 动力学 控制车辆运动。在该示例中车辆速度恒定为 10 米/秒,所以右转时已经超出了车辆的控制极限,车辆右转时开到轨迹之外,然后由于 控制模块的纠偏 重新回到规划的轨迹上。
-
1.2 Autopilot 综合算法 ¶
1.2.1 CurveSample ¶
算法构思
全局路径规划和局部路径调整,综合演示 SimOne API 的例子。
算法流程图
-
全局路径规划:
-
获取从起点至终点可能路线的道路编号集合(
naviRoadIdList),等同于地图服务商提供的推荐路线。
-
-
局部路径规划(
GetReferencePath函数)
该函数的目的是实时获取主车当前所在的道路编号,并与
naviRoadIdList
进行对比,从而在全局规划的基础上做出局部路径的规划和调整。
-
获取主车当前车道 :利用
GetNearMostLane函数,获取车辆当前所在的车道laneName。 -
添加中心线顶点 :使用
AddSamples函数,将当前车道的中心线顶点加入到路径变量path中,作为路径规划的一部分。 -
遍历和比较道路编号 :通过
while循环遍历naviRoadIdList中的每个道路编号。对于每个编号,使用GetValidSuccessor函数寻找正确的后继道路编号,以实现连续的路径规划。 -
设计
GetValidSuccessor函数 :该函数用于找到合适的后继道路编号,并与全局道路规划集合naviRoadIdList中的道路编号进行对比,确定局部路径规划的方向。
-
路径规划实现细节(
GetValidSuccessor函数实现)
该函数的核心思想是根据当前道路编号及其后继道路编号,查找并确定正确的后继道路,以便于主车继续沿着规划的路径行驶至目的地。这一过程可能涉及递归调用以处理复杂的道路关系。
总结
上述过程结合了全局路径规划与局部路径调整的思路。通过获取全局的道路编号集合(
naviRoadIdList
)作为规划基线,并设计
GetReferencePath
函数来进行实时路径规划和调整,确保车辆能够根据实时状况,沿着最优路径行驶至目的地。此过程中的
GetValidSuccessor
函数是局部路径规划的关键,它确保车辆可以根据实际情况,选择合适的后继道路,实现精确的导航及行驶。
编译环境
CMakeList.txt 支持生成 windows / ubuntu 的项目工程。
使用流程
在 SimOne 中运行案例,在 VS 中运行算法。
1.2.2 LimitChangeLaneSample ¶
算法构思
算法流程图
计算 A,B,C 点,后将 S->A->B->C->E 作为算法设计的路径
M 点(目标障碍物)投影到车道“1_0_-1”的虚拟中心线得到 B 点
M 点同车道 s 方向后退 30 米,得到 A 点
M 点同车道 s 方向前进 30 米,得到 C 点
M 点(目标障碍物)投影到车道“1_0_-1”的虚拟中心线得到 B 点获取 B 点位置。
A 点到 B 点的插值距离,这里用直线, 你也可以用 Clothoid 螺旋曲线。
编译环境
CMakeList.txt 支持生成 windows / ubuntu 的项目工程。
使用流程
在 SimOne 中运行案例,在 VS 中运行算法。
1.2.3 TrafficLightSample ¶
算法构思
获取场景中交通灯的相位状态。
算法流程图
编译环境
CMakeList.txt 支持生成 windows / ubuntu 的项目工程。
使用流程
在 SimOne 中运行案例,在 VS 中运行算法。
2. SimOneAPI 适配第三方中间件 ¶
2.1 Cyber ¶
ApolloCybertronBridge 接入方式:
Apollo API 接入方式:
Apollo SimOne 仿真通信接口:
| 模块 | 接口功能 | 数据传输方向 | 通信通道 Message Channel | 消息结构文件 Proto Message Structure |
|---|---|---|---|---|
| Control | 纵向控制(油门刹车方向等) | Apollo -> SimOne | /apollo/control | apollo/modules/control/proto/control_cmd.proto |
| Planning | 导航接口(全局规划轨迹) | SimOne -> Apollo | /apollo/routing_request | apollo/modules/routing/proto/routing.proto |
| 导航消息反馈 | Apollo -> SimOne | /apollo/routing_response | apollo/modules/routing/proto/routing.proto | |
| 规划接口(规划轨迹) | Apollo -> SimOne | /apollo/planning | apollo/modules/planning/proto/planning.proto | |
| Canbus | 底盘消息(主车状态) | SimOne -> Apollo | /apollo/canbus/chassis | apollo/modules/canbus/proto/chassis.proto |
| Localizati | Imu(角速度、加速度) | SimOne -> Apollo | /apollo/sensor/gnss/corrected_imu | apollo/modules/localization/proto/imu.proto |
| Gps(车辆位姿、速度) | SimOne -> Apollo | /apollo/sensor/gnss/odometry | apollo/modules/localization/proto/gps.proto | |
| Driver | Ins状态 | SimOne -> Apollo | /apollo/sensor/gnss/ins_stat | apollo/modules/drivers/gnss/proto/ins.proto |
| Perception | 障碍物感知 | SimOne -> Apollo | /apollo/perception/obstacles | apollo/modules/perception/proto/perception_obstacle.proto |
| 交通信号灯感知 | SimOne -> Apollo | /apollo/perception/traffic_light | apollo/modules/perception/proto/traffic_light_detection.proto |
2.2 Matlab ¶
使用说明
请参考软件在环测试中的 simulink 联合仿真部分。页面位置调整
2.3 ROS ¶
请参考 第三方中间件 ROS 。
2.4 Sensor_Raw ¶
2.4.1 Camera ¶
用法简述
物理级摄像头数据传输的演示代码,您可以参考此代码来实时发送摄像头仿真图像至您的算法或控制器。
在传感器配置页面正确填写接收端的 ip 和端口,SimOne 将通过 udp 协议发送数据。
编译环境
CMakeList.txt 支持生成 windows / ubuntu 的项目工程。
使用流程
在 SimOne 中运行案例,在 VS 中运行算法。
2.4.2 Lidar ¶
用法简述
物理级激光雷达数据传输的演示代码,您可以参考此代码来实时发送激光雷达仿真点云数据至您的算法或控制器。
在传感器配置页面正确填写接收端的 ip 和端口,SimOne 将通过 udp 协议发送数据。
编译环境
CMakeList.txt 支持生成 windows / ubuntu 的项目工程。
使用流程
在 SimOne 中运行案例,在 VS 中运行算法。
2.4.3 LidarROS ¶
用法简述
物理级激光雷达数据传输至 ROS 演示代码,您可以参考此代码来实时发送激光雷达仿真点云数据至您的 ROS 系统。
在传感器配置页面正确填写接收端的 ip 和端口,SimOne 将通过 udp 协议发送数据。
编译环境
CMakeList.txt 支持生成 windows / ubuntu 的项目工程。
使用流程
在 SimOne 中运行案例,在 VS 中运行算法。
2.4.4 SensorRadar4D ¶
用法简述
4D 毫米波雷达数据传输的演示代码,您可以参考此代码来实时发送 4D 毫米波雷达仿真点云数据至您的算法或控制器。
在传感器配置页面正确填写接收端的 ip 和端口,SimOne 将通过 udp 协议发送数据。
编译环境
-
CMakeList.txt 支持生成 windows / ubuntu 的项目工程。
-
先运行
gen_vs_proj.bat生成 Visual Studio 工程位于 build 文件夹 ,再运行build_release.bat,最后运行run_sensor_radar4d_view.bat。
使用流程
在 SimOne 中运行案例,在 VS 中运行算法。
3. 功能模块示例 Tutorial ¶
3.1 Dynamics ¶
算法构思
分别使用 SimOneNetAPI 测试配置车辆的加速,制动性能以及操稳。
算法流程图
百公里加速测试; 百公里加速后制动测试; 阶跃,斜坡以及 sine 扫频转向测试。
编译环境
CMakeList.txt 支持生成 windows / ubuntu 的项目工程。
使用流程
-
运行案例和测试流程 :在 SimOne 中运行案例,在 VS 中运行算法。
-
测试结果保存 :如果指定结果保存路径,测试的结果将在路径下生产 CSV 文件,如果无指定路径,将在默认 exe 路径下保存。
-
测试内容 :测试中包含对转向系统的时域扫频测试,可以参照文件中包含的 PostProcessing.m 文件在 MATLAB 中进行频域后处理。
-
数据后处理 :在保存数据时,在执行 exe 文件后加上 *-csvPath “文件名.csv” *这样便会在相应路径下生成测试结果。
3.2 HDMap ¶
算法构思
-
启动仿真案例 :当 SimOne 仿真案例启动时,系统会生成一个 URL 地址,并发送到 HDMap API 端。
-
加载地图文件 :HDMap API 使用接收到的 URL 地址发起 HTTP 请求,从数据平台中加载仿真案例运行时指定的
.xodr地图文件。地图文件被加载到内存中以供后续使用。 -
实时数据提供 :基于主车在静态地图上的动态位置,HDMap API 实时返回关键地图数据给第三方驾驶算法,这些数据包括:地图真值数据、道路路网信息、车道及车道线类型等。
算法流程图
3.2.1 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: 编译目录
HDMap: HDMap API 示例源码目录
编译:
CMakeList.txt 支持生成 windows / ubuntu 的项目工程
-
Windows:
-
进入 Build 目录,运行
gen_vs_proj_debug.bat或gen_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 目录下生成可执行文件
-
运行示例程序 ,查看运行结果
-
3.3 PNC ¶
算法构思
决策规划控制算法利用多传感器融合后的目标级真值数据,开展相关算法验证。SimOne 仿真主车控制 API 提供了 离散点、油门/刹车/方向、规划轨迹 等驱动方式,算法的控制消息通过 API 将规划控制消息传入 SimOne 仿真系统来验证主车控制结果的准确性。
算法流程图
3.3.1 PNC API ¶
-
【SimOne 安装位置】/SimOne/SimOneAPI/include/SimOnePNCAPI.h
-
示例伪代码:
// 主车Id
const char* mv_id = "0";
// 是否加入帧同步
bool isJoinTimeLoop = false;
// BridgeIO 服务 Ip
const char* serverIP = "10.66.9.194";
// 初始化 SimOneAPI
InitSimOneAPI("0", isJoinTimeLoop, serverIP);
// 控制方式一: 设置主车位置 API
std::unique_ptr<SimOne_Data_Pose_Control> pPose = std::make_unique<SimOne_Data_Pose_Control>();
[](pPose.get())
{
// 控制算法输出主车轨迹点,Eg:
pPose->posX; // Position X on Opendrive (by meter)
pPose->posY; // Position Y on Opendrive (by meter)
pPose->posZ; // Position Z on Opendrive (by meter)
pPose->oriX; // Rotation X on Opendrive (by radian)
pPose->oriY; // Rotation Y on Opendrive (by radian)
pPose->oriZ; // Rotation Z on Opendrive (by radian)
pPose->autoZ; // Automatically set Z according to scene
};
// mainVehicleId[input param]: Vehilcle index, configure order of web UI, starts from 0
// pPose[input param]: Pose to set
if (!SimOneAPI::SetPose(0, &pose_ctl))
{
std::cout << "Set Pose failed!" << std::endl;
}
// 控制方式二:主车控制 (通过油门、刹车、方向等消息驱动主车(有动力学),控制参数由算法端提供)
std::unique_ptr<SimOne_Data_Control> pCtrl = std::make_unique<SimOne_Data_Control>();
[](pCtrl.get())
{
// ToDo: 控制算法输出控制消息
// Eg:
pCtrl->timestamp; // uint64 时间戳,单位us
pCtrl->throttleMode = ESimOne_Throttle_Mode::ESimOne_Throttle_Mode_Speed; // vehicle speed, m/s, in this mode, brake input is ignored
pCtrl->throttle; // m/s double 油门开度 0-100。100表示最大油门驱动
pCtrl->steeringMode = ESimOne_Steering_Mode::ESimOne_Steering_Mode_SteeringWheelAngle; // steering wheel angle, degree
pCtrl->steering;
pCtrl->isManualGear = false;
pCtrl->gear = ESimOne_Gear_Mode::ESimOne_Gear_Mode_Drive; // forward gear for automatic gear
}
// mainVehicleId[input param]: Vehilcle index, configure order of web UI, starts from 0
// pControl[input param]: vehicle control data
if (!SetDrive(0, pCtrl.get()))
{
std::cout << "SetDrive Failed!" << std::endl;
}
// 控制方式三:主车控制 (通过规划轨迹点驱动主车(有动力学),不可同时使用SetDrive)
std::unique_ptr<SimOne_Data_Control_Trajectory> pTraj = std::make_unique<SimOne_Data_Control_Trajectory>();
[](pTraj.get())
{
// ToDo: 控制算法输出规划轨迹
// Eg:
for (int i = 0; i < pTraj->point_num; i++)
{
pTraj->points[i].posx; // position x
pTraj->points[i].posy; // position y
pTraj->points[i].speed; // m/s
pTraj->points[i].accel; // accelelation m/s^2
pTraj->points[i].theta; // yaw rad
pTraj->points[i].kappa; // curvature
pTraj->points[i].relative_time; // time relative to the first trajectory point
pTraj->points[i].s; // distance from the first trajectory point
pTraj->isReverse = false;
}
}
// mainVehicleId[input param]: Vehilcle index, configure order of web UI, starts from 0
// pControlTrajectory[input param]: vehicle planning trajectory
if (!SetDriveTrajectory("0", pTraj.get()))
{
std::cout << "SetDrive Failed!" << std::endl;
}
编译环境
-
PNC 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
├── PNC
│ ├── CMakeLists.txt
│ ├── gen_vs_proj.bat
│ ├── include
│ └── src
bin:目标生成目录
Build: 编译目录
HDMap: HDMap API 示例源码目录
编译:
CMakeList.txt 支持生成 windows / ubuntu 的项目工程
-
Windows:
-
进入 Build 目录,运行
gen_vs_proj_debug.bat或gen_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
-
使用流程
-
API 测试:
-
启动 SimOne,新建测试案例
-
新建测试主车(配置控制系统为 手动 / API 控制)
-
运行案例(选择主车为该主车)
-
编译测试代码,bin 目录下生成可执行文件
-
运行示例程序 ,查看运行结果
-
3.4 Sensor ¶
3.5 Traffic ¶
算法构思
动态交通流 API 可以让用户控制场景里面的对手车的轨迹。
算法流程图
对手车的轨迹在外部 json 文件里面配置。
编译环境
CMakeList.txt 支持生成 windows / ubuntu 的项目工程。
使用流程
在场景中需要使用交通流案例,把类型设置为 api。
3.6 V2X ¶
3.6.1 V2XADAS ¶
算法构思
国标中有五种消息 BSM、RSI、RSM、SPAT、MAP 。
| 缩写 | 全称 | 类型 | 描述 | 应用场景 |
|---|---|---|---|---|
| BSM | Basic Safety Message | V2V | 包含车辆的基础信息,如速度、方向、刹车状态等。 | 变道预警、盲区预警、交叉路口碰撞预警等 |
| RSI | Road Side Information | V2I | 路侧信息,用于警示即将到来的事件或路况。 | 道路施工、限速提示、超速预警、公交车道预警等 |
| RSM | Road Safety Message | V2I | 路侧的安全相关消息,由边缘设备提供。 | 事件检测警示,如事故、车辆异常、异物侵入等 |
| SPAT | Signal Phase and Timing | V2I | 交通灯的相位与时序信息。 | 车速引导、绿波带导航等 |
| MAP | MAP Message | V2I | 提供路口地图描述及与交通灯的关系。 | 辅助 SPAT 消息,提供路口导航与交通灯相位引导 |
SimOne 仿真 V2X 传感器节点综合仿真系统内部的感知、交通流,路侧设备以及路网等数据,按照国标 V2X 数据格式转换为相应类型的消息,通过 SimOne V2X API 输出给使用了 V2X 消息的 Adas 算法来做训练。
算法流程图
3.6.2 V2XAPI ¶
-
【SimOne-安装位置】/SimOne/SimOneAPI/include/SimOneV2XAPI.h
-
示例伪代码:
// 主车Id
const char* mv_id = "0";
// 是否加入帧同步
bool isJoinTimeLoop = false;
// BridgeIO 服务 Ip
const char* serverIP = "127.0.0.1";
// 初始化 SimOneAPI
InitSimOneAPI("0", isJoinTimeLoop, serverIP);
// 回调方式获取真值数据
if (IsCallBackMode) {
auto function = [](const char* mainVehicleId, const char* sensorId, SimOne_Data_V2XNFS *pDetections) {
std::cout << "sensorId:" << sensorId << std::endl;
std::cout <<" SetV2XInfoUpdateCB strlen= " << pDetections->V2XMsgFrameSize << std::endl;
std::cout << "MsgFrameData: " << pDetections->MsgFrameData << std::endl;
};
// 获得对应车辆编号V2X中的UPER编码之后的v2x消息更新回调
SetV2XInfoUpdateCB(function);
}
else {
std::unique_ptr<SimOne_Data_V2XNFS> pDetections = std::make_unique<SimOne_Data_V2XNFS>();
while (true)
{
// 获得对应车辆编号V2X中的UPER编码之后的v2x消息
if (GetV2XInfo(mv_id, "obu1" /*V2X Sensor ID*/, ESimOne_V2X_MessageFrame_PR::ESimOne_V2X_MessageFrame_PR_rsiFrame /* V2X 消息类型 */, pDetections.get()))
{
std::cout << "GetV2XInfo strlen = " << strlen(pDetections->MsgFrameData) << std::endl;
std::cout << "MsgFrameData: " << pDetections->MsgFrameData << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(20));
}
else {
std::cout << "GetV2XInfo Fail" << std::endl;
}
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
}
编译环境
CMakeList.txt 支持生成 windows / ubuntu 的项目工程。
-
V2X 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
└── V2X
└── V2XADAS
bin:目标生成目录
Build: 编译目录
HDMap: HDMap API 示例源码目录
编译:
CMakeList.txt 支持生成 windows / ubuntu 的项目工程
-
Windows:
-
进入 Build 目录,运行
gen_vs_proj_debug.bat或gen_vs_proj_release.bat生成 Visual Studio 工程 -
打开 Visual Studio 示例工程, 选择 V2X 工程编译
-
-
Linux:
-
cd Build -
./gen_make_debug.sh(或./gen_make_release.sh) -
cd build_debug(或cd build_release) -
make -j4
-
使用流程
-
API 测试:
-
启动 SimOne,新建测试案例(案例交通参与者设置 OBU)
-
新建测试主车(启用 OBU 配置控制系统为 手动 / API 控制)
-
运行案例(选择主车为该主车)
-
编译测试代码,bin 目录下生成可执行文件
-
运行示例程序 ,查看运行结果
-