Prescan C++仿真代码自动生成

欢迎使用 PrescanSimCppGenerator 1.0 代码仓库


项目简介

详细请参考原文

Prescan Simcpp Generator 旨在提供了一个Prescan C++ 仿真工程的代码生成器,主要根据Prescan工程的pb文件,自动生成该仿真工程所需的C++仿真代码,进而直接编译和运行整个C++仿真项目。目前支持自动生成的部分包括:

  • Buffer
  • DummySimulationModel
  • ISimulation
  • ISimulationLogger
  • ISimulationModel
  • ManualSimulation
  • Simulation
  • Unit
  • AirSensorUnit
  • AlmsSensorUnit
  • BrsSensorUnit
  • CameraSensorUnit
  • DepthCameraSensorUnit
  • ImageSegmentationSensorUnit
  • CollisionDetectionUnit
  • LmsSensorUnit
  • LidarSensorUnit
  • ObjectCameraSensorUnit
  • ObjectListProviderUnit
  • PcsSensorUnit
  • RadarSensorUnit
  • TisSensorUnit
  • TrafficSignalSensorUnit
  • ExternalControllerUnit (Refer to Prescan Experiment Demos)
  • OscStateActuatorUnit (Refer to Prescan Experiment Demos)
  • PathUnit
  • SpeedProfileUnit
  • UltrasonicSensorUnit
  • AmesimVehicleDynamicsUnit
  • RayCastUnit (Refer to Prescan Experiment Demos)
  • WheelContactUnit
  • StateActuatorUnit
  • SelfSensorUnit
  • PhysicsBasedCameraUnreal
    • PhysicsBasedCameraUnrealControlUnit
    • PhysicsBasedCameraUnrealExposureUnit
    • PhysicsBasedCameraUnrealRainOverlayUnit
    • PhysicsBasedCameraUnrealUnit
    • PhysicsBasedCameraUnrealSensorUnit
    • PhysicsBasedCameraUnrealRGBUnit
    • PhysicsBasedCameraUnrealDistanceUnit
    • PhysicsBasedCameraUnrealImageSegmentationUnit
    • PhysicsBasedCameraUnrealOpticalFlowUnit
    • PhysicsBasedCameraUnrealIlluminanceUnit
  • PhysicsBased Fullwaveform Lidar
  • PhysicsBased Point Cloud Lidar
  • PhysicsBased Radar (Refer to Prescan Experiment Demos)
  • Preconfigured AmesimDynamics PathFollower(Pedal Mode)
  • Mutil-threads for postprocess.

版本说明

  1. 该项目生成的Prescan C++ 代码命名空间适用于Prescan 2302 及其以后版本;
  2. 该项目的代码和示例基于Prescan2302 全功能版本(包含Prescan所有的功能模块)进行开发和测试;
  3. 该项目支持Windows 10/11和Ubuntu 20.04/22.04平台的Prescan SimCPP 的代码生成。
  4. 对于任何非全功能版本的Prescan,需要对该项目的源代码进行相应的删改,即在源代码中删除Prescan尚未安装或者支持的功能的相应部分。

项目申明

该项目Siemens Prescan官方发布,仅供Prescan C++用户学习和参考。

技术支持

请注意,针对该项目在使用过程中遇到的技术问题,有正式或试用license的Prescan的用户,请邮件联系你所在地区的Prescan技术支持人员,或者登录Siemens Support Center提交相应的技术支持请求,请勿直接发送任何邮件到Prescan官方技术支持,否则你的问题将不会得到任何答复。

使用指南

软件要求

在使用该项目时候,需要事先安装好以前软件:

  • Prescan 2302 或者更高版本
  • Python 3.8或者更高版本,并pip安装以下包:
    • pip install pyyaml
    • pip install colorama
  • C/C++ 编译器(推荐使用Visual Studio 2019或者更高版本)
  • CMake 3.21或者更高版本

变量设置

Windows

根据你电脑Prescan和其他软件的安装情况,你需要做如下的步骤:

  1. 首先更改set_env.bat文件中的环境变量,将Prescan安装目录下的bin目录。如果有安装Plugins,也需要将Plugin文件夹下的bin目录添加到系统PATH路径;
  2. 然后添加Prescan CMake配置文件的路径到Prescan_DIR变量;
  3. 如果你的系统环境变量中没有Python路径,你需要指定使用某个版本的Python,并将其添加到PATH变量中,如果有则忽略并删除该步骤;
  4. 然后你需要将Prescan安装目录下的python、modules和Plugins几个目录添加到PYTHONPATH变量;
  5. 将需要仿真的Prescan工程目录添加到experiment_dir;
  6. 将需要仿真的Prescan工程的pb文件路径添加到experiment_pb;
  7. 将SimCPP Generator生成的simcpp工程路径添加到simcpp_dir,建议在将自动生成的SimCPP工程放置在Prescan工程文件夹下的simcpp文件夹内,即"%experiment_dir%\\simcpp"

