多物理场仿真 Chrono(1.9) Collision shapes碰撞形状

为方便查阅,此文是原网站文档翻译,如有侵权,请与本人联系。

Collision shapes

碰撞形状可以选择性地添加到ChBody对象中。将碰撞形状附着到实体使它们能够在模拟过程中通过摩擦和接触与其他实体进行交互。

碰撞模型

每个实体都包含一个ChCollisionModel。这可用于定义碰撞形状。
在这里插入图片描述

  • 碰撞形状是相对于车身的REF框架定义的
  • 形状示例:球体、长方体、圆柱体、凸壳、椭球体、化合物等。
  • 可以将多个碰撞形状添加到刚体中。然而,复合形状会减慢模拟的碰撞检测阶段。在这种情况下,没有比位于刚体质心的球体更容易处理的几何体了。
  • 凹形的处理取决于凸形并集中几何体的分解
  • 对于已经包含碰撞形状的简单即用实体,请使用ChBodyEasySphere、ChBodyEasy Box
  • 碰撞形状和可视化资源不需要匹配;例如,为了渲染的目的,可以有一个详细的可视化形状,但碰撞形状要简单得多,以避免模拟速度减慢。
  • 避免过薄、过平或通常导致极端尺寸比的形状
    创建ChBody后设置碰撞的步骤:

body_b->GetCollisionModel()->ClearModel();
body_b->GetCollisionModel()->AddSphere(myradius);

body_b->GetCollisionModel()->BuildModel();
body_b->SetCollide(true);

碰撞族

可以为选择性碰撞定义碰撞族。例如,您可能不希望族=2的对象与族=4的任何对象碰撞:

// default collision family is 0. Change it:
body_b->GetCollisionModel()->SetFamily(2);
body_b->GetCollisionModel()->SetFamilyMaskNoCollisionWithFamily(4);
目前,Chrono最多允许15个不同的碰撞族参与模拟。

碰撞表面材质

向物体添加碰撞形状通常需要用户定义碰撞表面的一些特性,例如摩擦、滚动摩擦、恢复系数等。这可以通过chrono::ChMaterialSurfaceNSC或chrono::ChMaterialSuraceSMC类进行设置。事实上,Chrono可以处理两种不同的触点配方-非光滑触点(NSC)和Smooth触点(SMC)-每种触点都需要不同的表面材料类型,具体取决于使用的Chrono::ChSystem(请参阅ChSystem手册)。
一旦做出选择,用户可以通过以下两种方式设置表面材质特性:
内置材料(消耗内存)
每个实体都有自己的ChMaterialSurface内置实例,该实例由实体本身自动创建,类型为chrono::ChMaterialSurfaceNSC。
用户可以像这样访问这种内置表面材料(对于SMC版本也是如此):

body_b->GetMaterialSurfaceNSC()->SetFriction(0.1);
body_c->GetMaterialSurfaceNSC()->SetFriction(0.2);
body_d->GetMaterialSurfaceNSC()->SetFriction(0.3);

请注意,在这种情况下,每个主体都有自己的表面材料。对于上面的示例,这将导致三种不同的表面材质实例。在大量实体的情况下,这可能会导致内存问题。我们将在下一节中看到如何避免这种情况。为了创建一个处理SMooth触点(SMC)的ChBody,必须在ChBody构造过程中设置相应的选项。例如:

auto body_a = std::make_shared<ChBodyAuxRef>(ChMaterialSurface::SMC);

有关更多详细信息,请参阅 chrono::ChBody 参考。

共享材料

在某些情况下,不同的实体可能共享相同的表面材料特性。
在这种(非常常见)情况下,用户只能创建一个ChMaterialSurfaceNSC(或ChMaterialSuraceSMC)实例,并在不同的实体之间共享。然后,这些实体将丢弃其内置的ChMaterialSurfaceXXX实例。

// Create a surface material and set its properties
auto material = std::make_shared<ChMaterialSurfaceSMC>();
material->SetRestitution(0.1f);
material->SetFriction(0.4f);
material->SetAdhesion(0.0f);
 
// Assign surface material to one or more bodies:
body_b->SetMaterialSurface(material);
body_c->SetMaterialSurface(material);
body_d->SetMaterialSurface(material);

正如我们所看到的,有几个理想的效果:

  • 在内存中只创建了一个ChMaterialSurfaceXXX实例,从而限制了内存占用;
  • 用户可以在调用主体构造函数后设置表面材料类型([NSC|SMC])
    但是,用户应该考虑到这些属性实际上是共享的,因此body_d->GetMaterialSurfaceNSC()->SetFriction(0.3);也会影响body_bbody_c

复制(复制构造)或克隆实体时,默认情况下,ChMaterialSurface实例是共享的,而不是复制的。

碰撞公差

每个碰撞模型都有两个公差,用于碰撞引擎创建和删除接触:

  • 一个向外的完全的“包络”,这表示潜在的接触体将被搜索,换言之,为了碰撞检测的目的,物体变得蓬松或膨胀了少量,这是用户控制的。理由:尽管在一个时间步长开始时,两个机构可能没有接触,但在一个整合时间步长期间,它们可能会接触。这个信封提供了这种可能性。更具体地说,数值方案需要这个包络,因为它们必须提前预测接触。如果在对象已经相互渗透时将这些接触发送到解算器,则运动可能会不稳定且不太准确。包络过大会产生很多误报(就接触而言),这会减慢碰撞检测和解决阶段的速度。后者是由于许多接触将被解决,只会产生“零接触力”的答案。
  • 向内的边缘。由于数值积分误差、碰撞检测近似值、不明确的初始条件等原因,属于不同物体的两个碰撞形状即使被认为是刚性的,也可能相互渗透。“转到”碰撞检测算法可以支持达到该裕度的互穿。当越过此边界时,解算器会返回到较慢的碰撞检测算法。
    快速碰撞算法必须在形状的“收缩”版本之间运行,然后通过向外偏移碰撞点来恢复原始形状。因此产生了舍入效应。在下面的图片中,两个蓝色形状被添加为尖锐的方框,但从碰撞的角度来看,效果就像有圆角的方框,圆角半径是碰撞裕度。
    在这里插入图片描述
    信封和/或保证金选择不佳的缺点:
  • 碰撞包络过大:
    • 许多潜在接触
    • 耗时
    • 耗内存
  • 碰撞包络过小:
    • 隧道效应风险
    • 模拟不稳定、不稳定,尤其是在处理堆叠对象时
  • 碰撞边缘过大
    • 形状看起来太“粗糙”
  • 碰撞边缘过小
    • 当互穿超过该值时,将使用低效的算法

设置包络/边距的值:

collision::ChCollisionModel::SetDefaultSuggestedEnvelope(0.001);
collision::ChCollisionModel::SetDefaultSuggestedMargin(0.0005);

这些设置将影响在这些函数调用后创建的碰撞形状。
可以多次调用SetDefaultSuggestedEnvelope和SetDefaultSugestedMargin,但一旦用碰撞形状填充碰撞模型,就无法更改封套和边距。

最后,还有一个接触断开阈值,这是所有模型的全局容差。它可以设置为如下示例:

collision::ChCollisionSystemBullet::SetContactBreakingThreshold(0.001);

接触断开阈值表示在接触被认为不存在之前接触的两个碰撞形状之间的最大距离。这是由于Chrono在许多情况下依赖于Bullet碰撞算法,并且Bullet在一个模拟帧到下一个模拟框之间保持接触点的持久性。此阈值指示Bullet何时严重影响两个碰撞形状之间的接触。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值