Динамическое изменение координат для положения тела в библиотеке Modelica MultiBody
Я довольно новичок в Modelica, только начатый несколько месяцев назад из-за проекта, над которым я работал. В основном выполняю работу с многотельными механическими системами с использованием библиотеки MultiBody, включенной в стандартный дистрибутив Modelica.
Мне нужно изменить положение тела в соответствии с динамически рассчитанными координатами во время симуляции, но я не могу найти способ сделать это.
Это векторная переменная, которая вычисляет положение центра масс данной системы:
Modelica.SIunits.Length CMG[2];
CMG[1] = ... + cos(part3rotation.angles[3]) ... + part3origin[1] ...;
CMG[2] = ...;
Я хотел бы расположить безмассовое тело (FixedShape) по координатам (CMG[1], CMG[2]) как способ отображения центра масс и его движения во время симуляции.
Есть какой-либо способ сделать это?
Я пытался прикрепить тело к фиксированному компоненту перевода, но он ожидает параметр (PARAM) вместо переменной (VAR), и это вызывает ошибку.
Используемое программное обеспечение: Modelica 3.2.2 и Wolfram SystemModeler 5.0.
3 ответа
Решением было изменить класс FixedTranslation, добавив новый вход:
input Modelica.SIunits.Position xyz[3];
и измените уравнения:
frame_b.r_0 = frame_a.r_0 + xyz;
Соединение вектора CMG с вектором xyz класса сделало свое дело.
Я бы добавил рамку Modelica.Mechanics.MultiBody.Interfaces.Frame_b
к вашему телу, а затем добавьте следующие уравнения (взятые из FixedTranslation):
frame_b.r_0 = your_three_d_vector;
frame_b.R = frame_a.R; // or some other orientation
/* Force and torque balance */
zeros(3) = frame_a.f + frame_b.f; // and maybe some other forces in your system
zeros(3) = frame_a.t + frame_b.t + cross(r, frame_b.f); // and maybe some other torques and forces in your system
Чтобы добавить дополнительный соединитель в Modelica, мы должны были бы рассмотреть не только потенциальные переменные (в данном случае, положение и ориентацию), но также переменные потока (силы и моменты).
Я полагаю, вы рассчитываете положение центра масс всей системы относительно инерциальной системы. Тогда вы можете полностью опустить frame_a
в вашем классе, и поэтому не было бы необходимости всегда подключаться frame_a
явно world.frame_b
что явно устарело.
Будьте уверены, чтобы использовать Connections.root(frame_b.R)
вместо Connections.branch(frame_a.R, frame_b.R)
как первоначально определено в FixedTranslation
,
И еще один комментарий. Желательно напрямую работать с векторами, а не с компонентами вектора положения, и использовать функции из Modelica.Mechanics.MultiBody.Frames
для векторных преобразований.