【Chrono Engine学习总结】4-vehicle-4.3-两个vehicle碰撞测试

由于Chrono的官方教程在一些细节方面解释的并不清楚,自己做了一些尝试,做学习总结。

今天突发奇想,想试一下,是否可以实现两个vehicle的碰撞?

1、两辆vehicle的仿真

官方提供了demo_VEH_TwoCars这个demo,用来参考两个车的例子。

对于一个车而言,我们不需要专门制定Chrono的系统是什么,即只需要用Vehicle在创建时自动生成的system即可。
通过vehicle的底层代码,可以看到构造函数有两种,一种是不指定system,另一种是指定system的:
在这里插入图片描述
之前的例子,用的都是第一种初始化,这样在实际使用时,如果涉及到地形模块的交互,只需要在创建地形时,传入vehicle绑定的系统即可,例如:

HMMWV_Full hmmwv;
RigidTerrain terrain(hmmwv.GetSystem());

但是,如果有两个vehicle,再创建一个新的vehicle就会出现麻烦:他两个处于不同的物理系统。

于是,我们参考官方的例子,首先创建一个物理系统,然后在创建vehicle时指定同一个system即可:

// 创建物理仿真系统,并指定一些参数。
ChSystemNSC sys;
sys.SetCollisionSystemType(ChCollisionSystem::Type::BULLET);
sys.Set_G_acc(ChVector<>(0, 0, -9.81));
sys.SetSolverType(ChSolver::Type::BARZILAIBORWEIN);
sys.SetSolverMaxIterations(150);
sys.SetMaxPenetrationRecoverySpeed(4.0);// 创建第1个vehicle
HMMWV_Reduced hmmwv_1(&sys);// 创建第2个vehicle
HMMWV_Reduced hmmwv_2(&sys);

接下来,在仿真循环中,我们需要对系统进行动力学仿真。调用:sys.DoStepDynamics(step)

hmmwv_1.Advance(step_size);
hmmwv_2.Advance(step_size);
terrain.Advance(step_size);
vis->Advance(step_size);
// Advance state of entire system (containing both vehicles)
sys.DoStepDynamics(step_size);

之前采用vehicle的方式写代码时,不需要写出来这一句DoStepDynamics,因为在vehicle的Advance()中,最终调用了vehicle自己system的DoStepDynamics。如果这里我们忽略了最后这一句话,vehicle在仿真系统中是不会动的、但driver的控制量是已经给上了(这个bug卡了我半天,才想到去找demo,最后发现的问题)。

2、两车的碰撞

2.1 车辆可碰撞的地方

我们知道,chrono里面,有这个东西、可以看到可视化、以及会发生碰撞,这几件事情是没有关系的。
那首先就要搞清楚,对于一个vehicle来说,哪些地方可以“碰撞”。

从官方介绍中,可以得知,任何vehicle都包括底盘,轮式车辆又包括:悬挂、转向、传动、轮胎模型。
在这里插入图片描述
经过测试,轮胎、底盘是可以发生碰撞的,实际碰撞的位置如下图所示:
在这里插入图片描述
除了4个车轮、底盘圈出来的这部分,其他地方貌似是无法发生物理碰撞的。

2.2 碰撞设置

要想发生碰撞,需要对碰撞进行设置,包括:

  • 设置system的碰撞
  • 设置车辆的碰撞方法
  • 设置车辆具体哪个地方可以碰撞

其中,system和车辆的碰撞设置,例如采用Bullet碰撞

// system碰撞设置
auto collision_type = ChCollisionSystem::Type::BULLET;
sys.SetCollisionSystemType(collision_type);// 车辆碰撞设置
car1.SetCollisionSystemType(collision_type);

但是,仍需要设置,车辆哪些地方的碰撞需要启用?即需要使能。
翻阅官方文档,共有三个函数相关,分别是:

  • SetChassisCollide: Enable/disable collision for the chassis subsystem. This function controls contact of the chassis with all other collision shapes in the simulation.
  • SetChassisVehicleCollide: Enable/disable collision between the chassis and all other vehicle subsystems. Note that some of these collisions may be always disabled, as set by the particular derived vehicle class.
  • SetWheelCollide: Enable/disable collision for the wheel subsystems.
    注意,前两个是vehicle模块都具备的函数,第三个是wheel类型的vehicle所特有的。
    第一种和第二种的区别:第一个是底盘和所有物体的碰撞;第二个是底盘和vehicle本身发生碰撞。

