【Chrono Engine学习总结】4-vehicle-4.1-vehicle的基本概念
由于Chrono的官方教程在一些细节方面解释的并不清楚,自己做了一些尝试,做学习总结。
1、基本介绍
Vehicle Overview
Vehicle Mannel
Vehicle的官方demo
1.1 Vehicle的构型
- 一个车辆由许多子系统构成:悬挂、转向、轮子/履带、刹车/油门、动力传统系统(driverline)。
- Chrono提供了一些典型的车辆模型,例如:悍马车、小型轿车等 vehicle models,只需要直接代码选定即可;
- 如果不用官方的车型,就需要自己定义各种子系统。chono提供一些典型的子系统构型,例如悬挂包括:双横臂、前麦花臣支柱等 悬挂类型,转向包括:转向垂臂( Pitman arm)等转向类型。
- 如果连官方的子系统都不想用,就需要自己定义一些弹簧/轴的连接,就复杂一些,一般采用JSON文件的方式,这样比较清晰明了。
1.2 Vehicle部分仿真的逻辑
https://api.projectchrono.org/vehicle_overview.html#vehicle_simulation_loop
每一步仿真时,依次执行:获取系统输出、同步各个系统(synchronize system)、系统动力学仿真前进一步(advance system)。
- 在各个系统同步时,可能不仅包括vehicle的模块,还包括可视化等多个模块,同时vehicle部分需要同步:驾驶控制器、地型交互、车体、可视化等模块,如有。
- 在同步之后,进行advance操作,前进一步。
正因为如此,在仿真代码中,每次loop最后会有这么两段:
// Update modules (process inputs from other modules
driver->Synchronize(time);
terrain.Synchronize(time);
hmmwv.Synchronize(time, driver_inputs, terrain);
vis->Synchronize(time, driver_inputs);
// Advance simulation for one timestep for all modules
driver->Advance(step_size);
terrain.Advance(step_size);
hmmwv.Advance(step_size);
vis->Advance(step_size);
1.3 vehicle的可视化
Vehicle的可视化与之前的整体仿真环境的可视化有些相同,但不完全相同。相同之处是,是选用irrlicht、还是OpenGL、还是离线POV-Ray可视化。我这里采用irrlicht。
除此之外,由于vehicle包括很多子模块,例如地盘、悬挂、轮胎等,在仿真时可以选择是否进行显示。一般显示方式为三种:不显示(VisualizationType::None)、显示基础结构(PRIMITIVES)、显示完整表面mesh(MESH)。例如,地盘、悬挂、转向、轮胎、外壳,全部显示MESH和只显示基础结构分别是这样的:


2. 车辆控制系统
2.1 控制系统基础概念
车辆控制系统在chrono里面称作“driver”,ChDriver。
对于车辆的控制,主要控制量只有两个:油门throttle(和刹车brake)、转向(steering 左/右)。
控制系统包括:交互控制ChIteractiveDriver、闭环控制ChClosedLoopDriver、AI Driver等多种方式,每个模块的控制代码写法不同。这里暂不展开介绍。

2.2 交互控制系统
这里采用较为简单的交互控制。交互控制通过可视化模块获取来自键盘的输入控制量,通过WSAD分别控制:加油门、刹车、左转向、右转向。需要注意,在开启交互控制前,需要按键j启动键盘控制,否则无效(注意是否关闭了中文输入法)。
交互系统部分的代码是这样的:
DriverInputs driver_inputs = driver->GetInputs();
之后,在调用driver->Advance函数时,即对车辆的控制量进行更新。
需要注意的是,在交互控制中,每次按键改变的是上述控制量的增量,即按一下油门,油门会增大一些。因此,并不是直接控制的速度,所以在操作时,需要练习手感。
在程序运行时,右上角会显示控制量和车辆状态:

