如何在Modelica中用Prismatic Joint约束平动并使物体移动x米后停止
解决Modelica中Prismatic Joint驱动物体移动指定距离后停止的问题
方案1:分段式阻尼阻力控制(逐步停止,无反向)
核心是用位置触发切换力的类型,初始阶段用恒定力驱动,位移达标后切换为与速度反向的阻尼力,靠阻力消耗动能实现停止,不会反向运动。
图形化搭建步骤
- 先搭基础结构:
BodyBox(设好质量) +PrismaticJoint(一端连世界坐标系,另一端连BodyBox,选好平动轴) - 加PositionSensor:连接到PrismaticJoint的移动端,实时获取物体位移
- 加GreaterEqual逻辑模块:阈值设为目标位移(比如1m),位移达标后输出true
- 加If信号切换模块:
- 条件为false时,输出恒定驱动力(比如10N)
- 条件为true时,输出
-k*v(v是物体速度,k是阻尼系数,比如100N·s/m)
- 加VelocitySensor:获取物体实时速度,连到乘法模块和阻尼系数(Constant模块)相乘,再取反后连到If模块的false分支
- 把If模块的输出连到Force模块,作用在BodyBox上
对应代码片段
model StopAfterDistance Modelica.Mechanics.MultiBody.Parts.BodyBox body(m=1); Modelica.Mechanics.MultiBody.Joints.PrismaticJoint prismatic( animation=Modelica.Mechanics.MultiBody.Types.AnimationOn, axis=Modelica.Mechanics.MultiBody.Types.Axis.X); Modelica.Mechanics.MultiBody.Sensors.PositionSensor posSensor( connectorFrameB=prismatic.frame_b); Modelica.Mechanics.MultiBody.Sensors.VelocitySensor velSensor( connectorFrameB=prismatic.frame_b); Modelica.Blocks.Logical.GreaterEqual ge(threshold=1); Modelica.Blocks.Math.If ifForce; Modelica.Blocks.Sources.Constant driveForce(k=10); Modelica.Blocks.Math.Product dampingForce; Modelica.Blocks.Sources.Constant dampingCoeff(k=100); Modelica.Mechanics.MultiBody.Forces.Force force; equation connect(prismatic.frame_a, Modelica.Mechanics.MultiBody.World.frame_b); connect(prismatic.frame_b, body.frame_a); connect(posSensor.s, ge.u1); connect(ge.y, ifForce.cond); connect(driveForce.y, ifForce.y_true); connect(velSensor.v[1], dampingForce.u1); connect(dampingCoeff.y, dampingForce.u2); connect(-dampingForce.y, ifForce.y_false); connect(ifForce.y, force.f[1]); connect(force.frame, body.frame_b); end StopAfterDistance;
方案2:位置触发关节锁止(突然停止)
如果需要瞬间停止,直接在位移达标后锁死PrismaticJoint,强制固定物体位置。
图形化搭建步骤
- 基础结构同方案1
- 加PositionSensor和GreaterEqual模块,检测位移是否达到1m
- 把GreaterEqual的输出信号连到PrismaticJoint的
locked输入端口(注意部分Modelica库的关节支持动态锁止,若不支持可换用Switch模块切换FixedJoint和PrismaticJoint)
对应代码片段
model LockAfterDistance Modelica.Mechanics.MultiBody.Parts.BodyBox body(m=1); Modelica.Mechanics.MultiBody.Joints.PrismaticJoint prismatic( animation=Modelica.Mechanics.MultiBody.Types.AnimationOn, axis=Modelica.Mechanics.MultiBody.Types.Axis.X, locked=false); Modelica.Mechanics.MultiBody.Sensors.PositionSensor posSensor( connectorFrameB=prismatic.frame_b); Modelica.Blocks.Logical.GreaterEqual ge(threshold=1); equation connect(prismatic.frame_a, Modelica.Mechanics.MultiBody.World.frame_b); connect(prismatic.frame_b, body.frame_a); connect(posSensor.s, ge.u1); connect(ge.y, prismatic.locked); end LockAfterDistance;
调试注意点
- 阻尼系数k要根据物体质量调:质量越大,k可以适当增大,避免停止过慢;如果出现反向,说明k太大,减小即可
- 突然停止的锁止方案:若当前关节不支持动态锁止,可加一个Switch模块,位移达标前用PrismaticJoint,达标后切换为FixedJoint连接物体和世界
- 位移传感器要确保参考系是世界坐标系,避免位移计算错误
内容的提问来源于stack exchange,提问作者xrp.
相关产品推荐
相关产品推荐

