Sofa framework (2) ----- Main Principles

本文介绍了SOFA框架的核心概念,包括场景图的结构、数据管理、标签应用、动画循环及访问者模式等内容。SOFA框架采用模块化设计,支持通过XML或Python脚本构建仿真场景,适用于复杂的物理仿真需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 场景 (Scene Graph)

SOFA中的仿真被描述为具有内在广义层次结构的场景。 场景由节点构成树或有向无环图(DAG)组成。 不同的节点描述不同的仿真对象,也可以在不同的子节点中完成相同对象的不同表示。
Fig. 1 – A graph with one single child node

1.1 场景的结构 (Structure of a scene)

场景从一个父节点开始,称为“根”节点。 所有其他节点(称为子节点)都从此主节点继承。 在图1中,定义了第一个子节点“肝脏”并表示第一个对象。 通常,一个节点是与同一对象相关联的组件的集合(这些组件有相同的自由度)。

这种设计是高度模块化的,因为场景中的组是件彼此独立的。 通过更改图中的一个组件,可以简单地用另一个物理模型(三角形FEM)替换一个物理模型(弹簧)。 以同样的方式,通过修改场景对应XML文件中的一行,可以用隐式的解算器(EulerImplicitSolver)替换显式解算器方案(EulerSolver)。 框架的这种高模块性是由下面描述的scenegraph-visitor 实现的。
Fig. 2 – A graph with one object and its two representations (mechanics and visual)

如图2所示,节点可以在图中串行构建。 这种分层图允许同一对象的多种不同表示。 在该示例中,第一子节点“肝脏”实现肝脏的机械行为(六面体网格),而子节点“视觉”描述肝脏的表面模型(三角形网格)。Fig. 3 – A graph including two different objects computed in the same simulation

图3显示了涉及两个不同对象的仿真。 第一个节点可以计算肝脏的机械行为,而第二个节点可以模拟心脏的电气行为。 这两个系统依赖于两种不同的自由度,例如不同的物理现象。 因此,必须在两个不同的节点中描述它们。 此功能显示了SOFA轻松开发的优势和耦合模型的能力。

要在SOFA中构建仿真,可以使用以下方法编写场景图:
*** XML文件。 阅读关于如何用XML编写场景的相关页面。
*** Python脚本。 阅读有关如何使用Python编写的相关页面。

1.2 数据 (Data)

图1的这个“肝脏”节点包括用于构建肝脏的机械仿真的组件(求解器,力场,质量)。每个组件都包含属性。例如,质量分量具有质量密度的属性;迭代线性求解器需要一个定义最大迭代次数的属性。这些属性也称为数据。这些数据是容器,提供用于XML文件中的序列化以及在用户界面中自动创建输入/输出窗口小部件的反射API。

两个数据实例可以相互连接以保持其值同步。只有当它们都具有相同的类型(float,vector )时才可以这样做。惰性求值机制用于递归标记不是最新的数据。然后,重新计算数据(仅在必要时)。互连Data对象的网络定义了数据依赖关系图。在XML文件中,当使用“@”时,一个Data连接到另一个Data:

<Component dataname =“@ path_to / component.data”/> 

阅读有关“组件和数据”文档页面上的数据的更多信息。

1.3 标签 (Tag)

任何组件都可以设置一个或多个“标签”。 “标签”数据字段可用于任何SOFA组件。标记用于查找场景中的特定组件,区分场景图中同一类的多个实例,或者以不同方式处理这些实例(请参阅MultiTagAnimationLoop下面的内容)。

1.4 动画循环 (Animation Loop)

SOFA中的所有场景都必须包含AnimationLoop。此类规则模拟的所有步骤和系统解析,它们按特定顺序相互接替。在每个时间步,动画循环通过访问者机制触发每个事件(解决矩阵系统,管理约束,检测碰撞等)(见下文)。在场景中,如果未定义动画循环,则会自动创建“DefaultAnimationLoop”。否则,在XML格式中,可以写入:

在XML格式中,这将写成如下:

<Node name="root" dt="0.01" gravity="0 -9.81 0">
    <DefaultAnimationLoop />
</Node>