最后的环境变量设置如下所示:

@ECHO OFF
setlocal

set "PATH=D:\Simcenter Prescan\Prescan_2302\bin;D:\Simcenter Prescan\Prescan_2302\Plugins\FullWaveformLidarPlugin\bin;D:\Simcenter Prescan\Prescan_2302\Plugins\PBRadarPlugin\bin;D:\Simcenter Prescan\Prescan_2302\Plugins\PointCloudLidarPlugin\bin;D:\Simcenter Prescan\Prescan_2302\Plugins\ProbabilisticSensorsPlugin\bin;D:\Simcenter Prescan\Prescan_2302\Plugins\V2XPlugin\bin;%PATH%"

set "Prescan_DIR=D:\Simcenter Prescan\Prescan_2302\lib\cmake"

set "PATH=D:\Python38\Scripts\;D:\Python38\;%PATH%"

set "PYTHONPATH=D:\Simcenter Prescan\Prescan_2302\python;D:\Simcenter Prescan\Prescan_2302\modules;D:\Simcenter Prescan\Prescan_2302\Plugins;%PYTHONPATH%"

set experiment_dir="C:\\Users\\yiyan5ez\\Desktop\\PrescanSimcppGenerator\\prescandemos\\SimcppGenerator"
set experiment_pb="C:\\Users\\yiyan5ez\\Desktop\\PrescanSimcppGenerator\\prescandemos\\SimcppGenerator\\SimcppGenerator.pb"
set simcpp_dir="C:\\Users\\yiyan5ez\\Desktop\\PrescanSimcppGenerator\\prescandemos\\SimcppGenerator\\simcpp"

echo set path ...
cmd

Ubuntu

注意:Prescan 2307版本正式支持Ubuntu20.04系统,且包含了Windows版本下所有的基于物理建模的传感器,但不持支V2X插件。但在2307之前的版本,并不支持在Ubuntu系统下运行Physics-Based Point Cloud Lidar 和 Physics-Based Radar。因此用户在Ubuntu下使用该项目时候,需要根据自身Prescan版本以及安装的Plugins来添加环境变量。如何在Ubuntu下添加 Prescan Plugin及其PATH,请参考Prescan相关手册。在Prescan 2302的测试项目中,Ubuntu上未安装任何Prescan Plugins。

#! /usr/bin/env bash

# add prescan
export Prescan_version=Prescan_2302
export PATH=$PATH:/usr/local/${Prescan_version}/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/${Prescan_version}/lib

# add Prescan Plugin path
#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/${Prescan_version}/<path_to_plugin>/bin

export Prescan_DIR=/usr/local/${Prescan_version}/lib/cmake

export PYTHONPATH=$PYTHONPATH:/usr/local/${Prescan_version}/python:/usr/local/${Prescan_version}/modules:/usr/local/${Prescan_version}/Plugins

export experiment_dir=/home/yang/Desktop/PrescanSimcppGenerator/prescandemos/SimcppGenerator
export experiment_pb=/home/yang/Desktop/PrescanSimcppGenerator/prescandemos/SimcppGenerator/SimcppGenerator.pb
export simcpp_dir=/home/yang/Desktop/PrescanSimcppGenerator/prescandemos/SimcppGenerator/simcpp

代码删减

对于安装了全功能版的Prescan来说,可直接使用该项目的源代码,否则需要对源代码进行相应的删减以匹配当前Prescan所支持的功能。全功能的版本的Prescan在安装目录中将会有一个Plugins的目录,如图所示。其中选中的这些插件有对用户开放的API。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RV399pF0-1691675794378)(./pic/plugins.png)]

prescan_python_dmapi.py

首先需要删减或注释的部分在./rename_api_namespace/prescan_python_dmapi.py文件中,该模块导入了Prescan 2302对用户开放的所有功能的python API。

