自动驾驶仿真:基于Carsim开发的加速度请求模型

文章目录

  • 前言
  • 一、加速度输出变量问题澄清
  • 二、配置Carsim动力学模型
  • 三、配置Carsim驾驶员模型
  • 四、添加VS Command代码
  • 五、Run Control联合仿真
  • 六、加速度模型效果验证


前言

1、自动驾驶行业中,算法端对于纵向控制的功能预留接口基本都是加速度,我们需要给控制器仿真加速度的信号,控制器才会实现对纵向功能的控制。

2、Carsim或者其他动力学软件,主要提供者节气门开度和主缸压力进行控制。我们在进行联合仿真时,往往都要通过PID的方式将请求加速度转换成对应的节气门开度与主缸压力传给动力学软件进行闭环控制。

3、这里提供一个使用Carsim的VS Command方法定义一个加速度输入变量,修改车辆的动力系统模型,然后通过PID调节变矩器扭矩和主缸压力输出加速度来实现这个响应接近完美的加速度模型。


一、加速度输出变量问题澄清

问题澄清:改变动力学模型后Carsim Output接口输出的加速度值异常
1、正常情况下Carsim的加速度输出变量AX、AX_SM是能够正常输出加速度值,但是经过VS Command以及动力学模型修改之后Carsim Output接口加速度输变量输出值会比原值小10倍。因此需要在VS Command中定义新的加速度输出变量来解决输出值小10倍的问题。

2、自证Carsim Output接口输出加速度变量比原值小10倍。首先Carsim接口和VS Command中添加加速度输出变量,RsponAx是在VS Command定义的加速度输出变量,本质是在VS Command获取AX的值。

在这里插入图片描述
在这里插入图片描述


3、和Labview联合仿真:通过观察请求加速度(蓝色)、正确加速度RsponAx(红色曲线)和错误加速度AX(绿色曲线)就可以看出Rspon在VS Command拿的AX值是正常的,而直接从Carsim输出接口拿的AX比原值小10倍是不正确的。

在这里插入图片描述


4、再分析此时的速度变化情况,此时的速度变化是基于0.2g的正确加速度进行变化的,因此推断Carsim输出接口拿的AX 0.02g是错误的。
X轴300-600之间,这3秒钟速度变化大概为21kph(图表),由于V=at = 0.2*9.8*3 =5.88m/s,转换成km/h为21km/h左右。因此推断0.2g的正确加速度。

在这里插入图片描述


二、配置Carsim动力学模型

1、配置车辆模型

在这里插入图片描述


2、这里复制了Carsim自带例程C-Class, Hatchback。

在这里插入图片描述


3、修改车辆的动力系统模型,随便复制一个例程并进入修改内容。

在这里插入图片描述


4、选择外部发动力模型和外部变矩器,从模型上看只要调整变矩器扭矩IMP_M_OUT_TC即可实现纵向加速控制,减速控制一般都是通过主缸压力PBK_CON进行控制的。

在这里插入图片描述

5、修改挡位参数,改成1个前进挡位

在这里插入图片描述

改成1个前进挡位,否则速度加不上去

在这里插入图片描述


三、配置Carsim驾驶员模型

1、老规矩随便复制一个例程

在这里插入图片描述


2、驾驶员模型配置
1)配置概览

在这里插入图片描述


2)节气门开度加初始速度控制,但是由于我们修改了模型我们加速不控制THROTTLE_ENGINE,我们直接在VS Command控制变矩器扭矩IMP_M_OUT_TC。

在这里插入图片描述


3)初始刹车主缸压力为0MP,在VS Command控制变量为PBK_CON。

在这里插入图片描述


4)开闭环的档位控制(-1:倒挡 0:空挡 1-6:前进挡),在VS Command控制变量为MODE_TRANS。

在这里插入图片描述

5)最后配置一个Run就行,Forever或者时间都行。

在这里插入图片描述


四、添加VS Command代码

重头戏:VS Command,相当于Carsim开放的脚本编写命令行,直接上脚本,我就不对脚本的每一句内容进行解析了,有兴趣的结合官方文档VS Command分析。

1、配置Carsim VS Command
在这里插入图片描述


2、将下面脚本复制进VS Command中去

在这里插入图片描述

