码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 康谋分享 | 自动驾驶联合仿真——功能模型接口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++来做示范。

    1. fmi2Component fmi2Instantiate(
    2. fmi2String /*实例名称*/,
    3. fmi2Type fmuType /*实例类型(ME/CO)*/,
    4. fmi2String /*唯一标识符*/,
    5. fmi2String /*资源位置*/,
    6. const fmi2CallbackFunctions* /*回调函数*/,
    7. fmi2Boolean /*是否可见*/,
    8. fmi2Boolean /*是否启用日志*/)
    9. {/*此处可以与用判断车辆实例是否在使用、检查FMU的类型是ME模型交换还是CO联合仿真、执行实例化车辆*/
    10. car_is_used = True; //预先设置的标志变量,用于表示表示车辆是否正在使用
    11. returen &only_one_car; //预先定义的全局SimpleCar对象only_one_car
    12. }

    2、FMU交互

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

    ① 获取类型

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

    1. fmi2Status fmi2SetReal(fmi2Component /*c*/, const fmi2ValueReference vr[], size_t nvr, const fmi2Real value[]){
    2. for (size_t i = 0; i < nvr; ++i) {
    3. only_one_car.SetValue(vr[i], value[i]);
    4. }
    5. return fmi2OK;
    6. }

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

    ② 执行仿真

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

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

    1. fmi2Status fmi2DoStep(fmi2Component /*c*/, fmi2Real /*currentCommunicationPoint*/, fmi2Real communicationStepSize, fmi2Boolean /*newStep*/){
    2. log_to_file("fmi2DoStep()"); only_one_car.DoStep(communicationStepSize);
    3. return fmi2OK;
    4. }

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

    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/

  • 相关阅读:
    Three.js 进阶之旅:物理效果-碰撞和声音 💥
    (附源码)mysql+ssm自助游服务系统 毕业设计 250858
    Ablebits Ultimate Suite for Excel
    Win11+VS2022配置编译VTK9.1
    【算法基础】第五章:动态规划
    OPPO粟俊娥:OPPO研发云持续交付实践之路
    BI业务用户商业分析新时代,如何把数据用透?
    Java面试题学习-单例模式
    机器视觉运动控制一体机应用例程|柔性电路板自动上料解决方案
    matlab simulink球杆控制系统的模糊PID控制设计
  • 原文地址:https://blog.csdn.net/hongkeaimotek/article/details/140322473
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号