可以看出,此时的油门是+88(油门控制量默认是0-100),刹车是0(通过按键S将油门在减为0后,刹车会上来),此时车速是8.51m/s,以及一些其他参数。
3、官方例子
这次以官方例子进行介绍:
#include "chrono/core/ChStream.h"
#include "chrono/utils/ChUtilsInputOutput.h"
#include "chrono/utils/ChFilters.h"
#include "chrono_vehicle/ChConfigVehicle.h"
#include "chrono_vehicle/ChVehicleModelData.h"
#include "chrono_vehicle/terrain/RigidTerrain.h"
#include "chrono_vehicle/output/ChVehicleOutputASCII.h"
#include "chrono_models/vehicle/hmmwv/HMMWV.h"
#include "chrono_thirdparty/filesystem/path.h"
#include "chrono_vehicle/driver/ChInteractiveDriverIRR.h"
#include "chrono_vehicle/wheeled_vehicle/ChWheeledVehicleVisualSystemIrrlicht.h"
#include <iostream>using namespace chrono;
using namespace chrono::irrlicht;
using namespace chrono::vehicle;
using namespace chrono::vehicle::hmmwv;// Simulation step sizes
double step_size = 1e-3;
double tire_step_size = step_size;
double t_end = 1000;// Time interval between two render frames
double render_step_size = 1.0 / 50; // FPS = 50int main(int argc, char* argv[]) {chrono::SetChronoDataPath("E:/codeGit/chrono/chrono/build/data/"); // change the default data loading path.chrono::vehicle::SetDataPath("E:/codeGit/chrono/chrono/build/data/vehicle/"); // change the vehicle data pathChContactMethod contact_method = ChContactMethod::SMC; // 设定碰撞类型// Create the HMMWV vehicle, set parameters, and initialize// 创建一个HMMWV车,注意如果有vehicle模块,则不需要重新定义一个物理系统,这个vehicle自带一个系统,可以直接给别的模块调用。HMMWV_Full hmmwv;hmmwv.SetCollisionSystemType(ChCollisionSystem::Type::BULLET);hmmwv.SetContactMethod(contact_method);hmmwv.SetChassisCollisionType(CollisionType::NONE);hmmwv.SetChassisFixed(false);hmmwv.SetInitPosition(ChCoordsys<>({ 0, 0, 0.5 }, { 1, 0, 0, 0 }));hmmwv.SetEngineType(EngineModelType::SHAFTS);hmmwv.SetTransmissionType(TransmissionModelType::SHAFTS);hmmwv.SetDriveType(DrivelineTypeWV::AWD);hmmwv.UseTierodBodies(true);hmmwv.SetSteeringType(SteeringTypeWV::PITMAN_ARM);hmmwv.SetBrakeType(BrakeType::SHAFTS);hmmwv.SetTireType(TireModelType::PAC02);hmmwv.SetTireStepSize(tire_step_size);hmmwv.Initialize();// Visualization type for vehicle parts (PRIMITIVES, MESH, or NONE)// 设置车辆各个模块的可视化程度。VisualizationType chassis_vis_type = VisualizationType::PRIMITIVES;VisualizationType suspension_vis_type = VisualizationType::PRIMITIVES;VisualizationType steering_vis_type = VisualizationType::PRIMITIVES;VisualizationType wheel_vis_type = VisualizationType::PRIMITIVES;VisualizationType tire_vis_type = VisualizationType::PRIMITIVES;hmmwv.SetChassisVisualizationType(chassis_vis_type);hmmwv.SetSuspensionVisualizationType(suspension_vis_type);hmmwv.SetSteeringVisualizationType(steering_vis_type);hmmwv.SetWheelVisualizationType(wheel_vis_type);hmmwv.SetTireVisualizationType(tire_vis_type);// Create the terrain 创建地形,并设置地形的一些物理参数。RigidTerrain terrain(hmmwv.GetSystem());ChContactMaterialData minfo;minfo.mu = 0.9f;minfo.cr = 0.01f;minfo.Y = 2e7f;auto patch_mat = minfo.CreateMaterial(contact_method);// Rigid terraindouble terrainHeight = 0; // terrain height (FLAT terrain only)double terrainLength = 200.0; // size in X directiondouble terrainWidth = 200.0; // size in Y directionstd::shared_ptr<RigidTerrain::Patch> patch;patch = terrain.AddPatch(patch_mat, CSYSNORM, terrainLength, terrainWidth);patch->SetTexture(vehicle::GetDataFile("terrain/textures/dirt.jpg"), 200, 200);patch->SetColor(ChColor(0.8f, 0.8f, 0.5f));terrain.Initialize();// 创建基于irrlicht的可视化,以及交互控制系统。定义每次控制量、可hi话等内容。// ------------------------------------------------------------------------------// Create the vehicle run-time visualization interface and the interactive driver// ------------------------------------------------------------------------------// Set the time response for steering and throttle keyboard inputs.double steering_time = 1.0; // time to go from 0 to +1 (or from 0 to -1)double throttle_time = 1.0; // time to go from 0 to +1double braking_time = 0.3; // time to go from 0 to +1std::shared_ptr<ChVehicleVisualSystem> vis;std::shared_ptr<ChDriver> driver;// Create the vehicle Irrlicht interfaceauto vis_irr = chrono_types::make_shared<ChWheeledVehicleVisualSystemIrrlicht>(); //~ ChWheeled这个类继承了可视化的基类vis_irr->SetWindowTitle("HMMWV Demo");vis_irr->SetChaseCamera({ 0.0, 0.0, 1.75 }, 6.0, 0.5); // 将可视化的“相机位置”和车底盘上一点绑定。vis_irr->Initialize();vis_irr->AddLightDirectional();vis_irr->AddSkyBox();vis_irr->AddLogo();vis_irr->AttachVehicle(&hmmwv.GetVehicle()); // 将可视化与vehicle绑定// Create the interactive Irrlicht driver system 自定义每次按键的增量auto driver_irr = chrono_types::make_shared<ChInteractiveDriverIRR>(*vis_irr);driver_irr->SetSteeringDelta(render_step_size / steering_time);driver_irr->SetThrottleDelta(render_step_size / throttle_time);driver_irr->SetBrakingDelta(render_step_size / braking_time);driver_irr->Initialize();vis = vis_irr;driver = driver_irr;// ---------------// Simulation loop// ---------------// Number of simulation steps between miscellaneous eventsint render_steps = (int)std::ceil(render_step_size / step_size);// Initialize simulation frame countersint step_number = 0;int render_frame = 0;hmmwv.GetVehicle().EnableRealtime(true);while (vis->Run()) {double time = hmmwv.GetSystem()->GetChTime();// End simulationif (time >= t_end)break;// Render scene and output post-processing dataif (step_number % render_steps == 0) {vis->BeginScene();vis->Render();vis->EndScene();render_frame++;}// Driver inputsDriverInputs driver_inputs = driver->GetInputs();// Update modules (process inputs from other modules)driver->Synchronize(time);terrain.Synchronize(time);hmmwv.Synchronize(time, driver_inputs, terrain);vis->Synchronize(time, driver_inputs);// Advance simulation for one timestep for all modulesdriver->Advance(step_size);terrain.Advance(step_size);hmmwv.Advance(step_size);vis->Advance(step_size); //~ 更新vis的trackpoint等。// Increment frame numberstep_number++;std::cout << "Step: " << step_number << std::endl;}return 0;}
}
运行这个例子,就可以用WASD控制悍马车在自定义的一个地形上开动了。
相关文章:
【Chrono Engine学习总结】4-vehicle-4.1-vehicle的基本概念
由于Chrono的官方教程在一些细节方面解释的并不清楚,自己做了一些尝试,做学习总结。 1、基本介绍 Vehicle Overview Vehicle Mannel Vehicle的官方demo 1.1 Vehicle的构型 一个车辆由许多子系统构成:悬挂、转向、轮子/履带、刹车/油门、动…...
腾讯云4核8G服务器多少钱?2024精准报价
腾讯云4核8G服务器S5和轻量应用服务器优惠价格表,轻量应用服务器和CVM云服务器均有活动,云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元,5年6490.44元,标准型SA2服务器1444.8元一年,轻量应用服务器4核8G12M带宽一…...
汽车出租管理系统
文章目录 汽车出租管理系统一、系统演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目源码(9.9¥带走) 汽车出租管理系统 一、系统演示 汽车租赁系统 二、项目介绍 语言:java 框架:SpringBoot、…...
使用SM4国密加密算法对Spring Boot项目数据库连接信息以及yaml文件配置属性进行加密配置(读取时自动解密)
一、前言 在业务系统开发过程中,我们必不可少的会使用数据库,在应用开发过程中,数据库连接信息往往都是以明文的方式配置到yaml配置文件中的,这样有密码泄露的风险,那么有没有什么方式可以避免呢?方案当然是有的,就是对数据库密码配置的时候进行加密,然后读取的时候再…...
【LeetCode每日一题】二维前缀和基本概念与案例
二维前缀和 根据某个块块 的 左上角坐标,和右下角坐标 求出 块块的累加和。 304. 二维区域和检索 - 矩阵不可变 /*** param {number[][]} matrix*/ var NumMatrix function(matrix) {let row matrix.length;let col matrix[0].length;// 初始化一个二维数组&am…...
计算机网络——网络安全
计算机网络——网络安全 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家, [跳转到网站](https://www.captainbed.cn/qianqiu) 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU) 网络安全何…...
SQl 注入 - 利用报错函数updatexml及extracevalue
环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、updatexml() 函数 1. 使用前提: 在 MySQL 高版本中(大于5.1版本)添加了对 XML 文档进行查询和修改的函数,包括 updatexml() 和 extractvalue()。 2. 显示错误处理: 在…...
ChatGPT高效提问—prompt实践(生成VBA)
ChatGPT高效提问—prompt实践(生成VBA) 2. 生成VBA函数操作Excel 当前Excel表格数据无背景颜色,区分不明显。假如我们想美化数据展示效果,把标题行设置为浅蓝色,其余奇数行设置为橙色,该怎么操作呢?这次我们基于ChatGPT写一个prompt来创建VBA函数。 输入prompt…...
Ps:直接从图层生成文件(图像资源)
通过Ps菜单:文件/导出/将图层导出到文件 Layers to Files命令,我们可以快速地将当前文档中的每个图层导出为同一类型、相同大小和选项的独立文件。 Photoshop 还提供了一个功能,可以基于文档中的图层或图层组的名称,自动生成指定大…...
springboot-接入ai机器人 汇总
鱼聪明 Java SDKGitHub - liyupi/yucongming-java-sdk: 鱼聪明 AI 的 Java SDK,几行代码使用 AI 助手能力!...
蓝桥杯嵌入式第9届真题(完成) STM32G431
蓝桥杯嵌入式第9届真题(完成) STM32G431 题目 分析和代码 main.h /* USER CODE BEGIN Header */ /********************************************************************************* file : main.h* brief : Header for main.c file.* …...
电商小程序03登录页面开发
目录 1 创建应用2 创建页面3 首页功能搭建4 登录页搭建5 设置叠加效果总结 小程序开发在经过需求分析和数据源设计之后,就可以进入到页面开发的阶段了。首先我们需要开发登录的功能。 登录功能要求用户输入用户名和密码,勾选同意用户协议和隐私协议&…...
聊聊PowerJob的CleanService
序 本文主要研究一下PowerJob的CleanService CleanService Slf4j Service public class CleanService {private final DFsService dFsService;private final InstanceInfoRepository instanceInfoRepository;private final WorkflowInstanceInfoRepository workflowInstance…...
Qt QML学习(一):Qt Quick 与 QML 简介
参考引用 QML和Qt Quick快速入门全面认识 Qt Widgets、QML、Qt Quick 1. Qt Widgets、QML、Qt Quick 区别 1.1 QML 和 Qt Quick 是什么关系? 1.1.1 从概念上区分 QML 是一种用户界面规范和标记语言,它允许开发人员创建高性能、流畅的动画和具有视觉吸引…...
Kylin系统下Qt的各种中文问题解决思路
一、编译生成的程序运行,中文乱码 这个比较简单。 Windows下基本就是编码格式设置。ini中文问题,见QSettings读取ini中文key方法。 其他Linux版本没玩过,不清楚。Kylin系统下基本就是缺中文的字库。找个好的中文字库,放到目录下即可,系统目录/usr/lib/fonts,qt的安装目…...
C 练习实例69-约瑟夫环
题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。 代码: #include <stdio.h> int main() {int n8;int table[n]…...
【Qt Design】界面介绍
文章目录 前言Widget Box(工具箱)对象查看器Qt Design属性编译器sizePolicy内容 信号/槽编辑器资源浏览器ui文件编辑完窗口后查看代码在Pycharm中添加QtDesign 前言 Widget Box(工具箱) 提供很多控件 对象查看器 对象查看区域…...
Makefile编译原理 make 中的路径搜索_1
一.make中的路径搜索 问题:在实际的工程项目中,所有的源文件和头文件都放在同一个文件夹中吗? 实验1 : VPATH 引子 mhrubuntu:~/work/makefile1/17$ ll total 28 drwxrwxr-x 4 mhr mhr 4096 Apr 22 00:46 ./ drwxrwxr-x 7 mhr m…...
蓝桥杯每日一题------背包问题(一)
点击可观看配套视频讲解 背包问题 阅读小提示:这篇文章稍微有点长,希望可以对背包问题进行系统详细的讲解,在看的过程中如果有任何疑问请在评论区里指出。因为篇幅过长也可以进行选择性阅读,读取自己想要的那一部分即可。 前言…...
面试 JavaScript 框架八股文十问十答第八期
面试 JavaScript 框架八股文十问十答第八期 作者:程序员小白条,个人博客 相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新! ⭐点赞⭐收藏⭐不迷路!⭐ 1)实现call、apply…...
别再只用欧氏距离了!用Python+NumPy实战马氏距离异常检测(附卡方分布阈值设定)
用Python实战马氏距离异常检测:从理论到工业级实现 在数据分析领域,距离度量是许多算法的基石。当数据维度升高且特征间存在相关性时,传统的欧氏距离就像用一把没有刻度的尺子测量复杂空间——它无法捕捉变量间的相互作用。想象一下金融交易监…...
Acode移动代码编辑器:打造随时随地的高效编程体验
Acode移动代码编辑器:打造随时随地的高效编程体验 【免费下载链接】Acode Acode - powerful text/code editor for android 项目地址: https://gitcode.com/gh_mirrors/ac/Acode 在移动设备上编写代码时,你是否常常感到力不从心?小屏幕…...
Redis知识点完整补充文档
再学习该文档的时候先学习Redis内容 https://blog.csdn.net/MC_sir/article/details/159394860?spm1001.2014.3001.5502https://blog.csdn.net/MC_sir/article/details/159394860?spm1001.2014.3001.5502 一、基础定义与存储结构(补充) 1. 五大数据结…...
Fast Lab突破:3D激光雷达+强化学习如何重塑无人机自主避障新范式?
1. 当无人机遇上3D激光雷达:一场感知革命 想象一下,你操控的无人机正在茂密的树林中穿行,突然前方出现几根几乎透明的钓鱼线——这种场景会让任何飞手瞬间冒冷汗。传统基于视觉或超声波传感器的无人机就像戴着高度近视眼镜的短跑运动员&#…...
软考系统架构设计师论文 —— 负载均衡架构知识点(4)
接前一篇文章:软考系统架构设计师论文 —— 负载均衡架构知识点(3) 本文内容参考: 负载均衡策略和技术的基本指南 解析常见的负载均衡算法-CSDN博客...
3个方法解决小说断更难题:Yuedu书源库让你实现阅读自由
3个方法解决小说断更难题:Yuedu书源库让你实现阅读自由 【免费下载链接】Yuedu 📚「阅读」APP 精品书源(网络小说) 项目地址: https://gitcode.com/gh_mirrors/yu/Yuedu 你是否经历过这样的时刻:深夜追更的小说…...
Android与SpringBoot的轻量级数据桥梁——OkHttp3实战解析
1. OkHttp3与SpringBoot的黄金组合 第一次用OkHttp3对接SpringBoot后端时,我盯着满屏的404错误差点崩溃。后来才发现,原来是因为手机和电脑不在同一个WiFi下。这种看似低级的错误,恰恰是新手最容易踩的坑。OkHttp3作为Android端最流行的网络请…...
终极免费方案:3分钟掌握ViGEmBus虚拟游戏手柄驱动的完整部署与应用
终极免费方案:3分钟掌握ViGEmBus虚拟游戏手柄驱动的完整部署与应用 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 你是否曾为游戏不支持你的手柄…...
Fish Speech 1.5保姆级教程:零代码实现Markdown文档转语音
Fish Speech 1.5保姆级教程:零代码实现Markdown文档转语音 1. 为什么选择Fish Speech 1.5? 在日常工作中,我们经常需要处理大量Markdown格式的技术文档。传统的文本转语音工具往往存在几个痛点:声音机械生硬、无法处理Markdown特…...
Go gRPC 双向流通信实例
Go gRPC双向流通信实例解析 在现代分布式系统中,高效的双向通信是核心需求之一。gRPC作为Google开源的高性能RPC框架,支持双向流通信模式,允许客户端和服务端同时发送和接收多条消息。本文将以Go语言为例,介绍gRPC双向流通信的实…...
