康谋分享 | 自动驾驶联合仿真——功能模型接口FMI(三)

在之前的两篇文章中(文末往期回顾中可查看),我们主要介绍了功能模型接口FMI的主要组成部分和一些使用场景,今天就以康谋自动驾驶仿真软件aiSim为例,来展示一下如何建立一个FMU并实现基于UDP和FMI联合仿真(co-simulation)数据通信。


目录

效果预览

相关配置

操作步骤

1、实例化

2、FMU交互

3、初始化和释放


一、效果预览

PC1 aiSim运行效果
PC2 读取FMU和UDP通讯

 

二、相关配置

OS:Ubuntu22.05

仿真软件:aiSim 5.2.0

首先是要构建所需要的FMU,在一些动力学仿真软件上,如CarSim,可以直接导出动力学模型对应的FMU文件,但本次我们基于C++从零构建FMU文件。

需要编辑的6份文件分别是:

  • fmi_simple_car.cpp:根据FMI2.0标准实现一个车辆模型

  • simple_car.h:车辆模型的头文件

  • simple_car.cpp:车辆模型的实现文件

  • value_reference_ids.h:定义值应用ID的头文件

  • modelDescription.xml:定义FMU结构的根文件

  • simple_car_fmu.json文件:用于将构建的FMU文件映射到aiSim的车辆动力学中(非构建FMU所必须)

三、操作步骤

首先是fmi_simple_car.cpp文件主要包含了6个部分,最终实现为模拟控制一个简单的车辆模型,包括了实例化、设置参数,执行仿真步骤以及获取和设置模型参数的功能。

头文件:

  • include "fmi2Functions.h" (是FMI2.0标准的头文件,请参考FMI官网)

  • include

  • include

  • include "simple_car.h"

1、实例化

实例化FMU,在之前的文章中我们以C语言为例,本次采用C++来做示范。

fmi2Component fmi2Instantiate(  

fmi2String /*实例名称*/,

fmi2Type fmuType /*实例类型(ME/CO)*/,

fmi2String /*唯一标识符*/,

fmi2String /*资源位置*/,

const fmi2CallbackFunctions* /*回调函数*/,

fmi2Boolean /*是否可见*/,

fmi2Boolean /*是否启用日志*/)

{/*此处可以与用判断车辆实例是否在使用、检查FMU的类型是ME模型交换还是CO联合仿真、执行实例化车辆*/

car_is_used = True; //预先设置的标志变量,用于表示表示车辆是否正在使用

returen &only_one_car; //预先定义的全局SimpleCar对象only_one_car

}

2、FMU交互

实例化完成后,我们要实现一系列函数用于FMU交互的具体实现,主要包含获取和设置变量,执行仿真步骤等。

① 获取类型

获取实数,通过遍历引用数组vr,获取对应的值并存储。

fmi2Status fmi2SetReal(fmi2Component /*c*/, const fmi2ValueReference vr[], size_t nvr, const fmi2Real value[]){

for (size_t i = 0; i < nvr; ++i)    {

only_one_car.SetValue(vr[i], value[i]);

}

return fmi2OK;

}

同样还能够实现获取整数、布尔值和字符串值。

② 执行仿真

获取实联合仿真函数(CO),可以是根据之前实数和证书引入导数计算,又或是引入仿真步骤的执行和取消数,通过遍历引用数组vr,获取对应的值并存储。

比如执行仿真步骤,其中DoStep将会在Simple_car.cpp中实现:

fmi2Status fmi2DoStep(fmi2Component /*c*/, fmi2Real /*currentCommunicationPoint*/, fmi2Real communicationStepSize, fmi2Boolean /*newStep*/){    

log_to_file("fmi2DoStep()");    only_one_car.DoStep(communicationStepSize); 

return fmi2OK;

}

同样还能够实现获取整数、布尔值和字符串值。

3、初始化和释放

除此之外,我们还需要注意在仿真过程中FMU实例的初始化和释放。

比如我们可以简单的通过设置car_is_used= false实现实例的释放,可以通过only_one_car = SimplerCar()来实现FMU的重置,其中SimplerCar类的具体实现在simple_car.cpp中。

以上就是基于FMI2.0实现车辆模型时所需的基本内容,剩余的内容我们将在后续的文章中进行分享。


如您对上述产品和解决方案感兴趣,

欢迎联系康谋自动驾驶团队了解更多信息。

我们将竭诚为您服务!

期待与您的交流!

