【Chrono Engine学习总结】4-vehicle-4.1-vehicle的基本概念

news2025/1/25 7:08:05

由于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 = 50

int 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 path

    ChContactMethod 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 terrain
    double terrainHeight = 0;      // terrain height (FLAT terrain only)
    double terrainLength = 200.0;  // size in X direction
    double terrainWidth = 200.0;   // size in Y direction
    std::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 +1
    double braking_time = 0.3;   // time to go from 0 to +1

    std::shared_ptr<ChVehicleVisualSystem> vis;
    std::shared_ptr<ChDriver> driver;
    // Create the vehicle Irrlicht interface
    auto 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 events
    int render_steps = (int)std::ceil(render_step_size / step_size);
    // Initialize simulation frame counters
    int step_number = 0;
    int render_frame = 0;

    hmmwv.GetVehicle().EnableRealtime(true);
    while (vis->Run()) {
        double time = hmmwv.GetSystem()->GetChTime();
        // End simulation
        if (time >= t_end)
            break;
            
        // Render scene and output post-processing data
        if (step_number % render_steps == 0) {
            vis->BeginScene();
            vis->Render();
            vis->EndScene();
            render_frame++;
        }

        // Driver inputs
        DriverInputs 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 modules
        driver->Advance(step_size);
        terrain.Advance(step_size);
        hmmwv.Advance(step_size);
        vis->Advance(step_size);            //~ 更新vis的trackpoint等。

        // Increment frame number
        step_number++;
        std::cout << "Step: " << step_number << std::endl;
    }
    return 0;
	 }
}

运行这个例子,就可以用WASD控制悍马车在自定义的一个地形上开动了。

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

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

相关文章

书生谱语-大语言模型测试demo

课程内容简介 通用环境配置 开发机 InterStudio pip 换源 临时使用镜像源安装&#xff0c;如下所示&#xff1a;some-package 为你需要安装的包名 pip install -i https://mirrors.cernet.edu.cn/pypi/web/simple some-package设置pip默认镜像源&#xff0c;升级 pip 到最新…

力扣1122. 数组的相对排序(哈希表)

Problem: 1122. 数组的相对排序 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.利用arr2创建一个无序映射&#xff08;map集合&#xff09;&#xff0c;以其中的元素作为键&#xff0c;值默认设置为0&#xff1b; 2.扫描arr1数组统计arr2元素在其中的个数(将个…

Pandas教程12:常用的pd.set_option方法,显示所有行和列+不换行显示等等...

---------------pandas数据分析集合--------------- Python教程71&#xff1a;学习Pandas中一维数组Series Python教程74&#xff1a;Pandas中DataFrame数据创建方法及缺失值与重复值处理 Pandas数据化分析&#xff0c;DataFrame行列索引数据的选取&#xff0c;增加&#xff0c…

matlab发送串口数据,并进行串口数据头的添加,我们来看下pwm解析后并通过串口输出的效果

uintt16位的话会在上面前面加上00&#xff0c;16位的话一定是两个字节&#xff0c;一共16位的数据 如果是unint8的话就不会&#xff0c; 注意这里给的是13&#xff0c;但是现实的00 0D&#xff0c;这是大小端的问题&#xff0c;在matlanb里设置&#xff0c;我们就默认用这个模式…

python 笔记:shapely(形状篇)

主要是点&#xff08;point&#xff09;、线&#xff08;linestring&#xff09;、面&#xff08;surface&#xff09; 1 基本方法和属性 object.area 返回对象的面积&#xff08;浮点数&#xff09; object.bounds 返回一个&#xff08;minx, miny, maxx, maxy&#xff09;元…

基于Python的HTTP隧道安全性分析:魔法背后的锁与钥匙

当我们谈论基于Python的HTTP隧道时&#xff0c;不禁让人想起那些神秘的魔法门。但是&#xff0c;在魔法背后&#xff0c;我们也需要确保安全性&#xff0c;就像需要确保魔法不会落入邪恶之手一样。那么&#xff0c;基于Python的HTTP隧道在安全性方面表现如何呢&#xff1f;让我…

【Java程序设计】【C00270】基于Springboot的moba类游戏攻略分享平台(有论文)

基于Springboot的moba类游戏攻略分享平台&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的游戏攻略分享平台 本系统分为系统功能模块、管理员功能模块、以及用户后台功能模块。 系统功能模块&#xff1a;在平台首…

