由于Chrono的官方教程在一些细节方面解释的并不清楚,自己做了一些尝试,做学习总结。
1、关于物体材质
在介绍地型之前,要初步了解chrono中关于材质的一些基本概念。
首先,最基本的材质类是ChMaterialSurface
,其进一步包括:ChMaterialSurfaceNSC
和SMC
两个派生类。
ChMaterialSurface
从ChMaterialSurface.h
中可以看出,ChMaterialSurface
的基本属性包括:
- 静摩擦,static_friction,由
SetSfriction
和GetSfriction
两个函数设置和获取值 - 滑动摩擦,sliding_friction (kinetic coefficient of friction),
SetKfriction
- 滚动摩擦,rolling_friction (rolling coefficient),
SetRollingFriction
- 旋转摩擦,spinning_friction,
SetSpinningFriction
- 回弹系数/恢复系数,restitution,
SetRestitution
(它是描述在碰撞过程中,两个物体分离后的相对速度与它们接触前的相对速度之比的物理量。恢复系数用于表征碰撞过程中能量的保留情况,其值范围从0到1) - 其中,静摩擦和滑动摩擦,可以由
SetFriction
一个函数同时设置。
ChMaterialSurfaceNSC和SMC
- A ChSystemNSC for Non Smooth Contacts (NSC); in case of contacts a complementarity solver will take care of them using non smooth dynamics; this is very efficient even with large time steps.
- A ChSystemSMC for SMooth Contacts (SMC); with this system contacts are handled using penalty methods, i.e. contacts are deformable;
用中文进行解释:
- ChSystemNSC(非光滑接触系统):用于处理非光滑接触(NSC,Non-Smooth Contacts)的物理系统。在这种系统中,当接触发生时,将使用互补性求解器(complementarity solver)来处理这些接触,通过非光滑动力学(non-smooth dynamics)原理来解决问题。这种方法即使在使用较大时间步长的情况下也非常高效,因为它不需要精确模拟接触表面之间的微小变形,而是直接处理接触产生的力。
- ChSystemSMC(光滑接触系统):用于处理光滑接触(SMC,Smooth Contacts)的物理系统。与NSC系统不同,SMC系统通过惩罚方法(penalty methods)来处理接触问题,即认为接触是可变形的。在这种情况下,当两个物体接触时,它们的接触表面可以产生变形,仿真将考虑这种变形对接触力的影响。这种方法能够模拟更真实的物理行为,特别是在需要精确考虑接触变形时,但可能需要更小的时间步长以保持计算的准确性。
所以可以看出,这两种只是在计算时,是否精细考虑接触面造成的形变等因素,SMC的相比更加复杂。
ChMaterialSurfaceNSC
在ChMaterialSurface
的基础上,新增属性:凝聚力(Cohesion)最大值、接触阻尼(Damping)、正向接触柔顺性(Compliance)、切向接触柔顺性(ComplianceT)等,不展开介绍。
ChMaterialSurfaceSMC
在ChMaterialSurface
的基础上,新增属性:杨氏模量(Young’s Modulus)、泊松比(Possion Ration)等和形变相关的参数。具体内容参考头文件。
2、创建一个地型terrain
2.1 地型类别
Chrono: Terrain models
根据文档,地型包括:简单平面地型、刚性地型、CRG地型、可变SCM地型、含颗粒地型等。其中,重点关注刚性地形。
刚性地形,又包括:box、obj文件、高程bmp文件,三种形式。box的定义较为简单,obj和bmp格式载入时没有本质的区别。
2.2 代码自定义地型
创建地形,包括以下几个关键步骤:绑定物理系统、创建地面材质并设定参数、创建地形尺寸参数并添加材质、纹理设置(可选)、初始化。
关键代码如下:
RigidTerrain terrain(hmmwv.GetSystem());
auto patch_mat = chrono_types::make_shared<ChMaterialSurfaceSMC>(); // 创建地面材质
patch_mat->SetFriction(0.9f); // 进行一些地面材质设定
patch_mat->SetRestitution(0.01f);
patch_mat->SetYoungModulus(2e7f);
auto patch = terrain.AddPatch(patch_mat, ChCoordsys<>(ChVector<>(20, 0, 0), QUNIT), "C:/Users/larrydong/Desktop/my_terrain.bmp", 64.0, 64.0, 0.0, 0.1); //
patch->SetTexture(vehicle::GetDataFile("terrain/textures/grass.jpg"), 6.0f, 6.0f); // 贴图
terrain.Initialize(); // 初始化
其中,terrain.AddPatch
这一步,读取一个bmp的数字高程作为地型,尺寸时64x64(米),最小值(纯黑色像素)设置为0米,最大值(纯白色像素)设置为0.1米,并指定位置和旋转。这个bmp的地型的地表材质就是刚刚上面介绍的表面材质。
2.3 从JSON文件载入地型
另一种方式是直接从json文件载入地型,代码只需要一行:
RigidTerrain terrain(hmmwv.GetSystem(), "path/to/xxx.json");
打开参考例子的json文件,可以看出,在json里面定义了所有有关的内容,例如下面这个载入一个数字高程地型,定义了位置、数字高程图、材料、可视化等内容,和用代码自定义的方式一样。
在RigidTerrain初始化时,如果发现给定了一个文件路径,就会读取这个json文件,查找匹配字段,自动确定是哪种terrain并进行相关设置。需要注意的是,json文件中的路径,全部是通过vehicle::GetDataFile
的方式读取的,因此需要设定vehicle相关的path正确(chrono::vehicle::SetDataPath
)。但我用JSON的方式载入,无法正确载入地型和纹理贴图,虽然路径设置对了,目前还没搞清楚原因……
3、地型与车辆
在chrono中,terrain是位于vechile模块下方,因此地型的出现势必伴随着vehicle的设定。但本文没有涉及任何关于vehicle的内容,下一篇再做介绍。