原文链接:https://api.projectchrono.org/10.0.0/simulation_system
目录
- 仿真系统总览
- 两大核心系统:NSC 与 SMC
- 时间积分器(Time steppers)
- 求解器(Solvers)
- 碰撞相关全局参数
- 代码示例(C++ / PyChrono)
- 选型与调优总结
1. 仿真系统总览
ChSystem是 Chrono 仿真的核心顶层容器,所有仿真对象(刚体、约束、载荷、有限元网格等)都由它统一管理、调度与求解,是整个仿真程序的基石。
基础特性
ChSystem为抽象基类,无法直接实例化,必须使用它的两个派生类:ChSystemNSC、ChSystemSMC。- 通过
Add()/Remove()方法向系统添加、移除仿真实体。 - 标准仿真开发流程:
- 实例化
ChSystemNSC或ChSystemSMC - 向系统添加刚体、约束、载荷等对象
- 配置时间积分器、求解器、碰撞参数
- 启动动态仿真循环
- 实例化
核心可调参数
绝大多数仿真稳定性、精度、性能问题,都来自以下三类配置:
- 时间积分器:控制时间推进算法与仿真步长
- 求解器:计算加速度、约束反力、接触力(仿真主要性能瓶颈)
- 碰撞参数:修正物体穿透、优化堆叠/低速接触稳定性
补充:若仿真场景无碰撞、无接触,
ChSystemNSC和ChSystemSMC可任意选用,二者表现完全一致。
2. 两大核心系统(NSC 与 SMC)
根据接触求解算法区分两大系统,也是 Chrono 最核心的分类,需根据场景严格选择。
2.1 ChSystemNSC(非光滑接触系统)
- 原理:采用互补求解器处理硬接触,将碰撞、约束视为刚性几何约束,不引入人工刚度项。
- 优势:支持大仿真步长,计算效率高,刚体几乎无穿透。
- 适用:纯刚体机构、车辆、工程机械、刚体堆叠等硬接触场景。
2.2 ChSystemSMC(光滑接触系统)
- 原理:采用罚函数法,将接触等效为弹簧-阻尼模型,允许物体产生微小穿透。
- 优势:算法通用,适配柔性接触、颗粒、软体、大变形结构。
- 劣势:接触刚度越大,要求仿真步长越小,高刚度场景计算效率偏低。
- 适用:颗粒仿真、软碰撞、轮胎形变、FEA 柔性耦合。
3. 时间积分器(Time steppers)
时间积分器也叫时间步长器,作用是通过数值积分算法,在单个仿真步内更新所有对象的位置、速度、姿态等状态。
配置方式(二选一)
- 推荐写法:创建积分器实例,通过
SetTimestepper()挂载到系统(支持自定义积分器)。 - 快捷写法:直接调用
SetTimestepperType()选用官方预设积分器。
主流内置积分器详解
| 积分类型 | 精度 | 核心特性 | 适用范围 | 限制 |
|---|---|---|---|---|
| EULER_IMPLICIT_LINEARIZED 线性化隐式欧拉(默认) | 一阶 | 无嵌套子迭代、运算速度最快;通过稳定算法维持约束闭合 | NSC 硬接触(DVI)、常规多体、通用场景;FEA 一阶求解 | 高阶动力学精度一般 |
| HHT 希尔伯特-休斯-泰勒隐式积分 | 二阶 | 需嵌套子迭代;内置可调数值阻尼;约束闭合精度极高 | FEA 有限元、结构动力学 | 不支持 NSC 硬接触(DVI) |
| NEWMARK | 一阶(特殊参数下二阶) | FEA 领域经典算法,特性与 HHT 相近 | 结构力学、隐式动力学 | 不推荐用于刚性碰撞 |
术语说明:一阶/二阶精度:代表积分全局误差随步长变化的阶数,二阶积分精度更高,但计算开销更大。
专属参数配置示例
HHT 积分器支持自定义数值阻尼系数Alpha,C++ 示例:
// 强制转换为 HHT 积分器并设置参数if(automystepper=std::dynamic_pointer_cast<chrono::ChTimestepperH>(my_system->GetTimestepper())){mystepper->SetAlpha(-0.2);}4. 求解器(Solvers)
求解器由时间积分器调用,每一个仿真步负责求解系统的未知加速度、约束反力、接触力,是仿真最大的算力瓶颈。
配置方式(二选一)
- 推荐写法:自定义求解器实例,通过
SetSolver()挂载。 - 快捷写法:调用
SetSolverType()选用官方预设求解器。
主流迭代求解器能力对照表
| 求解器类型 | 收敛特性 | 支持能力 | 适用场景 |
|---|---|---|---|
| PSOR | 精度较低,复杂模型易收敛停滞 | 支持 NSC 硬接触(DVI) | 小型模型、对精度要求低的快速仿真 |
| APGD | 收敛性优秀、精度高 | 支持 NSC 硬接触(DVI) | 中大型刚体模型、工程高精度仿真 |
| BARZILAIBORWEIN | 收敛稳定,抗大质量比能力强 | 支持 NSC 硬接触(DVI) | 含轻重搭配构件的复杂机构、连杆系统 |
| MINRES | 收敛表现良好 | 不支持 NSC 硬接触,仅适配 FEA | 纯有限元结构仿真 |
| ADMM + PardisoMKL | 全能型 | 同时支持 NSC 硬接触 + FEA | 刚体-柔性耦合大型模型;依赖 PardisoMKL 模块 |
关键配置:最大迭代次数
对于含大量关节、约束、接触的模型,迭代次数不足会导致约束失效、模型错位、仿真发散,必须手动调大。
// C++ 示例:设置迭代求解器最大迭代数为 400my_system->GetSolver()->AsIterative()->SetMaxIterations(400);进阶参数示例
部分求解器拥有专属配置,以 MINRES 对角预处理为例:
if(automsolver=std::dynamic_pointer_cast<chrono::ChSolverMINRES>(my_system->GetSolver())){msolver->SetDiagonalPreconditioning(true);// 开启对角预处理,提升收敛速度}5. 碰撞相关全局参数
针对含碰撞、接触的仿真,系统提供两个核心阈值参数,用于修正数值误差导致的穿透、抖动问题。
5.1 最大穿透修复速度(Max. recovery speed)
- 接口:
SetMaxPenetrationRecoverySpeed(double value) - 作用:当因积分误差、初始错位等问题导致物体相互穿透时,系统会以该速度将物体拉回合法位置。
- 调优规则:
- 数值过大:修复动作剧烈,堆叠物体易弹跳、抖动;
- 数值过小:穿透修正乏力,物体逐步相互嵌入;
- 常规推荐值:
0.1 ~ 0.5。
5.2 最小反弹速度(Min. bounce speed)
- 接口:
SetMinBounceSpeed(double value) - 作用:物体入射速度低于该阈值时,强制回弹系数为 0(完全不反弹),用于稳定堆叠、静置接触。
- 调优规则:
- 数值偏大:堆叠稳定性强,但物理真实性下降;
- 数值偏小:碰撞更贴近真实,但低速接触易产生持续微反弹;
- 常规推荐值:
0.05 ~ 0.2。
6. 代码示例(C++ / PyChrono)
6.1 C++ 完整示例
#include"chrono/physics/ChSystemNSC.h"#include"chrono/physics/ChBody.h"#include"chrono/solver/ChSolverAPGD.h"#include"chrono/timestepper/ChTimestepperHHT.h"intmain(){// 1. 创建 NSC 刚体系统chrono::ChSystemNSC sys;// 2. 配置求解器(APGD + 最大迭代数)sys.SetSolverType(chrono::ChSolver::Type::APGD);sys.GetSolver()->AsIterative()->SetMaxIterations(400);// 3. 配置 HHT 时间积分器并设置参数sys.SetTimestepperType(chrono::ChTimestepper::Type::HHT);if(autohht=std::dynamic_pointer_cast<chrono::ChTimestepperHHT>(sys.GetTimestepper())){hht->SetAlpha(-0.2);}// 4. 碰撞全局参数sys.SetMaxPenetrationRecoverySpeed(0.2);sys.SetMinBounceSpeed(0.1);// 后续:添加刚体、可视化、仿真循环return0;}6.2 PyChrono 完整示例
importpychronoaschronoimportpychrono.irrlichtasirr# 1. 创建 NSC 系统sys=chrono.ChSystemNSC()sys.SetGravitationalAcceleration(chrono.ChVector3d(0,-9.81,0))# 2. 求解器配置sys.SetSolverType(chrono.ChSolver.Type_APGD)iter_solver=sys.GetSolver().AsIterative()iter_solver.SetMaxIterations(400)# 3. 时间积分器sys.SetTimestepperType(chrono.ChTimestepper.Type_HHT)hht_stepper=sys.GetTimestepper()ifisinstance(hht_stepper,chrono.ChTimestepperHHT):hht_stepper.SetAlpha(-0.2)# 4. 碰撞参数sys.SetMaxPenetrationRecoverySpeed(0.2)sys.SetMinBounceSpeed(0.1)# 5. 基础刚体与可视化(省略重复代码)vis=irr.ChVisualSystemIrrlicht()vis.AttachSystem(sys)vis.Initialize()# 仿真循环step=0.01whilevis.Run():vis.BeginScene()vis.Render()vis.EndScene()sys.DoStepDynamics(step)7. 选型与调优总结
7.1 组合选型方案(直接套用)
常规刚体/车辆/硬接触(首选)
系统:ChSystemNSC
积分器:EULER_IMPLICIT_LINEARIZED(默认)
求解器:APGD/BARZILAIBORWEIN
迭代数:300 ~ 500
仿真步长:0.01 ~ 0.02 s纯有限元 FEA / 结构动力学
系统:ChSystemNSC/ChSystemSMC
积分器:HHT/NEWMARK
求解器:MINRES
步长:根据结构刚度适当缩小颗粒/软碰撞/形变仿真
系统:ChSystemSMC
积分器:EULER_IMPLICIT_LINEARIZED
求解器:PSOR/APGD
步长:随接触刚度增大而缩小
7.2 常见问题排查
- 关节松动、约束错位 → 增大求解器最大迭代次数
- 物体相互穿透 → 调大
MaxPenetrationRecoverySpeed;SMC 场景同步增大接触刚度、缩小步长 - 堆叠物体持续抖动 → 调大
MinBounceSpeed,降低穿透修复速度 - 仿真运行缓慢 → 更换简易求解器、降低迭代数、选用一阶积分器
- HHT 积分器报错 → HHT 不支持 NSC 硬接触,更换隐式欧拉积分器
7.3 核心禁忌
- NSC 硬接触场景,禁止使用 HHT / NEWMARK 积分器;
- NSC 场景禁止使用 MINRES 求解器;
- SMC 系统中,接触刚度与仿真步长必须匹配,高刚度搭配大步长会直接导致仿真发散。
补充术语对照表
| 英文术语 | 中文释义 |
|---|---|
| Non Smooth Contacts (NSC) | 非光滑接触(刚性约束接触) |
| SMooth Contacts (SMC) | 光滑接触(罚函数柔性接触) |
| Time stepper / Integrator | 时间积分器 / 时间步长器 |
| Iterative solver | 迭代求解器 |
| Penetration recovery | 穿透修复 |
| Restitution | 回弹系数 |
| DVI | 变分不等式(NSC 硬接触底层算法) |
需要我结合FEA 柔性体场景,给你一套专属的积分器+求解器参数搭配吗?