import prescan.api
import prescan.api.experiment
import prescan.api.types
import prescan.api.log
import prescan.genericmodel
import prescan.internal
import prescan.assets
import prescan.assets.bufferdata
import prescan.api.air
import prescan.api.alms
import prescan.api.annotations
import prescan.api.brs
import prescan.api.camera
import prescan.api.depthcamera
import prescan.api.iss
import prescan.api.collisiondetection
import prescan.api.communication
import prescan.api.roads
import prescan.api.lidar
import prescan.api.lms
import prescan.api.objectlistprovider
import prescan.api.ocs
import prescan.api.opendrive
import prescan.api.openscenario
import prescan.api.pcs
import prescan.api.physicsbasedcameraunreal
import prescan.api.viewer
import prescan.api.radar
import prescan.api.tis
import prescan.api.trafficsignalsensor
import prescan.api.scenario
import prescan.api.trajectory
import prescan.api.ultrasonic
import prescan.api.userdata
import prescan.api.vehicledynamics
import prescan.internal.algorithm
import prescan.internal.scenario
import prescan.api.fullwaveformlidar
import prescan.api.pbradar
import prescan.api.pointcloudlidar
import prescan.api.probabilisticcamera
import prescan.api.probabilisticradar
import prescan.api.v2x
import prescan.api.roads.types
import prescan.api as prescan_api
import prescan.api.experiment as prescan_api_experiment
import prescan.api.types as prescan_api_types
import prescan.api.log as prescan_api_log
import prescan.genericmodel as prescan_genericmodel
import prescan.internal as prescan_internal
import prescan.assets as prescan_assets
import prescan.assets.bufferdata as prescan_assets_bufferdata
import AIR.python_interface.prescan.api.air as prescan_api_air
import ALMS.python_interface.prescan.api.alms as prescan_api_alms
import Annotations.python_interface.prescan.api.annotations as prescan_api_annotations
import BRS.python_interface.prescan.api.brs as prescan_api_brs
import Camera.python_interface.prescan.api.camera as prescan_api_camera
import Camera.python_interface.prescan.api.depthcamera as prescan_api_depthcamera
import Camera.python_interface.prescan.api.iss as prescan_api_iss
import CollisionDetection.python_interface.prescan.api.collisiondetection as prescan_api_collisiondetection
import Communication.python_interface.prescan.api.communication as prescan_api_communication
import GraphBasedRoads.python_interface.prescan.api.roads as prescan_api_roads
import Lidar.python_interface.prescan.api.lidar as prescan_api_lidar
import LMS.python_interface.prescan.api.lms as prescan_api_lms
import ObjectListProvider.python_interface.prescan.api.objectlistprovider as prescan_api_objectlistprovider
import OCS.python_interface.prescan.api.ocs as prescan_api_ocs
import OpenDriveImporter.python_interface.prescan.api.opendrive as prescan_api_opendrive
import OpenScenarioImporter.python_interface.prescan.api.openscenario as prescan_api_openscenario
import PCS.python_interface.prescan.api.pcs as prescan_api_pcs
import PhysicsBasedCamera.python_interface.prescan.api.physicsbasedcameraunreal as prescan_api_physicsbasedcameraunreal
import PrescanViewer.python_interface.prescan.api.viewer as prescan_api_viewer
import Radar.python_interface.prescan.api.radar as prescan_api_radar
import TIS.python_interface.prescan.api.tis as prescan_api_tis
import TrafficSignalSensor.python_interface.prescan.api.trafficsignalsensor as prescan_api_trafficsignalsensor
import Trajectory.python_interface.prescan.api.scenario as prescan_api_scenario
import Trajectory.python_interface.prescan.api.trajectory as prescan_api_trajectory
import UltraSonic.python_interface.prescan.api.ultrasonic as prescan_api_ultrasonic
import UserData.python_interface.prescan.api.userdata as prescan_api_userdata
import VehicleDynamics.python_interface.prescan.api.vehicledynamics as prescan_api_vehicledynamics
import Algorithm.python_interface.prescan.internal.algorithm as prescan_internal_algorithm
import Trajectory.python_interface.prescan.internal.scenario as prescan_internal_scenario
import FullWaveformLidarPlugin.modules.fullwaveformlidar.python_interface.prescan.api.fullwaveformlidar as prescan_api_fullwaveformlidar
import PBRadarPlugin.modules.pbradar.python_interface.prescan.api.pbradar as prescan_api_pbradar
import PointCloudLidarPlugin.modules.pointcloudlidar.python_interface.prescan.api.pointcloudlidar as prescan_api_pointcloudlidar
import ProbabilisticSensorsPlugin.modules.ProbabilisticCamera.python_interface.prescan.api.probabilisticcamera as prescan_api_probabilisticcamera
import ProbabilisticSensorsPlugin.modules.ProbabilisticRadar.python_interface.prescan.api.probabilisticradar as prescan_api_probabilisticradar
import V2XPlugin.modules.v2x.python_interface.prescan.api.v2x as prescan_api_v2x
import GraphBasedRoads.python_interface.prescan.api.roads.types as prescan_api_roads_types

