更新时间:2024-10-30 GMT+08:00
分享

自定义评测镜像制作

延时评测

仿真器输出的仿真过程数据会按照OSI的GroundTruth格式存储为pb文件,根据创建任务配置时是否选择使用datahub,该仿真pb有两种格式:

  1. 使用datahub时,该仿真pb的每帧数据是GroundTruth结构,然后按照OSI标准推荐的存储格式,先按小端顺序存储4个字节,该4个字节表示下一帧GroundTruth总的字节数,然后继续4个字节,更下一帧GroundTruth的字节数,以此类推。
  2. 未使用datahub时,该仿真pb按照sim_osi.proto定义的格式进行存储,所有仿真数据帧GroundTruth存储到一个列表字段“frames”中。

仿真平台定义了sim_osi.proto和eva.proto,用于支持用户自定义评测的功能,具体的proto字段说明见请联系接口人获取仿真服务的proto协议。

图1 自定义评测流程

如上图所示,自定义评测算法以仿真pb文件作为输入,进行评测逻辑处理后,将评测结果写成评测pb。

其中仿真pb是通过八爪鱼提供的sim_osi.proto进行序列化和反序列化,评测pb是通过八爪鱼提供的eva.proto进行序列化和反序列化的。

自定义评测算法的实现有如下几个步骤:

  1. 在代码内通过SIM_OSI_PATH环境变量获取仿真pb路径,通过EVA_PATH环境变量获取评测pb路径。

    通过文件Open的方式打开仿真pb路径,读取字节流,根据文件后缀读取仿真pb文件,如果是.osi后缀结尾的文件,则表示该仿真pb是按照OSI标准格式存储,需要先读取4个字节,获取下一帧GroundTruth长度,然后再读取一定长度的帧数据字节,用GroundTruth进行反序列化。如果是.pb结尾的文件,则利用sim_osi.proto中的SimData反序列化仿真pb中的内容。该步骤会得到一个SimData的内存对象,用户通过访问对象中的字段即可获取自己关注的数据。

  2. 仿真pb包含仿真器输出的整个仿真过程数据,用户处理根据自身评测逻辑处理所有帧数据。
  3. 用户自定义的评测指标包含通过,不通过等结果,将该结果写入到eva.proto中的Evaluation类中,然后通过文件Open的形式打开评测pb路径,将评测结果写成评测pb文件。
  4. 写成评测pb文件后,自定义评测镜像的工作就完成了,仿真平台的控制程序在运行自定义评测容器时会主动将评测pb文件上传到对象存储中,前端通过下载该评测pb文件进行解析,可以将自定义评测结果和内置评测结果一样完全兼容地进行展示。

评测算法代码开发完成后,将代码构建成算法镜像上传到仿真平台评测管理模块即可被仿真任务使用。在制作评测算法镜像的Dockerfile中,建议将评测代码编译成的二进制文件COPY到系统的/usr/bin目录下,便于在前端界面填写评测镜像的运行命令时直接填写该二进制文件的名称即可。在镜像中新建一个shell脚本来运行评测代码也是可以接受的方案。

实时评测

图2 实时评测

仿真平台定义了eva.proto,用于支持用户自定义实时评测的功能,具体的proto字段说明见其他相关文档。

自定义实时评测算法的实现有如下几个步骤:

  1. 代码内实现与仿真器的通信,实时接收仿真器的帧数据,也可同时接收仿真器和AD算法的数据。同时,自定义评测算法也可选择对接八爪鱼提供的Datahub服务,通过Grpc协议,连接`SubscribeGroundTruth`接口实时获取GroundTruth数据。
  2. 用户自定义的评测指标包含通过,不通过等结果,将该结果写入到eva.proto中的Evaluation类中。
  3. 处理每帧数据,不断更新评测结果。具体是更新`eva.proto`中的Evaluation`对象的各个字段值。
  4. 捕获SIGINT信号,当捕获到该信号时,代表仿真结束,将结束时的这帧的评测结果作为最终的评测结果,通过EVA_PATH环境变量获取评测pb路径,将评测结果写入到评测pb文件中。
  5. 写成评测pb文件后,自定义实时评测镜像的工作就完成了。仿真平台的控制程序,会主动将自定义评测结果和内置评测结果融合后的评测pb文件上传到对象存储中,前端可通过下载pb文件进行解析。

评测算法代码开发完成后,将代码构建成算法镜像上传到仿真平台评测管理模块即可被仿真任务使用。在制作评测算法镜像的Dockerfile中,建议将评测代码编译成的二进制文件COPY到系统的/usr/bin目录下,便于在前端界面填写评测镜像的运行命令时直接填写该二进制文件的名称即可。在镜像中新建一个shell脚本来运行评测代码也是可以接受的方案。

另外,对于仿真器B的configure.xml文件的以下两个字段需要更改为:

<ControlInLoop value="1" type="1" />
<CoSimuSocketMode value="2" /> 

相关文档