PNC 示例¶
注意
示例目录:[SimOne 安装目录]\SimOneAPI\Tutorial\PNC
算法构思
决策规划控制算法利用多传感器融合后的目标级真值数据,开展相关算法验证。SimOne 仿真主车控制 API 提供了 离散点、油门/刹车/方向、规划轨迹 等驱动方式,算法的控制消息通过 API 将规划控制消息传入 SimOne 仿真系统来验证主车控制结果的准确性。
算法流程图
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>();
// 控制算法输出主车轨迹点,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>();
// 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>();
// 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 示例工程, 选择 PNC 工程编译
-
Linux:
-
cd Build -
./gen_make_debug.sh(或./gen_make_release.sh) -
cd build_debug(或cd build_release) -
make -j4
使用流程
-
API 测试:
-
启动 SimOne,新建测试用例
-
新建测试主车(配置控制系统为 手动 / API 控制)
-
运行用例(选择主车为该主车)
-
编译测试代码,bin 目录下生成可执行文件
-
运行示例程序,查看运行结果
