【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间发生碰撞时,碰撞的力不知道怎么传递到车辆底盘,进而改变车体的各个子系统,即“碰撞”或许能看出来,但后续车辆的运动,不符合“车辆模型+控制量+碰撞”共同造成的影响。

希望有高手提供思路。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【更新公告】AirtestIDE更新至1.2.17版本

1. 前言 本次更新为AirtestIDE、Airtest-Selenium库更新。 AirtestIDE更新至1.2.17版本&#xff0c;AirtestIDE内置库Airtest更新为1.3.3.1版本&#xff0c;Poco更新为1.0.94版本&#xff0c;主要支持了selenium4.0以上版本&#xff0c;ADB更换为41版本&#xff0c;Airtest新…

数据驱动决策:掌握高效数据分析的七大步骤

在这个数据驱动的时代&#xff0c;无论是企业决策还是个人发展&#xff0c;数据分析都扮演着至关重要的角色。然而&#xff0c;想要从海量数据中提炼出有价值的信息&#xff0c;并不是一件容易的事情。本文为你详细解读高效数据分析&#xff0c;让你的数据开口说话&#xff0c;…

GIS技术在灾后重建中的空间规划与决策支持

地质灾害是指全球地壳自然地质演化过程中&#xff0c;由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。由于降水、地震等自然作用下&#xff0c;地质灾害在世界范围内频繁发生。我国除滑坡灾害外&#xff0c;还包括崩塌、泥石流、地面沉…

单体微服务K8S笔记

单体微服务K8S笔记 https://blog.csdn.net/m0_48341969/article/details/126063832思路参考以上博客 //测试 https://gitee.com/yangbuyi/yi项目组织参考以上git 单体&#xff1a; 不特地介绍 微服务&#xff1a; rpc:远程过程调用 拆分&#xff0c;分别部署&#xff0…

Day04-流程控制语句_循环结构(while,do...while,关键字continue,关键字break,循环嵌套)

文章目录 Day04- 循环结构学习目标1 while循环2 do...while循环4 循环语句的区别5 关键字continue6 关键字break7 循环嵌套案例1&#xff1a;打印5行直角三角形案例2&#xff1a;break结束当层循环 Day04- 循环结构 学习目标 理解for语句的格式和执行流程 随机数公式 理解…

Linux中安装Nginx及日常配置使用

高性能的http服务器/反向代理服务器。官方测试支持5万并发&#xff0c;CPU、内存等消耗较低且运行稳定 使用场景 Http服务器。 Nginx可以单独提供Http服务&#xff0c;做为静态网页的服务器。虚拟主机。 可以在一台服务器虚拟出多个网站。反向代理与负载均衡。 Nginx做反向代理…

SQL注入之DNSLog外带注入

一、认识&#xff1a; 什么是dnslog呢&#xff1f; DNS就是域名解析服务&#xff0c;把一个域名转换成对应的IP地址&#xff0c;转换完成之后&#xff0c;DNS服务器就会有一个日志记录本次转换的时间、域名、域名对应的ip、请求方的一些信息&#xff0c;这个日志就叫DNSLog。…

基于 java springboot+layui仓库管理系统

基于 java springbootlayui仓库管理系统设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取源…

好书推荐| After Effects 2022案例实战全视频教程

After Effects 2022案例实战全视频教程 作者 &#xff1a;王红卫 书号&#xff1a;9787302631958 定价&#xff1a;99元 出版时间&#xff1a;2023年7月 作者介绍 王红卫 拥有多年设计师的经学经验&#xff0c;北京理工大学百事特教师&#xff0c;水木风云工作室创始人&a…

网络编程知识整理

目录 1.1 引言 1.2 分层 1.3 TCP/IP的分层 1.4 互联网的地址 1.5 域名服务 1.6 封装 1.7 分用 1.8 端口号 1.1 引言 很多不同的厂家生产各种型号的计算机&#xff0c;它们运行完全不同的操作系统&#xff0c;但 T C P / I P协议族允许它们互相进行通信。这一点很让人感…

⭐北邮复试刷题105. 从前序与中序遍历序列构造二叉树__递归分治 (力扣每日一题)

105. 从前序与中序遍历序列构造二叉树 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,…

论文精读--word2vec

word2vec从大量文本语料中以无监督方式学习语义知识&#xff0c;是用来生成词向量的工具 把文本分散嵌入到另一个离散空间&#xff0c;称作分布式表示&#xff0c;又称为词嵌入&#xff08;word embedding&#xff09;或词向量 Abstract We propose two novel model architec…

Go 中的 init 如何用?它的常见应用场景有哪些呢?

嗨&#xff0c;大家好&#xff01;我是波罗学。本文是系列文章 Go 技巧第十六篇&#xff0c;系列文章查看&#xff1a;Go 语言技巧。 Go 中有一个特别的 init() 函数&#xff0c;它主要用于包的初始化。init() 函数在包被引入后会被自动执行。如果在 main 包中&#xff0c;它也…

四、分类算法 - 随机森林

目录 1、集成学习方法 2、随机森林 3、随机森林原理 4、API 5、总结 sklearn转换器和估算器KNN算法模型选择和调优朴素贝叶斯算法决策树随机森林 1、集成学习方法 2、随机森林 3、随机森林原理 4、API 5、总结

Kubernetes 卷存储 NFS | nfs搭建配置 原理介绍 nfs作为存储卷使用

1、NFS介绍 NFS&#xff08;Network File System&#xff09;是一种分布式文件系统协议&#xff0c;允许客户端远程访问服务器上的文件&#xff0c;实现数据共享。它整合多个存储设备为统一文件系统&#xff0c;方便数据存储和管理&#xff0c;支持负载均衡和故障转移&#xf…

[设计模式Java实现附plantuml源码~行为型]协调多个对象之间的交互——中介者模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…

DataX - 全量数据同步工具

前言 今天是2024-2-21&#xff0c;农历正月十二&#xff0c;相信今天开始是新的阶段&#xff0c;尽管它不是新的周一、某月一日、某年第一天&#xff0c;尽管我是一个很讲究仪式感的人。新年刚过去 12 天&#xff0c;再过 3 天就开学咯&#xff0c;开学之后我的大学时光就进入了…

内网穿透——NPS突然无法连接

温馨提示 &#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f32d;&#x1f32d;&#x1f32d;&#x1f32d;&#x1f32d;&#x1f32d;&#x1f32d;❤️❤️❤️❤️❤️❤️❤️&#x1f968;&#x1f968;&#x1f9…

Go语言中的TLS加密:深入crypto/tls库的实战指南

Go语言中的TLS加密&#xff1a;深入crypto/tls库的实战指南 引言crypto/tls库的核心组件TLS配置&#xff1a;tls.Config证书加载与管理TLS握手过程及其实现 构建安全的服务端创建TLS加密的HTTP服务器配置TLS属性常见的安全设置和最佳实践 开发TLS客户端应用编写使用TLS的客户端…

基于springboot+vue的B2B平台的购物推荐网站(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…