自动驾驶仿真:基于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,加速度值给负值)

综上,完成加速度模型搭建,模型可能还有点小缺陷,大神们可以指导一下,如有问题及时沟通。
相关文章:
自动驾驶仿真:基于Carsim开发的加速度请求模型
文章目录 前言一、加速度输出变量问题澄清二、配置Carsim动力学模型三、配置Carsim驾驶员模型四、添加VS Command代码五、Run Control联合仿真六、加速度模型效果验证 前言 1、自动驾驶行业中,算法端对于纵向控制的功能预留接口基本都是加速度,我们需要…...
.netcore grpc客户端工厂及依赖注入使用
一、客户端工厂概述 gRPC 与 HttpClientFactory 的集成提供了一种创建 gRPC 客户端的集中方式。可以通过依赖包Grpc.Net.ClientFactory中的AddGrpcClient进行gRPC客户端依赖注入AddGrpcClient函数提供了许多配置项用于处理一些其他事项;例如AOP、重试策略等 二、案…...
C语言入门_Day7 逻辑运算
目录: 前言 1.逻辑运算 2.优先级 3.易错点 4.思维导图 前言 算术运算用来进行数据的计算和处理;比较运算是用来比较不同的数据,进而来决定下一步怎么做;除此以外还有一种运算叫做逻辑运算,它的应用场景也是用来影…...
什么是Eureka?以及Eureka注册服务的搭建
导包 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 htt…...
Docker安装并配置镜像加速器,镜像、容器的基本操作
目录 1.安装docker服务,配置镜像加速器 (1)安装依赖的软件包 (2)设置yum源,我配置的阿里仓库 (3)选择一个版本安装 (4)启动docker服务,并设置…...
前端 -- 基础 网页、HTML、 WEB标准 扫盲详解
什么是网页 : 网页是构成网站的基本元素,它通常由 图片、链接、文字、声音、视频等元素组成。 通常我们看到的网页 ,常见以 .html 或 .htm 后缀结尾的文件, 因此俗称 HTML 文件 什么是 HTML : HTML 指的是 超文本标记语言,…...
分布式锁实现方式
分布式锁 1 分布式锁介绍 1.1 什么是分布式 一个大型的系统往往被分为几个子系统来做,一个子系统可以部署在一台机器的多个 JVM(java虚拟机) 上,也可以部署在多台机器上。但是每一个系统不是独立的,不是完全独立的。需要相互通信ÿ…...
C语言小练习(一)
🌞 “人生是用来体验的,不是用来绎示完美的,接受迟钝和平庸,允许出错,允许自己偶尔断电,带着遗憾,拼命绽放,这是与自己达成和解的唯一办法。放下焦虑,和不完美的自己和解…...
Flask-flask系统运行后台轮询线程
对于有些flask系统,后台需要启动轮询线程,执行特定的任务,以下是一个简单的例子。 globals/daemon.py import threading from app.executor.ops_service import find_and_run_ops_task_todo_in_redisdef context_run_func(app, func):with …...
jsp本质-servlet
jsp本质-servlet 一、jsp文件 <% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8"%> <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>JSP Example…...
回归预测 | MATLAB实现GWO-SVM灰狼优化算法优化支持向量机多输入单输出回归预测(多指标,多图)
回归预测 | MATLAB实现GWO-SVM灰狼优化算法优化支持向量机多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现GWO-SVM灰狼优化算法优化支持向量机多输入单输出回归预测(多指标,多图)效果一览基…...
科技资讯|苹果Vision Pro新专利曝光:可调节液态透镜
苹果公司近日申请了名为“带液态镜头的电子设备”,概述了未来可能的头显设计。头显设备中的透镜采用可调节的液态透镜,每个透镜可以具有填充有液体的透镜腔,透镜室可以具有形成光学透镜表面的刚性和 / 或柔性壁。 包括苹果自家的 Vision Pr…...
神经网络基础-神经网络补充概念-38-归一化输入
概念 归一化输入是一种常见的数据预处理技术,旨在将不同特征的取值范围映射到相似的尺度,从而帮助优化机器学习模型的训练过程。归一化可以提高模型的收敛速度、稳定性和泛化能力,减少模型受到不同特征尺度影响的情况。 常见的归一化方法 …...
【Redis】什么是缓存雪崩,如何预防缓存雪崩?
【Redis】什么是缓存雪崩,如何预防缓存雪崩? 如果缓存集中在一段时间内失效,也就是通常所说的热点数据集中失效 (一般都会给缓存设定一个失效时间,过了失效时间后,该数据库会被缓存直接删除,从…...
[国产MCU]-W801开发实例-开发环境搭建
W801开发环境搭建 文章目录 W801开发环境搭建1、W801芯片介绍2、W801芯片特性3、W801芯片结构4、开发环境搭建1、W801芯片介绍 W801芯片是联盛德微电子推出的一款高性价比物联网芯片。 W801 芯片是一款安全 IoT Wi-Fi/蓝牙 双模 SoC芯片。芯片提供丰富的数字功能接口。支持2.…...
区间预测 | MATLAB实现QRGRU门控循环单元分位数回归时间序列区间预测
区间预测 | MATLAB实现QRGRU门控循环单元分位数回归时间序列区间预测 目录 区间预测 | MATLAB实现QRGRU门控循环单元分位数回归时间序列区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 MATLAB实现QRGRU门控循环单元分位数回归时间序列区间预测。基于分位…...
改善神经网络——优化算法(mini-batch、动量梯度下降法、Adam优化算法)
改善神经网络——优化算法 梯度下降Mini-batch 梯度下降(Mini-batch Gradient Descent)指数加权平均包含动量的梯度下降RMSprop算法Adam算法 优化算法可以使神经网络运行的更快,机器学习的应用是一个高度依赖经验的过程,伴随着大量…...
大数据面试题:Spark的任务执行流程
面试题来源: 《大数据面试题 V4.0》 大数据面试题V3.0,523道题,679页,46w字 可回答:1)Spark的工作流程?2)Spark的调度流程;3)Spark的任务调度原理…...
通过 Amazon SageMaker JumpStart 部署 Llama 2 快速构建专属 LLM 应用
来自 Meta 的 Llama 2 基础模型现已在 Amazon SageMaker JumpStart 中提供。我们可以通过使用 Amazon SageMaker JumpStart 快速部署 Llama 2 模型,并且结合开源 UI 工具 Gradio 打造专属 LLM 应用。 Llama 2 简介 Llama 2 是使用优化的 Transformer 架构的自回归语…...
ansible远程执行命令
一、ansible简介 需要在一台机器上搭建ansible环境,且配置目的ip的密码,通道没有问题即可下发命令 使用的通道是ssh(端口:36000) 二、搭建细节 1、安装ansible yum install -y ansible 2、把目的ip密码写到配置…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...
