自动驾驶仿真:基于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就行,Forerer或者时间都行。

在这里插入图片描述


四、添加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.mzph.cn/news/44985.shtml

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

相关文章

pandas数据分析40——读取 excel 合并单元格的表头

案例背景 真的很容易疯....上班的单位的表格都是不同的人做的,所以就会出现各种合并单元格的情况,要知道我们用pandas读取数据最怕合并单元格了,因为没规律...可能前几列没合并,后面几列又合并了....而且pandas对于索引很严格&am…

地球IT

地球是我们生活的家园,也是人类发展的基地。地球不仅仅是一个行星,更是一个复杂而有机的生态系统。 地球直径约为12,742公里,被称为“蓝色星球”,因为它的表面约70%被水覆盖。海洋是地球上最大的生态系统之一,它们扮演…

JavaScript对象知识总结

一、创建对象的三种方式 1、字面量创建对象 2、new关键字+构造函数创建对象 3、Object.create()创建对象 二、查看对象属性和更改对象值的两种方式 1、形如:obj.keyvalue 2、形如:obj[key]value 三、删除对象属性 1、delete obj.key …

计算机竞赛 图像检索算法

文章目录 1 前言2 图像检索介绍(1) 无监督图像检索(2) 有监督图像检索 3 图像检索步骤4 应用实例5 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 图像检索算法 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐&#xff…

【数理知识】向量的坐标基表示法,Matlab 代码验证

序号内容1【数理知识】向量的坐标基表示法,Matlab 代码验证2【数理知识】向量与基的内积,Matlab 代码验证 文章目录 1. 向量的坐标基表示2. 二维平面向量举例3. Matlab 代码验证Ref 1. 向量的坐标基表示 假设空间中存在一个向量 a ⃗ \vec{a} a &#…

Vite更新依赖缓存失败,强制更新依赖缓存

使用vitets开发一段时间了,感觉并不是想象中的好用,特别是出现些稀奇古怪的问题不好解决,比如下面这个问题 上午9:50:08 [vite] error while updating dependencies: Error: ENOENT: no such file or directory, open E:/workspace-dir/node…

ansible(1)-- 部署ansible连接被控端

目录 一、部署ansible 1.1 安装 1.2 测试连接 192.168.136.55 ansible 192.168.136.56被控端 一、部署ansible 1.1 安装 zabbix-s只是主机名,不用在意,更好该主机也安装了zabbix,不好更改。 下载阿里云epel源 #安装阿里云的epel源&#…

计算机网络(9) --- 数据链路层与MAC帧

计算机网络(8) --- IP与IP协议_哈里沃克的博客-CSDN博客IP与IP协议https://blog.csdn.net/m0_63488627/article/details/132155460?spm1001.2014.3001.5502 目录 1.MAC帧 1.MAC地址 2.MAC帧报头 3.资源碰撞 4.MTU 1.对IP协议的影响 2.对UDP协议…

esp8266+电压检测模块检测电池电压

请注意 esp8266的ADC引脚受wifi模块影响,会导致不准确,具体请查看这里:https://github.com/esp8266/Arduino/issues/2070 简单说一下解决方案: ①如果不是频繁的读取数据,可以在wifi连接前读取数据然后存储到缓存&…

【Visual Studio Code】--- Win11 配置 VS Code 为中文 超详细

Win11 配置 VS Code 为中文 超详细 一、概述二、重要提示二、配置 VS Code 为中文 一、概述 一个好的文章能够帮助开发者完成更便捷、更快速的开发。书山有路勤为径,学海无涯苦作舟。我是秋知叶i、期望每一个阅读了我的文章的开发者都能够有所成长。 二、重要提示…

RT-Thread 的环形缓冲区 ---- 镜像指示位

可以看一下这篇我写的博客,了解一下大概: RingBuffer 环形缓冲区----镜像指示位_呵呵哒( ̄▽ ̄)"的博客-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/132340883?spm1001.2014.3001.5501 【回顾】缓冲区…

Mock平台-08开发:项目管理(四)编辑功能和Component抽离

【Mock平台】为系列测试开发教程,从0到1编码带你一步步使用Spring Boot 和 Antd React框架完成搭建一个测试工具平台,希望作为一个实战项目对各位的测试开发学习之路有帮助,大奇一个专注测试技术干货原创与分享的家伙。 本篇重点:…

MetaMask Mobile +Chrome DevTools 调试Web3应用教程

注:本教程来源网络,根据项目做的整理 写好了WEB3应用,在本地调试用得好好的,但是用钱包软件访问就报莫名的错,但是又不知道是什么原因,排查的过程非常浪费时间 。 因此在本地同一局域网进行调试就非常有必要…

mybatis-plus--配置-(sql)日志输出-自动填充-分页-多数据源-逻辑删除

写在前面: 本文主要介绍mybatis-plus的配置,以后在有的时候在补充。欢迎交流。 文章目录 日志输出自动填充分页全局字段配置多数据源 日志输出 调试的时候需要看执行的sql,这时候就很需要日志来记录查看了。 mybatis-plus的日志配置在yml…

​8th参考文献:[8]许少辉.乡村振兴战略下传统村落文化旅游设计[M]北京:中国建筑出版传媒,2022.

​8th参考文献:[8]许少辉.乡村振兴战略下传统村落文化旅游设计[M]北京:中国建筑出版传媒,2022&…

RK3588平台开发系列讲解(AI 篇)RKNN C API 详细说明

文章目录 一、API 硬件平台支持说明二、API 函数介绍2.1、rknn_init2.2、rknn_destroy2.3、rknn_query2.4、rknn_inputs_set2.5、rknn_run2.6、rknn_outputs_get2.7、rknn_outputs_release沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要讲解 RKNN C API 详细…

springboot 项目日志配置文件详解

spring boot 项目指定 日志配置文件 在Spring Boot项目中,可以通过在application.properties或application.yml文件中指定日志配置文件来配置日志。 1. 使用application.properties文件: 在application.properties中,您可以使用以下属性来…

【ARM】Day4 点亮LED灯

1. 思维导图 2. 自己编写代码实现三盏灯点亮 .text .global _start _start: /**********LED1,LED2,LED3点灯:PE10,PF10,PE8**************/ RCC_INIT:使能GPIOE组/GPIOF组控制器,通过RXCC_MP_AHB4ENSETR设置第[5:4]位写1,地址:0x50000A28[5:4]1ldr r0,0x50000A28 …

01_Redis单线程与多线程

01——Redis单线程与多线程 一、Redis是单线程还是多线程 在谈Redis的单线程或多线程时,需要根据版本来区分。 在redis 3.x之前,redis是单线程的从redis 4.x开始,redis引入多线程。处理客户端请求时,使用单线程;在异…

B-树和B+树的区别

B-树和B树的区别 一、B-tree数据存储 在下图中 P 代表的是指针,指向的是下一个磁盘块。在第一个节点中的 16、24 就是代表我们的 key 值是什么。date 就是这个 key 值对应的这一行记录是什么。 假设寻找 key 为 33 的这条记录,33 在 16 和 34 中间&am…