!Define vehicle forward related variables
define_variable CumErr_TC 0
define_variable CumErr_BK 0
define_variable CurErr 0
define_variable Torque_TC 0
define_variable PCON_BK 0!Define vehicle reverse related variables
define_variable RCumErr_TC 0
define_variable RCumErr_BK 0
define_variable RCurErr 0
define_variable RTorque_TC 0
define_variable RPCON_BK 0!Define driver Behavior variables
define_variable ForwardFlag 0
define_variable ReverseFlag 0!Add Brake master cylinder pressure
!Add shaft torque of torque converter
IMP_PCON_BK VS_add 0
IMP_M_OUT_TC VS_add 0!Define PID related parameter
define_parameter P_TC 0.5
define_parameter I_TC 0.2
define_parameter D_TC 0.0
define_parameter P_BK 0.5
define_parameter I_BK 0.005
define_parameter D_BK 0.000!Define Operating cycle
define_parameter DeltaT 0.001!Define Input/Output variables
define_import IMP_TargetAX 0
define_import IMP_TargetBk 0
define_import IMP_ConMode 0
define_output RsponAx!Select Froward or Reverse
EQ_IN ForwardFlag = GE(IMP_TargetAX,0)
EQ_IN ReverseFlag = LE(IMP_TargetAX,0)!Caiculate Current Error and Cumulative error
EQ_OUT CurErr= IMP_TargetAX - AX
EQ_OUT RCurErr= AX -  IMP_TargetAX
EQ_OUT CumErr_TC = IF_GT_0_THEN(ForwardFlag,CumErr_TC+CurErr,0)
EQ_OUT RCumErr_TC = IF_GT_0_THEN(ReverseFlag,RCumErr_TC+RCurErr,0)
EQ_OUT CumErr_BK = IF_NOT_0_THEN(ForwardFlag,0,CumErr_BK+CurErr)
EQ_OUT RCumErr_BK = IF_NOT_0_THEN(ReverseFlag,0,RCumErr_BK+CurErr)!Forward PID(Torque)
EQ_IN Torque_TC = P_TC*CurErr+I_TC*CumErr_TC+D_TC*CurErr/DeltaT
EQ_IN Torque_TC = IF_GT_0_THEN(Torque_TC, Torque_TC,0)
EQ_IN Torque_TC = IF_GT_0_THEN(ForwardFlag,Torque_TC,0)!Reverse PID(Torque) 
EQ_IN RTorque_TC = P_TC*RCurErr+I_TC*RCumErr_TC+D_TC*RCurErr/DeltaT
EQ_IN RTorque_TC = IF_GT_0_THEN(RTorque_TC, RTorque_TC,0)
EQ_IN RTorque_TC = IF_GT_0_THEN(ReverseFlag,RTorque_TC,0)!Forward or backward depending on the transmission mode
EQ_IN IMP_M_OUT_TC = IF_GT_0_THEN(GE(ModeTran, 0), Torque_TC, RTorque_TC)
EQ_IN IMP_M_OUT_TC = IF_GT_0_THEN(EQ(ModeTran, 0), 0 , IMP_M_OUT_TC)
EQ_IN IMP_M_OUT_TC = IF_GT_0_THEN(IMP_ConMode, 0 , IMP_M_OUT_TC)!Forward PID(Brake)
EQ_IN PCON_BK = -(P_BK*CurErr+I_BK*CumErr_BK+D_BK*CurErr/DeltaT)
EQ_IN PCON_BK = IF_GT_0_THEN(PCON_BK-15, 15, PCON_BK)
EQ_IN PCON_BK = IF_GT_0_THEN(PCON_BK, PCON_BK,0)
EQ_IN PCON_BK = IF_NOT_0_THEN(ForwardFlag,0,PCON_BK)*1e6
EQ_IN PCON_BK = IF_NOT_0_THEN(IMP_TargetBk,IMP_TargetBk,PCON_BK)!Reverse PID(Brake) 
EQ_IN RPCON_BK = P_BK*CurErr+I_BK*CumErr_BK + D_BK*CurErr/DeltaT
EQ_IN RPCON_BK = IF_GT_0_THEN(RPCON_BK-15, 15, RPCON_BK)
EQ_IN RPCON_BK = IF_NOT_0_THEN(IMP_TargetBk, IMP_TargetBk,RPCON_BK)
EQ_IN RPCON_BK = IF_GT_0_THEN(GE(ModeTran,0), RPCON_BK,0)
EQ_IN RPCON_BK = IF_GT_0_THEN(RPCON_BK, RPCON_BK,0)*1e6!Acceleration braking or direct braking depending on the mode
EQ_IN IMP_PCON_BK = IF_GT_0_THEN(GE(ModeTran, 0), PCON_BK, RPCON_BK)
EQ_IN IMP_PCON_BK = IF_GT_0_THEN(IMP_ConMode, IMP_TargetBk, IMP_PCON_BK)!if ModeTran=0,Clear accumulated error
EQ_OUT CumErr_TC = IF_GT_0_THEN(EQ(ModeTran, 0),0,CumErr_TC)
EQ_OUT RCumErr_TC = IF_GT_0_THEN(EQ(ModeTran, 0),0,RCumErr_TC)
EQ_OUT CumErr_BK = IF_GT_0_THEN(EQ(ModeTran, 0),0,CumErr_BK)
EQ_OUT RCumErr_BK = IF_GT_0_THEN(EQ(ModeTran, 0),0,RCumErr_BK)EQ_OUT RsponAx= AX

