OpenModelica — Предельное положение сустава во время моделирования

#limit #collision #modelica #openmodelica

Вопрос:

В настоящее время я работаю с OpenModelica над реализацией динамической модели роботизированной системы, и я хотел бы реализовать совместные ограничения из-за некоторых физических ограничений. Я немного заблудился, так как не нахожу правильного решения своей проблемы: допустим, у меня есть два звена, соединенных с поворотным шарниром (например, пример с двойным шарниром в MSL), и неограниченное вращение шарнира приведет к столкновению звеньев. Как я могу смоделировать некоторое ограничение соединения, чтобы ограничить угол поворота шарнира, чтобы он оставался между, скажем,- pi/2 и pi/2?

Кроме того, есть ли способ реализовать свойства столкновения для компонентов моей модели? Из того, что я видел до сих пор, большинство моделей с несколькими телами позволяют телам взаимопроникать.

Комментарии:

1. Пожалуйста, отредактируйте вопрос, чтобы ограничить его конкретной проблемой с достаточной детализацией для определения адекватного ответа.

Ответ №1:

В нем нет обнаружения столкновений Modelica.Mechanics.MultiBody , и добавить его непросто.

Для вашего особого случая, было бы возможно использовать в Modelica.Mechanics.Rotational.Components.ElastoBacklash качестве ограничения угла? Это, очевидно, станет намного сложнее даже при использовании «только» двойного маятника, но также должно быть возможно использование ограничения на перемещение Modelica.Mechanics.Translational.Components.ElastoGap .

Пример (модифицированный из двойного маятника MSL), который ограничивает движение маятника отрицательными значениями по оси y:

 model LimitedPendulum   extends Modelica.Icons.Example;   inner Modelica.Mechanics.MultiBody.World world annotation (Placement(  transformation(extent={{-100,-10},{-80,10}})));  Modelica.Mechanics.MultiBody.Joints.Revolute revolute1(useAxisFlange=true,  phi(fixed=true, start=-1.5707963267949),  w(fixed=true, start=10))  annotation (Placement(transformation(extent={{-60,-10},{-40,10}})));  Modelica.Mechanics.Rotational.Components.ElastoBacklash elastoBacklash(  c=1e6,  d=10,  b=3.1415926535898,  phi_rel0=-1.5707963267949)  annotation (Placement(transformation(extent={{-60,30},{-40,50}})));  Modelica.Mechanics.MultiBody.Parts.BodyBox boxBody1(r={0.5,0,0}, width=0.06)  annotation (Placement(transformation(extent={{-20,-10},{0,10}})));  equation   connect(elastoBacklash.flange_b, revolute1.axis) annotation (Line(points={{-40,40},{-40,20},{-50,20},{-50,10}}));  connect(revolute1.support, elastoBacklash.flange_a) annotation (Line(points={{-56,10},{-56,20},{-60,20},{-60,40}}));  connect(revolute1.frame_b, boxBody1.frame_a)  annotation (Line(  points={{-40,0},{-20,0}},  color={95,95,95},  thickness=0.5));  connect(world.frame_b, revolute1.frame_a)  annotation (Line(  points={{-80,0},{-60,0}},  color={95,95,95},  thickness=0.5));  annotation (  experiment(StopTime=3),  uses(Modelica(version="4.0.0"))); end LimitedPendulum;  

Комментарии:

1. Спасибо вам за ваш ответ! Это решение, безусловно, работает с примером маятника, но я думаю, что с некоторыми более сложными моделями это может стать более сложным. Плюс я думаю, что такое решение добавило бы в модель некоторые динамические свойства, которые нежелательны в динамической модели. Можно ли добавить revolute1(useAxisFlange=true, phi(fixed=true, start=-1.5707963267949, min = -3.1415926535898, max = 0) что-то вроде условия? еще раз спасибо

2. Есть несколько вещей, которые следует учитывать при использовании атрибутов min и max: 1. По умолчанию они не проверяются (из-за соображений производительности). 2. Если они будут проверены и нарушены, моделирование будет прервано (или, по крайней мере, будет выведено предупреждение). Причина последнего, вероятно, в том, что нет возможности вычислить общепризнанную реакцию на проверку допустимого диапазона.