康谋科技 - 您的一站式自动驾驶解决方案合作伙伴,助力自动驾驶商业化落地 - keymotek康谋科技有限公司是原虹科自动驾驶业务孵化出来的全新独立公司,专注于自动驾驶领域。我们以数据为驱动力,提供高性能的数据采集、记录、传输方案,针对各种驾驶场景进行精准的仿真模拟,以及对大量自动驾驶数据进行高效、高质量处理。我们的一站式服务能够满足自动驾驶领域研发测试的全流程需求,助力客户在自动驾驶领域取得更大突破。icon-default.png?t=N7T8https://keymotek.com/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/791038.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数智化CIO展】鲁泰建材CIO张兵:全力投入,发现需求,是数智化转型的第一步...

张兵 本文由鲁泰建材CIO张兵投递并参与由数据猿联合上海大数据联盟共同推出的《2024中国数智化转型升级优秀CIO》榜单/奖项评选。丨推荐企业&#xff1a;数睿数据 大数据产业创新服务媒体 ——聚焦数据 改变商业 随着全球经济的持续发展和科技的不断进步&#xff0c;数字化转型…

基于JavaSpringBoot+Vue+uniapp微信小程序校园宿舍管理系统设计与实现(论文7000字参考+源码+LW+部署讲解)

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…

【STM32学习】stm32cubemx基础配置,点亮/闪烁一个LED灯

1、cubemx开始 打开cubemx&#xff0c;在help栏中&#xff0c;点击&#xff0c;选择安装你所需要的stm32芯片版本&#xff0c; 打开后&#xff0c;选择你所配置的芯片型号&#xff0c;如我配置的是stm32f4系列&#xff0c;勾选&#xff0c;点击Install。 安装好后&#xff0c;…

E. Beautiful Array(cf954div3)

题意&#xff1a;给定一个数组&#xff0c;可以先对数组进行任意排序&#xff0c;每次操作可以选择一个ai&#xff0c;将它变成aik&#xff0c; 想让这个数组变成一个美丽数组&#xff08;回文数组&#xff09;&#xff0c;求最少操作次数 分析&#xff1a; 先找出相同的数字…

STM32 - PWR 笔记

PWR&#xff08;Power Control&#xff09;电源控制 PWR 负责管理 STM32 内部的电源供电部分&#xff0c;可以实现 可编程电压监测器 和 低功耗模式 的功能 可编程电压监测器&#xff08;PVD&#xff09;可以监控VDD电源电压&#xff0c;当VDD下降到PVD阀值以下或上升到PVD…

Apache Flink 运行时架构

Flink 运行时架构 Flink整个系统由两个主要部分组成JobManager和TaskManager&#xff0c;Flink架构也遵循Master-Slave架构设计原则&#xff0c;JobManager为Master节点&#xff0c;TaskManager为worker&#xff08;Slave&#xff09;节点&#xff0c;所有组件之间通讯都是借助…

项目进度管理(5-1)常见的缓冲区监控方法

缓冲区监控是一种项目管理技术&#xff0c;主要用于关键链项目管理系统&#xff08;Critical Chain Project Management, CCPM&#xff09;中。它的核心理念是识别和管理项目中的不确定性和依赖性&#xff0c;以提高项目完成的可靠性。 缓冲区监控方法主要是针对项目进度计划执…

【ChatGPT 消费者偏好】第二弹:ChatGPT在日常生活中的使用—推文分享—2024-07-10

今天的推文主题还是【ChatGPT & 消费者偏好】 第一篇&#xff1a;哪些动机因素和技术特征的组合能够导致ChatGPT用户中高和低的持续使用意图。第二篇&#xff1a;用户对ChatGPT的互动性、性能期望、努力期望以及社会影响如何影响他们继续使用这些大型语言模型的意向&#x…

OpenCV中使用Canny算法在图像中查找边缘

操作系统&#xff1a;ubuntu22.04OpenCV版本&#xff1a;OpenCV4.9IDE:Visual Studio Code编程语言&#xff1a;C11 算法描述 Canny算法是一种广泛应用于计算机视觉和图像处理领域中的边缘检测算法。它由John F. Canny在1986年提出&#xff0c;旨在寻找给定噪声条件下的最佳边…

Elasticsearch:使用 Filebeat 从 Node.js Web 应用程序提取日志

本指南演示了如何从 Node.js Web 应用程序中提取日志并将其安全地传送到 Elasticsearch Service 部署中。你将设置 Filebeat 来监控具有标准 Elastic Common Schema (ECS) 格式字段的 JSON 结构日志文件&#xff0c;然后在向 Node.js 服务器发出请求时&#xff0c;你将在 Kiban…