我在脚本中定义了新的接口变量:

!Define Input/Output variables
define_import IMP_TargetAX 0     !IMP_TargetAX是外部请求的加速度接口。
define_import IMP_TargetBk 0     !IMP_TargetBk是外部请求的主缸压力,一般通过给减速度就可以控制,这里开放了手动减速 的方法。
define_import IMP_ConMode 0      !IMP_ConMode自动模式0或者手动模式1,自动模式通过加速度控制减速,手动模式发送IMP_TargetBk值进行减速,默认自动模式。
define_output RsponAx 0          !RsponAx定义新的加速度输出接口,Carsim端的加速度接口AX比原值小10倍,因此使用RsponAx作为加速度响应。

五、Run Control联合仿真

1、这里使用的Labiew,大家可以用Simulink联合仿真。

在这里插入图片描述


2、添加输入变量

在这里插入图片描述


3、添加输出变量

在这里插入图片描述


4、Send to Labview

在这里插入图片描述


六、加速度模型效果验证

1、层叠曲线显示所有变量

在这里插入图片描述


2、前进挡:请求加速度与响应加速度曲线(挡位给1,加速度值给正值)

在这里插入图片描述


3、后退挡:请求加速度与响应加速度曲线(挡位给-1,加速度值给负值)

在这里插入图片描述


综上,完成加速度模型搭建,模型可能还有点小缺陷,大神们可以指导一下,如有问题及时沟通。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Unity小技巧】Unity探究自制对象池和官方内置对象池(ObjectPool)的使用

文章目录 前言不使用对象池使用官方内置对象池应用 自制对象池总结源码参考完结 前言 对象池(Object Pool)是一种软件设计模式,用于管理和重用已创建的对象。在对象池中,一组预先创建的对象被维护在一个池中,并在需要时…

树结构使用实例---实现数组和树结构的转换

文章目录 一、为什么要用树结构?二、使用步骤 1.引入相关json2.树结构的转换总结 一、为什么要用树结构? 本文将讲述一个实例,构造一棵树来实现数组和tree的转换,这在前端树结构中是经常遇到的 后端返回树结构方便管理&#xff…

【Vue框架】 router和route是什么关系

前言 之前没太注意,写着写着突然发现它们貌似不太一样,记录以下,回顾的看总结就好。 1、总结✨ route:当前激活路由的对象,用于访问和操作当前路由的信息 router:管理多个route的对象,整个应…

Qt双击某一文件通过自己实现的程序打开,并加载文件显示

双击启动 简述方法一方法二注意 简述 在Windows系统中,双击某类扩展名的文件,通过自己实现的程序打开文件,并正确加载及显示文件。有两种方式可以到达这个目的。 对于系统不知道的扩展名的文件,第一次打开时,需要自行…

Kali Linux中的SQL注入攻击如何进行

Kali Linux中的SQL注入攻击如何进行? 什么是SQL注入攻击? SQL注入是一种常见的Web应用程序漏洞,攻击者可以通过恶意构造的SQL查询字符串,绕过应用程序的验证和过滤,进而访问或操纵数据库中的数据。这可能导致泄露敏感…

Android OpenCV(七十五): 看看刚”转正“的条形码识别

前言 2021年,我们写过一篇《OpenCV 条码识别 Android 平台实践》,当时的条形码识别模块位于 opencv_contrib 仓库,但是 OpenCV 4.8.0 版本开始, 条形码识别模块已移动到 OpenCV 主仓库,至此我们无需自行编译即可轻松地调用条形码识别能力。 Bar code detector and decoder…