但当用户安装的Prescan不支持某些功能API的时候,需要手动将对应的代码导入部分注释或删除掉。如果用户没有安装的Prescan没有Plugins或者Plugins不全,则需要注释掉相应的代码。例如,用户没有安装Plugins或者缺少Plugins中的Physics-Based Camera/Lidar/Radar或Probabilistic Radar/Camera或V2X,则需要注释或删除对应的API导入代码。

如缺少v2x,注释或删除:

#import prescan.api.v2x
#import V2XPlugin.modules.v2x.python_interface.prescan.api.v2x as prescan_api_v2x

如缺少physicsbasedcameraunreal,注释或删除:

#import prescan.api.physicsbasedcameraunreal
#import PhysicsBasedCamera.python_interface.prescan.api.physicsbasedcameraunreal as prescan_api_physicsbasedcameraunreal

如缺少fullwaveformlidar,注释或删除:

#import prescan.api.fullwaveformlidar
#import FullWaveformLidarPlugin.modules.fullwaveformlidar.python_interface.prescan.api.fullwaveformlidar as prescan_api_fullwaveformlidar

如缺少pbradar,注释或删除:

#import prescan.api.pbradar
#import PBRadarPlugin.modules.pbradar.python_interface.prescan.api.pbradar as prescan_api_pbradar

如缺少pointcloudlidar,注释或删除:

#import prescan.api.pointcloudlidar
#import PointCloudLidarPlugin.modules.pointcloudlidar.python_interface.prescan.api.pointcloudlidar as prescan_api_pointcloudlidar

如缺少probabilisticcamera/radar,注释或删除:

#import prescan.api.probabilisticcamera
#import prescan.api.probabilisticradar
#import ProbabilisticSensorsPlugin.modules.ProbabilisticCamera.python_interface.prescan.api.probabilisticcamera as prescan_api_probabilisticcamera
#import ProbabilisticSensorsPlugin.modules.ProbabilisticRadar.python_interface.prescan.api.probabilisticradar as prescan_api_probabilisticradar

如缺少整个Plugins文件夹,则删除上述所有代码。另外,Prescan目前尚未支持Linux平台下的v2x模块,所以用户在Ubuntu上使用该项目的时候,必须注释或删除v2x相关的API导入。

sensors and generators

在删除或注释掉对应plugin的API导入后,还需要在sensorsgenerator文件夹内删除对应的传感器模块。例如:如果在prescan_python_dmapi.py中注释或者删除掉了pointcloudlidar的导入,则必须在sensorsgenerator文件中分别删除Pointcloudlidar.pyPointcloudlidarGenerator.py

使用步骤

在进行正式SimCPP代码生成前,确保已经根据Prescan实际安装情况和支持的功能,按上述要求完成了SimCPP Generator源代码的删减
SimCPP Generator可以在Windows或Ubuntu上分别为Prescan工程自动生成SimCPP代码。但考虑到Prescan在Ubuntu上安装Plugins的时候具有一定的灵活性,不同的用户可能安装到不同的目录或者命名不同的文件夹。所以,如果要在Ubuntu上使用到Prescan Plugins的一些功能,建议直接在Windows上生成SimCPP然后拷贝到Ubuntu上编译运行。

