介绍
接口介绍
- CarMaker Python API使用Python编程语言为CarMaker仿真框架提供了一个替代的脚本级接口。除了对有Python经验的用户更容易访问之外,它还部署了一种更面向对象的方法,利用了Python编程语言的完全灵活性。
- 通过构建Python框架,CarMaker Python API的用户受益于Python编程语言的易用性和全面性,以及广泛的社区支持和针对所有可能的应用程序的第三方库的可用性。
- CarMaker GUI能实现的操作,使用CarMaker Python API也能实现,而且可以实现更多的功能,只不过得自己编写具体的代码。
文章内容
- 本章介绍了CarMaker Python API在PyCharm里面的运行方法,和运行过程中可能发生的错误以及解决办法。
环境
- Python 3.6 (必须是这个版本)
- PyCharm Community Edition 2021.1.3
- CarMaker 10.2
- Windows 10
使用方法(只介绍Pycharm内的使用方法)
打开python项目
- 打开一个崭新的Pycharm
- 以项目的方式打开CarMaker的python文件,默认位置在:C:\IPG\carmaker\win64-10.2\Python
填写CarMaker工程地址
- 打开后,第一件事情,修改xml里面的占位字符,对于Config.xml里的%YourProject%,并不能自动获取到你CarMaker的项目位置,而且你那么多项目,他又怎么能知道你想调用哪个CarMaker的项目呢,所以,手动改为我的CarMaker项目Work1的绝对路径:G:\cm_project\Work1。
- 只修改这一个肯定不够,在Edit -> Find -> Replace in Files功能,将所有的%YourProject%全部替换掉
- 其他xml里面的占位符%CustomInstallDir%等,需要的话,也可以进行替换,本章实验用不到。
设置python版本
- Python版本必须为3.6,高低版本都不行,否则,运行会提示,版本不是3.6.如果你的版本正好如此,无需按照下述步骤操作,如果不是,请参考下述步骤
- 打开File -> Setting界面,选择Project Python下的Project Interpreter,点击右侧的齿轮符号,点击Add
- 打开File -> Setting界面,选择Project Python下的Project Interpreter,点击右侧的齿轮符号,点击Add
- 选择Python3.6的主程序Python.exe。安装包请自行去网上查找,默认安装位置:C:\Users\Administrator\AppData\Local\Programs\Python\Python36\python.exe
- 正在自动配置并下载相应组建
- 自动配置完成
- 点击Run -> Edit Configuration,配置编译工具
- 将Python3.6配置为编译工具,设置要执行的文件的路径
运行样例ReadWrite
- 右键 1_ReadWrite.py,点击 Run ‘1 ReadWrite’
- 运气好非常好的话,我们能得到如下结果
import包那里单词红色下划线不用担心,ASAM这几个包是正常的,但2_BasicCapturing.py等脚本里面的matplotlib包得手动导入一下,将光标移动到matplotlib处,同时按住Alt+Enter,出现下列选项,点击第一个Install package matplotlib,如下所示:
运行样例CapturingWithDurationWatcher
- 方法同运行样例ReadWrite,只不过要注意matplotlib这个包已经导入了没有,如果matplotlib下方又红色波浪线,则还没有导入,可以去网上看看导入包的方法,这里不做讲解。
- 运行成功后,打开输出的图片,如下图所示
错误分析
- 我运气挺好了,在经历了数小时报错后,于凌晨一点不到成功跑通,现在分析一下错误原因:
- 下述情况,可能是配置Python和CarMaker项目关联的时候有一些自动带出的版本导致的,这个时候,在Config.xml换一个项目,可能会跑通
- 还有一个方法,就是重新加载一遍项目,这种情况下发生这种错误的原因可能是:之前是其他python版本,现在更换为python3.6版本的原因
可以去IPG_ImplementationManifest.imf文件里看看CarMaker、python的版本是否正确
- 下面两种错误可能是因为CarMakerGUI正在运行,导致文件占用发生冲突,把CarMakerGUI关了就行;也可能是12345端口占用,可能是迅雷的原因,关闭即可;还可能是网络问题,这个需要检查防火墙等情况。
- 下述情况,可能是配置Python和CarMaker项目关联的时候有一些自动带出的版本导致的,这个时候,在Config.xml换一个项目,可能会跑通
样例介绍
1_ReadWrite
-
功能:在样例Examples/BasicFunctions/Driver/BackAndForth下,测试在仿真过程中的不同时间方向盘角度。
-
运行效果:
-
解释:
- 运行10秒后,获取当前方向盘角度:SteerAng after 10s: -0.00013378871798683408
- 此时,修改方向盘角度-1度,持续100毫秒:Setting steer angle to 1 rad for 100ms
- 新的方向盘角度为1度:New SteerAngle after write: 1.0
- 再运行20秒,获取当前方向盘角度:SteerAngle after 20s: -1.1985995711572186
- 此时,修改方向盘角度-2度,持续100毫秒:Setting steer angle to -2 rad for 100ms
- 新的方向盘角度为2度:New steering angle after write: -2.0
任何使用XIL API功能的脚本都必须从导入一个能够读取的TestbenchFactory包开始。.imf文件表示清单文件和创建 Testbench实例。 在CarMaker安装的Python目录中提供了这样一个TestbenchFactory的方法。我们可以使用此方法来搜索XIL Testbench的Python模块。示例中的第一行代码展示了如何将路径添加到Python文件夹的路径,并导入TestbenchFactory模块。
2_BasicCapturing
- 功能:观察样例Examples/BasicFunctions/Driver/BackAndForth"和 "Examples/VehicleDynamics/Braking/Braking"的加速度随时间的变化情况
- 运行效果:
- graph_0.png
- graph_1.png
- graph_0.png
所有示例的第一行都与示例1中的相同,因为模块导入和配置总是需要与MAPort一起工作。本样例将重点介绍设置捕获对象以从CarMaker收集一些数据所需的步骤。
3_CapturingWithDurationWatcher
- 本示例展示了如何为捕获对象创建开始和停止触发器,以便仅在模拟期间捕获特定的时间段。
- 运行效果:
- mygraph.png
- mygraph.png
4_CapturingWithConditionWatcher
- 本示例显示了您可以设置的其他类型的启动/停止触发器,即条件观察器。我们可以使用它来使用模拟中的一个变量的值来触发捕获的开始和停止。
- 运行效果:
- mygraph.png
- mygraph.png
5_CaptureToFile
- 到目前为止,我们将数据捕获到内存中,并直接在脚本中处理后处理。本示例说明了如何将数据捕获到。mdf文件中。
.mf4文件用来存储测量数据的宏驱动的路径和文件名。
6_MultiFetch
- 本示例展示了如何在模拟过程中通过重复调用Fetch函数从捕获中连续获取数据。
- 返回的捕获结果将存储在列表中,以便后期处理。一旦模拟完成,所有的模拟都会被绘制出来。请注意,对循环中获取的最后一次调用以及循环后完成设置为True的Fetch调用将返回整个捕获时间帧的数据。这是因为循环中的最后一次调用发生在停止触发器将捕获状态设置为完成之后。在这种状态下,获取始终从开始到结束返回整个捕获结果。
- 运行效果
- alldata.png
- alldata.png
7_ConfigurationParameters
- 此示例将更详细地说明如何参数化CarMaker。第一个主要区别是,它使用了一个包含您可以设置的所有可能参数的配置.xml文件。我们可以在与示例相同的文件夹中找到Config_Example.xml。默认情况下,此脚本显示了如何在Xpack4重构系统上从项目中的src/文件夹中启动自定义可执行文件。您需要使用到项目的路径、自定义安装目录和xeno系统的主机名来填充占位符路径。此外,还可以将数据池添加到“数据池”列表中:
涉及到我的知识盲区了,不做过多讲解,有兴趣的看参考手册吧。
结束
- 昨天从天黑就开始搞,一直搞到0:30,中途一度想放弃,尤其是万万没想到,$YourProject$需要替换为CarMaker工程的地址,我却在不停尝试Python工程的地址,甚至还列了表格比较几十种可能的报错情况。
- Python API 很少有人会使用,因为CarMaker GUI目前做的相当完善,能解决大部分需求。而且,这个接口的相关教程十分少,初次运行报错却很多。所以建议只做了解,不要轻易尝试。尤其没有过python开发经验的,更不要尝试了。
- 关于这个接口的详细介绍,在Help里面有,但里面只是介绍各python模块的功能,并非使用方法和案例。