【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.pswp.cn/news/696583.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/696583.shtml
英文地址,請注明出處:http://en.pswp.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…

系統學習Python——裝飾器:類裝飾器-[單例類:編寫替代方案]

分類目錄&#xff1a;《系統學習Python》總目錄 有趣的是&#xff0c;這里如果能使用nonlocal語句&#xff08;僅在Python3.X中可用&#xff09;來改變外層作用域名稱&#xff0c;我們在這里可以編寫一個自包含程度更高的解決方案一一一下面的替代方案為每個類使用了一個外層作…

編寫程序,實現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天精通鴻蒙》 …

代碼隨想錄算法訓練營第四十二天|122. 買賣股票的最佳時機 II

674. 最長連續遞增序列 public static int findLengthOfLCIS(int[] nums) {int[] dp new int[nums.length];dp[0] 1;for (int i 1; i < nums.length; i) {dfs(nums, dp, i);}Arrays.sort(dp);return dp[dp.length - 1];}public static void dfs(int[] nums, int[] dp, i…

【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; 首先來說一下小店的主體類型…

git常用命令記錄

1、第一次初始化 git init git add . git commit -m ‘first commit’ git remote add origin gitgithub.com:帳號名/倉庫名.git git pull origin master git push origin master # -f 強推 git clone gitgithub.com:git帳號名/倉庫名.git 2、工作基本操作 git checkout master…

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;用戶可以選…

C語言——static的三大用法

被稱為面試愛考愛問題的它到底有何奧義 它難度不大并且非常常用&#xff0c;話不多說&#xff0c;直接開始 一、局部靜態變量 定義 在函數內部使用static修飾的變量被稱為局部靜態變量&#xff0c;與普通的局部變量不同&#xff0c;局部靜態變量在使用后不會被銷毀&#xff…

pycharm 遠程運行報錯 Failed to prepare environment

什么也沒動的情況下&#xff0c;遠程連接后運行是沒問題的&#xff0c;突然在運行時就運行不了了&#xff0c;解決方案 清理緩存&#xff1a; 有時候 PyCharm 的內部緩存可能出現問題&#xff0c;可以嘗試清除緩存&#xff08;File > Invalidate Caches / Restart&#xff0…