#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. Если они будут проверены и нарушены, моделирование будет прервано (или, по крайней мере, будет выведено предупреждение). Причина последнего, вероятно, в том, что нет возможности вычислить общепризнанную реакцию на проверку допустимого диапазона.