2017-09-20 11 views
1

Je suis relativement nouveau pour Modelica, il y a quelques mois seulement, à cause d'un projet sur lequel je travaillais. Travaillant principalement avec des systèmes mécaniques multi-corps utilisant la bibliothèque MultiBody incluse dans la distribution Modelica standard.Changement dynamique de coordonnées pour la position du corps dans la bibliothèque Modelica MultiBody

J'ai besoin de changer une position du corps en fonction des coordonnées calculées dynamiquement pendant la simulation, mais je ne peux pas trouver un moyen de le faire.

Ceci est la variable de vecteur qui calcule la position du centre de masse du système suivant:

Modelica.SIunits.Length CMG[2]; 

CMG[1] = ... + cos(part3rotation.angles[3]) ... + part3origin[1] ...; 
CMG[2] = ...; 

Je souhaite positionner un corps sans masse (FixedShape) au point de coordonnées (CMG [1], CMG [2]) comme un moyen d'afficher le centre de masse et son mouvement pendant la simulation.

Y at-il un moyen de le faire?

J'ai essayé d'attacher le corps à un composant de traduction fixe mais il attend un paramètre (PARAM) au lieu d'une variable (VAR) et cela provoque une erreur.

Logiciel utilisé: Modelica 3.2.2 et Wolfram SystemModeler 5.0.

Répondre

0

La solution a consisté à modifier la classe FixedTranslation pour inclure une nouvelle entrée:

input Modelica.SIunits.Position xyz[3]; 

et modifier les équations:

frame_b.r_0 = frame_a.r_0 + xyz; 

Avec le vecteur CMG au vecteur xyz de la classe démarche la tour.

1

Je voudrais ajouter un cadre Modelica.Mechanics.MultiBody.Interfaces.Frame_b à votre corps, puis ajoutez les équations suivantes (prises de 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 

Pour ajouter un connecteur supplémentaire Modelica, nous devrions considérer non seulement les variables potentielles (dans ce cas, la position et l'orientation), mais aussi les variables d'écoulement (forces et couples).

0

Je suppose que vous calculez la position du centre de masse du système entier par rapport au système inertiel. Ensuite, vous pouvez complètement omettre frame_a dans votre classe et donc il ne serait pas nécessaire de toujours se connecter frame_a explicitement à world.frame_b qui est évidemment obsolète.

Veillez uniquement à utiliser Connections.root(frame_b.R) au lieu de Connections.branch(frame_a.R, frame_b.R) comme défini à l'origine dans FixedTranslation.

Et encore un commentaire. Il est conseillé de travailler directement avec des vecteurs au lieu de composants vectoriels de position, et d'utiliser les fonctions de Modelica.Mechanics.MultiBody.Frames pour les transformations vectorielles.