官方建议,当chassis或wheel一个设置为true时,另一个设置为false,避免出现bug。

2.3 结果

轮胎的碰撞:
在这里插入图片描述
在这里插入图片描述
可以看到,当两个车的轮胎碰上时,会发生碰撞,但车体之间可以相互“穿越”。

底盘碰撞:
在这里插入图片描述

在这里插入图片描述
可以看到,底盘碰撞时,轮胎可以重合,但是在底盘部分会发生碰撞,改变车的结构。

3、思考:车外壳碰撞

在这里插入图片描述
以上方法,只能够实现部分体积的碰撞,但车体的“外壳”无法碰撞。

自己尝试了一下,发现实现起来比较困难,原因如下
虽然车体外壳的mesh是属于chassis控制,但chassis的体积只有上述部分,外壳部分是没有碰撞体积的;外壳碰撞时,并不会有外部的力影响车辆系统,因此,即使定义一个“无可视化”的ChBody与车体坐标系绑定,当ChBody间发生碰撞时,碰撞的力不知道怎么传递到车辆底盘,进而改变车体的各个子系统,即“碰撞”或许能看出来,但后续车辆的运动,不符合“车辆模型+控制量+碰撞”共同造成的影响。

希望有高手提供思路。

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

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

相关文章

C++入门04 函数的参数传递、引用类型与重载

图源&#xff1a;文心一言 听课笔记简单整理&#xff0c;供小伙伴们参考&#xff0c;包含以下内容“&#x1f40b;3.11 引用类型、&#x1f40b;3.14 内联函数、&#x1f40b;3.15 默认参数值、&#x1f40b;3.16 函数重载、&#x1f40b;3.17 C系统函数”~&#x1f95d;&…

LabVIEW多通道压力传感器实时动态检测

LabVIEW多通道压力传感器实时动态检测 介绍了一种基于LabVIEW的多通道压力传感器实时动态检测系统&#xff0c;解决压阻式压力传感器温度补偿过程的复杂度&#xff0c;提高测量的准确性。通过自动轮询检测方法&#xff0c;结合硬件检测模型和多通道检测系统设计&#xff0c;本…

集合框架之List集合

目录 ​编辑 一、什么是UML 二、集合框架 三、List集合 1.特点 2.遍历方式 3.删除 4.优化 四、迭代器原理 五、泛型 六、装拆箱 七、ArrayList、LinkedList和Vector的区别 ArrayList和Vector的区别 LinkedList和Vector的区别 一、什么是UML UML&#xff08;Unif…

基于ORB-SLAM2与YOLOv8剔除动态特征点(三种方法)

基于ORB-SLAM2与YOLOv8剔除动态特征点(三种方法) 写上篇文章时测试过程比较乱&#xff0c;写的时候有些地方有点失误&#xff0c;所以重新写了这篇 本文内容均在RGB-D环境下进行程序测试 本文涉及到的动态特征点剔除速度均是以https://cvg.cit.tum.de/data/datasets/rgbd-dat…

编写程序,实现shell功能——项目训练——day08

c c今天做了一个实战项目训练&#xff0c;编写一个程序&#xff0c;实现shell功能&#xff0c;我们称之为minishell。 主要是利用Linux中IO接口实现&#xff0c;实现的功能有&#xff1a; 1.ls ls -a ls -l cd cp mv pwd c…

软件License授权原理

软件License授权原理 你知道License是如何防止别人破解的吗&#xff1f;本文将介绍License的生成原理&#xff0c;理解了License的授权原理你不但可以防止别人破解你的License&#xff0c;你甚至可以研究别人的License找到它们的漏洞。喜欢本文的朋友建议收藏关注&#xff0c;…

【Linux】进程状态

进程状态 进程状态的简要介绍运行状态进程排队 阻塞状态挂起状态Linux中的进程状态 进程状态的简要介绍 进程状态指的是一个操作系统中正在运行的进程当前所处的状态。根据不同的操作系统&#xff0c;进程状态可能会有一些细微的差别&#xff0c;但最主要的是以下三种状态 运行…

Java——方法的使用

目录 一.方法的概念及使用 1 什么是方法(method) 2.方法定义 3 方法调用的执行过程 4 实参和形参的关系(重要) 5.没有返回值的方法 二.方法重载 1.为什么需要方法重载 2.方法重载概念 3.方法签名 三.递归 1.递归的概念 2.递归执行过程分析 3. 递归练习 一.方法的…

