【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.hqwc.cn/news/484499.html

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

相关文章

React -- useEffect

React - useEffect 概念理解 useEffect是一个React Hook函数&#xff0c;用于在React组件中创建不是由事件引起而是由渲染本身引起的操作&#xff08;副作用&#xff09;, 比 如发送AJAX请求&#xff0c;更改DOM等等 :::warning 说明&#xff1a;上面的组件中没有发生任何的用…

暴风一期 黑群晖折腾流水账

起因是想和女友一起分享各自手机中的小猫照片&#xff0c;经过上网查资料了解到了群晖&#xff0c;可惜正版白群晖售价太高&#xff1a; 无奈选择了黑群晖&#xff0c;白群晖其实也可以简单理解为一台电脑多装了几块硬盘&#xff0c;然后装了一个文件服务器系统&#xff0c;这个…

CoordConv(NeurIPS 2018)

paper&#xff1a;An Intriguing Failing of Convolutional Neural Networks and the CoordConv Solution official implementation&#xff1a;https://github.com/uber-research/coordconv 存在的问题 本文揭示并分析了CNN在两种不同类型空间表示之间转换能力的欠缺&#…

每日OJ题_二叉树dfs⑤_力扣230. 二叉搜索树中第K小的元素

目录 力扣230. 二叉搜索树中第K小的元素 解析代码 力扣230. 二叉搜索树中第K小的元素 230. 二叉搜索树中第K小的元素 难度 中等 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 个最小元素&#xff08;从 1 开始计数…

RocketMQ—RocketMQ消息重复消费问题

RocketMQ—RocketMQ消息重复消费问题 重复消费问题的描述 什么情况下会发生重复消费的问题&#xff1a; 生产者多次投递消息&#xff1a;如果生产者发送消息时&#xff0c;连接有延迟&#xff0c;MQ还没收到消息&#xff0c;生产者又发送了一次消息&#xff1b; 消费者方扩容…

3个wordpress中文企业主题模板

农业畜牧养殖wordpress主题 简洁大气的农业畜牧养殖wordpress主题&#xff0c;农业农村现代化&#xff0c;离不开新农人、新技术。 https://www.jianzhanpress.com/?p3051 老年公寓wordpress主题 浅绿色简洁实用的老年公寓wordpress主题&#xff0c;适合做养老业务的老年公…

三防平板丨三防工业平板电脑丨三防平板电脑有哪些优势?

三防平板电脑通常使用特殊材料和制造工艺来达到防水、防尘、防摔的目的&#xff0c;这样可以在极端条件下使用&#xff0c;并保证设备的稳定性和可靠性。因此&#xff0c;三防平板电脑适用于各种恶劣环境&#xff0c;如户外野营、物流、工业制造等应用场景。那么相比于普通消费…

【力扣 - 二叉树的直径】

题目描述 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 提示&#xff1a; 树中节点数目在范围 [1, 10000] 内…

CSS基础属性

【三】基础属性 【1】高度和宽度 &#xff08;1&#xff09;参数 width&#xff08;宽度&#xff09;&#xff1a;用于设置元素的宽度。可以使用具体的数值&#xff08;如像素值&#xff09;或百分比来指定宽度。 height&#xff08;高度&#xff09;&#xff1a;用于设置元…

开源LLMs导览:工作原理、顶级LLM列表对比

目录 一、开源 LLM 是什么意思&#xff1f;二、开源LLM如何工作&#xff1f;2.1 预训练2.2 代币化2.3 开源LLM的微调2.4 输入编码2.5 训练与优化2.6 推理 三、开源LLM对组织的好处3.1 增强的数据安全和隐私3.2 节约成本3.3 减少供应商依赖性3.4 代码透明度 四、哪种LLM模式最好…

2024华北医院信息网络大会第二轮更新通知

大会背景 近年来&#xff0c;我国医疗行业信息化取得了飞跃式的发展&#xff0c;医疗信息化对医疗行业有着重要的支撑作用。2021年国家卫健委、中医药管理局联合印发《公立医院高质量发展促进行动&#xff08;2021-2025年&#xff09;》&#xff0c;提出重点建设“三位一体”智…

Redis之缓存穿透问题解决方案实践SpringBoot3+Docker

文章目录 一、介绍二、方案介绍三、Redis Docker部署四、SpringBoot3 Base代码1. 依赖配置2. 基本代码 五、缓存优化代码1. 校验机制2. 布隆过滤器3. 逻辑优化 一、介绍 当一种请求&#xff0c;总是能越过缓存&#xff0c;调用数据库&#xff0c;就是缓存穿透。 比如当请求一…