Windows

  1. 首先创建或打开一个Prescan工程,我们在该项目中已经包含了一个示例工程,在项目的./prescandemos文件夹下,工程名称为SimcppGenerator

  2. 在Prescan GUI中创建场景,添加道路、建筑、车辆等,设置仿真,然后给车辆添加运动轨迹或者AmesimPreconfigedDynamics,最后给感兴趣的车辆添加传感器(支持自动生成SimCPP代码的传感器类型);
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MJsVu8LI-1691675794379)(./pic/GUI.png)]

  3. 在SimCPP generator中修改set_env.bat文件中的环境变量,例如,将该项目文件夹位于C:\\Users\\yiyan5ez\\Desktop\\PrescanSimcppGenerator时候,以下路径改为Prescan示例工程路径、pb文件以及期望把生成的Simcpp工程放置的路径:

    set experiment_dir="C:\\Users\\yiyan5ez\\Desktop\\PrescanSimcppGenerator\\prescandemos\\SimcppGenerator"
    set experiment_pb="C:\\Users\\yiyan5ez\\Desktop\\PrescanSimcppGenerator\\prescandemos\\SimcppGenerator\\SimcppGenerator.pb"
    set simcpp_dir="C:\\Users\\yiyan5ez\\Desktop\\PrescanSimcppGenerator\\prescandemos\\SimcppGenerator\\simcpp"
    
  4. 双击set_env.bat即可打开一个cmd窗口,输入:

    python main.py %experiment_pb% -out_dir %simcpp_dir%
    

    第一个位置参数%experiment_pb%为Prescan工程的pb文件,第二个可选参数-out_dir表示将自动生成的SimCPP工程拷贝到%simcpp_dir%路径下。如果%simcpp_dir%路径已经存在,则运行上述代码的时候将会提示是否删除已经存在的simcpp工程。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LQsZqPBe-1691675794381)(./pic/generate_win.png)]
    输入’y’表示同意删除,'n’或其他字符不删除并退出程序,如图显示SimCPP创建成功。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l7K22peH-1691675794381)(./pic/generated_win.png)]

  5. 在对应的Prescan工程目录下,即可看到一个simcpp文件夹,里面包含了整个工程的SimCPP程序。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9qkU2i70-1691675794381)(./pic/simcpp_win.png)]

    进入该文件夹内,可以看到如下文件结构:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EgsAATQT-1691675794382)(./pic/simmode_win.png)]

    双击set_env.bat即可打开一个cmd窗口,输入:

    build.bat
    

    如果build成功,则可以看到如下输出内容:

    -- Selecting Windows SDK version 10.0.17763.0 to target Windows 10.0.22621.
    -- The CXX compiler identification is MSVC 19.20.27508.1
    -- Detecting CXX compiler ABI info
    -- Detecting CXX compiler ABI info - done
    -- Check for working CXX compiler: c:/apps/MVS16/VC/Tools/MSVC/14.20.27508/bin/Hostx64/x64/cl.exe - skipped
    -- Detecting CXX compile features
    -- Detecting CXX compile features - done
    -- Found Prescan 2023.1.0 at D:/Simcenter Prescan/Prescan_2302/lib/cmake
        Plugins found:
            - Prescan::FullWaveformLidar
            - Prescan::PBRadar
            - Prescan::PointCloudLidar
            - Prescan::ProbabilisticSensors
            - Prescan::v2x
    -- Generating helper scripts for demo: SimCppProject
    -- Experiment directory set to: C:/Users/yiyan5ez/Desktop/SimcppGenerator
    -- PrescanRootDIR D:/Simcenter Prescan/Prescan_2302
    -- Configuring done
    -- Generating done
    -- Build files have been written to: C:/Users/yiyan5ez/Desktop/SimcppGenerator/simcpp/build
    Microsoft (R) Build Engine version 16.0.462+g62fb89029d for .NET Framework
    Copyright (C) Microsoft Corporation. All rights reserved.
    
      Checking File Globs
      Checking Build System
      Building Custom Rule C:/Users/yiyan5ez/Desktop/SimcppGenerator/simcpp/CMakeLists.txt
      main.cpp
      cnpy.cpp
      Generating Code...
      SimCppProject.vcxproj -> C:\Users\yiyan5ez\Desktop\SimcppGenerator\simcpp\build\Release\SimCppProject.exe
      Building Custom Rule C:/Users/yiyan5ez/Desktop/SimcppGenerator/simcpp/CMakeLists.txt
    

    继续双击set_env.bat即可打开一个cmd窗口,输入:

    run.bat
    

    Prescan将会开始仿真:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gx7mTG59-1691675794382)(./pic/sim_win.png)]
    如果需要更改仿真时间,打开run.bat

    prescanrun %simcpp_dir%\\build\\Release\\SimCppProject.exe %experiment_pb% 10
    

    其中,数字10表示仿真进行10s。

