PreScan笔记(2.1)——MATLAB更改初始data model文件中的参数

    xiaoxiao2025-05-14  72

    文章目录

    用MATLAB更改初始data model文件中的参数(1)什么是Data Model文件?Data Model API如何读取data model里面的内容?还有哪些其他实用的API?(从属于prescan.experiment下) 用Data Model API修改参数的优势

    用MATLAB更改初始data model文件中的参数(1)

    最近导师让我看下PreScan帮助文档中如何用MATLAB脚本修改已搭建模型的参数的部分,虽然说还没想好有哪些具体场景可以搭建,但阅读过文档之后,还是在这记录一下相关知识点和相关API,语法感觉比较简单好记。(我只重点看了utility functions下的prescan.experiment,之后的我以后看了或有用到就马上补上)

    什么是Data Model文件?

    先说什么是Data Model。我们都知道在PreScan GUI中parse并build之后,我们会打开MATLAB Simulink窗口,这时进入相关项目所在路径(和.slx文件同路径),我们能发现一个后缀为.pb的文件(名字和你的实验名称相同,experiment_name.pb),这个就是初始的data model文件了。在Simulink模块运行之前这个文件会被MATLAB初始化,这其中包含了很多参数,比如worldmodel, cammodel, cameramodel或者还有一些特定的传感器模型(sensor specific models)等。

    这些所包含的信息中worldmodel类最为重要,它含有整个搭建的工况的信息。cammodel和cameramodel包含了一些关于可视化相机的信息。用户们可以在模块运行之前自行更改这些参数的值,一些改变可以在运行中被发现,或者说不需要regeneration(比如我们可以替换不同的参与车辆),但是有些变动则会破坏整个仿真。

    Data Model API

    有了关于data model文件的一些基本理解,接下来就是如何用API写一些语句读取并进一步修改这些数据了。

    如何读取data model里面的内容?

    读取有两种方式,第一是不标明路径,第二则是输入具体路径。 如果你已经运行了simulink的模块,可以直接输入models=prescan.experiment.readDataModels();来把data model的数据存储到类型为struct的变量models中。点击工作区的此变量,可以看到如图所示的一些子变量(或者说子数据) 正如上文所说,models里面含有worldmodel, cammodel, cameramodel和一些其他传感器的信息,这些信息都以struct或者cell类型进行存储。接下来点击worldmodel,可以看到它包含了许多重要的参数(如下图),诸如,experimentID(本实验的名称),object, sky, terrain, weather (操作条件的信息)等。 如果我们想运行特定的文件,可以把上一个语句改为models=prescan.experiment.readDataModels('\path\ExperimentFileName.pb');括号里为.pb文件的具体路径即可。

    还有哪些其他实用的API?(从属于prescan.experiment下)

    除了读取data model中的参数之外,如果我们想修改一些参数,可以采用直接赋值的方法,比如

    %change the camera resolution to 1900x1080 px models.cameramodel.sensor{1}.resolution = struct('x', 1900, 'y', 1080);

    当然,除此之外MATLAB还提供了其他的函数,比如prescan.experiment系列的函数。(因为我重点看了这一部分,其他的诸如prescan.sensors,prescan.worldmodel,和prescan.types等我用到了之后再补上)

    prescan.experiment系列一些我觉得我之后可能会用到的API总结:(具体语法使用的时候直接参考帮助文档即可)

    API名称简要用途getFieldValue得到data model子变量的数据readDataModels读取data model中的内容replaceWorldObjectByName从另外一个数据模型中用名字的方式替换现有文件的对应数据runWithDataModels用制定的data model运行simulink文件setFieldValue设置某个子数据的数值worldObjectsDeleteByName通过名字删除对象worldObjectsDeleteByTypeId通过typeID删除对象worldObjectsDeleteIf使用MATLAB匿名函数删除某个对象writeDataModels将数据重新写入.pb文件中

    我从文档中复制了一个例子过来:

    % read data models from the 'default' file models = prescan.experiment.readDataModels(); % run unmodified simulation simOut = prescan.experiment.run('StopTime', '5'); % change the camera azimuth FOV to 1.2 rad (~69 degrees) models.cameramodel.sensor{1} = prescan.experiment.setFieldValue(models.cameramodel.sensor{1}, 'fovAzimuth', 1.2); % change the camera elevation FOV to 1.0 rad (~57 degrees) models.cameramodel.sensor{1} = prescan.experiment.setFieldValue(models.cameramodel.sensor{1}, 'fovElevation', 1.0); % run simulation with modified camera sensor simOut = prescan.experiment.runWithDataModels(models, 'StopTime', '5');

    效果如图:

    用Data Model API修改参数的优势

    最后是关于使用这些MATLAB API的优点: 1.不需要重复建模(画不同的scenarios),非常节省时间。 2.用户可以具体到修改某一个目标或者对象的参数。 3.可以利用结构化的数据。

    最新回复(0)