猫头虎分享已解决Bug || 容器编排问题:OrchestrationFailure, ContainerManagementError

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

【Python】【VS Code】VS Code中python.json和setting.json文件配置说明

目录 1. python.json配置 2. setting.json配置 3. 解决中文乱码 4. 实现效果 1. python.json配置 python.json 获取步骤&#xff1a;文件 -> 首选项 -> 配置用户代码片段 -> python 此为VS Code的头文件设置&#xff0c;复制以下内容到 python.json {"HEADER…

个人做抖店如何能够快速起店?掌握好技巧是关键!建议收藏!

大家好&#xff0c;我是电商小布。 相信我们每个朋友在店铺开通后&#xff0c;最关心的事情就是小店成功起店了。 那么个人做抖店想要快速起店&#xff0c;该怎么来进行操作呢&#xff1f; 接下来&#xff0c;小布重点给大家说三点&#xff1a; 首先来说一下小店的主体类型…

dell r740服务器黄灯闪烁维修现场解决

1&#xff1a;首先看一下这款DELL非常主力的PowerEdge R740服务器长啥样&#xff0c;不得不说就外观来说自从IBM抛弃System X系列服务器后&#xff0c;也就戴尔这个外观看的比较顺眼。 图一&#xff1a;是DELL R740前视图&#xff08;这款是8盘机型&#xff09; 图二&#xff…

QT 数据库的增加操作和画图 Win

第一步、先配置CMakeLists.txt 在CMakeLists.txt中添加 find_package(Qt6 REQUIRED COMPONENTS Sql) find_package(Qt6 REQUIRED COMPONENTS Charts)target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Sql) target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Charts)避…

springboot集成JWT实现token权限认证

vuespringboot登录与注册功能的实现 注&#xff1a;对于JWT的学习&#xff0c;首先要完成注册和登录的功能&#xff0c;本篇博客是基于上述博客的进阶学习&#xff0c;代码页也是在原有的基础上进行扩展 ①在pom.xml添加依赖 <!-- JWT --> <dependency><grou…

Linux篇:Shell命令以及运行原理 和 权限

一. Shell命令及原理 Linux操作系统狭义上是Linux内核&#xff0c;广义上是指Linux内核Linux外壳(Shell)和对应的配套程序 Linux外壳&#xff1a;Linux 外壳是用户与内核之间的接口&#xff0c;用户通过外壳与操作系统进行交互和操作。在 Linux 系统中&#xff0c;用户可以选…

pycharm 远程运行报错 Failed to prepare environment

什么也没动的情况下&#xff0c;远程连接后运行是没问题的&#xff0c;突然在运行时就运行不了了&#xff0c;解决方案 清理缓存&#xff1a; 有时候 PyCharm 的内部缓存可能出现问题&#xff0c;可以尝试清除缓存&#xff08;File > Invalidate Caches / Restart&#xff0…

mysql优化指南之原理篇

之前碰到一个线上问题&#xff0c;在接手一个同事的项目后&#xff0c;因为工期比较赶&#xff0c;我还没来得及了解业务背景和大致实现&#xff0c;只是了解了上线发布的顺序和验证方式就进行了上线&#xff0c;在上线进行金丝雀的时候系统还没发生什么异常&#xff0c;于是我…

MySQL数据库进阶第二篇(索引,SQL性能分析,使用规则)

文章目录 一、索引概述二、索引结构三、结构 - B-Tree四、结构 - BTree五、结构 - Hash六、索引分类七、索引语法1.案例代码 八、SQL性能分析1.查看SQl执行频率2.慢查询日志3.PROFILES详情4.EXPLAIN执行计划 九、 索引使用规则十、SQL 提示十一、覆盖索引十二、前缀索引十三、单…

滚动加载react-infinite-scroll-component

react-infinite-scroll-component 当请求数据量过大时&#xff0c;接口返回数据时间会很长&#xff0c;数据回显时间长&#xff0c;Dom 的渲染会有很大的性能压力。 antd的List组件中有提到一个滚动加载的组件库react-infinite-scroll-component 实现滚动加载 Antd&#xff1…

考研高数(高阶导数的计算)

1.归纳法 常见高阶导数 2.泰勒展开式 3.莱布尼兹公式 4.用导数定义证明导函数在某一点连续的例题