多体动力学仿真软件:MATLAB_Simulink_(5).约束和连接建模
约束和连接建模
在进行多体动力学仿真时,约束与联结被视为描述系统中各刚体间相互关系的关键工具。它们决定了各刚体间的相对运动模式及力的传递路径,并从而使得整个系统的动态行为能够更为精确地模仿真实物理现象。本节将深入探讨如何在MATLAB Simulink环境中构建约束与联结模型,并涵盖常见类型、典型联结方式及其应用场景分析。

1. 常见约束类型
在多体动力学仿真中,常见的约束类型包括:
位置约束 :限制刚体在特定位置上的运动。
速度约束 :限制刚体在特定速度上的运动。
力约束 :限制刚体之间传递的力。
运动约束 :限制刚体之间的相对运动。
1.1 位置约束
位置约束用于限制刚体在空间中的动态行为。例如,在某些应用中, 刚体会被固定在一个参考坐标系中;或者两者的相对距离会被精确设定以维持稳定
1.1.1 固定点约束
定点约束可被用来将一个刚体固定于空间中的某一特定位置。而在Simulink环境中,则可通过配置Fixed Joint块来实现定点约束的应用。
示例 :将一个刚体固定在空间中的原点。
% 创建Simulink模型
model = 'FixedJointExample';
new_system(model);
% 添加刚体
rigidBody1 = add_block('SimMechanics/Blocks/Rigid Body', [model '/RigidBody1'], 'Position', [0 0 0]);
% 添加固定关节
fixedJoint = add_block('SimMechanics/Blocks/Fixed Joint', [model '/FixedJoint1'], 'Position', [0 0 0]);
% 连接刚体和固定关节
connect([model '/RigidBody1'], [model '/FixedJoint1']);
% 设置仿真时间
set_param(model, 'StopTime', '10');
% 保存模型
save_system(model);
1.2 速度约束
通过速度约束来限制刚体在特定速度范围内的运动。举例而言,在机械系统中,一个刚体通常会维持恒定的速度;而在机器人学中,则要求两个不同的刚体之间保持相对恒定的速度。
1.2.1 恒定速度约束
恒定速度约束可以通过配置Velocity Source块来达成。此模块可设定物体的初始运动速度并持续维持该速度。
示例 :设置一个刚体以恒定速度沿x轴运动。
% 创建Simulink模型
model = 'VelocitySourceExample';
new_system(model);
% 添加刚体
rigidBody1 = add_block('SimMechanics/Blocks/Rigid Body', [model '/RigidBody1'], 'Position', [0 0 0]);
% 添加速度源
velocitySource = add_block('SimMechanics/Blocks/Velocity Source', [model '/VelocitySource1'], 'Position', [0 0 0]);
% 设置速度源参数
set_param([model '/VelocitySource1'], 'v', '5'); % 设置沿x轴的速度为5 m/s
% 连接刚体和速度源
connect([model '/VelocitySource1'], [model '/RigidBody1'], 'v');
% 设置仿真时间
set_param(model, 'StopTime', '10');
% 保存模型
save_system(model);
1.3 力约束
力约束被用来限制刚体之间传递的力。也可能是这样:一个刚体可能需要承受特定的外加载荷作用;或者在连接处设置两个刚体之间的接触约束以保持恒定的传递。
1.3.1 固定力约束
基于Force块能够实现固定作用力约束。此Force块可配置所施加的恒定外力。
示例 :设置一个刚体受到10 N的沿y轴的力。
% 创建Simulink模型
model = 'ForceExample';
new_system(model);
% 添加刚体
rigidBody1 = add_block('SimMechanics/Blocks/Rigid Body', [model '/RigidBody1'], 'Position', [0 0 0]);
% 添加力块
force = add_block('SimMechanics/Blocks/Force', [model '/Force1'], 'Position', [0 0 0]);
% 设置力块参数
set_param([model '/Force1'], 'F', '[0 10 0]'); % 设置沿y轴的力为10 N
% 连接刚体和力块
connect([model '/Force1'], [model '/RigidBody1'], 'F');
% 设置仿真时间
set_param(model, 'StopTime', '10');
% 保存模型
save_system(model);
1.4 运动约束
运动约束不仅用于限制刚体之间的相对运动,还可能要求一个刚体相对于另一个以特定的方式进行移动。
1.4.1 滑动约束
滑动约束可以通过借助Prismatic Joint块来实现。此结构支持刚体在一个特定方向上的自由运动。
示例 :设置一个刚体沿z轴滑动。
% 创建Simulink模型
model = 'PrismaticJointExample';
new_system(model);
% 添加刚体
rigidBody1 = add_block('SimMechanics/Blocks/Rigid Body', [model '/RigidBody1'], 'Position', [0 0 0]);
rigidBody2 = add_block('SimMechanics/Blocks/Rigid Body', [model '/RigidBody2'], 'Position', [0 0 0]);
% 添加滑动关节
prismaticJoint = add_block('SimMechanics/Blocks/Prismatic Joint', [model '/PrismaticJoint1'], 'Position', [0 0 0]);
% 设置滑动关节参数
set_param([model '/PrismaticJoint1'], 'Axis', 'Z');
% 连接刚体和滑动关节
connect([model '/RigidBody1'], [model '/PrismaticJoint1'], 'R');
connect([model '/RigidBody2'], [model '/PrismaticJoint1'], 'F');
% 设置仿真时间
set_param(model, 'StopTime', '10');
% 保存模型
save_system(model);
2. 连接方式
对于多体动力学仿真而言,在定义刚体间的相互作用时,采用特定的连接方案是必要的。通常所涉及的常见连接方案主要包括几种主要类型。
刚性连接 :两个刚体之间的相对位置和姿态保持不变。
弹性连接 :两个刚体之间通过弹性元件连接,允许一定的变形。
铰链连接 :两个刚体之间通过铰链连接,允许绕某个轴旋转。
滑动连接 :两个刚体之间通过滑动关节连接,允许沿某个方向滑动。
2.1 刚性连接
严格连接通过Fixed Joint块来实现以保证两个刚体之间的相对位置和姿态固定不变
示例 :将两个刚体刚性连接。
% 创建Simulink模型
model = 'FixedJointConnectionExample';
new_system(model);
% 添加刚体
rigidBody1 = add_block('SimMechanics/Blocks/Rigid Body', [model '/RigidBody1'], 'Position', [0 0 0]);
rigidBody2 = add_block('SimMechanics/Blocks/Rigid Body', [model '/RigidBody2'], 'Position', [1 0 0]);
% 添加固定关节
fixedJoint = add_block('SimMechanics/Blocks/Fixed Joint', [model '/FixedJoint1'], 'Position', [0 0 0]);
% 连接刚体和固定关节
connect([model '/RigidBody1'], [model '/FixedJoint1'], 'R');
connect([model '/RigidBody2'], [model '/FixedJoint1'], 'F');
% 设置仿真时间
set_param(model, 'StopTime', '10');
% 保存模型
save_system(model);
2.2 弹性连接
弹性连接由Spring and Damper组件构成,能够提供一定程度的变形模拟。
示例 :设置两个刚体之间的弹性连接。
% 创建Simulink模型
model = 'ElasticConnectionExample';
new_system(model);
% 添加刚体
rigidBody1 = add_block('SimMechanics/Blocks/Rigid Body', [model '/RigidBody1'], 'Position', [0 0 0]);
rigidBody2 = add_block('SimMechanics/Blocks/Rigid Body', [model '/RigidBody2'], 'Position', [1 0 0]);
% 添加弹簧和阻尼块
springDamper = add_block('SimMechanics/Blocks/Spring and Damper', [model '/SpringDamper1'], 'Position', [0 0 0]);
% 设置弹簧和阻尼块参数
set_param([model '/SpringDamper1'], 'Stiffness', '1000'); % 设置弹簧刚度为1000 N/m
set_param([model '/SpringDamper1'], 'Damping', '50'); % 设置阻尼系数为50 Ns/m
% 连接刚体和弹簧阻尼块
connect([model '/RigidBody1'], [model '/SpringDamper1'], 'R');
connect([model '/RigidBody2'], [model '/SpringDamper1'], 'F');
% 设置仿真时间
set_param(model, 'StopTime', '10');
% 保存模型
save_system(model);
2.3 铰链连接
铰链连接使用 Revolute Joint 块来实现,并支持两个刚体围绕某轴转动
示例 :设置两个刚体之间的铰链连接。
% 创建Simulink模型
model = 'RevoluteJointConnectionExample';
new_system(model);
% 添加刚体
rigidBody1 = add_block('SimMechanics/Blocks/Rigid Body', [model '/RigidBody1'], 'Position', [0 0 0]);
rigidBody2 = add_block('SimMechanics/Blocks/Rigid Body', [model '/RigidBody2'], 'Position', [1 0 0]);
% 添加铰链关节
revoluteJoint = add_block('SimMechanics/Blocks/Revolute Joint', [model '/RevoluteJoint1'], 'Position', [0 0 0]);
% 设置铰链关节参数
set_param([model '/RevoluteJoint1'], 'Axis', 'X'); % 设置绕x轴旋转
% 连接刚体和铰链关节
connect([model '/RigidBody1'], [model '/RevoluteJoint1'], 'R');
connect([model '/RigidBody2'], [model '/RevoluteJoint1'], 'F');
% 设置仿真时间
set_param(model, 'StopTime', '10');
% 保存模型
save_system(model);
2.4 滑动连接
滑动连接采用Prismatic Joint组件来实现功能,在此结构中,允许两个刚体在特定方向上进行相对滑动
示例 :设置两个刚体之间的滑动连接。
% 创建Simulink模型
model = 'PrismaticJointConnectionExample';
new_system(model);
% 添加刚体
rigidBody1 = add_block('SimMechanics/Blocks/Rigid Body', [model '/RigidBody1'], 'Position', [0 0 0]);
rigidBody2 = add_block('SimMechanics/Blocks/Rigid Body', [model '/RigidBody2'], 'Position', [1 0 0]);
% 添加滑动关节
prismaticJoint = add_block('SimMechanics/Blocks/Prismatic Joint', [model '/PrismaticJoint1'], 'Position', [0 0 0]);
% 设置滑动关节参数
set_param([model '/PrismaticJoint1'], 'Axis', 'Y'); % 设置沿y轴滑动
% 连接刚体和滑动关节
connect([model '/RigidBody1'], [model '/PrismaticJoint1'], 'R');
connect([model '/RigidBody2'], [model '/PrismaticJoint1'], 'F');
% 设置仿真时间
set_param(model, 'StopTime', '10');
% 保存模型
save_system(model);
3. 复杂约束和连接建模
在实际应用中,在工程实践中涉及的多体系统之间的相互制约与相互连接往往具有较高的复杂性,在这种情况下往往需要综合运用多种制约关系与连接方式以实现系统的整体优化设计。本节将深入探讨如何在MATLAB Simulink环境中构建这些复杂而精密的制约体系,并涵盖包括但不限于是多关节约束、多力约束以及多运动约束等多种类型的具体实现方法
3.1 多关节约束
多自由度约束被用来描述多个刚体之间的复杂运动关系。例如,在机械臂的操作过程中需要各个关节协同配合完成动作。通过合理搭配不同类型的关节结构设计,在实际应用中可以达到更为复杂的动作表现。
示例 :建模一个简单的机械臂,包含两个铰链关节。
% 创建Simulink模型
model = 'MultiJointExample';
new_system(model);
% 添加刚体
rigidBody1 = add_block('SimMechanics/Blocks/Rigid Body', [model '/RigidBody1'], 'Position', [0 0 0]);
rigidBody2 = add_block('SimMechanics/Blocks/Rigid Body', [model '/RigidBody2'], 'Position', [1 0 0]);
rigidBody3 = add_block('SimMechanics/Blocks/Rigid Body', [model '/RigidBody3'], 'Position', [2 0 0]);
% 添加铰链关节
revoluteJoint1 = add_block('SimMechanics/Blocks/Revolute Joint', [model '/RevoluteJoint1'], 'Position', [0 0 0]);
revoluteJoint2 = add_block('SimMechanics/Blocks/Revolute Joint', [model '/RevoluteJoint2'], 'Position', [1 0 0]);
% 设置铰链关节参数
set_param([model '/RevoluteJoint1'], 'Axis', 'X'); % 设置绕x轴旋转
set_param([model '/RevoluteJoint2'], 'Axis', 'Y'); % 设置绕y轴旋转
% 连接刚体和关节
connect([model '/RigidBody1'], [model '/RevoluteJoint1'], 'R');
connect([model '/RigidBody2'], [model '/RevoluteJoint1'], 'F');
connect([model '/RigidBody2'], [model '/RevoluteJoint2'], 'R');
connect([model '/RigidBody3'], [model '/RevoluteJoint2'], 'F');
% 设置仿真时间
set_param(model, 'StopTime', '10');
% 保存模型
save_system(model);
3.2 多力约束
多输入受力协调机制用于表征多个刚体间的复杂相互作用关系。具体来说,在一个机械系统中可能存在多个弹簧组件以及相应的阻尼装置。通过合理配置不同类型的受力源与阻尼装置,则可达到更为复杂的相互作用模式
示例 :建模一个包含两个弹簧和阻尼器的多力约束系统。
% 创建Simulink模型
model = 'MultiForceExample';
new_system(model);
% 添加刚体
rigidBody1 = add_block('SimMechanics/Blocks/Rigid Body', [model '/RigidBody1'], 'Position', [0 0 0]);
rigidBody2 = add_block('SimMechanics/Blocks/Rigid Body', [model '/RigidBody2'], 'Position', [1 0 0]);
rigidBody3 = add_block('SimMechanics/Blocks/Rigid Body', [model '/RigidBody3'], 'Position', [2 0 0]);
% 添加弹簧和阻尼块
springDamper1 = add_block('SimMechanics/Blocks/Spring and Damper', [model '/SpringDamper1'], 'Position', [0 0 0]);
springDamper2 = add_block('SimMechanics/Blocks/Spring and Damper', [model '/SpringDamper2'], 'Position', [1 0 0]);
% 设置弹簧和阻尼块参数
set_param([model '/SpringDamper1'], 'Stiffness', '1000'); % 设置弹簧刚度为1000 N/m
set_param([model '/SpringDamper1'], 'Damping', '50'); % 设置阻尼系数为50 Ns/m
set_param([model '/SpringDamper2'], 'Stiffness', '500'); % 设置弹簧刚度为500 N/m
set_param([model '/SpringDamper2'], 'Damping', '25'); % 设置阻尼系数为25 Ns/m
% 连接刚体和弹簧阻尼块
connect([model '/RigidBody1'], [model '/SpringDamper1'], 'R');
connect([model '/RigidBody2'], [model '/SpringDamper1'], 'F');
connect([model '/RigidBody2'], [model '/SpringDamper2'], 'R');
connect([model '/RigidBody3'], [model '/SpringDamper2'], 'F');
% 设置仿真时间
set_param(model, 'StopTime', '10');
% 保存模型
save_system(model);
3.3 多运动约束
多种约束条件被用来描述多个刚体之间的复杂运动关系。例如,在一个机械系统中可能存在多种滑动副和转动副。通过结合不同类型的连接方式,在机械系统中可以获得更为复杂的动态特性。
示例 :建模一个包含两个滑动关节和一个铰链关节的多运动约束系统。
% 创建Simulink模型
model = 'MultiMotionConstraintExample';
new_system(model);
% 添加刚体
rigidBody1 = add_block('SimMechanics/Blocks/Rigid Body', [model '/RigidBody1'], 'Position', [0 0 0]);
rigidBody2 = add_block('SimMechanics/Blocks/Rigid Body', [model '/RigidBody2'], 'Position', [1 0 0]);
rigidBody3 = add_block('SimMechanics/Blocks/Rigid Body', [model '/RigidBody3'], 'Position', [2 0 0]);
% 添加滑动关节
prismaticJoint1 = add_block('SimMechanics/Blocks/Prismatic Joint', [model '/PrismaticJoint1'], 'Position', [0 0 0]);
prismaticJoint2 = add_block('SimMechanics/Blocks/Prismatic Joint', [model '/PrismaticJoint2'], 'Position', [1 0 0]);
% 添加铰链关节
revoluteJoint = add_block('SimMechanics/Blocks/Revolute Joint', [model '/RevoluteJoint1'], 'Position', [1 0 0]);
% 设置滑动关节参数
set_param([model '/PrismaticJoint1'], 'Axis', 'Y'); % 设置沿y轴滑动
set_param([model '/PrismaticJoint2'], 'Axis', 'Z'); % 设置沿z轴滑动
% 设置铰链关节参数
set_param([model '/RevoluteJoint1'], 'Axis', 'X'); % 设置绕x轴旋转
% 连接刚体和关节
connect([model '/RigidBody1'], [model '/PrismaticJoint1'], 'R');
connect([model '/RigidBody2'], [model '/PrismaticJoint1'], 'F');
connect([model '/RigidBody2'], [model '/RevoluteJoint1'], 'R');
connect([model '/RigidBody3'], [model '/RevoluteJoint1'], 'F');
connect([model '/RigidBody3'], [model '/PrismaticJoint2'], 'R');
connect([model '/RigidBody4'], [model '/PrismaticJoint2'], 'F');
% 设置仿真时间
set_param(model, 'StopTime', '10');
% 保存模型
save_system(model);
3.4 组合约束和连接
在处理更为复杂的多体系统时
示例 :建模一个包含滑动关节、铰链关节和弹簧阻尼器的组合系统。
% 创建Simulink模型
model = 'CombinedConstraintExample';
new_system(model);
% 添加刚体
rigidBody1 = add_block('SimMechanics/Blocks/Rigid Body', [model '/RigidBody1'], 'Position', [0 0 0]);
rigidBody2 = add_block('SimMechanics/Blocks/Rigid Body', [model '/RigidBody2'], 'Position', [1 0 0]);
rigidBody3 = add_block('SimMechanics/Blocks/Rigid Body', [model '/RigidBody3'], 'Position', [2 0 0]);
rigidBody4 = add_block('SimMechanics/Blocks/Rigid Body', [model '/RigidBody4'], 'Position', [3 0 0]);
% 添加滑动关节
prismaticJoint1 = add_block('SimMechanics/Blocks/Prismatic Joint', [model '/PrismaticJoint1'], 'Position', [0 0 0]);
prismaticJoint2 = add_block('SimMechanics/Blocks/Prismatic Joint', [model '/PrismaticJoint2'], 'Position', [2 0 0]);
% 添加铰链关节
revoluteJoint1 = add_block('SimMechanics/Blocks/Revolute Joint', [model '/RevoluteJoint1'], 'Position', [1 0 0]);
revoluteJoint2 = add_block('SimMechanics/Blocks/Revolute Joint', [model '/RevoluteJoint2'], 'Position', [3 0 0]);
% 添加弹簧和阻尼块
springDamper1 = add_block('SimMechanics/Blocks/Spring and Damper', [model '/SpringDamper1'], 'Position', [1 0 0]);
springDamper2 = add_block('SimMechanics/Blocks/Spring and Damper', [model '/SpringDamper2'], 'Position', [3 0 0]);
% 设置滑动关节参数
set_param([model '/PrismaticJoint1'], 'Axis', 'Y'); % 设置沿y轴滑动
set_param([model '/PrismaticJoint2'], 'Axis', 'Z'); % 设置沿z轴滑动
% 设置铰链关节参数
set_param([model '/RevoluteJoint1'], 'Axis', 'X'); % 设置绕x轴旋转
set_param([model '/RevoluteJoint2'], 'Axis', 'Y'); % 设置绕y轴旋转
% 设置弹簧和阻尼块参数
set_param([model '/SpringDamper1'], 'Stiffness', '1000'); % 设置弹簧刚度为1000 N/m
set_param([model '/SpringDamper1'], 'Damping', '50'); % 设置阻尼系数为50 Ns/m
set_param([model '/SpringDamper2'], 'Stiffness', '500'); % 设置弹簧刚度为500 N/m
set_param([model '/SpringDamper2'], 'Damping', '25'); % 设置阻尼系数为25 Ns/m
% 连接刚体和关节
connect([model '/RigidBody1'], [model '/PrismaticJoint1'], 'R');
connect([model '/RigidBody2'], [model '/PrismaticJoint1'], 'F');
connect([model '/RigidBody2'], [model '/RevoluteJoint1'], 'R');
connect([model '/RigidBody3'], [model '/RevoluteJoint1'], 'F');
connect([model '/RigidBody3'], [model '/SpringDamper1'], 'R');
connect([model '/RigidBody4'], [model '/SpringDamper1'], 'F');
connect([model '/RigidBody3'], [model '/PrismaticJoint2'], 'R');
connect([model '/RigidBody4'], [model '/PrismaticJoint2'], 'F');
connect([model '/RigidBody4'], [model '/RevoluteJoint2'], 'R');
connect([model '/RigidBody5'], [model '/RevoluteJoint2'], 'F');
% 设置仿真时间
set_param(model, 'StopTime', '10');
% 保存模型
save_system(model);
4. 总结
在多体动力学仿真中,在恰当地应用约束与连接的基础上,则能显著促进物理行为的准确模拟效果。通过本节的学习目标明确后,请您掌握并灵活运用Simulink中的常见约束类型及其相应的连接方式。从简单的单关节模型到复杂的多层次系统(包含多个关节、外力以及多样化的运动限制条件),Simulink均提供了丰富全面的建模工具及相应的模块库支持。这些示例将为您提供宝贵的参考资源与实践机会。希望这些示例能为您在实际进行多体动力学仿真时提供切实的帮助与指导。
5. 进一步阅读和资源
对于那些希望进一步深入地进行学习多体动力学仿真以及Simulink使用的读者来说
MATLAB Simulink官方文档 :全面阐述了Simulink的各项功能模块及其操作步骤。
SimMechanics工具箱教程 :提供了多体动力学建模的具体步骤和示例。
相关书籍 :包括了如《Multibody System Dynamics: Robotics, Vehicles and the Like》以及《MATLAB for Engineers》等著作;这些著作则全面介绍了多体动力学仿真及其相关的MATLAB编程基础。
借助这些资源库,在实践中持续积累实践经验以不断提升多体动力学仿真建模水平