SOFA中已有几个AnimationLoops:

  • DefaultAnimationLoop:这是名称所示的默认动画循环!如果场景中未指定动画循环,则此动画循环默认包含在图形的根节点中。使用DefaultAnimationLoop,一个模拟步骤的循环如下:
  1. 构建并解决场景中的所有线性系统:碰撞和时间积分,以计算自由度的新值
  2. 更新上下文(dt ++)
  3. 更新映射
  4. 更新边界框(覆盖场景的所有对象的体积)
  • MultiTagAnimationLoop:此动画循环通过使用不同标记标记组件来工作。使用MultiTagAnimationLoop,一个模拟步骤的循环与DefaultAnimationLoop相同,只是在给定标签列表的情况下,一个标签在另一个标签之后求解:
  1. 构建并解决场景中的所有线性系统
  2. 对于使用第一个标记的所有组件和节点
  3. 那么第二个标签…依此类推
  4. 更新上下文
  5. 更新映射
  6. 更新边界框
  • MultiStepAnimationLoop:给定一个时间步,这个动画循环允许在一个步骤(I)中运行几个碰撞(C)和几个积分时间,其中C和I可以是不同的。如果时间步长为dt = 0.01,则碰撞步骤数C = 2且积分步数为I = 4,则进行一个模拟步骤的循环:
  1. 计算C =碰撞管道的4倍(4个碰撞步骤)
    • 对于每个碰撞步骤,由于积分,求解线性系统的I = 4倍。因此,积分时间步长是dt’= dt /(C.I)= 0.00125(8个积分步骤)。- - 对于每个碰撞步骤,由于积分,求解线性系统的I = 4倍。因此,积分时间步长是dt’= dt /(C.I)= 0.00125(8个积分步骤)。
  1. 更新上下文
  2. 更新映射
  3. 更新边界框:这意味着可视化在每个时间步dt = 0.01时完成一次
  • FreeAnimationLoop:此动画循环用于涉及约束和碰撞的模拟。使用FreeAnimationLoop,一个模拟步骤的循环如下:
  1. 在没有约束的情况下构建和解决场景中的所有线性系统,并保存自由度的“自由”值
  2. 计算碰撞
  3. 约束最终用于纠正“自由”自由度,以便考虑碰撞和约束
  4. 更新映射
  5. 更新边界框

1.5 访问器 (Visitor)

在模拟的不同步骤(初始化,系统组装,求解,可视化)期间,需要从所有图节点恢复信息。基于Visitor的隐式机制实现了这一点。您可以在SofaSimulation包中找到抽象的Visitor类。

对于每个步骤,访问者执行的操作可以描述为:

  • 图遍历
  • 取决于触发动作的抽象方法(例如:清除全局向量或累积力),
  • 和矢量识别器。

访问器从上到下和自下而上遍历场景,并在每个图节点遍历时调用相应的虚函数。因此,访问器用于通过调用相关的虚拟函数来触发动作(例如,动画化模拟,累积力)。模拟对象的算法操作是通过派生Visitor类并重载其虚函数topDown()和bottomUp()来实现的。这种方法隐藏了组件中的场景结构(父级,子级),以实现更多的实现灵活性和更好地控制执行模型。此外,可以独立于在每个节点处执行的机械计算来应用各种并行策略。实际上,数据结构从严格的层次结构扩展到有向非循环图,以处理更一般的运动依赖性。除非已经遍历了当前节点的所有父节点,否则将修剪自上而下的节点遍历,以便只有遍历了所有父节点后才遍历具有多个父节点的节点。自下而上的遍历以相反的顺序进行。

示例:累积力量。累积力用于计算应用于对象的所有力(内部或外部)。然后,解算器触发关联访问器,并且操作通过图传播,并在每个强制和映射节点调用适当的(自下而上)方法。所有能够计算力量的组件都会累积其贡献。此信息最终在MechanicalObject中收集,解算器将使用此“力”向量来求解数学系统。
Traversing Visitors triggered for the accumulateForce() action

1.6 序列图 (Sequence diagram)

以下是SOFA仿真的常用顺序图。
Sequence diagram of a SOFA simulation
有关访客的更多信息,请点击此处

Reference

https://www.sofa-framework.org/community/doc : main-principles

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值