Ubuntu

  1. 步骤同Windows;

  2. 步骤同Windows;

  3. 将Prescan工程和Simcpp Generator项目文件夹都拷贝到Ubuntu;

  4. 同理,在SimCPP generator中修改set_env.bash文件中的环境变量,例如以下路径改为所创建的Prescan工程路径、pb文件以及期望把生成的Simcpp工程放置的路径:

    export experiment_dir=/home/yang/Desktop/PrescanSimcppGenerator/prescandemos/SimcppGenerator
    export experiment_pb=/home/yang/Desktop/PrescanSimcppGenerator/prescandemos/SimcppGenerator/SimcppGenerator.pb
    export simcpp_dir=/home/yang/Desktop/PrescanSimcppGenerator/prescandemos/SimcppGenerator/simcpp
    
  5. 在当前SimCPP generator项目文件夹中打开一个Terminal,依次输入:

    source set_env.bash
    
    python3 main.py $experiment_pb -out_dir $simcpp_dir
    

    运行成功的话,同样将在Prescan工程文件夹下找到simcpp文件夹。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1l8OaK7J-1691675794382)(./pic/simmodel_linux.png)]

  6. 在simcpp文件夹内打开一个Terminal,依次输入:

    source set_env.bash
    
    bash build.bash
    

    如果build成功将会看到如下输出:

    -- The CXX compiler identification is GNU 11.4.0
    -- Detecting CXX compiler ABI info
    -- Detecting CXX compiler ABI info - done
    -- Check for working CXX compiler: /usr/bin/c++ - skipped
    -- Detecting CXX compile features
    -- Detecting CXX compile features - done
    -- Found Prescan 2023.1.0 at /usr/local/Prescan_2302/lib/cmake
        Plugins found: <NONE>
    -- Generating helper scripts for demo: SimCppProject
    -- Experiment directory set to: /home/yang/Desktop/SimcppGenerator
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/yang/Desktop/SimcppGenerator/simcpp/build
    [ 33%] Building CXX object CMakeFiles/SimCppProject.dir/simmodel/main.cpp.o
    In file included from /home/yang/Desktop/SimcppGenerator/simcpp/simmodel/simmodel/simmodel.h:21,
                    from /home/yang/Desktop/SimcppGenerator/simcpp/simmodel/main.cpp:23:
    /home/yang/Desktop/SimcppGenerator/simcpp/simmodel/utils/threadpool.h: In function ‘double prescan::utils::get_timestamp()’:
    /home/yang/Desktop/SimcppGenerator/simcpp/simmodel/utils/threadpool.h:56:8: warning: ‘int ftime(timeb*)’ is deprecated: Use gettimeofday or clock_gettime instead [-Wdeprecated-declarations]
      56 |   ftime(&now);
          |   ~~~~~^~~~~~
    In file included from /home/yang/Desktop/SimcppGenerator/simcpp/simmodel/utils/threadpool.h:38,
                    from /home/yang/Desktop/SimcppGenerator/simcpp/simmodel/simmodel/simmodel.h:21,
                    from /home/yang/Desktop/SimcppGenerator/simcpp/simmodel/main.cpp:23:
    /usr/include/x86_64-linux-gnu/sys/timeb.h:29:12: note: declared here
      29 | extern int ftime (struct timeb *__timebuf)
          |            ^~~~~
    [ 66%] Building CXX object CMakeFiles/SimCppProject.dir/simmodel/utils/cnpy.cpp.o
    [100%] Linking CXX executable SimCppProject
    /usr/bin/ld: warning: /usr/local/Prescan_2302/lib/libplatform.so has a program header with invalid alignment
    /usr/bin/ld: warning: /usr/local/Prescan_2302/lib/libpimp.so has a program header with invalid alignment
    /usr/bin/ld: warning: /usr/local/Prescan_2302/lib/libfederate_sdk.so has a program header with invalid alignment
    /usr/bin/ld: warning: /usr/local/Prescan_2302/lib/libpssettings.so has a program header with invalid alignment
    /usr/bin/ld: warning: /usr/local/Prescan_2302/lib/libmoduleloader.so has a program header with invalid alignment
    /usr/bin/ld: warning: /usr/local/Prescan_2302/lib/libprtl.so has a program header with invalid alignment
    /usr/bin/ld: warning: /usr/local/Prescan_2302/lib/libvislibrary.so has a program header with invalid alignment
    [100%] Built target SimCppProject
    

    然后可以继续运行run.bash执行仿真。但在仿真之前,请确保Prescan DeploymentService已经运行起来。同样,在simcpp中打开一个Terminal,然后依次输入:

    source set_env.bash
    
    bash run.bash
    

    即可运行Prescan仿真,如图所示:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-royohbsv-1691675794382)(./pic/sim_linux.png)]

代码详解

请参加线上和线下培训

进阶应用

SimCppBridge

该项目中包含了一个Prescan Simcpp和用户的C++或Python程序进行共享内存通信的示例,在Windows11和Ubuntu22.04两个平台进行了测试,工作流程如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GeVJ7mx0-1691675794383)(./pic/workflow_cn.png)]

首先需要用户使用Protobuf定义各类消息并将其编译成C++和python文件,这些消息集将作为Prescan Simcpp和用户程序的通信媒介。Simcpp和用户程序使用共享内存通信的一个完整的仿真周期包括以下三步:

  1. 在simcpp程序中,用户将Prescan各类传感器或其他状态数据填充到相应的Protobuf消息中,并通过采用共享内存的方式将填充好的protobuf消息进行序列化并写入到共享内存,然后阻塞等待用户程序处理数据和返回结果;
  2. 用户程序阻塞读取共享内存中来自Prescan Simcpp的数据,并进行反序列化得到protobuf消息,然后完成用户逻辑或算法部分,得到结果(如控制指令),并将结果填充到对应的protobuf消息,最后进行序列化并写入共享内存;
  3. Simcpp读取来自用户程序的处理结果,然后反序列化为对应的protobuf消息,并将结果作用到Prescan(如控制车辆油门、转向和制动);

