跳转至

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.batgen_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 目录下生成可执行文件

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