2.含电热联合系统的微电网运行优化

含电热联合系统的微电网运行优化 MATLAB代码:含电热联合系统的微电网运行优化 关键词:微网 电热联合系统 优化调度 参考文档:《含电热联合系统的微电网运行优化》完全复现 仿真平台:MATLAB yalmipcplex [火]主要内容&#xf…

设计模式篇---抽象工厂(包含优化)

文章目录 概念结构实例优化 概念 抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。 工厂方法是有一个类型的产品,也就是只有一个产品的抽象类或接口,而抽象工厂相对于工厂方法来说,是有…

THINKPHP 微联云投票系统源码独立版 + 支持刷礼物

THINKPHP 微联云投票系统源码独立版 支持刷礼物 nginxphp7.2以上 mysql5.6以上 简单测试后台基本没什么问题,暂时发现H5前端有bug,自行修复。

【Winform学习笔记(八)】通过委托实现跨窗体传值

通过委托实现跨窗体传值 前言正文1、委托及事件2、通过委托实现跨窗体传值的步骤1.在子窗体中定义委托2.在子窗体中声明一个委托类型的事件3.调用委托类型事件4.在实例化子窗体后,子窗体订阅事件接受方法5.实现具体的事件 3、具体示例4、完整代码5、实现效果 前言 …

CTFhub-sqli注入-Referer注入

在最后添加 Referer: (注意 R 大写, Referer后面是 :,Content-Length: 与 Referer: 之间没有空行) 1 2 3 1 union select 1,database() -1 union select 1,database() -1 union select 1,group_concat(table_name)from information_sche…

解决ios隔空播放音频到macos没有声音的问题

解决ios隔空播放音频到macos没有声音的问题 一、检查隔空播放支持设备和系统要求二、打开隔空播放接收器三、重置MAC控制中心进程END 一、检查隔空播放支持设备和系统要求 Mac、iPhone、iPad 和 Apple Watch 上“连续互通”的系统要求 二、打开隔空播放接收器 ps;我设备是同一…

springboot里 运用 easyexcel 导出

引入pom <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version> </dependency>运用 import com.alibaba.excel.EasyExcel; import org.springframework.stereotype.Contr…

对称输出字符串(对称+递归)--夏令营

题目 tips&#xff1a; 1、巧思&#xff1a;类似于将输入的字符串按一个上一个下输出&#xff1b;所以可以用递归栈思考&#xff0c;第一个输入的直接输出&#xff0c;第二个存下来存进栈&#xff0c;如果没有字符串了&#xff0c;就可以输出第二个字符串&#xff0c;如果还有…

「UG/NX」Block UI 选择特征SelectFeature

✨博客主页何曾参静谧的博客📌文章专栏「UG/NX」BlockUI集合📚全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C+&#

【C++小项目】实现一个日期计算器

目录 Ⅰ. 引入 Ⅱ. 列轮廓 Ⅲ. 功能的实现 构造函数 Print 判断是否相等 | ! ➡️: ➡️!: 判断大小 > | > | < | < ➡️>&#xff1a; ➡️<&#xff1a; ➡️>&#xff1a; ➡️<&#xff1a; 加减天数 | | - | - ➡️&#xff1a;…

【boost网络库从青铜到王者】第六篇:asio网络编程中的socket异步读(接收)写(发送)

文章目录 1、简介2、异步写 void AsyncWriteSomeToSocketErr(const std::string& buffer)3、异步写void AsyncWriteSomeToSocket(const std::string& buffer)4、异步写void AsyncSendToSocket(const std::string& buffer)5、异步读void AsyncReadSomeToSocket(cons…

Grafana Dashboard 备份方案

文章目录 Grafana Dashboard 备份方案引言工具简介支持的组件要求配置备份安装使用 pypi 安装grafana备份工具配置环境变量使用Grafana Backup Tool 进行备份恢复备份 Grafana Dashboard恢复 Grafana Dashboard结论Grafana Dashboard 备份方案 引言 每个使用 Grafana 的同学都…

Anomalib:异常检测的深度学习库 -- 应用Anomalib训练自己的图片

文章目录 资料汇总 Github链接&#xff1a;https://github.com/openvinotoolkit/anomalib/blob/main/README.md 论文链接&#xff1a;https://arxiv.org/pdf/2202.08341v1.pdf 其他参考资料&#xff1a;https://paperswithcode.com/paper/efficientad-accurate-visual-anomaly-…