使用指南

软件环境

除了SimCpp Generator要求的软件环境,还需要安装以下软件或依赖:

  • Windows:
    • 安装 vcpkg 2023.07.21 Release 并按照官方指导安装boost和protobuf库,vcpkg 2023.07.21 默认会安装boost 1.82版 和 protobuf 3.21.12版。也可以安装其他版本的boost或者protobuf,但如果想要做Simcpp和python程序的共享内存通信的话,protobuf的C++版本必须和python版本兼容。本示例中,python版本的protobuf 4.21.12和C++ protobuf 3.21.12兼容。
      • vcpkg.exe install boost:x64-Windows
      • vcpkg.exe install protobuf:x64-Windows
    • pip install protobuf==4.21.12
    • pip install matplotlib
  • Ubuntu:
    • 安装boost>=1.72
    • 安装protobuf>=3.19.2
    • pip3 install protobuf==(protobuf C++兼容的版本)

Windows(Simcpp和C++用户程序)

  1. ./bridgedemos下的simcpp文件夹直接拷贝到./prescandemos/SimcppGenerator示例工程里面。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HzBlkCSl-1691675794383)(./pic/bridgesimcpp.png)]
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ed6RbdZt-1691675794384)(./pic/experiment_bridge_simcpp.png)]

  2. 进入./prescandemos/SimcppGenerator/simcpp中,按照变量设置修改set_env.bat,其中vcpkg"%vcpkg installation folder%\scripts\buildsystems\vcpkg.cmake,用于在CMake中找到boost和protobuf依赖。

  3. 修改完毕后,双击set_env.bat弹出cmd窗口,输入:

    build.bat
    

    等待编译完成,会看到以下输出,生成可执行文件,编译成功。

    ...
    Generating Code...
    SimCppProject.vcxproj -> C:\Users\yiyan5ez\Desktop\PrescanSimcppGenerator\prescandemos\SimcppGenerator\simcpp\build\R
    elease\SimCppProject.exe
    Building Custom Rule C:/Users/yiyan5ez/Desktop/PrescanSimcppGenerator/prescandemos/SimcppGenerator/simcpp/CMakeLists.txt
    
  4. 双击set_env.bat弹出cmd窗口,输入:

    run.bat
    

    在运行该命令之前,请确保已启动Prescan Process Manager。运行成功将会看到如下和画面。但整个程序会阻塞在当前位置,因为用户程序尚未开启。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nd3nLqKg-1691675794384)(/pic/bridge_simcpp_run_win.png)]

  5. 接下来编译用户程序。进入./bridgedemos/cppbridge文件夹,同样先修改set_env.bat文件中的环境变量vcpkg。然后双击set_env.bat,打开cmd窗口,输入:

    build.bat
    

    编译成功后你将看到以下信息,生成了可执行文件。

    ...
    cppbridge.vcxproj -> C:\Users\yiyan5ez\Desktop\PrescanSimcppGenerator\bridgedemos\cppbridge\build\Release\cppbridge.exe
    Building Custom Rule C:/Users/yiyan5ez/Desktop/PrescanSimcppGenerator/bridgedemos/cppbridge/CMakeLists.txt
    

    最后,继续在cmd窗口中输入:

    run.bat
    

    此时仿真将运行起来,Prescan Viewer也可以观察到变化,如下所示。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kWsnMMW4-1691675794385)(./pic/bridge_simcpp_run_win_with_user.png)]

  6. 运行结束后,Simcpp和用户C++程序将自行结束。注意,在Windows上面,请先启动Simcpp,再启动用户C++程序。

Windows(Simcpp和Python用户程序)

  1. 同“Windows(Simcpp和C++用户程序)”步骤1。

  2. 同“Windows(Simcpp和C++用户程序)”步骤2。

  3. 同“Windows(Simcpp和C++用户程序)”步骤3。

  4. 同“Windows(Simcpp和C++用户程序)”步骤4。

  5. 当Simcpp程序运行起来后,在C:\ProgramData\boost_interprocess文件夹下可以找到一个文件夹,里面包含共享内存的映射文件,如下所示:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XCQAkM8Q-1691675794385)(./pic/boost_files.png)]
    进去文件夹./bridgedemos/pybridge/shmtypes,打开文件bridge_shm..py,将文件夹名(该示例为44000000)写入到python代码对应位置,然后保存关闭文件。

    class ShmHandler:
    if platform.system() == "Windows":
        shm_path = "C:\\ProgramData\\boost_interprocess\\44000000\\"
    elif platform.system() == "Linux":
        shm_path = "/dev/shm/"
    else:
        raise Exception("Platform not supported")
    
    

    回到./bridgedemos/pybridge文件夹,在该路径下打开一个终端,输入:

    python main.py
    

    运行成功将看到如下界面:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RqDXcCyB-1691675794386)(./pic/bridge_simcpp_run_win_with_userpy.png)]

  6. 运行结束后,Simcpp和用户Python程序将自行结束。注意,在Windows上面,请先启动Simcpp,再启动用户Python程序。