three-tile: 1. 第一个three-tile程序

上篇介绍了&#xff1a;three-tile&#xff1a; 一个开源的轻量级三维瓦片库-CSDN博客 three-tile 是一个开源的轻量级三维瓦片库&#xff0c;它基于threejs使用typescript开发&#xff0c;提供一个三维地形模型&#xff0c;能轻松给你的应用增加三维瓦片地图。 项目地址&…

Spark-RDD和共享变量

概览 每个Spark应用程序都由一个driver program 组成&#xff0c;该驱动程序运行我们编写的main函数&#xff0c;并在集群上执行各种 并行 操作。Spark提供的主要抽象是一个 弹性分布式数据集&#xff08;RDD&#xff09;&#xff0c;它是一个跨集群节点分区的元素集合&#x…

maven7——(重要,构建项目)maven项目构建(命令)

Maven的常用命令管理项目的生命周期 clean命令 清除编译产生的target文件夹内容&#xff0c;可以配合相应命令在cmd中使用&#xff0c;如mvn clean package&#xff0c; mvn clean test D:\工作\公司培训-4班\day20\day20\untitled1>mvn clean compile命令 该命令可以…

Nginx: Rewrite功能配置/Nginx反向代理/Nginx的安全控制SSL

Rewrite功能配置 Rewrite是Nginx服务器提供的一个重要基本功能&#xff0c;是Web服务器产品中几乎必备的功能。主要的作用是用来实现URL的重写。www.jd.com 注意:Nginx服务器的Rewrite功能的实现依赖于PCRE的支持&#xff0c;因此在编译安装Nginx服务器之前&#xff0c;需要安…

[ICS] Inferno(地狱) ETH/IP未授权访问,远程控制工控设备利用工具

项目地址:https://github.com/MartinxMax/Inferno Inferno $ ./Install.sh $ python Inferno.py -h 模拟服务端 $ sudo python3 -m pip install --upgrade cpppo $ $ python -m cpppo.server.enip SCADAINT[1000] ADMININT[2] -v 创建一个EtherNet/IP设备 扫描设备 $ pyth…

【网络安全】Oracle:SSRF获取元数据

未经许可&#xff0c;不得转载。 文章目录 前言正文漏洞利用 前言 Acme 是一家广受欢迎的播客托管公司&#xff0c;拥有庞大的客户群体。与许多大型运营公司一样&#xff0c;Acme 采用了Apiary的服务&#xff0c;使用户能够安全高效地管理他们的播客。 Apiary 于2017年初被Or…

【Django项目】基于Python+Django+MySQL的音乐网站系统项目

功能介绍 首页&#xff1a;歌曲分类、歌曲搜索、热门歌曲、热门下载、新歌推荐 歌曲排行&#xff1a;歌曲分类、分页功能 用户板块&#xff1a;用户登陆/注册、播放历史 歌曲详情&#xff1a;歌曲播放、当前播放列表、歌曲点评、歌曲播放插件、下载歌曲 系统后台&#xff1a;歌…

如何将Docker镜像源更改为阿里云的镜像加速地址

在使用Docker时&#xff0c;尤其是在国内环境下&#xff0c;由于网络原因&#xff0c;从Docker Hub拉取镜像可能会遇到速度较慢的问题。为了提高拉取速度&#xff0c;我们可以将Docker的镜像源更改为阿里云等国内镜像源。下面详细介绍如何获取并配置阿里云的Docker镜像加速地址…

【中项第三版】系统集成项目管理工程师 | 第 4 章 信息系统架构⑤ | 4.8 - 4.9

前言 第4章对应的内容选择题和案例分析都会进行考查&#xff0c;这一章节属于技术相关的内容&#xff0c;学习要以教材为准。本章分值预计在4-5分。 目录 4.8 云原生架构 4.8.1 发展概述 4.8.2 架构定义 4.8.3 基本原则 4.8.4 常用架构模式 4.8.5 云原生案例 4.9 本章…

docker(六)--创建镜像

六、创建镜像 1.创建镜像两种方式 方式1&#xff1a; 更新镜像 docker commit 方式2&#xff1a;构建镜像 docker build 2.更新镜像 1&#xff09;用法 docker commit -m“描述信息” -a作者 容器id或者容器名 镜像名:tag 2&#xff09;步骤 ①根据镜像运行容器 ②进入容…