[VulnHub靶机渗透] Nyx

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

【Java程序设计】【C00253】基于Springboot的在线考试管理系统(有论文)

基于Springboot的在线考试管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的在线考试系统 本系统分为系统功能模块、管理员功能模块以及用户功能模块。 系统功能模块&#xff1a;系统登录&#xff0c;管理…

综合项目---博客

一.运行环境 192.168.32.132 Server-Web linux Web 192.168.32.133 Server-NFS-DNS linux NFS/DNS 基础配置 1.配置主机名静态ip 2.开启防火墙并配置 3.部分开启selinux并配置 4.服务器之间通过阿里云进行时间同步 5.服务器之间实现ssh免密…

牛客——递归实现组合型枚举(枚举,dfs)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 从 1~n 这 n 个整数中随机选出 m 个&#xff0c;输出所有可能的选择方案。n>0n \gt 0n>0, 0≤m≤n0 \leq m \leq n0≤m≤n, n(n−m)≤25n(n-m)\leq 25n(n−m)≤25。 输入描述…

大白话 ChatGPT 技术原理

▼最近直播超级多&#xff0c;预约保你有收获 近期直播&#xff1a;《Agent 企业级应用案例实战》 —1— ChatGPT 大模型如何完成训练的&#xff1f; ChatGPT 大模型训练分为以下3个步骤&#xff1a; 第一步、Pretraining 预训练。 给大模型海量的文本进行训练&#xff0c;99%…

申请SSL证书怎么进行域名验证?域名验证的三种方式

SSL证书是用于加密和保护Web服务器和浏览器之间通信的数字证书&#xff0c;在申请SSL证书时&#xff0c;为了防止域名被冒用&#xff0c;对于申请SSL证书的域名&#xff0c;要求先验证这个域名的所有权。而目前可用的域名验证SSL证书方式有三种&#xff1a;分别是DNS验证、邮箱…

【Java程序设计】【C00264】基于Springboot的原创歌曲分享平台(有论文)

基于Springboot的原创歌曲分享平台&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的原创歌曲分享平台 本系统分为平台功能模块、管理员功能模块以及用户功能模块。 平台功能模块&#xff1a;在平台首页可以查看首…

利用Windows10漏洞破解密码(保姆级教学)

前言: 本篇博客只是技术分享并非非法传播知识,实验内容均是在虚拟机中进行,并非真实环境 正文: 一.windows10电脑密码破解 1)开启windows10虚拟机,停留在这个页面 2&#xff09;按5次Shift键,出现这个粘滞键,如果没有出现的,则说明漏洞已经修复 3)重新启动,在这个页面的时候…

【Java程序设计】【C00257】基于Springboot的校园二手书交易平台(有论文)

基于Springboot的校园二手书交易平台&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的乐校园二手书交易管理系统 本系统分为系统功能模块、管理员功能模块、卖家用户功能模块以及用户功能模块。 系统功能模块&…

CentOS 7.9安装Tesla M4驱动、CUDA和cuDNN

正文共&#xff1a;1333 字 21 图&#xff0c;预估阅读时间&#xff1a;2 分钟 上次我们在Windows上尝试用Tesla M4配置深度学习环境&#xff08;TensorFlow识别GPU难道就这么难吗&#xff1f;还是我的GPU有问题&#xff1f;&#xff09;&#xff0c;但是失败了。考虑到Windows…

【思科ssh】思科模拟器配置ssh登录

配置路由器的名称为R1 配置路由器的域名为aaa.com 使用rsa来加密传输数据&#xff0c;密钥位数为2048 配置登录用户名为cj&#xff0c;密码为123456 只允许ssh登录&#xff0c;不能以其他方式登录 本地验证

HarmonyOS 鸿蒙 ArkTS ArkUI 页面之间切换转换动画设置

第一步&#xff1a;导入 import promptAction from ohos.promptAction 第二步&#xff1a;在build下方写入 pageTransition(){PageTransitionEnter({ duration: 1200 }).slide(SlideEffect.Right)PageTransitionExit({ delay: 100 }).translate({ x: 100.0, y: 100.0 }).opac…

Vue核心基础4:绑定样式、条件渲染、列表渲染

1 绑定样式 【代码】 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>绑定样式</title><s…