Ubuntu(Simcpp和C++用户程序)

  1. 同“Windows(Simcpp和C++用户程序)”步骤1。

  2. 进入./prescandemos/SimcppGenerator/simcpp中,按照变量设置修改set_env.bash

  3. 修改完毕后,在当前路径打开一个终端,依次输入:

    source set_env.bash
    
    bash build.bash
    

    等待编译完成,会看到以下输出,生成可执行文件,编译成功。

    ...
    [100%] Linking CXX executable SimCppProject
    /usr/bin/ld: warning: /usr/local/Prescan_2302/lib/libplatform.so has a program header with invalid alignment
    /usr/bin/ld: warning: /usr/local/Prescan_2302/lib/libpimp.so has a program header with invalid alignment
    /usr/bin/ld: warning: /usr/local/Prescan_2302/lib/libfederate_sdk.so has a program header with invalid alignment
    /usr/bin/ld: warning: /usr/local/Prescan_2302/lib/libpssettings.so has a program header with invalid alignment
    /usr/bin/ld: warning: /usr/local/Prescan_2302/lib/libmoduleloader.so has a program header with invalid alignment
    /usr/bin/ld: warning: /usr/local/Prescan_2302/lib/libprtl.so has a program header with invalid alignment
    /usr/bin/ld: warning: /usr/local/Prescan_2302/lib/libvislibrary.so has a program header with invalid alignment
    [100%] Built target SimCppProject
    
  4. 在当前路径打开一个终端,依次输入:

    source set_env.bash
    
    bash run.bash
    

    在运行该命令之前,请确保已启动DeploymentService。运行成功将会看到如下和画面。但整个程序会阻塞在当前位置,因为用户程序尚未开启。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a3ynPuDc-1691675794386)(/pic/bridge_simcpp_run_linux_cpp.png)]

  5. 接下来编译用户程序。进入./bridgedemos/cppbridge文件夹,在当前路径打开一个终端,输入:

    bash build.bash
    

    编译成功后你将看到以下信息,生成了可执行文件。

    ...
    [100%] Linking CXX executable cppbridge
    [100%] Built target cppbridge
    

    最后,继续在终端中输入:

    bash run.bash
    

    此时仿真将运行起来,Prescan Viewer也可以观察到变化,如下所示。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YQBdIARQ-1691675794387)(./pic/bridge_simcpp_run_linux_with_user.png)]

  6. 运行结束后,Simcpp和用户C++程序将自行结束。注意,在Ubuntu上面,Simcpp和用户C++程序启动顺序没有特别指定

Ubuntu(Simcpp和Python用户程序)

  1. 同“Ubuntu(Simcpp和C++用户程序)”步骤1。
  2. 同“Ubuntu(Simcpp和C++用户程序)”步骤2。
  3. 同“Ubuntu(Simcpp和C++用户程序)”步骤3。
  4. 同“Ubuntu(Simcpp和C++用户程序)”步骤4。
  5. 当Simcpp程序运行起来后,回到./bridgedemos/pybridge文件夹,在该路径下打开一个终端,输入:
    python3 main.py
    
    运行成功将看到如下界面:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jXtxTHrg-1691675794387)(./pic/bridge_simcpp_run_linux_with_userpy.png)]
  6. 运行结束后,Simcpp和用户Python程序将自行结束。注意,在Ubuntu上面,Simcpp和用户Python程序启动顺序没有特别指定

已知问题

  1. 在Windows环境下,Simcpp和User C++ App共享内存通信时候,C++ User App不能使用该项目中的定义好的线程池类读取数据,否则会出现卡死。
  2. 在Windows环境下,Prescandemos中的Prescan工程,PCS在PrescanViewer中的Annotate属性如果使能,Simcpp和User Python App则不能实现共享内存通信,因为在C:\ProgramData\boost_interprocess中的共享内存文件不是按照用户自定义的名称进行命名的,python无法找到对应的文件和内存。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值