| 1 | package Modelica "Modelica Standard Library (Version 3.1)"
|
|---|
| 2 | extends Modelica.Icons.Library;
|
|---|
| 3 | annotation(preferredView="info", version="3.1", versionBuild=5, versionDate="2009-08-14", dateModified="2009-12-18 08:49:49Z", revisionId="$Id:: package.mo 3222 2009-12-18 08:53:50Z #$", conversion(noneFromVersion="3.0.1", noneFromVersion="3.0", from(version="2.1", script="Scripts/ConvertModelica_from_2.2.2_to_3.0.mos"), from(version="2.2", script="Scripts/ConvertModelica_from_2.2.2_to_3.0.mos"), from(version="2.2.1", script="Scripts/ConvertModelica_from_2.2.2_to_3.0.mos"), from(version="2.2.2", script="Scripts/ConvertModelica_from_2.2.2_to_3.0.mos")), __Dymola_classOrder={"UsersGuide","Blocks","StateGraph","Electrical","Magnetic","Mechanics","Fluid","Media","Thermal","Math","Utilities","Constants","Icons","SIunits"}, Settings(NewStateSelection=true), Documentation(info="<HTML>
|
|---|
| 4 | <p>
|
|---|
| 5 | Package <b>Modelica</b> is a <b>standardized</b> and <b>free</b> package
|
|---|
| 6 | that is developed together with the Modelica language from the
|
|---|
| 7 | Modelica Association, see
|
|---|
| 8 | <a href=\"http://www.Modelica.org\">http://www.Modelica.org</a>.
|
|---|
| 9 | It is also called <b>Modelica Standard Library</b>.
|
|---|
| 10 | It provides model components in many domains that are based on
|
|---|
| 11 | standardized interface definitions. Some typical examples are shown
|
|---|
| 12 | in the next figure:
|
|---|
| 13 | </p>
|
|---|
| 14 |
|
|---|
| 15 | <p>
|
|---|
| 16 | <img src=\"Images/UsersGuide/ModelicaLibraries.png\">
|
|---|
| 17 | </p>
|
|---|
| 18 |
|
|---|
| 19 | <p>
|
|---|
| 20 | For an introduction, have especially a look at:
|
|---|
| 21 | </p>
|
|---|
| 22 | <ul>
|
|---|
| 23 | <li> <a href=\"Modelica://Modelica.UsersGuide.Overview\">Overview</a>
|
|---|
| 24 | provides an overview of the Modelica Standard Library
|
|---|
| 25 | inside the <a href=\"Modelica://Modelica.UsersGuide\">User's Guide</a>.</li>
|
|---|
| 26 | <li><a href=\"Modelica://Modelica.UsersGuide.ReleaseNotes\">Release Notes</a>
|
|---|
| 27 | summarizes the changes of new versions of this package.</li>
|
|---|
| 28 | <li> <a href=\"Modelica://Modelica.UsersGuide.Contact\">Contact</a>
|
|---|
| 29 | lists the contributors of the Modelica Standard Library.</li>
|
|---|
| 30 | <li> The <b>Examples</b> packages in the various libraries, demonstrate
|
|---|
| 31 | how to use the components of the corresponding sublibrary.</li>
|
|---|
| 32 | </ul>
|
|---|
| 33 |
|
|---|
| 34 | <p>
|
|---|
| 35 | This version of the Modelica Standard Library consists of
|
|---|
| 36 | </p>
|
|---|
| 37 | <ul>
|
|---|
| 38 | <li> <b>922</b> models and blocks, and</li>
|
|---|
| 39 | <li> <b>615</b> functions
|
|---|
| 40 | </ul>
|
|---|
| 41 | <p>
|
|---|
| 42 | that are directly usable (= number of public, non-partial classes).
|
|---|
| 43 | </p>
|
|---|
| 44 |
|
|---|
| 45 |
|
|---|
| 46 | <p>
|
|---|
| 47 | <b>Licensed by the Modelica Association under the Modelica License 2</b><br>
|
|---|
| 48 | Copyright © 1998-2009, ABB, arsenal research, T. Bödrich, DLR, Dynasim, Fraunhofer, Modelon,
|
|---|
| 49 | TU Hamburg-Harburg, Politecnico di Milano.
|
|---|
| 50 | </p>
|
|---|
| 51 |
|
|---|
| 52 | <p>
|
|---|
| 53 | <i>This Modelica package is <u>free</u> software and
|
|---|
| 54 | the use is completely at <u>your own risk</u>;
|
|---|
| 55 | it can be redistributed and/or modified under the terms of the
|
|---|
| 56 | Modelica license 2, see the license conditions (including the
|
|---|
| 57 | disclaimer of warranty)
|
|---|
| 58 | <a href=\"Modelica://Modelica.UsersGuide.ModelicaLicense2\">here</a></u>
|
|---|
| 59 | or at
|
|---|
| 60 | <a href=\"http://www.Modelica.org/licenses/ModelicaLicense2\">
|
|---|
| 61 | http://www.Modelica.org/licenses/ModelicaLicense2</a>.
|
|---|
| 62 | </p>
|
|---|
| 63 |
|
|---|
| 64 | </HTML>
|
|---|
| 65 | "));
|
|---|
| 66 | package Utilities "Library of utility functions dedicated to scripting (operating on files, streams, strings, system)"
|
|---|
| 67 | extends Modelica.Icons.Library;
|
|---|
| 68 | annotation(Documentation(info="<html>
|
|---|
| 69 | <p>
|
|---|
| 70 | This package contains Modelica <b>functions</b> that are
|
|---|
| 71 | especially suited for <b>scripting</b>. The functions might
|
|---|
| 72 | be used to work with strings, read data from file, write data
|
|---|
| 73 | to file or copy, move and remove files.
|
|---|
| 74 | </p>
|
|---|
| 75 | <p>
|
|---|
| 76 | For an introduction, have especially a look at:
|
|---|
| 77 | </p>
|
|---|
| 78 | <ul>
|
|---|
| 79 | <li> <a href=\"Modelica://Modelica.Utilities.UsersGuide\">Modelica.Utilities.User's Guide</a>
|
|---|
| 80 | discusses the most important aspects of this library.</li>
|
|---|
| 81 | <li> <a href=\"Modelica://Modelica.Utilities.Examples\">Modelica.Utilities.Examples</a>
|
|---|
| 82 | contains examples that demonstrate the usage of this library.</li>
|
|---|
| 83 | </ul>
|
|---|
| 84 | <p>
|
|---|
| 85 | The following main sublibraries are available:
|
|---|
| 86 | </p>
|
|---|
| 87 | <ul>
|
|---|
| 88 | <li> <a href=\"Modelica://Modelica.Utilities.Files\">Files</a>
|
|---|
| 89 | provides functions to operate on files and directories, e.g.,
|
|---|
| 90 | to copy, move, remove files.</li>
|
|---|
| 91 | <li> <a href=\"Modelica://Modelica.Utilities.Streams\">Streams</a>
|
|---|
| 92 | provides functions to read from files and write to files.</li>
|
|---|
| 93 | <li> <a href=\"Modelica://Modelica.Utilities.Strings\">Strings</a>
|
|---|
| 94 | provides functions to operate on strings. E.g.
|
|---|
| 95 | substring, find, replace, sort, scanToken.</li>
|
|---|
| 96 | <li> <a href=\"Modelica://Modelica.Utilities.System\">System</a>
|
|---|
| 97 | provides functions to interact with the environment.
|
|---|
| 98 | E.g., get or set the working directory or environment
|
|---|
| 99 | variables and to send a command to the default shell.</li>
|
|---|
| 100 | </ul>
|
|---|
| 101 |
|
|---|
| 102 | <p>
|
|---|
| 103 | Copyright © 1998-2009, Modelica Association, DLR and Dynasim.
|
|---|
| 104 | </p>
|
|---|
| 105 | <p>
|
|---|
| 106 | <i>This Modelica package is <b>free</b> software; it can be redistributed and/or modified
|
|---|
| 107 | under the terms of the <b>Modelica license</b>, see the license conditions
|
|---|
| 108 | and the accompanying <b>disclaimer</b>
|
|---|
| 109 | <a href=\"Modelica://Modelica.UsersGuide.ModelicaLicense2\">here</a>.</i>
|
|---|
| 110 | </p><br>
|
|---|
| 111 | </html>
|
|---|
| 112 | "));
|
|---|
| 113 | package Internal "Internal components that a user should usually not directly utilize"
|
|---|
| 114 | partial package PartialModelicaServices "Interfaces of components requiring a tool specific implementation"
|
|---|
| 115 | package Animation "Models and functions for 3-dim. animation"
|
|---|
| 116 | partial model PartialShape "Different visual shapes with variable size; all data have to be set as modifiers"
|
|---|
| 117 | import SI = Modelica.SIunits;
|
|---|
| 118 | import Modelica.Mechanics.MultiBody.Frames;
|
|---|
| 119 | import Modelica.Mechanics.MultiBody.Types;
|
|---|
| 120 | parameter Types.ShapeType shapeType="box" "Type of shape (box, sphere, cylinder, pipecylinder, cone, pipe, beam, gearwheel, spring)";
|
|---|
| 121 | input Frames.Orientation R=Frames.nullRotation() "Orientation object to rotate the world frame into the object frame" annotation(Dialog);
|
|---|
| 122 | input SI.Position r[3]={0,0,0} "Position vector from origin of world frame to origin of object frame, resolved in world frame" annotation(Dialog);
|
|---|
| 123 | input SI.Position r_shape[3]={0,0,0} "Position vector from origin of object frame to shape origin, resolved in object frame" annotation(Dialog);
|
|---|
| 124 | input Real lengthDirection[3](each final unit="1")={1,0,0} "Vector in length direction, resolved in object frame" annotation(Dialog);
|
|---|
| 125 | input Real widthDirection[3](each final unit="1")={0,1,0} "Vector in width direction, resolved in object frame" annotation(Dialog);
|
|---|
| 126 | input SI.Length length=0 "Length of visual object" annotation(Dialog);
|
|---|
| 127 | input SI.Length width=0 "Width of visual object" annotation(Dialog);
|
|---|
| 128 | input SI.Length height=0 "Height of visual object" annotation(Dialog);
|
|---|
| 129 | input Types.ShapeExtra extra=0.0 "Additional size data for some of the shape types" annotation(Dialog);
|
|---|
| 130 | input Real color[3]={255,0,0} "Color of shape" annotation(Dialog);
|
|---|
| 131 | input Types.SpecularCoefficient specularCoefficient=0.7 "Reflection of ambient light (= 0: light is completely absorbed)" annotation(Dialog);
|
|---|
| 132 | annotation(Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={2,2}), graphics={Rectangle(extent={{-100,-100},{80,60}}, lineColor={0,0,255}, fillColor={255,255,255}, fillPattern=FillPattern.Solid),Polygon(points={{-100,60},{-80,100},{100,100},{80,60},{-100,60}}, lineColor={0,0,255}, fillColor={192,192,192}, fillPattern=FillPattern.Solid),Polygon(points={{100,100},{100,-60},{80,-100},{80,60},{100,100}}, lineColor={0,0,255}, fillColor={160,160,164}, fillPattern=FillPattern.Solid),Text(extent={{-100,-100},{80,60}}, lineColor={0,0,0}, textString="%shapeType"),Text(extent={{-132,160},{128,100}}, textString="%name", lineColor={0,0,255})}), Documentation(info="<html>
|
|---|
| 133 |
|
|---|
| 134 | <p>
|
|---|
| 135 | This model is documented at
|
|---|
| 136 | <a href=\"Modelica://Modelica.Mechanics.MultiBody.Visualizers.Advanced.Shape\">Modelica.Mechanics.MultiBody.Visualizers.Advanced.Shape</a>.
|
|---|
| 137 | </p>
|
|---|
| 138 |
|
|---|
| 139 | </html>
|
|---|
| 140 | "));
|
|---|
| 141 | end PartialShape;
|
|---|
| 142 |
|
|---|
| 143 | end Animation;
|
|---|
| 144 |
|
|---|
| 145 | annotation(Documentation(info="<html>
|
|---|
| 146 |
|
|---|
| 147 | <p>
|
|---|
| 148 | This package contains interfaces of a set of functions and models used in the
|
|---|
| 149 | Modelica Standard Library that requires a <u>tool specific implementation</u>.
|
|---|
| 150 | There is an associated package called <u>ModelicaServices</u>. A tool vendor
|
|---|
| 151 | should provide a proper implementation of this library for the corresponding
|
|---|
| 152 | tool. The default implementation is \"do nothing\".
|
|---|
| 153 | In the Modelica Standard Library, the models and functions of ModelicaServices
|
|---|
| 154 | are used.
|
|---|
| 155 | </p>
|
|---|
| 156 |
|
|---|
| 157 | </html>"));
|
|---|
| 158 | end PartialModelicaServices;
|
|---|
| 159 |
|
|---|
| 160 | end Internal;
|
|---|
| 161 |
|
|---|
| 162 | end Utilities;
|
|---|
| 163 |
|
|---|
| 164 | package Mechanics "Library of 1-dim. and 3-dim. mechanical components (multi-body, rotational, translational)"
|
|---|
| 165 | extends Modelica.Icons.Library2;
|
|---|
| 166 | annotation(Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}), graphics={Rectangle(extent={{-5,-40},{45,-70}}, lineColor={0,0,0}, fillPattern=FillPattern.HorizontalCylinder, fillColor={192,192,192}),Ellipse(extent={{-90,-50},{-80,-60}}, lineColor={0,0,0}),Line(points={{-85,-55},{-60,-21}}, color={0,0,0}, thickness=0.5),Ellipse(extent={{-65,-16},{-55,-26}}, lineColor={0,0,0}),Line(points={{-60,-21},{9,-55}}, color={0,0,0}, thickness=0.5),Ellipse(extent={{4,-50},{14,-60}}, lineColor={0,0,0}, fillColor={0,0,0}, fillPattern=FillPattern.Solid),Line(points={{-10,-34},{72,-34},{72,-76},{-10,-76}}, color={0,0,0})}), Documentation(info="<HTML>
|
|---|
| 167 | <p>
|
|---|
| 168 | This package contains components to model the movement
|
|---|
| 169 | of 1-dim. rotational, 1-dim. translational, and
|
|---|
| 170 | 3-dim. <b>mechanical systems</b>.
|
|---|
| 171 | </p>
|
|---|
| 172 | </HTML>
|
|---|
| 173 | "));
|
|---|
| 174 | package MultiBody "Library to model 3-dimensional mechanical systems"
|
|---|
| 175 | import SI = Modelica.SIunits;
|
|---|
| 176 | extends Modelica.Icons.Library;
|
|---|
| 177 | model World "World coordinate system + gravity field + default animation definition"
|
|---|
| 178 | import SI = Modelica.SIunits;
|
|---|
| 179 | import Modelica.Mechanics.MultiBody.Types.GravityTypes;
|
|---|
| 180 | import Modelica.Mechanics.MultiBody.Types;
|
|---|
| 181 | Interfaces.Frame_b frame_b "Coordinate system fixed in the origin of the world frame" annotation(Placement(transformation(extent={{84,-16},{116,16}}, rotation=0)));
|
|---|
| 182 | parameter Boolean enableAnimation=true "= true, if animation of all components is enabled";
|
|---|
| 183 | parameter Boolean animateWorld=true "= true, if world coordinate system shall be visualized" annotation(Dialog(enable=enableAnimation));
|
|---|
| 184 | parameter Boolean animateGravity=true "= true, if gravity field shall be visualized (acceleration vector or field center)" annotation(Dialog(enable=enableAnimation));
|
|---|
| 185 | parameter Types.AxisLabel label1="x" "Label of horizontal axis in icon";
|
|---|
| 186 | parameter Types.AxisLabel label2="y" "Label of vertical axis in icon";
|
|---|
| 187 | parameter Types.GravityTypes gravityType=GravityTypes.UniformGravity "Type of gravity field" annotation(Evaluate=true);
|
|---|
| 188 | parameter SI.Acceleration g=9.81 "Constant gravity acceleration" annotation(Dialog(enable=gravityType == GravityTypes.UniformGravity));
|
|---|
| 189 | parameter Types.Axis n={0,-1,0} "Direction of gravity resolved in world frame (gravity = g*n/length(n))" annotation(Evaluate=true, Dialog(enable=gravityType == Modelica.Mechanics.MultiBody.Types.GravityTypes.UniformGravity));
|
|---|
| 190 | parameter Real mue(unit="m3/s2", min=0)=398600000000000.0 "Gravity field constant (default = field constant of earth)" annotation(Dialog(enable=gravityType == Types.GravityTypes.PointGravity));
|
|---|
| 191 | parameter Boolean driveTrainMechanics3D=true "= true, if 3-dim. mechanical effects of Parts.Mounting1D/Rotor1D/BevelGear1D shall be taken into account";
|
|---|
| 192 | parameter SI.Distance axisLength=nominalLength/2 "Length of world axes arrows" annotation(Dialog(tab="Animation", group="if animateWorld = true", enable=enableAnimation and animateWorld));
|
|---|
| 193 | parameter SI.Distance axisDiameter=axisLength/defaultFrameDiameterFraction "Diameter of world axes arrows" annotation(Dialog(tab="Animation", group="if animateWorld = true", enable=enableAnimation and animateWorld));
|
|---|
| 194 | parameter Boolean axisShowLabels=true "= true, if labels shall be shown" annotation(Dialog(tab="Animation", group="if animateWorld = true", enable=enableAnimation and animateWorld));
|
|---|
| 195 | input Types.Color axisColor_x=Modelica.Mechanics.MultiBody.Types.Defaults.FrameColor "Color of x-arrow" annotation(Dialog(tab="Animation", group="if animateWorld = true", enable=enableAnimation and animateWorld));
|
|---|
| 196 | input Types.Color axisColor_y=axisColor_x annotation(Dialog(tab="Animation", group="if animateWorld = true", enable=enableAnimation and animateWorld));
|
|---|
| 197 | input Types.Color axisColor_z=axisColor_x "Color of z-arrow" annotation(Dialog(tab="Animation", group="if animateWorld = true", enable=enableAnimation and animateWorld));
|
|---|
| 198 | parameter SI.Position gravityArrowTail[3]={0,0,0} "Position vector from origin of world frame to arrow tail, resolved in world frame" annotation(Dialog(tab="Animation", group="if animateGravity = true and gravityType = UniformGravity", enable=enableAnimation and animateGravity and gravityType == GravityTypes.UniformGravity));
|
|---|
| 199 | parameter SI.Length gravityArrowLength=axisLength/2 "Length of gravity arrow" annotation(Dialog(tab="Animation", group="if animateGravity = true and gravityType = UniformGravity", enable=enableAnimation and animateGravity and gravityType == GravityTypes.UniformGravity));
|
|---|
| 200 | parameter SI.Diameter gravityArrowDiameter=gravityArrowLength/defaultWidthFraction "Diameter of gravity arrow" annotation(Dialog(tab="Animation", group="if animateGravity = true and gravityType = UniformGravity", enable=enableAnimation and animateGravity and gravityType == GravityTypes.UniformGravity));
|
|---|
| 201 | input Types.Color gravityArrowColor={0,230,0} "Color of gravity arrow" annotation(Dialog(tab="Animation", group="if animateGravity = true and gravityType = UniformGravity", enable=enableAnimation and animateGravity and gravityType == GravityTypes.UniformGravity));
|
|---|
| 202 | parameter SI.Diameter gravitySphereDiameter=12742000 "Diameter of sphere representing gravity center (default = mean diameter of earth)" annotation(Dialog(tab="Animation", group="if animateGravity = true and gravityType = PointGravity", enable=enableAnimation and animateGravity and gravityType == GravityTypes.PointGravity));
|
|---|
| 203 | input Types.Color gravitySphereColor={0,230,0} "Color of gravity sphere" annotation(Dialog(tab="Animation", group="if animateGravity = true and gravityType = PointGravity", enable=enableAnimation and animateGravity and gravityType == GravityTypes.PointGravity));
|
|---|
| 204 | parameter SI.Length nominalLength=1 "\"Nominal\" length of multi-body system" annotation(Dialog(tab="Defaults"));
|
|---|
| 205 | parameter SI.Length defaultAxisLength=nominalLength/5 "Default for length of a frame axis (but not world frame)" annotation(Dialog(tab="Defaults"));
|
|---|
| 206 | parameter SI.Length defaultJointLength=nominalLength/10 "Default for the fixed length of a shape representing a joint" annotation(Dialog(tab="Defaults"));
|
|---|
| 207 | parameter SI.Length defaultJointWidth=nominalLength/20 "Default for the fixed width of a shape representing a joint" annotation(Dialog(tab="Defaults"));
|
|---|
| 208 | parameter SI.Length defaultForceLength=nominalLength/10 "Default for the fixed length of a shape representing a force (e.g. damper)" annotation(Dialog(tab="Defaults"));
|
|---|
| 209 | parameter SI.Length defaultForceWidth=nominalLength/20 "Default for the fixed width of a shape represening a force (e.g. spring, bushing)" annotation(Dialog(tab="Defaults"));
|
|---|
| 210 | parameter SI.Length defaultBodyDiameter=nominalLength/9 "Default for diameter of sphere representing the center of mass of a body" annotation(Dialog(tab="Defaults"));
|
|---|
| 211 | parameter Real defaultWidthFraction=20 "Default for shape width as a fraction of shape length (e.g., for Parts.FixedTranslation)" annotation(Dialog(tab="Defaults"));
|
|---|
| 212 | parameter SI.Length defaultArrowDiameter=nominalLength/40 "Default for arrow diameter (e.g., of forces, torques, sensors)" annotation(Dialog(tab="Defaults"));
|
|---|
| 213 | parameter Real defaultFrameDiameterFraction=40 "Default for arrow diameter of a coordinate system as a fraction of axis length" annotation(Dialog(tab="Defaults"));
|
|---|
| 214 | parameter Real defaultSpecularCoefficient(min=0)=0.7 "Default reflection of ambient light (= 0: light is completely absorbed)" annotation(Dialog(tab="Defaults"));
|
|---|
| 215 | parameter Real defaultN_to_m(unit="N/m", min=0)=1000 "Default scaling of force arrows (length = force/defaultN_to_m)" annotation(Dialog(tab="Defaults"));
|
|---|
| 216 | parameter Real defaultNm_to_m(unit="N.m/m", min=0)=1000 "Default scaling of torque arrows (length = torque/defaultNm_to_m)" annotation(Dialog(tab="Defaults"));
|
|---|
| 217 | protected
|
|---|
| 218 | parameter Integer ndim=if enableAnimation and animateWorld then 1 else 0;
|
|---|
| 219 | parameter Integer ndim2=if enableAnimation and animateWorld and axisShowLabels then 1 else 0;
|
|---|
| 220 | parameter SI.Length headLength=min(axisLength, axisDiameter*Types.Defaults.FrameHeadLengthFraction);
|
|---|
| 221 | parameter SI.Length headWidth=axisDiameter*Types.Defaults.FrameHeadWidthFraction;
|
|---|
| 222 | parameter SI.Length lineLength=max(0, axisLength - headLength);
|
|---|
| 223 | parameter SI.Length lineWidth=axisDiameter;
|
|---|
| 224 | parameter SI.Length scaledLabel=Modelica.Mechanics.MultiBody.Types.Defaults.FrameLabelHeightFraction*axisDiameter;
|
|---|
| 225 | parameter SI.Length labelStart=1.05*axisLength;
|
|---|
| 226 | Modelica.Mechanics.MultiBody.Visualizers.Advanced.Shape x_arrowLine(shapeType="cylinder", length=lineLength, width=lineWidth, height=lineWidth, lengthDirection={1,0,0}, widthDirection={0,1,0}, color=axisColor_x, specularCoefficient=0) if enableAnimation and animateWorld;
|
|---|
| 227 | Modelica.Mechanics.MultiBody.Visualizers.Advanced.Shape x_arrowHead(shapeType="cone", length=headLength, width=headWidth, height=headWidth, lengthDirection={1,0,0}, widthDirection={0,1,0}, color=axisColor_x, r={lineLength,0,0}, specularCoefficient=0) if enableAnimation and animateWorld;
|
|---|
| 228 | Modelica.Mechanics.MultiBody.Visualizers.Internal.Lines x_label(lines=scaledLabel*{[0,0;1,1],[0,1;1,0]}, diameter=axisDiameter, color=axisColor_x, r_lines={labelStart,0,0}, n_x={1,0,0}, n_y={0,1,0}, specularCoefficient=0) if enableAnimation and animateWorld and axisShowLabels;
|
|---|
| 229 | Modelica.Mechanics.MultiBody.Visualizers.Advanced.Shape y_arrowLine(shapeType="cylinder", length=lineLength, width=lineWidth, height=lineWidth, lengthDirection={0,1,0}, widthDirection={1,0,0}, color=axisColor_y, specularCoefficient=0) if enableAnimation and animateWorld;
|
|---|
| 230 | Modelica.Mechanics.MultiBody.Visualizers.Advanced.Shape y_arrowHead(shapeType="cone", length=headLength, width=headWidth, height=headWidth, lengthDirection={0,1,0}, widthDirection={1,0,0}, color=axisColor_y, r={0,lineLength,0}, specularCoefficient=0) if enableAnimation and animateWorld;
|
|---|
| 231 | Modelica.Mechanics.MultiBody.Visualizers.Internal.Lines y_label(lines=scaledLabel*{[0,0;1,1.5],[0,1.5;0.5,0.75]}, diameter=axisDiameter, color=axisColor_y, r_lines={0,labelStart,0}, n_x={0,1,0}, n_y={-1,0,0}, specularCoefficient=0) if enableAnimation and animateWorld and axisShowLabels;
|
|---|
| 232 | Modelica.Mechanics.MultiBody.Visualizers.Advanced.Shape z_arrowLine(shapeType="cylinder", length=lineLength, width=lineWidth, height=lineWidth, lengthDirection={0,0,1}, widthDirection={0,1,0}, color=axisColor_z, specularCoefficient=0) if enableAnimation and animateWorld;
|
|---|
| 233 | Modelica.Mechanics.MultiBody.Visualizers.Advanced.Shape z_arrowHead(shapeType="cone", length=headLength, width=headWidth, height=headWidth, lengthDirection={0,0,1}, widthDirection={0,1,0}, color=axisColor_z, r={0,0,lineLength}, specularCoefficient=0) if enableAnimation and animateWorld;
|
|---|
| 234 | Modelica.Mechanics.MultiBody.Visualizers.Internal.Lines z_label(lines=scaledLabel*{[0,0;1,0],[0,1;1,1],[0,1;1,0]}, diameter=axisDiameter, color=axisColor_z, r_lines={0,0,labelStart}, n_x={0,0,1}, n_y={0,1,0}, specularCoefficient=0) if enableAnimation and animateWorld and axisShowLabels;
|
|---|
| 235 | parameter SI.Length gravityHeadLength=min(gravityArrowLength, gravityArrowDiameter*Types.Defaults.ArrowHeadLengthFraction);
|
|---|
| 236 | parameter SI.Length gravityHeadWidth=gravityArrowDiameter*Types.Defaults.ArrowHeadWidthFraction;
|
|---|
| 237 | parameter SI.Length gravityLineLength=max(0, gravityArrowLength - gravityHeadLength);
|
|---|
| 238 | Modelica.Mechanics.MultiBody.Visualizers.Advanced.Shape gravityArrowLine(shapeType="cylinder", length=gravityLineLength, width=gravityArrowDiameter, height=gravityArrowDiameter, lengthDirection=n, widthDirection={0,1,0}, color=gravityArrowColor, r_shape=gravityArrowTail, specularCoefficient=0) if enableAnimation and animateGravity and gravityType == GravityTypes.UniformGravity;
|
|---|
| 239 | Modelica.Mechanics.MultiBody.Visualizers.Advanced.Shape gravityArrowHead(shapeType="cone", length=gravityHeadLength, width=gravityHeadWidth, height=gravityHeadWidth, lengthDirection=n, widthDirection={0,1,0}, color=gravityArrowColor, r_shape=gravityArrowTail + Modelica.Math.Vectors.normalize(n)*gravityLineLength, specularCoefficient=0) if enableAnimation and animateGravity and gravityType == GravityTypes.UniformGravity;
|
|---|
| 240 | parameter Integer ndim_pointGravity=if enableAnimation and animateGravity and gravityType == 2 then 1 else 0;
|
|---|
| 241 | Modelica.Mechanics.MultiBody.Visualizers.Advanced.Shape gravitySphere(shapeType="sphere", r_shape={-gravitySphereDiameter/2,0,0}, lengthDirection={1,0,0}, length=gravitySphereDiameter, width=gravitySphereDiameter, height=gravitySphereDiameter, color=gravitySphereColor, specularCoefficient=0) if enableAnimation and animateGravity and gravityType == GravityTypes.PointGravity;
|
|---|
| 242 | function gravityAcceleration= gravityAccelerationTypes(gravityType=gravityType, g=g*Modelica.Math.Vectors.normalize(n), mue=mue);
|
|---|
| 243 | protected
|
|---|
| 244 | function gravityAccelerationTypes "Gravity field acceleration depending on field type and position"
|
|---|
| 245 | import Modelica.Mechanics.MultiBody.Types.GravityTypes;
|
|---|
| 246 | extends Modelica.Icons.Function;
|
|---|
| 247 | input SI.Position r[3] "Position vector from world frame to actual point, resolved in world frame";
|
|---|
| 248 | input GravityTypes gravityType "Type of gravity field";
|
|---|
| 249 | input SI.Acceleration g[3] "Constant gravity acceleration, resolved in world frame, if gravityType=1";
|
|---|
| 250 | input Real mue(unit="m3/s2") "Field constant of point gravity field, if gravityType=2";
|
|---|
| 251 | output SI.Acceleration gravity[3] "Gravity acceleration at point r, resolved in world frame";
|
|---|
| 252 | algorithm
|
|---|
| 253 | gravity:=if gravityType == GravityTypes.UniformGravity then g else if gravityType == GravityTypes.PointGravity then -mue/(r*r)*(r/Modelica.Math.Vectors.length(r)) else zeros(3);
|
|---|
| 254 | end gravityAccelerationTypes;
|
|---|
| 255 |
|
|---|
| 256 | equation
|
|---|
| 257 | Connections.root(frame_b.R);
|
|---|
| 258 | assert(Modelica.Math.Vectors.length(n) > 1e-10, "Parameter n of World object is wrong (lenght(n) > 0 required)");
|
|---|
| 259 | frame_b.r_0=zeros(3);
|
|---|
| 260 | frame_b.R=Frames.nullRotation();
|
|---|
| 261 | annotation(defaultComponentName="world", defaultComponentPrefixes="inner", missingInnerMessage="No \"world\" component is defined. A default world
|
|---|
| 262 | component with the default gravity field will be used
|
|---|
| 263 | (g=9.81 in negative y-axis). If this is not desired,
|
|---|
| 264 | drag Modelica.Mechanics.MultiBody.World into the top level of your model.", Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={2,2}), graphics={Rectangle(extent={{-100,100},{100,-100}}, lineColor={0,0,0}, fillColor={255,255,255}, fillPattern=FillPattern.Solid),Line(points={{-100,-118},{-100,61}}, color={0,0,0}, thickness=0.5),Polygon(points={{-100,100},{-120,60},{-80,60},{-100,100},{-100,100}}, lineColor={0,0,0}, fillColor={0,0,0}, fillPattern=FillPattern.Solid),Line(points={{-119,-100},{59,-100}}, color={0,0,0}, thickness=0.5),Polygon(points={{99,-100},{59,-80},{59,-120},{99,-100}}, lineColor={0,0,0}, fillColor={0,0,0}, fillPattern=FillPattern.Solid),Text(extent={{-140,165},{140,103}}, textString="%name", lineColor={0,0,255}),Text(extent={{95,-113},{144,-162}}, lineColor={0,0,0}, textString="%label1"),Text(extent={{-170,127},{-119,77}}, lineColor={0,0,0}, textString="%label2"),Line(points={{-56,78},{-56,-26}}, color={0,0,255}),Polygon(points={{-68,-26},{-56,-66},{-44,-26},{-68,-26}}, fillColor={0,0,255}, fillPattern=FillPattern.Solid, lineColor={0,0,255}),Line(points={{2,78},{2,-26}}, color={0,0,255}),Polygon(points={{-10,-26},{2,-66},{14,-26},{-10,-26}}, fillColor={0,0,255}, fillPattern=FillPattern.Solid, lineColor={0,0,255}),Line(points={{66,80},{66,-26}}, color={0,0,255}),Polygon(points={{54,-26},{66,-66},{78,-26},{54,-26}}, fillColor={0,0,255}, fillPattern=FillPattern.Solid, lineColor={0,0,255})}), Diagram(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={2,2}), graphics), Documentation(info="<HTML>
|
|---|
| 265 | <p>
|
|---|
| 266 | Model <b>World</b> represents a global coordinate system fixed in
|
|---|
| 267 | ground. This model serves several purposes:
|
|---|
| 268 | <ul>
|
|---|
| 269 | <li> It is used as <b>inertial system</b> in which
|
|---|
| 270 | the equations of all elements of the MultiBody library
|
|---|
| 271 | are defined.</li>
|
|---|
| 272 | <li> It is the world frame of an <b>animation window</b> in which
|
|---|
| 273 | all elements of the MultiBody library are visualized.</li>
|
|---|
| 274 | <li> It is used to define the <b>gravity field</b> in which a
|
|---|
| 275 | multi-body model is present. Default is a uniform gravity
|
|---|
| 276 | field where the gravity acceleration vector g is the
|
|---|
| 277 | same at every position. Additionally, a point gravity field
|
|---|
| 278 | can be selected.</li>
|
|---|
| 279 | <li> It is used to define <b>default settings</b> of animation properties
|
|---|
| 280 | (e.g. the diameter of a sphere representing by default
|
|---|
| 281 | the center of mass of a body, or the diameters of the cylinders
|
|---|
| 282 | representing a revolute joint).</li>
|
|---|
| 283 | <li> It is used to define a <b>visual representation</b> of the
|
|---|
| 284 | world model (= 3 coordinate axes with labels) and of the defined
|
|---|
| 285 | gravity field.<br>
|
|---|
| 286 | <IMG SRC=\"../../Images/MultiBody/world.png\" ALT=\"MultiBodys.World\">
|
|---|
| 287 | </li>
|
|---|
| 288 | </ul>
|
|---|
| 289 | <p>
|
|---|
| 290 | Since the gravity field function is required from all bodies with mass
|
|---|
| 291 | and the default settings of animation properties are required
|
|---|
| 292 | from nearly every component, exactly one instance of model World needs
|
|---|
| 293 | to be present in every model on the top level. The basic declaration
|
|---|
| 294 | needs to be:
|
|---|
| 295 | </p>
|
|---|
| 296 | <pre>
|
|---|
| 297 | <b>inner</b> Modelica.Mechanics.MultiBody.World world
|
|---|
| 298 | </pre>
|
|---|
| 299 | <p>
|
|---|
| 300 | Note, it must be an <b>inner</b> declaration with instance name <b>world</b>
|
|---|
| 301 | in order that this world object can be accessed from all objects in the
|
|---|
| 302 | model. When dragging the \"World\" object from the package browser into
|
|---|
| 303 | the diagram layer, this declaration is automatically generated
|
|---|
| 304 | (this is defined via annotations in model World).
|
|---|
| 305 | </p>
|
|---|
| 306 | <p>
|
|---|
| 307 | All vectors and tensors of a mechanical system are resolved in a
|
|---|
| 308 | frame that is local to the corresponding component. Usually,
|
|---|
| 309 | if all relative joint coordinates vanish, the local frames
|
|---|
| 310 | of all components are parallel to each other, as well as to the
|
|---|
| 311 | world frame (this holds as long as a Parts.FixedRotation,
|
|---|
| 312 | component is <b>not</b> used). In this \"reference configuration\"
|
|---|
| 313 | it is therefore
|
|---|
| 314 | alternatively possible to resolve all vectors in the world
|
|---|
| 315 | frame, since all frames are parallel to each other.
|
|---|
| 316 | This is often very convenient. In order to give some visual
|
|---|
| 317 | support in such a situation, in the icon of a World instance
|
|---|
| 318 | two axes of the world frame are shown and the labels
|
|---|
| 319 | of these axes can be set via parameters.
|
|---|
| 320 | </p>
|
|---|
| 321 | </HTML>
|
|---|
| 322 | "));
|
|---|
| 323 | end World;
|
|---|
| 324 |
|
|---|
| 325 | annotation(Documentation(info="<HTML>
|
|---|
| 326 | <p>
|
|---|
| 327 | Library <b>MultiBody</b> is a <b>free</b> Modelica package providing
|
|---|
| 328 | 3-dimensional mechanical components to model in a convenient way
|
|---|
| 329 | <b>mechanical systems</b>, such as robots, mechanisms, vehicles.
|
|---|
| 330 | Typical animations generated with this library are shown
|
|---|
| 331 | in the next figure:
|
|---|
| 332 | </p>
|
|---|
| 333 | <p>
|
|---|
| 334 | <img src=\"../../Images/MultiBody/MultiBody.png\">
|
|---|
| 335 | </p>
|
|---|
| 336 | <p>
|
|---|
| 337 | For an introduction, have especially a look at:
|
|---|
| 338 | </p>
|
|---|
| 339 | <ul>
|
|---|
| 340 | <li> <a href=\"Modelica://Modelica.Mechanics.MultiBody.UsersGuide\">MultiBody.UsersGuide</a>
|
|---|
| 341 | discusses the most important aspects how to use this library.</li>
|
|---|
| 342 | <li> <a href=\"Modelica://Modelica.Mechanics.MultiBody.Examples\">MultiBody.Examples</a>
|
|---|
| 343 | contains examples that demonstrate the usage of this library.</li>
|
|---|
| 344 | </ul>
|
|---|
| 345 |
|
|---|
| 346 | <p>
|
|---|
| 347 | Copyright © 1998-2009, Modelica Association and DLR.
|
|---|
| 348 | </p>
|
|---|
| 349 | <p>
|
|---|
| 350 | <i>This Modelica package is <b>free</b> software; it can be redistributed and/or modified
|
|---|
| 351 | under the terms of the <b>Modelica license</b>, see the license conditions
|
|---|
| 352 | and the accompanying <b>disclaimer</b>
|
|---|
| 353 | <a href=\"Modelica://Modelica.UsersGuide.ModelicaLicense2\">here</a>.</i>
|
|---|
| 354 | </p><br>
|
|---|
| 355 | </HTML>"));
|
|---|
| 356 | package Visualizers "3-dimensional visual objects used for animation"
|
|---|
| 357 | extends Modelica.Icons.Library;
|
|---|
| 358 | package Advanced "Visualizers that require basic knowledge about Modelica in order to use them"
|
|---|
| 359 | extends Modelica.Icons.Library;
|
|---|
| 360 | model Arrow "Visualizing an arrow with variable size; all data have to be set as modifiers (see info layer)"
|
|---|
| 361 | import SI = Modelica.SIunits;
|
|---|
| 362 | import Modelica.Mechanics.MultiBody.Types;
|
|---|
| 363 | import Modelica.Mechanics.MultiBody.Frames;
|
|---|
| 364 | input Frames.Orientation R=Frames.nullRotation() "Orientation object to rotate the world frame into the arrow frame." annotation(Dialog);
|
|---|
| 365 | input SI.Position r[3]={0,0,0} "Position vector from origin of world frame to origin of arrow frame, resolved in world frame" annotation(Dialog);
|
|---|
| 366 | input SI.Position r_tail[3]={0,0,0} "Position vector from origin of arrow frame to arrow tail, resolved in arrow frame" annotation(Dialog);
|
|---|
| 367 | input SI.Position r_head[3]={0,0,0} "Position vector from arrow tail to the head of the arrow, resolved in arrow frame" annotation(Dialog);
|
|---|
| 368 | input SI.Diameter diameter=world.defaultArrowDiameter "Diameter of arrow line" annotation(Dialog);
|
|---|
| 369 | input Modelica.Mechanics.MultiBody.Types.Color color=Modelica.Mechanics.MultiBody.Types.Defaults.ArrowColor "Color of arrow" annotation(Dialog);
|
|---|
| 370 | input Types.SpecularCoefficient specularCoefficient=world.defaultSpecularCoefficient "Material property describing the reflecting of ambient light (= 0 means, that light is completely absorbed)" annotation(Dialog);
|
|---|
| 371 | protected
|
|---|
| 372 | outer Modelica.Mechanics.MultiBody.World world;
|
|---|
| 373 | SI.Length length=Modelica.Math.Vectors.length(r_head) "Length of arrow";
|
|---|
| 374 | Visualizers.Advanced.Shape arrowLine(length=noEvent(max(0, length - diameter*Types.Defaults.ArrowHeadLengthFraction)), width=diameter, height=diameter, lengthDirection=r_head, widthDirection={0,1,0}, shapeType="cylinder", color=color, specularCoefficient=specularCoefficient, r_shape=r_tail, r=r, R=R) if world.enableAnimation;
|
|---|
| 375 | Visualizers.Advanced.Shape arrowHead(length=noEvent(max(0, min(length, diameter*Types.Defaults.ArrowHeadLengthFraction))), width=noEvent(max(0, diameter*MultiBody.Types.Defaults.ArrowHeadWidthFraction)), height=noEvent(max(0, diameter*MultiBody.Types.Defaults.ArrowHeadWidthFraction)), lengthDirection=r_head, widthDirection={0,1,0}, shapeType="cone", color=color, specularCoefficient=specularCoefficient, r=arrowLine.rvisobj + arrowLine.rxvisobj*arrowLine.length, R=R) if world.enableAnimation;
|
|---|
| 376 | annotation(Documentation(info="<HTML>
|
|---|
| 377 | <p>
|
|---|
| 378 | Model <b>Arrow</b> defines an arrow that is dynamically
|
|---|
| 379 | visualized at the defined location (see variables below).
|
|---|
| 380 | </p>
|
|---|
| 381 | <IMG SRC=\"../../Images/MultiBody/Visualizers/Arrow.png\" ALT=\"model Visualizers.Advanced.Arrow\">
|
|---|
| 382 | <p>
|
|---|
| 383 | The variables under heading <b>Parameters</b> below
|
|---|
| 384 | are declared as (time varying) <b>input</b> variables.
|
|---|
| 385 | If the default equation is not appropriate, a corresponding
|
|---|
| 386 | modifier equation has to be provided in the
|
|---|
| 387 | model where an <b>Arrow</b> instance is used, e.g., in the form
|
|---|
| 388 | </p>
|
|---|
| 389 | <pre>
|
|---|
| 390 | Visualizers.Advanced.Arrow arrow(diameter = sin(time));
|
|---|
| 391 | </pre>
|
|---|
| 392 |
|
|---|
| 393 | <p>
|
|---|
| 394 | Variable <b>color</b> is an Integer vector with 3 elements,
|
|---|
| 395 | {r, g, b}, and specifies the color of the shape.
|
|---|
| 396 | {r,g,b} are the \"red\", \"green\" and \"blue\" color parts.
|
|---|
| 397 | Note, r g, b are given in the range 0 .. 255.
|
|---|
| 398 | The predefined type <b>MultiBody.Types.Color</b> contains
|
|---|
| 399 | a menu definition of the colors used in the MultiBody
|
|---|
| 400 | library (will be replaced by a color editor).
|
|---|
| 401 | </p>
|
|---|
| 402 | </HTML>"), Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}), graphics={Rectangle(extent={{-100,28},{20,-30}}, lineColor={128,128,128}, fillColor={128,128,128}, fillPattern=FillPattern.Solid),Polygon(points={{20,60},{100,0},{20,-60},{20,60}}, lineColor={128,128,128}, fillColor={128,128,128}, fillPattern=FillPattern.Solid),Text(extent={{-146,124},{142,62}}, textString="%name", lineColor={0,0,255})}), Diagram(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}), graphics));
|
|---|
| 403 | end Arrow;
|
|---|
| 404 |
|
|---|
| 405 | model DoubleArrow "Visualizing a double arrow with variable size; all data have to be set as modifiers (see info layer)"
|
|---|
| 406 | import SI = Modelica.SIunits;
|
|---|
| 407 | import Modelica.Mechanics.MultiBody.Types;
|
|---|
| 408 | import Modelica.Mechanics.MultiBody.Frames;
|
|---|
| 409 | input Frames.Orientation R=Frames.nullRotation() "Orientation object to rotate the world frame into the arrow frame." annotation(Dialog);
|
|---|
| 410 | input SI.Position r[3]={0,0,0} "Position vector from origin of world frame to origin of arrow frame, resolved in world frame" annotation(Dialog);
|
|---|
| 411 | input SI.Position r_tail[3]={0,0,0} "Position vector from origin of arrow frame to double arrow tail, resolved in arrow frame" annotation(Dialog);
|
|---|
| 412 | input SI.Position r_head[3]={0,0,0} "Position vector from double arrow tail to the head of the double arrow, resolved in arrow frame" annotation(Dialog);
|
|---|
| 413 | input SI.Diameter diameter=world.defaultArrowDiameter "Diameter of arrow line" annotation(Dialog);
|
|---|
| 414 | input Modelica.Mechanics.MultiBody.Types.Color color=Modelica.Mechanics.MultiBody.Types.Defaults.ArrowColor "Color of double arrow" annotation(Dialog);
|
|---|
| 415 | input Types.SpecularCoefficient specularCoefficient=world.defaultSpecularCoefficient "Material property describing the reflecting of ambient light (= 0 means, that light is completely absorbed)" annotation(Dialog);
|
|---|
| 416 | protected
|
|---|
| 417 | outer Modelica.Mechanics.MultiBody.World world;
|
|---|
| 418 | SI.Length length=Modelica.Math.Vectors.length(r_head) "Length of arrow";
|
|---|
| 419 | SI.Length headLength=noEvent(max(0, min(length, diameter*MultiBody.Types.Defaults.ArrowHeadLengthFraction)));
|
|---|
| 420 | SI.Length headWidth=noEvent(max(0, diameter*MultiBody.Types.Defaults.ArrowHeadWidthFraction));
|
|---|
| 421 | Visualizers.Advanced.Shape arrowLine(length=noEvent(max(0, length - 1.5*diameter*MultiBody.Types.Defaults.ArrowHeadLengthFraction)), width=diameter, height=diameter, lengthDirection=r_head, widthDirection={0,1,0}, shapeType="cylinder", color=color, specularCoefficient=specularCoefficient, r_shape=r_tail, r=r, R=R) if world.enableAnimation;
|
|---|
| 422 | Visualizers.Advanced.Shape arrowHead1(length=headLength, width=headWidth, height=headWidth, lengthDirection=r_head, widthDirection={0,1,0}, shapeType="cone", color=color, specularCoefficient=specularCoefficient, r=arrowLine.rvisobj + arrowLine.rxvisobj*arrowLine.length, R=R) if world.enableAnimation;
|
|---|
| 423 | Visualizers.Advanced.Shape arrowHead2(length=headLength, width=headWidth, height=headWidth, lengthDirection=r_head, widthDirection={0,1,0}, shapeType="cone", color=color, specularCoefficient=specularCoefficient, r=arrowLine.rvisobj + arrowLine.rxvisobj*(arrowLine.length + 0.5*arrowHead1.length), R=R) if world.enableAnimation;
|
|---|
| 424 | annotation(Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}), graphics={Rectangle(extent={{-100,28},{0,-28}}, lineColor={128,128,128}, fillColor={128,128,128}, fillPattern=FillPattern.Solid),Polygon(points={{40,60},{100,0},{40,-60},{40,60}}, lineColor={128,128,128}, fillColor={128,128,128}, fillPattern=FillPattern.Solid),Text(extent={{-146,124},{142,62}}, textString="%name", lineColor={0,0,255}),Polygon(points={{0,60},{60,0},{0,-60},{0,60}}, lineColor={128,128,128}, fillColor={128,128,128}, fillPattern=FillPattern.Solid)}), Diagram(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}), graphics), Documentation(info="<HTML>
|
|---|
| 425 | <p>
|
|---|
| 426 | Model <b>DoubleArrow</b> defines a double arrow that is dynamically
|
|---|
| 427 | visualized at the defined location (see variables below).
|
|---|
| 428 | </p>
|
|---|
| 429 | <IMG SRC=\"../../Images/MultiBody/Visualizers/DoubleArrow.png\" ALT=\"model Visualizers.Advanced.DoubleArrow\">
|
|---|
| 430 | <p>
|
|---|
| 431 | The variables under heading <b>Parameters</b> below
|
|---|
| 432 | are declared as (time varying) <b>input</b> variables.
|
|---|
| 433 | If the default equation is not appropriate, a corresponding
|
|---|
| 434 | modifier equation has to be provided in the
|
|---|
| 435 | model where an <b>Arrow</b> instance is used, e.g., in the form
|
|---|
| 436 | </p>
|
|---|
| 437 | <pre>
|
|---|
| 438 | Visualizers.Advanced.DoubleArrow doubleArrow(diameter = sin(time));
|
|---|
| 439 | </pre>
|
|---|
| 440 | <p>
|
|---|
| 441 | Variable <b>color</b> is an Integer vector with 3 elements,
|
|---|
| 442 | {r, g, b}, and specifies the color of the shape.
|
|---|
| 443 | {r,g,b} are the \"red\", \"green\" and \"blue\" color parts.
|
|---|
| 444 | Note, r g, b are given in the range 0 .. 255.
|
|---|
| 445 | The predefined type <b>MultiBody.Types.Color</b> contains
|
|---|
| 446 | a menu definition of the colors used in the MultiBody
|
|---|
| 447 | library (will be replaced by a color editor).
|
|---|
| 448 | </p>
|
|---|
| 449 | </HTML>"));
|
|---|
| 450 | end DoubleArrow;
|
|---|
| 451 |
|
|---|
| 452 | model Shape "Different visual shapes with variable size; all data have to be set as modifiers (see info layer)"
|
|---|
| 453 | extends Modelica.Utilities.Internal.PartialModelicaServices.Animation.PartialShape;
|
|---|
| 454 | extends ModelicaServices.Animation.Shape;
|
|---|
| 455 | annotation(Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={2,2}), graphics={Rectangle(extent={{-100,-100},{80,60}}, lineColor={0,0,255}, fillColor={255,255,255}, fillPattern=FillPattern.Solid),Polygon(points={{-100,60},{-80,100},{100,100},{80,60},{-100,60}}, lineColor={0,0,255}, fillColor={192,192,192}, fillPattern=FillPattern.Solid),Polygon(points={{100,100},{100,-60},{80,-100},{80,60},{100,100}}, lineColor={0,0,255}, fillColor={160,160,164}, fillPattern=FillPattern.Solid),Text(extent={{-100,-100},{80,60}}, lineColor={0,0,0}, textString="%shapeType"),Text(extent={{-132,160},{128,100}}, textString="%name", lineColor={0,0,255})}), Documentation(info="<HTML>
|
|---|
| 456 | <p>
|
|---|
| 457 | Model <b>Shape</b> defines a visual shape that is
|
|---|
| 458 | shown at the location of its reference coordinate system, called
|
|---|
| 459 | 'object frame' below. All describing variables such
|
|---|
| 460 | as size and color can vary dynamically (with the only exception
|
|---|
| 461 | of parameter shapeType). The default equations in the
|
|---|
| 462 | declarations should be modified by providing appropriate equations.
|
|---|
| 463 | Model <b>Shape</b> is usually used as a basic building block to
|
|---|
| 464 | implement simpler to use graphical components.
|
|---|
| 465 | </p>
|
|---|
| 466 | <p>
|
|---|
| 467 | The following shapes are supported via
|
|---|
| 468 | parameter <b>shapeType</b> (e.g., shapeType=\"box\"):<br>
|
|---|
| 469 | </p>
|
|---|
| 470 | <IMG SRC=\"../../Images/MultiBody/Shape.png\" ALT=\"model Visualizers.FixedShape\">
|
|---|
| 471 | <p> <br>
|
|---|
| 472 | The dark blue arrows in the figure above are directed along
|
|---|
| 473 | variable <b>lengthDirection</b>. The light blue arrows are directed
|
|---|
| 474 | along variable <b>widthDirection</b>. The <b>coordinate systems</b>
|
|---|
| 475 | in the figure represent frame_a of the Shape component.
|
|---|
| 476 | </p>
|
|---|
| 477 | <p>
|
|---|
| 478 | Additionally, external shapes are specified as DXF-files
|
|---|
| 479 | (only 3-dim.Face is supported). External shapes must be named \"1\", \"2\"
|
|---|
| 480 | etc.. The corresponding definitions should be in files \"1.dxf\",
|
|---|
| 481 | \"2.dxf\" etc.Since the DXF-files contain color and dimensions for
|
|---|
| 482 | the individual faces, the corresponding information in the model
|
|---|
| 483 | is currently ignored. The DXF-files must be found either in the current
|
|---|
| 484 | directory or in the directory where the Shape instance is stored
|
|---|
| 485 | that references the DXF file.
|
|---|
| 486 | </p>
|
|---|
| 487 |
|
|---|
| 488 | <p>
|
|---|
| 489 | Via input variable <b>extra</b> additional sizing data is defined
|
|---|
| 490 | according to:
|
|---|
| 491 | </p>
|
|---|
| 492 | <table border=1 cellspacing=0 cellpadding=2>
|
|---|
| 493 | <tr><th><b>shapeType</b></th><th>Meaning of variable <b>extra</b></th></tr>
|
|---|
| 494 | <tr>
|
|---|
| 495 | <td valign=\"top\">\"cylinder\"</td>
|
|---|
| 496 | <td valign=\"top\">if extra > 0, a black line is included in the
|
|---|
| 497 | cylinder to show the rotation of it.</td>
|
|---|
| 498 | </tr>
|
|---|
| 499 | <tr>
|
|---|
| 500 | <td valign=\"top\">\"cone\"</td>
|
|---|
| 501 | <td valign=\"top\">extra = diameter-left-side / diameter-right-side, i.e.,<br>
|
|---|
| 502 | extra = 1: cylinder<br>
|
|---|
| 503 | extra = 0: \"real\" cone.</td>
|
|---|
| 504 | </tr>
|
|---|
| 505 | <tr>
|
|---|
| 506 | <td valign=\"top\">\"pipe\"</td>
|
|---|
| 507 | <td valign=\"top\">extra = outer-diameter / inner-diameter, i.e, <br>
|
|---|
| 508 | extra = 1: cylinder that is completely hollow<br>
|
|---|
| 509 | extra = 0: cylinder without a hole.</td>
|
|---|
| 510 | </tr>
|
|---|
| 511 | <tr>
|
|---|
| 512 | <td valign=\"top\">\"gearwheel\"</td>
|
|---|
| 513 | <td valign=\"top\">extra is the number of teeth of the gear.</td>
|
|---|
| 514 | </tr>
|
|---|
| 515 | <tr>
|
|---|
| 516 | <td valign=\"top\">\"spring\"</td>
|
|---|
| 517 | <td valign=\"top\">extra is the number of windings of the spring.
|
|---|
| 518 | Additionally, \"height\" is <b>not</b> the \"height\" but
|
|---|
| 519 | 2*coil-width.</td>
|
|---|
| 520 | </tr>
|
|---|
| 521 | </table>
|
|---|
| 522 |
|
|---|
| 523 | <p>
|
|---|
| 524 | Parameter <b>color</b> is an Integer vector with 3 elements,
|
|---|
| 525 | {r, g, b}, and specifies the color of the shape.
|
|---|
| 526 | {r,g,b} are the \"red\", \"green\" and \"blue\" color parts.
|
|---|
| 527 | Note, r g, b are given in the range 0 .. 255.
|
|---|
| 528 | The predefined type <b>MultiBody.Types.Color</b> contains
|
|---|
| 529 | a menu definition of the colors used in the MultiBody
|
|---|
| 530 | library (will be replaced by a color editor).
|
|---|
| 531 | </p>
|
|---|
| 532 |
|
|---|
| 533 | <p>
|
|---|
| 534 | The variables under heading <b>Parameters</b> below
|
|---|
| 535 | are declared as (time varying) <b>input</b> variables.
|
|---|
| 536 | If the default equation is not appropriate, a corresponding
|
|---|
| 537 | modifier equation has to be provided in the
|
|---|
| 538 | model where a <b>Shape</b> instance is used, e.g., in the form
|
|---|
| 539 | </p>
|
|---|
| 540 | <pre>
|
|---|
| 541 | Visualizers.Advanced.Shape shape(length = sin(time));
|
|---|
| 542 | </pre>
|
|---|
| 543 | </HTML>
|
|---|
| 544 | "));
|
|---|
| 545 | end Shape;
|
|---|
| 546 |
|
|---|
| 547 | annotation(Documentation(info="<HTML>
|
|---|
| 548 | <p>
|
|---|
| 549 | Package <b>Visualizers.Advanced</b> contains components to visualize
|
|---|
| 550 | 3-dimensional shapes with dynamical sizes. None of the components
|
|---|
| 551 | has a frame connector. The position and orientation is set via
|
|---|
| 552 | modifiers. Basic knowledge of Modelica
|
|---|
| 553 | is needed in order to utilize the components of this package.
|
|---|
| 554 | These components have also to be used for models,
|
|---|
| 555 | where the forces and torques in the frame connector are set via
|
|---|
| 556 | equations (in this case, the models of the Visualizers package cannot be used,
|
|---|
| 557 | since they all have frame connectors).
|
|---|
| 558 | <p>
|
|---|
| 559 | <h4>Content</h4>
|
|---|
| 560 | <table border=1 cellspacing=0 cellpadding=2>
|
|---|
| 561 | <tr><td valign=\"top\"><a href=\"Modelica://Modelica.Mechanics.MultiBody.Visualizers.Advanced.Arrow\">Arrow</a></td>
|
|---|
| 562 | <td valign=\"top\">Visualizing an arrow where all parts of the arrow can vary dynamically:<br>
|
|---|
| 563 | <IMG SRC=\"../../Images/MultiBody/Visualizers/Arrow.png\" ALT=\"model Visualizers.Advanced.Arrow\">
|
|---|
| 564 | </td>
|
|---|
| 565 | </tr>
|
|---|
| 566 | <tr><td valign=\"top\"><a href=\"Modelica://Modelica.Mechanics.MultiBody.Visualizers.Advanced.DoubleArrow\">DoubleArrow</a></td>
|
|---|
| 567 | <td valign=\"top\">Visualizing a double arrow where all parts of the arrow can vary dynamically:<br>
|
|---|
| 568 | <IMG SRC=\"../../Images/MultiBody/Visualizers/DoubleArrow.png\" ALT=\"model Visualizers.Advanced.DoubleArrow\">
|
|---|
| 569 | </td>
|
|---|
| 570 | </tr>
|
|---|
| 571 | <tr><td valign=\"top\"><a href=\"Modelica://Modelica.Mechanics.MultiBody.Visualizers.Advanced.Shape\">Shape</a></td>
|
|---|
| 572 | <td valign=\"top\">Animation shape of a part with dynamically varying sizes.
|
|---|
| 573 | The following shape types are supported:<br> <br>
|
|---|
| 574 | <IMG SRC=\"../../Images/MultiBody/FixedShape.png\" ALT=\"model Visualizers.Advanced.Shape\">
|
|---|
| 575 | </td>
|
|---|
| 576 | </tr>
|
|---|
| 577 | </table>
|
|---|
| 578 | </HTML>"));
|
|---|
| 579 | end Advanced;
|
|---|
| 580 |
|
|---|
| 581 | package Internal "Visualizers that will be replaced by improved versions in the future (don't use them)"
|
|---|
| 582 | extends Modelica.Icons.Library;
|
|---|
| 583 | model Lines "Visualizing a set of lines as cylinders with variable size, e.g., used to display characters (no Frame connector)"
|
|---|
| 584 | import SI = Modelica.SIunits;
|
|---|
| 585 | import Modelica.Mechanics.MultiBody;
|
|---|
| 586 | import Modelica.Mechanics.MultiBody.Types;
|
|---|
| 587 | import Modelica.Mechanics.MultiBody.Frames;
|
|---|
| 588 | import T = Modelica.Mechanics.MultiBody.Frames.TransformationMatrices;
|
|---|
| 589 | input Modelica.Mechanics.MultiBody.Frames.Orientation R=Frames.nullRotation() "Orientation object to rotate the world frame into the object frame" annotation(Dialog);
|
|---|
| 590 | input SI.Position r[3]={0,0,0} "Position vector from origin of world frame to origin of object frame, resolved in world frame" annotation(Dialog);
|
|---|
| 591 | input SI.Position r_lines[3]={0,0,0} "Position vector from origin of object frame to the origin of 'lines' frame, resolved in object frame" annotation(Dialog);
|
|---|
| 592 | input Real n_x[3](each final unit="1")={1,0,0} "Vector in direction of x-axis of 'lines' frame, resolved in object frame" annotation(Dialog);
|
|---|
| 593 | input Real n_y[3](each final unit="1")={0,1,0} "Vector in direction of y-axis of 'lines' frame, resolved in object frame" annotation(Dialog);
|
|---|
| 594 | input SI.Position lines[:,2,2]=zeros(0, 2, 2) "List of start and end points of cylinders resolved in an x-y frame defined by n_x, n_y, e.g., {[0,0;1,1], [0,1;1,0], [2,0; 3,1]}" annotation(Dialog);
|
|---|
| 595 | input SI.Length diameter(min=0)=0.05 "Diameter of the cylinders defined by lines" annotation(Dialog);
|
|---|
| 596 | input Modelica.Mechanics.MultiBody.Types.Color color={0,128,255} "Color of cylinders" annotation(Dialog);
|
|---|
| 597 | input Types.SpecularCoefficient specularCoefficient=0.7 "Reflection of ambient light (= 0: light is completely absorbed)" annotation(Dialog);
|
|---|
| 598 | protected
|
|---|
| 599 | parameter Integer n=size(lines, 1) "Number of cylinders";
|
|---|
| 600 | T.Orientation R_rel=T.from_nxy(n_x, n_y);
|
|---|
| 601 | T.Orientation R_lines=T.absoluteRotation(R.T, R_rel);
|
|---|
| 602 | Modelica.SIunits.Position r_abs[3]=r + T.resolve1(R.T, r_lines);
|
|---|
| 603 | Modelica.Mechanics.MultiBody.Visualizers.Advanced.Shape cylinders[n](each shapeType="cylinder", lengthDirection=array(T.resolve1(R_rel, vector([lines[i,2,:] - lines[i,1,:];0])) for i in 1:n), length=array(Modelica.Math.Vectors.length(lines[i,2,:] - lines[i,1,:]) for i in 1:n), r=array(r_abs + T.resolve1(R_lines, vector([lines[i,1,:];0])) for i in 1:n), each width=diameter, each height=diameter, each widthDirection={0,1,0}, each color=color, each R=R, each specularCoefficient=specularCoefficient);
|
|---|
| 604 | annotation(Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}), graphics={Rectangle(extent={{-100,100},{100,-100}}, lineColor={128,128,128}, fillColor={255,255,255}, fillPattern=FillPattern.Solid),Polygon(points={{-24,-34},{-82,40},{-72,46},{-14,-26},{-24,-34}}, lineColor={0,127,255}, fillColor={0,127,255}, fillPattern=FillPattern.Solid),Polygon(points={{-82,-24},{-20,46},{-10,38},{-72,-32},{-82,-24}}, lineColor={0,127,255}, fillColor={0,127,255}, fillPattern=FillPattern.Solid),Polygon(points={{42,-18},{10,40},{20,48},{50,-6},{42,-18}}, lineColor={0,127,255}, fillColor={0,127,255}, fillPattern=FillPattern.Solid),Polygon(points={{10,-68},{84,48},{96,42},{24,-72},{10,-68}}, lineColor={0,127,255}, fillColor={0,127,255}, fillPattern=FillPattern.Solid),Text(extent={{-140,164},{148,102}}, textString="%name", lineColor={0,0,255})}), Diagram(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}), graphics), Documentation(info="<HTML>
|
|---|
| 605 | <p>
|
|---|
| 606 | With model <b>Lines</b> a set of dynamic lines is defined
|
|---|
| 607 | that are located relatively to frame_a. Every line
|
|---|
| 608 | is represented by a cylinder. This allows, e.g., to define simple shaped
|
|---|
| 609 | 3-dimensional characters. Note, if the lines are fixed relatively to frame_a,
|
|---|
| 610 | it is more convenient to use model <b>Visualizers.FixedLines</b>.
|
|---|
| 611 | An example for dynamic lines is shown in the following figure:<br>
|
|---|
| 612 | </p>
|
|---|
| 613 | <IMG SRC=\"../../Images/MultiBody/FixedLines.png\" ALT=\"model Visualizers.FixedLines\">
|
|---|
| 614 | <p> <br>
|
|---|
| 615 | The two letters \"x\" and \"y\" are constructed with 4 lines
|
|---|
| 616 | by providing the following data for input variable <b>lines</b>
|
|---|
| 617 | </p>
|
|---|
| 618 | <pre>
|
|---|
| 619 | lines = {[0, 0; 1, 1],[0, 1; 1, 0],[1.5, -0.5; 2.5, 1],[1.5, 1; 2, 0.25]}
|
|---|
| 620 | </pre>
|
|---|
| 621 | <p>
|
|---|
| 622 | Via vectors <b>n_x</b> and <b>n_y</b> a two-dimensional
|
|---|
| 623 | coordinate system is defined. The points defined with variable
|
|---|
| 624 | <b>lines</b> are with respect to this coordinate system. For example
|
|---|
| 625 | \"[0, 0; 1, 1]\" defines a line that starts at {0,0} and ends at {1,1}.
|
|---|
| 626 | The diameter and color of all line cylinders are identical
|
|---|
| 627 | and are defined by parameters.
|
|---|
| 628 | </p>
|
|---|
| 629 |
|
|---|
| 630 | </HTML>
|
|---|
| 631 | "));
|
|---|
| 632 | end Lines;
|
|---|
| 633 |
|
|---|
| 634 | annotation(Documentation(info="<html>
|
|---|
| 635 | <p>
|
|---|
| 636 | This package contains components to construct 3-dim. fonts
|
|---|
| 637 | with \"cylinder\" elements for the animation window.
|
|---|
| 638 | This is just a temporary hack until 3-dim. fonts are supported in
|
|---|
| 639 | Modelica tools. The components are used to construct the \"x\", \"y\",
|
|---|
| 640 | \"z\" labels of coordinates systems in the animation.
|
|---|
| 641 | </p>
|
|---|
| 642 | </html>"));
|
|---|
| 643 | end Internal;
|
|---|
| 644 |
|
|---|
| 645 | annotation(Documentation(info="<HTML>
|
|---|
| 646 | <p>
|
|---|
| 647 | Package <b>Visualizers</b> contains components to visualize
|
|---|
| 648 | 3-dimensional shapes. These components are the basis for the
|
|---|
| 649 | animation features of the MultiBody library.
|
|---|
| 650 | <p>
|
|---|
| 651 | <h4>Content</h4>
|
|---|
| 652 | <table border=1 cellspacing=0 cellpadding=2>
|
|---|
| 653 | <tr><td valign=\"top\"><a href=\"Modelica://Modelica.Mechanics.MultiBody.Visualizers.FixedShape\">FixedShape</a><br>
|
|---|
| 654 | <a href=\"Modelica://Modelica.Mechanics.MultiBody.Visualizers.FixedShape2\">FixedShape2</a></td>
|
|---|
| 655 | <td valign=\"top\">Animation shape of a part with fixed sizes. FixedShape2 has additionally
|
|---|
| 656 | a frame_b for easier connection to further visual objects.
|
|---|
| 657 | The following shape types are supported:<br> <br>
|
|---|
| 658 | <IMG SRC=\"../../Images/MultiBody/FixedShape.png\" ALT=\"model Visualizers.FixedShape\">
|
|---|
| 659 | </td>
|
|---|
| 660 | </tr>
|
|---|
| 661 | <tr><td valign=\"top\"><a href=\"Modelica://Modelica.Mechanics.MultiBody.Visualizers.FixedFrame\">FixedFrame</a></td>
|
|---|
| 662 | <td valign=\"top\">Visualizing a coordinate system including axes labels with fixed sizes:<br>
|
|---|
| 663 | <IMG SRC=\"../../Images/MultiBody/FixedFrame2.png\"
|
|---|
| 664 | ALT=\"model Visualizers.FixedFrame\">
|
|---|
| 665 | </td>
|
|---|
| 666 | </tr>
|
|---|
| 667 | <tr><td valign=\"top\"><a href=\"Modelica://Modelica.Mechanics.MultiBody.Visualizers.FixedArrow\">FixedArrow</a>,<br>
|
|---|
| 668 | <a href=\"Modelica://Modelica.Mechanics.MultiBody.Visualizers.SignalArrow\">SignalArrow</a></td>
|
|---|
| 669 | <td valign=\"top\">Visualizing an arrow. Model \"FixedArrow\" provides
|
|---|
| 670 | a fixed sized arrow, model \"SignalArrow\" provides
|
|---|
| 671 | an arrow with dynamically varying length that is defined
|
|---|
| 672 | by an input signal vector:<br>
|
|---|
| 673 | <IMG SRC=\"../../Images/MultiBody/Visualizers/Arrow.png\" \">
|
|---|
| 674 | </td>
|
|---|
| 675 | </tr>
|
|---|
| 676 | <tr><td valign=\"top\"><a href=\"Modelica://Modelica.Mechanics.MultiBody.Visualizers.Advanced\">Advanced</a></td>
|
|---|
| 677 | <td valign=\"top\"> <b>Package</b> that contains components to visualize
|
|---|
| 678 | 3-dimensional shapes where all parts of the shape
|
|---|
| 679 | can vary dynamically. Basic knowledge of Modelica is
|
|---|
| 680 | needed in order to utilize the components of this package.
|
|---|
| 681 | </td>
|
|---|
| 682 | </tr>
|
|---|
| 683 | </table>
|
|---|
| 684 | <p>
|
|---|
| 685 | The colors of the visualization components are declared with
|
|---|
| 686 | the predefined type <b>MultiBody.Types.Color</b>.
|
|---|
| 687 | This is a vector with 3 elements,
|
|---|
| 688 | {r, g, b}, and specifies the color of the shape.
|
|---|
| 689 | {r,g,b} are the \"red\", \"green\" and \"blue\" color parts.
|
|---|
| 690 | Note, r g, b are given as Integer[3] in the ranges 0 .. 255,
|
|---|
| 691 | respectively.
|
|---|
| 692 | </p>
|
|---|
| 693 | </HTML>"));
|
|---|
| 694 | end Visualizers;
|
|---|
| 695 |
|
|---|
| 696 | package Types "Constants and types with choices, especially to build menus"
|
|---|
| 697 | extends Modelica.Icons.Library;
|
|---|
| 698 | type Axis= Modelica.Icons.TypeReal[3](each final unit="1") "Axis vector with choices for menus" annotation(preferedView="text", Evaluate=true, choices(choice={1,0,0} "{1,0,0} \"x axis\"", choice={0,1,0} "{0,1,0} \"y axis\"", choice={0,0,1} "{0,0,1} \"z axis\"", choice={-1,0,0} "{-1,0,0} \"negative x axis\"", choice={0,-1,0} "{0,-1,0} \"negative y axis\"", choice={0,0,-1} "{0,0,-1} \"negative z axis\""), Documentation(info="<html>
|
|---|
| 699 | </html>"));
|
|---|
| 700 | type AxisLabel= Modelica.Icons.TypeString "Label of axis with choices for menus" annotation(preferedView="text", choices(choice="x" "x", choice="y" "y", choice="z" "z"));
|
|---|
| 701 | type RotationSequence= Modelica.Icons.TypeInteger[3](min={1,1,1}, max={3,3,3}) "Sequence of planar frame rotations with choices for menus" annotation(preferedView="text", Evaluate=true, choices(choice={1,2,3} "{1,2,3} \"Cardan/Tait-Bryan angles\"", choice={3,1,3} "{3,1,3} \"Euler angles\"", choice={3,2,1} "{3,2,1}"));
|
|---|
| 702 | type Color= Modelica.Icons.TypeInteger[3](each min=0, each max=255) "RGB representation of color (will be improved with a color editor)" annotation(Dialog(colorSelector), choices(choice={0,0,0} "{0,0,0} \"black\"", choice={155,0,0} "{155,0,0} \"dark red\"", choice={255,0,0} "{255,0,0 } \"red\"", choice={255,65,65} "{255,65,65} \"light red\"", choice={0,128,0} "{0,128,0} \"dark green\"", choice={0,180,0} "{0,180,0} \"green\"", choice={0,230,0} "{0,230,0} \"light green\"", choice={0,0,200} "{0,0,200} \"dark blue\"", choice={0,0,255} "{0,0,255} \"blue\"", choice={0,128,255} "{0,128,255} \"light blue\"", choice={255,255,0} "{255,255,0} \"yellow\"", choice={255,0,255} "{255,0,255} \"pink\"", choice={100,100,100} "{100,100,100} \"dark grey\"", choice={155,155,155} "{155,155,155} \"grey\"", choice={255,255,255} "{255,255,255} \"white\""), Documentation(info="<html>
|
|---|
| 703 | <p>
|
|---|
| 704 | Type <b>Color</b> is an Integer vector with 3 elements,
|
|---|
| 705 | {r, g, b}, and specifies the color of a shape.
|
|---|
| 706 | {r,g,b} are the \"red\", \"green\" and \"blue\" color parts.
|
|---|
| 707 | Note, r g, b are given in the range 0 .. 255.
|
|---|
| 708 | </p>
|
|---|
| 709 | </html>"));
|
|---|
| 710 | type SpecularCoefficient= Modelica.Icons.TypeReal "Reflection of ambient light (= 0: light is completely absorbed)" annotation(min=0, choices(choice=0 "\"0.0 (dull)\"", choice=0.7 "\"0.7 (medium)\"", choice=1 "\"1.0 (glossy)\""), Documentation(info="<html>
|
|---|
| 711 | <p>
|
|---|
| 712 | Type <b>SpecularCoefficient</b> defines the reflection of
|
|---|
| 713 | ambient light on shape surfaces. If value = 0, the light
|
|---|
| 714 | is completely absorbed. Often, 0.7 is a reasonable value.
|
|---|
| 715 | It might be that from some viewing directions, a body is no
|
|---|
| 716 | longer visible, if the SpecularCoefficient value is too high.
|
|---|
| 717 | In the following image, the different values of SpecularCoefficient
|
|---|
| 718 | are shown for a cylinder:
|
|---|
| 719 | </p>
|
|---|
| 720 |
|
|---|
| 721 | <p>
|
|---|
| 722 | <img src=\"../Images/MultiBody/Visualizers/SpecularCoefficient.png\"
|
|---|
| 723 | </p>
|
|---|
| 724 | </html>"));
|
|---|
| 725 | type ShapeType= Modelica.Icons.TypeString "Type of shape (box, sphere, cylinder, pipecylinder, cone, pipe, beam, gearwheel, spring, dxf-file)" annotation(choices(choice="box" "\"box\"", choice="sphere" "\"sphere\"", choice="cylinder" "\"cylinder\"", choice="pipecylinder" "\"pipecylinder\"", choice="cone" "\"cone\"", choice="pipe" "\"pipe\"", choice="beam" "\"beam\"", choice="gearwheel" "\"gearwheel\"", choice="spring" "\"spring\"", choice="1" "File \"1.dxf\" in current directory", choice="2" "File \"2.dxf\" in current directory", choice="3" "File \"3.dxf\" in current directory", choice="4" "File \"4.dxf\" in current directory", choice="5" "File \"5.dxf\" in current directory", choice="6" "File \"6.dxf\" in current directory", choice="7" "File \"7.dxf\" in current directory", choice="8" "File \"8.dxf\" in current directory", choice="9" "File \"9.dxf\" in current directory"), Documentation(info="<html>
|
|---|
| 726 | <p>
|
|---|
| 727 | Type <b>ShapeType</b> is used to define the shape of the
|
|---|
| 728 | visual object as parameter String. Usually, \"shapeType\" is used
|
|---|
| 729 | as instance name. The following
|
|---|
| 730 | values for shapeType are possible, e.g., shapeType=\"box\":
|
|---|
| 731 | </p>
|
|---|
| 732 | <IMG SRC=\"../Images/MultiBody/Shape.png\" ALT=\"model Visualizers.FixedShape\">
|
|---|
| 733 | <p> <br>
|
|---|
| 734 | The dark blue arrows in the figure above are directed along
|
|---|
| 735 | variable <b>lengthDirection</b>. The light blue arrows are directed
|
|---|
| 736 | along variable <b>widthDirection</b>. The <b>coordinate systems</b>
|
|---|
| 737 | in the figure represent frame_a of the Shape component.
|
|---|
| 738 | </p>
|
|---|
| 739 | <p>
|
|---|
| 740 | Additionally, external shapes are specified as DXF-files
|
|---|
| 741 | (only 3-dim.Face is supported). External shapes must be named \"1\", \"2\"
|
|---|
| 742 | etc.. The corresponding definitions should be in files \"1.dxf\",
|
|---|
| 743 | \"2.dxf\" etc.Since the DXF-files contain color and dimensions for
|
|---|
| 744 | the individual faces, the corresponding information in the model
|
|---|
| 745 | is currently ignored. The DXF-files must be found either in the current
|
|---|
| 746 | directory or in the directory where the Shape instance is stored
|
|---|
| 747 | that references the DXF file.
|
|---|
| 748 | </p>
|
|---|
| 749 | </html>"));
|
|---|
| 750 | type ShapeExtra= Modelica.Icons.TypeReal "Reflection of ambient light (= 0: light is completely absorbed)" annotation(min=0, Documentation(info="<html>
|
|---|
| 751 | <p>
|
|---|
| 752 | This type is used in shapes of visual objects to define
|
|---|
| 753 | extra data depending on the shape type. Usually, input
|
|---|
| 754 | variable <b>extra</b> is used as instance name:
|
|---|
| 755 | </p>
|
|---|
| 756 | <table border=1 cellspacing=0 cellpadding=2>
|
|---|
| 757 | <tr><th><b>shapeType</b></th><th>Meaning of variable <b>extra</b></th></tr>
|
|---|
| 758 | <tr>
|
|---|
| 759 | <td valign=\"top\">\"cylinder\"</td>
|
|---|
| 760 | <td valign=\"top\">if extra > 0, a black line is included in the
|
|---|
| 761 | cylinder to show the rotation of it.</td>
|
|---|
| 762 | </tr>
|
|---|
| 763 | <tr>
|
|---|
| 764 | <td valign=\"top\">\"cone\"</td>
|
|---|
| 765 | <td valign=\"top\">extra = diameter-left-side / diameter-right-side, i.e.,<br>
|
|---|
| 766 | extra = 1: cylinder<br>
|
|---|
| 767 | extra = 0: \"real\" cone.</td>
|
|---|
| 768 | </tr>
|
|---|
| 769 | <tr>
|
|---|
| 770 | <td valign=\"top\">\"pipe\"</td>
|
|---|
| 771 | <td valign=\"top\">extra = outer-diameter / inner-diameter, i.e, <br>
|
|---|
| 772 | extra = 1: cylinder that is completely hollow<br>
|
|---|
| 773 | extra = 0: cylinder without a hole.</td>
|
|---|
| 774 | </tr>
|
|---|
| 775 | <tr>
|
|---|
| 776 | <td valign=\"top\">\"gearwheel\"</td>
|
|---|
| 777 | <td valign=\"top\">extra is the number of teeth of the gear.</td>
|
|---|
| 778 | </tr>
|
|---|
| 779 | <tr>
|
|---|
| 780 | <td valign=\"top\">\"spring\"</td>
|
|---|
| 781 | <td valign=\"top\">extra is the number of windings of the spring.
|
|---|
| 782 | Additionally, \"height\" is <b>not</b> the \"height\" but
|
|---|
| 783 | 2*coil-width.</td>
|
|---|
| 784 | </tr>
|
|---|
| 785 | </table>
|
|---|
| 786 | </html>"));
|
|---|
| 787 | type RotationTypes= enumeration(RotationAxis "Rotating frame_a around an angle with a fixed axis", TwoAxesVectors "Resolve two vectors of frame_b in frame_a", PlanarRotationSequence "Planar rotation sequence") "Enumeration defining in which way the fixed orientation of frame_b with respect to frame_a is specified" annotation(Evaluate=true, Documentation(info="<html>
|
|---|
| 788 | <table border=1 cellspacing=0 cellpadding=2>
|
|---|
| 789 | <tr><th><b>Types.RotationTypes.</b></th><th><b>Meaning</b></th></tr>
|
|---|
| 790 | <tr><td valign=\"top\">RotationAxis</td>
|
|---|
| 791 | <td valign=\"top\">frame_b is defined by rotating the coordinate system along
|
|---|
| 792 | an axis fixed in frame_a and with a fixed angle.</td></tr>
|
|---|
| 793 |
|
|---|
| 794 | <tr><td valign=\"top\">TwoAxesVectors</td>
|
|---|
| 795 | <td valign=\"top\">frame_b is defined by resolving two vectors of frame_b in frame_a.</td></tr>
|
|---|
| 796 |
|
|---|
| 797 | <tr><td valign=\"top\">PlanarRotationSequence</td>
|
|---|
| 798 | <td valign=\"top\">frame_b is defined by rotating the coordinate system along
|
|---|
| 799 | 3 consecutive axes vectors with fixed rotation angles
|
|---|
| 800 | (e.g. Cardan or Euler angle sequence rotation).</td></tr>
|
|---|
| 801 | </table>
|
|---|
| 802 | </html>"));
|
|---|
| 803 | type GravityTypes= enumeration(NoGravity "No gravity field", UniformGravity "Uniform gravity field", PointGravity "Point gravity field") "Enumeration defining the type of the gravity field" annotation(Documentation(info="<html>
|
|---|
| 804 | <table border=1 cellspacing=0 cellpadding=2>
|
|---|
| 805 | <tr><th><b>Types.GravityTypes.</b></th><th><b>Meaning</b></th></tr>
|
|---|
| 806 | <tr><td valign=\"top\">NoGravity</td>
|
|---|
| 807 | <td valign=\"top\">No gravity field</td></tr>
|
|---|
| 808 |
|
|---|
| 809 | <tr><td valign=\"top\">UniformGravity</td>
|
|---|
| 810 | <td valign=\"top\">Gravity field is described by a vector of constant gravity acceleration</td></tr>
|
|---|
| 811 |
|
|---|
| 812 | <tr><td valign=\"top\">PointGravity</td>
|
|---|
| 813 | <td valign=\"top\">Central gravity field. The gravity acceleration vector is directed to
|
|---|
| 814 | the field center and the gravity is proportional to 1/r^2, where
|
|---|
| 815 | r is the distance to the field center.</td></tr>
|
|---|
| 816 | </table>
|
|---|
| 817 | </html>"));
|
|---|
| 818 | package Defaults "Default settings of the MultiBody library via constants"
|
|---|
| 819 | extends Modelica.Icons.Library;
|
|---|
| 820 | constant Types.Color BodyColor={0,128,255} "Default color for body shapes that have mass (light blue)";
|
|---|
| 821 | constant Types.Color RodColor={155,155,155} "Default color for massless rod shapes (grey)";
|
|---|
| 822 | constant Types.Color JointColor={255,0,0} "Default color for elementary joints (red)";
|
|---|
| 823 | constant Types.Color ForceColor={0,128,0} "Default color for force arrow (dark green)";
|
|---|
| 824 | constant Types.Color TorqueColor={0,128,0} "Default color for torque arrow (dark green)";
|
|---|
| 825 | constant Types.Color SpringColor={0,0,255} "Default color for a spring (blue)";
|
|---|
| 826 | constant Types.Color SensorColor={255,255,0} "Default color for sensors (yellow)";
|
|---|
| 827 | constant Types.Color FrameColor={0,0,0} "Default color for frame axes and labels (black)";
|
|---|
| 828 | constant Types.Color ArrowColor={0,0,255} "Default color for arrows and double arrows (blue)";
|
|---|
| 829 | constant Real FrameHeadLengthFraction=5.0 "Frame arrow head length / arrow diameter";
|
|---|
| 830 | constant Real FrameHeadWidthFraction=3.0 "Frame arrow head width / arrow diameter";
|
|---|
| 831 | constant Real FrameLabelHeightFraction=3.0 "Height of frame label / arrow diameter";
|
|---|
| 832 | constant Real ArrowHeadLengthFraction=4.0 "Arrow head length / arrow diameter";
|
|---|
| 833 | constant Real ArrowHeadWidthFraction=3.0 "Arrow head width / arrow diameter";
|
|---|
| 834 | constant SI.Diameter BodyCylinderDiameterFraction=3 "Default for body cylinder diameter as a fraction of body sphere diameter";
|
|---|
| 835 | constant Real JointRodDiameterFraction=2 "Default for rod diameter as a fraction of joint sphere diameter attached to rod";
|
|---|
| 836 | annotation(Documentation(info="<html>
|
|---|
| 837 | <p>
|
|---|
| 838 | This package contains constants used as default setting
|
|---|
| 839 | in the MultiBody library.
|
|---|
| 840 | </p>
|
|---|
| 841 | </html>"));
|
|---|
| 842 | end Defaults;
|
|---|
| 843 |
|
|---|
| 844 | annotation(Documentation(info="<HTML>
|
|---|
| 845 | <p>
|
|---|
| 846 | In this package <b>types</b> and <b>constants</b> are defined that are used in the
|
|---|
| 847 | MultiBody library. The types have additional annotation choices
|
|---|
| 848 | definitions that define the menus to be built up in the graphical
|
|---|
| 849 | user interface when the type is used as parameter in a declaration.
|
|---|
| 850 | </p>
|
|---|
| 851 | </HTML>"));
|
|---|
| 852 | end Types;
|
|---|
| 853 |
|
|---|
| 854 | package Parts "Rigid components such as bodies with mass and inertia and massless rods"
|
|---|
| 855 | import SI = Modelica.SIunits;
|
|---|
| 856 | extends Modelica.Icons.Library;
|
|---|
| 857 | model FixedTranslation "Fixed translation of frame_b with respect to frame_a"
|
|---|
| 858 | import SI = Modelica.SIunits;
|
|---|
| 859 | import Modelica.Mechanics.MultiBody.Types;
|
|---|
| 860 | Interfaces.Frame_a frame_a "Coordinate system fixed to the component with one cut-force and cut-torque" annotation(Placement(transformation(extent={{-116,-16},{-84,16}}, rotation=0)));
|
|---|
| 861 | Interfaces.Frame_b frame_b "Coordinate system fixed to the component with one cut-force and cut-torque" annotation(Placement(transformation(extent={{84,-16},{116,16}}, rotation=0)));
|
|---|
| 862 | parameter Boolean animation=true "= true, if animation shall be enabled";
|
|---|
| 863 | parameter SI.Position r[3](start={0,0,0}) "Vector from frame_a to frame_b resolved in frame_a";
|
|---|
| 864 | parameter Types.ShapeType shapeType="cylinder" " Type of shape" annotation(Dialog(tab="Animation", group="if animation = true", enable=animation));
|
|---|
| 865 | parameter SI.Position r_shape[3]={0,0,0} " Vector from frame_a to shape origin, resolved in frame_a" annotation(Dialog(tab="Animation", group="if animation = true", enable=animation));
|
|---|
| 866 | parameter Types.Axis lengthDirection=r - r_shape " Vector in length direction of shape, resolved in frame_a" annotation(Evaluate=true, Dialog(tab="Animation", group="if animation = true", enable=animation));
|
|---|
| 867 | parameter Types.Axis widthDirection={0,1,0} " Vector in width direction of shape, resolved in frame_a" annotation(Evaluate=true, Dialog(tab="Animation", group="if animation = true", enable=animation));
|
|---|
| 868 | parameter SI.Length length=Modelica.Math.Vectors.length(r - r_shape) " Length of shape" annotation(Dialog(tab="Animation", group="if animation = true", enable=animation));
|
|---|
| 869 | parameter SI.Distance width=length/world.defaultWidthFraction " Width of shape" annotation(Dialog(tab="Animation", group="if animation = true", enable=animation));
|
|---|
| 870 | parameter SI.Distance height=width " Height of shape." annotation(Dialog(tab="Animation", group="if animation = true", enable=animation));
|
|---|
| 871 | parameter Types.ShapeExtra extra=0.0 " Additional parameter depending on shapeType (see docu of Visualizers.Advanced.Shape)." annotation(Dialog(tab="Animation", group="if animation = true", enable=animation));
|
|---|
| 872 | input Types.Color color=Modelica.Mechanics.MultiBody.Types.Defaults.RodColor " Color of shape" annotation(Dialog(tab="Animation", group="if animation = true", enable=animation));
|
|---|
| 873 | input Types.SpecularCoefficient specularCoefficient=world.defaultSpecularCoefficient "Reflection of ambient light (= 0: light is completely absorbed)" annotation(Dialog(tab="Animation", group="if animation = true", enable=animation));
|
|---|
| 874 | protected
|
|---|
| 875 | outer Modelica.Mechanics.MultiBody.World world;
|
|---|
| 876 | Visualizers.Advanced.Shape shape(shapeType=shapeType, color=color, specularCoefficient=specularCoefficient, r_shape=r_shape, lengthDirection=lengthDirection, widthDirection=widthDirection, length=length, width=width, height=height, extra=extra, r=frame_a.r_0, R=frame_a.R) if world.enableAnimation and animation;
|
|---|
| 877 | equation
|
|---|
| 878 | Connections.branch(frame_a.R, frame_b.R);
|
|---|
| 879 | assert(cardinality(frame_a) > 0 or cardinality(frame_b) > 0, "Neither connector frame_a nor frame_b of FixedTranslation object is connected");
|
|---|
| 880 | frame_b.r_0=frame_a.r_0 + Frames.resolve1(frame_a.R, r);
|
|---|
| 881 | frame_b.R=frame_a.R;
|
|---|
| 882 | zeros(3)=frame_a.f + frame_b.f;
|
|---|
| 883 | zeros(3)=frame_a.t + frame_b.t + cross(r, frame_b.f);
|
|---|
| 884 | annotation(Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={1,1}), graphics={Rectangle(extent={{-99,5},{101,-5}}, lineColor={0,0,0}, fillColor={0,0,0}, fillPattern=FillPattern.Solid),Text(extent={{-131,101},{129,41}}, textString="%name", lineColor={0,0,255}),Text(extent={{127,-72},{-133,-22}}, lineColor={0,0,0}, textString="%=r"),Text(extent={{-89,38},{-53,13}}, lineColor={128,128,128}, textString="a"),Text(extent={{57,39},{93,14}}, lineColor={128,128,128}, textString="b")}), Diagram(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={1,1}), graphics={Rectangle(extent={{-100,5},{100,-5}}, lineColor={0,0,0}, fillColor={0,0,0}, fillPattern=FillPattern.Solid),Line(points={{-95,20},{-58,20}}, color={128,128,128}, arrow={Arrow.None,Arrow.Filled}),Line(points={{-94,18},{-94,50}}, color={128,128,128}, arrow={Arrow.None,Arrow.Filled}),Text(extent={{-72,35},{-58,24}}, lineColor={128,128,128}, textString="x"),Text(extent={{-113,57},{-98,45}}, lineColor={128,128,128}, textString="y"),Line(points={{-100,-4},{-100,-69}}, color={128,128,128}),Line(points={{-100,-63},{90,-63}}, color={128,128,128}),Text(extent={{-22,-39},{16,-63}}, lineColor={128,128,128}, textString="r"),Polygon(points={{88,-59},{88,-68},{100,-63},{88,-59}}, lineColor={0,0,0}, fillColor={0,0,0}, fillPattern=FillPattern.Solid),Line(points={{100,-3},{100,-68}}, color={128,128,128}),Line(points={{69,20},{106,20}}, color={128,128,128}, arrow={Arrow.None,Arrow.Filled}),Line(points={{70,18},{70,50}}, color={128,128,128}, arrow={Arrow.None,Arrow.Filled}),Text(extent={{92,35},{106,24}}, lineColor={128,128,128}, textString="x"),Text(extent={{51,57},{66,45}}, lineColor={128,128,128}, textString="y")}), Documentation(info="<HTML>
|
|---|
| 885 | <p>
|
|---|
| 886 | Component for a <b>fixed translation</b> of frame_b with respect
|
|---|
| 887 | to frame_a, i.e., the relationship between connectors frame_a and frame_b
|
|---|
| 888 | remains constant and frame_a is always <b>parallel</b> to frame_b.
|
|---|
| 889 | </p>
|
|---|
| 890 | <p>
|
|---|
| 891 | By default, this component is visualized by a cylinder connecting
|
|---|
| 892 | frame_a and frame_b, as shown in the figure below. Note, that the
|
|---|
| 893 | two visualized frames are not part of the component animation and that
|
|---|
| 894 | the animation may be switched off via parameter animation = <b>false</b>.
|
|---|
| 895 | </p>
|
|---|
| 896 | <IMG SRC=\"../../Images/MultiBody/FixedTranslation.png\" ALT=\"Parts.FixedTranslation\">
|
|---|
| 897 | </HTML>"));
|
|---|
| 898 | end FixedTranslation;
|
|---|
| 899 |
|
|---|
| 900 | model FixedRotation "Fixed translation followed by a fixed rotation of frame_b with respect to frame_a"
|
|---|
| 901 | import Modelica.Mechanics.MultiBody.Frames;
|
|---|
| 902 | import Modelica.Mechanics.MultiBody.Types;
|
|---|
| 903 | import SI = Modelica.SIunits;
|
|---|
| 904 | import Cv = Modelica.SIunits.Conversions;
|
|---|
| 905 | Interfaces.Frame_a frame_a "Coordinate system fixed to the component with one cut-force and cut-torque" annotation(Placement(transformation(extent={{-116,-16},{-84,16}}, rotation=0)));
|
|---|
| 906 | Interfaces.Frame_b frame_b "Coordinate system fixed to the component with one cut-force and cut-torque" annotation(Placement(transformation(extent={{84,-16},{116,16}}, rotation=0)));
|
|---|
| 907 | parameter Boolean animation=true "= true, if animation shall be enabled";
|
|---|
| 908 | parameter SI.Position r[3]={0,0,0} "Vector from frame_a to frame_b resolved in frame_a";
|
|---|
| 909 | parameter Modelica.Mechanics.MultiBody.Types.RotationTypes rotationType=Modelica.Mechanics.MultiBody.Types.RotationTypes.RotationAxis "Type of rotation description" annotation(Evaluate=true);
|
|---|
| 910 | parameter Types.Axis n={1,0,0} " Axis of rotation in frame_a (= same as in frame_b)" annotation(Evaluate=true, Dialog(group="if rotationType = RotationAxis", enable=rotationType == Modelica.Mechanics.MultiBody.Types.RotationTypes.RotationAxis));
|
|---|
| 911 | parameter Cv.NonSIunits.Angle_deg angle=0 " Angle to rotate frame_a around axis n into frame_b" annotation(Dialog(group="if rotationType = RotationAxis", enable=rotationType == Modelica.Mechanics.MultiBody.Types.RotationTypes.RotationAxis));
|
|---|
| 912 | parameter Types.Axis n_x={1,0,0} " Vector along x-axis of frame_b resolved in frame_a" annotation(Evaluate=true, Dialog(group="if rotationType = TwoAxesVectors", enable=rotationType == Types.RotationTypes.TwoAxesVectors));
|
|---|
| 913 | parameter Types.Axis n_y={0,1,0} " Vector along y-axis of frame_b resolved in frame_a" annotation(Evaluate=true, Dialog(group="if rotationType = TwoAxesVectors", enable=rotationType == Types.RotationTypes.TwoAxesVectors));
|
|---|
| 914 | parameter Types.RotationSequence sequence(min={1,1,1}, max={3,3,3})={1,2,3} " Sequence of rotations" annotation(Evaluate=true, Dialog(group="if rotationType = PlanarRotationSequence", enable=rotationType == Types.RotationTypes.PlanarRotationSequence));
|
|---|
| 915 | parameter Cv.NonSIunits.Angle_deg angles[3]={0,0,0} " Rotation angles around the axes defined in 'sequence'" annotation(Dialog(group="if rotationType = PlanarRotationSequence", enable=rotationType == Types.RotationTypes.PlanarRotationSequence));
|
|---|
| 916 | parameter Types.ShapeType shapeType="cylinder" " Type of shape" annotation(Dialog(tab="Animation", group="if animation = true", enable=animation));
|
|---|
| 917 | parameter SI.Position r_shape[3]={0,0,0} " Vector from frame_a to shape origin, resolved in frame_a" annotation(Dialog(tab="Animation", group="if animation = true", enable=animation));
|
|---|
| 918 | parameter Types.Axis lengthDirection=r - r_shape " Vector in length direction of shape, resolved in frame_a" annotation(Evaluate=true, Dialog(tab="Animation", group="if animation = true", enable=animation));
|
|---|
| 919 | parameter Types.Axis widthDirection={0,1,0} " Vector in width direction of shape, resolved in frame_a" annotation(Evaluate=true, Dialog(tab="Animation", group="if animation = true", enable=animation));
|
|---|
| 920 | parameter SI.Length length=Modelica.Math.Vectors.length(r - r_shape) " Length of shape" annotation(Dialog(tab="Animation", group="if animation = true", enable=animation));
|
|---|
| 921 | parameter SI.Distance width=length/world.defaultWidthFraction " Width of shape" annotation(Dialog(tab="Animation", group="if animation = true", enable=animation));
|
|---|
| 922 | parameter SI.Distance height=width " Height of shape." annotation(Dialog(tab="Animation", group="if animation = true", enable=animation));
|
|---|
| 923 | parameter Types.ShapeExtra extra=0.0 " Additional parameter depending on shapeType (see docu of Visualizers.Advanced.Shape)." annotation(Dialog(tab="Animation", group="if animation = true", enable=animation));
|
|---|
| 924 | input Types.Color color=Modelica.Mechanics.MultiBody.Types.Defaults.RodColor " Color of shape" annotation(Dialog(tab="Animation", group="if animation = true", enable=animation));
|
|---|
| 925 | input Types.SpecularCoefficient specularCoefficient=world.defaultSpecularCoefficient "Reflection of ambient light (= 0: light is completely absorbed)" annotation(Dialog(tab="Animation", group="if animation = true", enable=animation));
|
|---|
| 926 | final parameter Frames.Orientation R_rel=if rotationType == 1 then Frames.planarRotation(Modelica.Math.Vectors.normalize(n), Cv.from_deg(angle), 0) else if rotationType == 2 then Frames.from_nxy(n_x, n_y) else Frames.axesRotations(sequence, Cv.from_deg(angles), zeros(3)) "Fixed rotation object from frame_a to frame_b";
|
|---|
| 927 | protected
|
|---|
| 928 | outer Modelica.Mechanics.MultiBody.World world;
|
|---|
| 929 | parameter Frames.Orientation R_rel_inv=Frames.from_T(transpose(R_rel.T), zeros(3)) "Inverse of R_rel (rotate from frame_b to frame_a)";
|
|---|
| 930 | Modelica.Mechanics.MultiBody.Visualizers.Advanced.Shape shape(shapeType=shapeType, color=color, specularCoefficient=specularCoefficient, r_shape=r_shape, lengthDirection=lengthDirection, widthDirection=widthDirection, length=length, width=width, height=height, extra=extra, r=frame_a.r_0, R=frame_a.R) if world.enableAnimation and animation;
|
|---|
| 931 | equation
|
|---|
| 932 | Connections.branch(frame_a.R, frame_b.R);
|
|---|
| 933 | assert(cardinality(frame_a) > 0 or cardinality(frame_b) > 0, "Neither connector frame_a nor frame_b of FixedRotation object is connected");
|
|---|
| 934 | frame_b.r_0=frame_a.r_0 + Frames.resolve1(frame_a.R, r);
|
|---|
| 935 | if rooted(frame_a.R) then
|
|---|
| 936 | frame_b.R=Frames.absoluteRotation(frame_a.R, R_rel);
|
|---|
| 937 | zeros(3)=frame_a.f + Frames.resolve1(R_rel, frame_b.f);
|
|---|
| 938 | zeros(3)=frame_a.t + Frames.resolve1(R_rel, frame_b.t) - cross(r, frame_a.f);
|
|---|
| 939 | else
|
|---|
| 940 | frame_a.R=Frames.absoluteRotation(frame_b.R, R_rel_inv);
|
|---|
| 941 | zeros(3)=frame_b.f + Frames.resolve1(R_rel_inv, frame_a.f);
|
|---|
| 942 | zeros(3)=frame_b.t + Frames.resolve1(R_rel_inv, frame_a.t) + cross(Frames.resolve1(R_rel_inv, r), frame_b.f);
|
|---|
| 943 | end if;
|
|---|
| 944 | annotation(Documentation(info="<HTML>
|
|---|
| 945 | <p>
|
|---|
| 946 | Component for a <b>fixed translation</b> and <b>fixed rotation</b> of frame_b with respect
|
|---|
| 947 | to frame_a, i.e., the relationship between connectors frame_a and frame_b
|
|---|
| 948 | remains constant. There are several possibilities to define the
|
|---|
| 949 | orientation of frame_b with respect to frame_a:
|
|---|
| 950 | </p>
|
|---|
| 951 | <ul>
|
|---|
| 952 | <li><b>Planar rotation</b> along axis 'n' (that is fixed and resolved
|
|---|
| 953 | in frame_a) with a fixed angle 'angle'.</li>
|
|---|
| 954 | <li><b>Vectors n_x</b> and <b>n_y</b> that are directed along the corresponding axes
|
|---|
| 955 | direction of frame_b and are resolved in frame_a (if n_y is not
|
|---|
| 956 | orthogonal to n_x, the y-axis of frame_b is selected such that it is
|
|---|
| 957 | orthogonal to n_x and in the plane of n_x and n_y).</li>
|
|---|
| 958 | <li><b>Sequence</b> of <b>three planar axes rotations</b>.
|
|---|
| 959 | For example, \"sequence = {1,2,3}\" and \"angles = {90, 45, -90}\"
|
|---|
| 960 | means to rotate frame_a around the x axis with 90 degrees, around the new
|
|---|
| 961 | y axis with 45 degrees and around the new z axis around -90 degrees to
|
|---|
| 962 | arrive at frame_b. Note, that sequence={1,2,3}
|
|---|
| 963 | is the Cardan angle sequence and sequence = {3,1,3} is the Euler angle
|
|---|
| 964 | sequence.</li>
|
|---|
| 965 | </ul>
|
|---|
| 966 | <p>
|
|---|
| 967 | By default, this component is visualized by a cylinder connecting
|
|---|
| 968 | frame_a and frame_b, as shown in the figure below. In this figure
|
|---|
| 969 | frame_b is rotated along the z-axis of frame_a with 60 degree. Note, that the
|
|---|
| 970 | two visualized frames are not part of the component animation and that
|
|---|
| 971 | the animation may be switched off via parameter animation = <b>false</b>.
|
|---|
| 972 | </p>
|
|---|
| 973 | <IMG SRC=\"../../Images/MultiBody/FixedRotation.png\" ALT=\"Parts.FixedRotation\">
|
|---|
| 974 | </HTML>", revisions="<HTML><p><b>Release Notes:</b></p>
|
|---|
| 975 | <ul>
|
|---|
| 976 | <li><i>July 28, 2003</i><br>
|
|---|
| 977 | Bug fixed: if rotationType = PlanarRotationSequence, then 'angles'
|
|---|
| 978 | was used with unit [rad] instead of [deg].</li>
|
|---|
| 979 | </ul>
|
|---|
| 980 | </HTML>"), Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={1,1}), graphics={Text(extent={{-136,79},{132,139}}, textString="%name", lineColor={0,0,255}),Rectangle(extent={{-100,5},{100,-4}}, lineColor={0,0,0}, fillColor={0,0,0}, fillPattern=FillPattern.Solid),Line(points={{80,20},{129,50}}, color={0,0,0}),Line(points={{80,20},{57,59}}, color={0,0,0}),Polygon(points={{144,60},{117,59},{132,37},{144,60}}, lineColor={0,0,0}, fillColor={0,0,0}, fillPattern=FillPattern.Solid),Polygon(points={{43,80},{46,50},{68,65},{43,80}}, lineColor={0,0,0}, fillColor={0,0,0}, fillPattern=FillPattern.Solid),Text(extent={{-144,-52},{143,-89}}, lineColor={0,0,0}, textString="r=%r"),Text(extent={{-117,51},{-81,26}}, lineColor={128,128,128}, textString="a"),Text(extent={{84,-24},{120,-49}}, lineColor={128,128,128}, textString="b")}), Diagram(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={1,1}), graphics={Line(points={{-100,-1},{-100,-66}}, color={128,128,128}),Line(points={{100,0},{100,-65}}, color={128,128,128}),Line(points={{-100,-60},{89,-60}}, color={128,128,128}),Text(extent={{-22,-36},{16,-60}}, lineColor={128,128,128}, textString="r"),Rectangle(extent={{-100,5},{100,-5}}, lineColor={0,0,0}, fillColor={0,0,0}, fillPattern=FillPattern.Solid),Line(points={{69,29},{97,45}}, color={128,128,128}, arrow={Arrow.None,Arrow.Filled}),Line(points={{70,27},{55,54}}, color={128,128,128}, arrow={Arrow.None,Arrow.Filled}),Text(extent={{95,42},{109,31}}, lineColor={128,128,128}, textString="x"),Text(extent={{42,70},{57,58}}, lineColor={128,128,128}, textString="y"),Line(points={{-95,22},{-58,22}}, color={128,128,128}, arrow={Arrow.None,Arrow.Filled}),Line(points={{-94,20},{-94,52}}, color={128,128,128}, arrow={Arrow.None,Arrow.Filled}),Text(extent={{-72,37},{-58,26}}, lineColor={128,128,128}, textString="x"),Text(extent={{-113,59},{-98,47}}, lineColor={128,128,128}, textString="y"),Polygon(points={{88,-56},{88,-65},{100,-60},{88,-56}}, lineColor={0,0,0}, fillColor={0,0,0}, fillPattern=FillPattern.Solid)}));
|
|---|
| 981 | end FixedRotation;
|
|---|
| 982 |
|
|---|
| 983 | model Body "Rigid body with mass, inertia tensor and one frame connector (12 potential states)"
|
|---|
| 984 | import SI = Modelica.SIunits;
|
|---|
| 985 | import C = Modelica.Constants;
|
|---|
| 986 | import Modelica.Math.*;
|
|---|
| 987 | import Modelica.Mechanics.MultiBody.Types;
|
|---|
| 988 | import Modelica.Mechanics.MultiBody.Frames;
|
|---|
| 989 | Interfaces.Frame_a frame_a "Coordinate system fixed at body" annotation(Placement(transformation(extent={{-116,-16},{-84,16}}, rotation=0)));
|
|---|
| 990 | parameter Boolean animation=true "= true, if animation shall be enabled (show cylinder and sphere)";
|
|---|
| 991 | parameter SI.Position r_CM[3](start={0,0,0}) "Vector from frame_a to center of mass, resolved in frame_a";
|
|---|
| 992 | parameter SI.Mass m(min=0, start=1) "Mass of rigid body";
|
|---|
| 993 | parameter SI.Inertia I_11(min=0)=0.001 " (1,1) element of inertia tensor" annotation(Dialog(group="Inertia tensor (resolved in center of mass, parallel to frame_a)"));
|
|---|
| 994 | parameter SI.Inertia I_22(min=0)=0.001 " (2,2) element of inertia tensor" annotation(Dialog(group="Inertia tensor (resolved in center of mass, parallel to frame_a)"));
|
|---|
| 995 | parameter SI.Inertia I_33(min=0)=0.001 " (3,3) element of inertia tensor" annotation(Dialog(group="Inertia tensor (resolved in center of mass, parallel to frame_a)"));
|
|---|
| 996 | parameter SI.Inertia I_21(min=-C.inf)=0 " (2,1) element of inertia tensor" annotation(Dialog(group="Inertia tensor (resolved in center of mass, parallel to frame_a)"));
|
|---|
| 997 | parameter SI.Inertia I_31(min=-C.inf)=0 " (3,1) element of inertia tensor" annotation(Dialog(group="Inertia tensor (resolved in center of mass, parallel to frame_a)"));
|
|---|
| 998 | parameter SI.Inertia I_32(min=-C.inf)=0 " (3,2) element of inertia tensor" annotation(Dialog(group="Inertia tensor (resolved in center of mass, parallel to frame_a)"));
|
|---|
| 999 | SI.Position r_0[3](start={0,0,0}, stateSelect=if enforceStates then StateSelect.always else StateSelect.avoid) "Position vector from origin of world frame to origin of frame_a" annotation(Dialog(tab="Initialization", __Dymola_initialDialog=true));
|
|---|
| 1000 | SI.Velocity v_0[3](start={0,0,0}, stateSelect=if enforceStates then StateSelect.always else StateSelect.avoid) "Absolute velocity of frame_a, resolved in world frame (= der(r_0))" annotation(Dialog(tab="Initialization", __Dymola_initialDialog=true));
|
|---|
| 1001 | SI.Acceleration a_0[3](start={0,0,0}) "Absolute acceleration of frame_a resolved in world frame (= der(v_0))" annotation(Dialog(tab="Initialization", __Dymola_initialDialog=true));
|
|---|
| 1002 | parameter Boolean angles_fixed=false "= true, if angles_start are used as initial values, else as guess values" annotation(Evaluate=true, choices(__Dymola_checkBox=true), Dialog(tab="Initialization"));
|
|---|
| 1003 | parameter SI.Angle angles_start[3]={0,0,0} "Initial values of angles to rotate frame_a around 'sequence_start' axes into frame_b" annotation(Dialog(tab="Initialization"));
|
|---|
| 1004 | parameter Types.RotationSequence sequence_start={1,2,3} "Sequence of rotations to rotate frame_a into frame_b at initial time" annotation(Evaluate=true, Dialog(tab="Initialization"));
|
|---|
| 1005 | parameter Boolean w_0_fixed=false "= true, if w_0_start are used as initial values, else as guess values" annotation(Evaluate=true, choices(__Dymola_checkBox=true), Dialog(tab="Initialization"));
|
|---|
| 1006 | parameter SI.AngularVelocity w_0_start[3]={0,0,0} "Initial or guess values of angular velocity of frame_a resolved in world frame" annotation(Dialog(tab="Initialization"));
|
|---|
| 1007 | parameter Boolean z_0_fixed=false "= true, if z_0_start are used as initial values, else as guess values" annotation(Evaluate=true, choices(__Dymola_checkBox=true), Dialog(tab="Initialization"));
|
|---|
| 1008 | parameter SI.AngularAcceleration z_0_start[3]={0,0,0} "Initial values of angular acceleration z_0 = der(w_0)" annotation(Dialog(tab="Initialization"));
|
|---|
| 1009 | parameter SI.Diameter sphereDiameter=world.defaultBodyDiameter "Diameter of sphere" annotation(Dialog(tab="Animation", group="if animation = true", enable=animation));
|
|---|
| 1010 | input Types.Color sphereColor=Modelica.Mechanics.MultiBody.Types.Defaults.BodyColor "Color of sphere" annotation(Dialog(tab="Animation", group="if animation = true", enable=animation));
|
|---|
| 1011 | parameter SI.Diameter cylinderDiameter=sphereDiameter/Types.Defaults.BodyCylinderDiameterFraction "Diameter of cylinder" annotation(Dialog(tab="Animation", group="if animation = true", enable=animation));
|
|---|
| 1012 | input Types.Color cylinderColor=sphereColor "Color of cylinder" annotation(Dialog(tab="Animation", group="if animation = true", enable=animation));
|
|---|
| 1013 | input Types.SpecularCoefficient specularCoefficient=world.defaultSpecularCoefficient "Reflection of ambient light (= 0: light is completely absorbed)" annotation(Dialog(tab="Animation", group="if animation = true", enable=animation));
|
|---|
| 1014 | parameter Boolean enforceStates=false " = true, if absolute variables of body object shall be used as states (StateSelect.always)" annotation(Evaluate=true, Dialog(tab="Advanced"));
|
|---|
| 1015 | parameter Boolean useQuaternions=true " = true, if quaternions shall be used as potential states otherwise use 3 angles as potential states" annotation(Evaluate=true, Dialog(tab="Advanced"));
|
|---|
| 1016 | parameter Types.RotationSequence sequence_angleStates={1,2,3} " Sequence of rotations to rotate world frame into frame_a around the 3 angles used as potential states" annotation(Evaluate=true, Dialog(tab="Advanced", enable=not useQuaternions));
|
|---|
| 1017 | final parameter SI.Inertia I[3,3]=[I_11,I_21,I_31;I_21,I_22,I_32;I_31,I_32,I_33] "inertia tensor";
|
|---|
| 1018 | final parameter Frames.Orientation R_start=Modelica.Mechanics.MultiBody.Frames.axesRotations(sequence_start, angles_start, zeros(3)) "Orientation object from world frame to frame_a at initial time";
|
|---|
| 1019 | final parameter SI.AngularAcceleration z_a_start[3]=Frames.resolve2(R_start, z_0_start) "Initial values of angular acceleration z_a = der(w_a), i.e., time derivative of angular velocity resolved in frame_a";
|
|---|
| 1020 | SI.AngularVelocity w_a[3](start=Frames.resolve2(R_start, w_0_start), fixed=fill(w_0_fixed, 3), stateSelect=if enforceStates then if useQuaternions then StateSelect.always else StateSelect.never else StateSelect.avoid) "Absolute angular velocity of frame_a resolved in frame_a";
|
|---|
| 1021 | SI.AngularAcceleration z_a[3](start=Frames.resolve2(R_start, z_0_start), fixed=fill(z_0_fixed, 3)) "Absolute angular acceleration of frame_a resolved in frame_a";
|
|---|
| 1022 | SI.Acceleration g_0[3] "Gravity acceleration resolved in world frame";
|
|---|
| 1023 | protected
|
|---|
| 1024 | outer Modelica.Mechanics.MultiBody.World world;
|
|---|
| 1025 | parameter Frames.Quaternions.Orientation Q_start=Frames.to_Q(R_start) "Quaternion orientation object from world frame to frame_a at initial time";
|
|---|
| 1026 | Frames.Quaternions.Orientation Q(start=Q_start, stateSelect=if enforceStates then if useQuaternions then StateSelect.prefer else StateSelect.never else StateSelect.avoid) "Quaternion orientation object from world frame to frame_a (dummy value, if quaternions are not used as states)";
|
|---|
| 1027 | parameter SI.Angle phi_start[3]=if sequence_start[1] == sequence_angleStates[1] and sequence_start[2] == sequence_angleStates[2] and sequence_start[3] == sequence_angleStates[3] then angles_start else Frames.axesRotationsAngles(R_start, sequence_angleStates) "Potential angle states at initial time";
|
|---|
| 1028 | SI.Angle phi[3](start=phi_start, stateSelect=if enforceStates then if useQuaternions then StateSelect.never else StateSelect.always else StateSelect.avoid) "Dummy or 3 angles to rotate world frame into frame_a of body";
|
|---|
| 1029 | SI.AngularVelocity phi_d[3](stateSelect=if enforceStates then if useQuaternions then StateSelect.never else StateSelect.always else StateSelect.avoid) "= der(phi)";
|
|---|
| 1030 | SI.AngularAcceleration phi_dd[3] "= der(phi_d)";
|
|---|
| 1031 | Visualizers.Advanced.Shape cylinder(shapeType="cylinder", color=cylinderColor, specularCoefficient=specularCoefficient, length=if Modelica.Math.Vectors.length(r_CM) > sphereDiameter/2 then Modelica.Math.Vectors.length(r_CM) - (if cylinderDiameter > 1.1*sphereDiameter then sphereDiameter/2 else 0) else 0, width=cylinderDiameter, height=cylinderDiameter, lengthDirection=r_CM, widthDirection={0,1,0}, r=frame_a.r_0, R=frame_a.R) if world.enableAnimation and animation;
|
|---|
| 1032 | Visualizers.Advanced.Shape sphere(shapeType="sphere", color=sphereColor, specularCoefficient=specularCoefficient, length=sphereDiameter, width=sphereDiameter, height=sphereDiameter, lengthDirection={1,0,0}, widthDirection={0,1,0}, r_shape=r_CM - {1,0,0}*sphereDiameter/2, r=frame_a.r_0, R=frame_a.R) if world.enableAnimation and animation and sphereDiameter > 0;
|
|---|
| 1033 | initial equation
|
|---|
| 1034 | if angles_fixed then
|
|---|
| 1035 | if not Connections.isRoot(frame_a.R) then
|
|---|
| 1036 | zeros(3)=Frames.Orientation.equalityConstraint(frame_a.R, R_start);
|
|---|
| 1037 | elseif useQuaternions then
|
|---|
| 1038 | zeros(3)=Frames.Quaternions.Orientation.equalityConstraint(Q, Q_start);
|
|---|
| 1039 | else
|
|---|
| 1040 | phi=phi_start;
|
|---|
| 1041 | end if;
|
|---|
| 1042 | end if;
|
|---|
| 1043 | equation
|
|---|
| 1044 | if enforceStates then
|
|---|
| 1045 | Connections.root(frame_a.R);
|
|---|
| 1046 | else
|
|---|
| 1047 | Connections.potentialRoot(frame_a.R);
|
|---|
| 1048 | end if;
|
|---|
| 1049 | r_0=frame_a.r_0;
|
|---|
| 1050 | if not Connections.isRoot(frame_a.R) then
|
|---|
| 1051 | Q={0,0,0,1};
|
|---|
| 1052 | phi=zeros(3);
|
|---|
| 1053 | phi_d=zeros(3);
|
|---|
| 1054 | phi_dd=zeros(3);
|
|---|
| 1055 | elseif useQuaternions then
|
|---|
| 1056 | frame_a.R=Frames.from_Q(Q, Frames.Quaternions.angularVelocity2(Q, der(Q)));
|
|---|
| 1057 | {0}=Frames.Quaternions.orientationConstraint(Q);
|
|---|
| 1058 | phi=zeros(3);
|
|---|
| 1059 | phi_d=zeros(3);
|
|---|
| 1060 | phi_dd=zeros(3);
|
|---|
| 1061 | else
|
|---|
| 1062 | phi_d=der(phi);
|
|---|
| 1063 | phi_dd=der(phi_d);
|
|---|
| 1064 | frame_a.R=Frames.axesRotations(sequence_angleStates, phi, phi_d);
|
|---|
| 1065 | Q={0,0,0,1};
|
|---|
| 1066 | end if;
|
|---|
| 1067 | g_0=world.gravityAcceleration(frame_a.r_0 + Frames.resolve1(frame_a.R, r_CM));
|
|---|
| 1068 | v_0=der(frame_a.r_0);
|
|---|
| 1069 | a_0=der(v_0);
|
|---|
| 1070 | w_a=Frames.angularVelocity2(frame_a.R);
|
|---|
| 1071 | z_a=der(w_a);
|
|---|
| 1072 | frame_a.f=m*(Frames.resolve2(frame_a.R, a_0 - g_0) + cross(z_a, r_CM) + cross(w_a, cross(w_a, r_CM)));
|
|---|
| 1073 | frame_a.t=I*z_a + cross(w_a, I*w_a) + cross(r_CM, frame_a.f);
|
|---|
| 1074 | annotation(Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={1,1}), graphics={Rectangle(extent={{-100,30},{-3,-31}}, lineColor={0,0,0}, fillPattern=FillPattern.HorizontalCylinder, fillColor={0,127,255}),Text(extent={{131,-123},{-129,-73}}, lineColor={0,0,0}, textString="m=%m"),Text(extent={{-128,132},{132,72}}, textString="%name", lineColor={0,0,255}),Ellipse(extent={{-20,60},{100,-60}}, lineColor={0,0,0}, fillPattern=FillPattern.Sphere, fillColor={0,127,255})}), Diagram(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={1,1}), graphics), Documentation(info="<HTML>
|
|---|
| 1075 | <p>
|
|---|
| 1076 | <b>Rigid body</b> with mass and inertia tensor.
|
|---|
| 1077 | All parameter vectors have to be resolved in frame_a.
|
|---|
| 1078 | The <b>inertia tensor</b> has to be defined with respect to a
|
|---|
| 1079 | coordinate system that is parallel to frame_a with the
|
|---|
| 1080 | origin at the center of mass of the body.
|
|---|
| 1081 | </p>
|
|---|
| 1082 | <p>
|
|---|
| 1083 | By default, this component is visualized by a <b>cylinder</b> located
|
|---|
| 1084 | between frame_a and the center of mass and by a <b>sphere</b> that has
|
|---|
| 1085 | its center at the center of mass. If the cylinder length is smaller as
|
|---|
| 1086 | the radius of the sphere, e.g., since frame_a is located at the
|
|---|
| 1087 | center of mass, the cylinder is not displayed. Note, that
|
|---|
| 1088 | the animation may be switched off via parameter animation = <b>false</b>.
|
|---|
| 1089 | </p>
|
|---|
| 1090 | <IMG SRC=\"../../Images/MultiBody/Body.png\" ALT=\"Parts.Body\">
|
|---|
| 1091 | <p>
|
|---|
| 1092 | <b>States of Body Components</b>
|
|---|
| 1093 | </p>
|
|---|
| 1094 | <p>
|
|---|
| 1095 | Every body has potential states. If possible a tool will select
|
|---|
| 1096 | the states of joints and not the states of bodies because this is
|
|---|
| 1097 | usually the most efficient choice. In this case the position, orientation,
|
|---|
| 1098 | velocity and angular velocity of frame_a of the body will be computed
|
|---|
| 1099 | by the component that is connected to frame_a. However, if a body is moving
|
|---|
| 1100 | freely in space, variables of the body have to be used as states. The potential
|
|---|
| 1101 | states of the body are:
|
|---|
| 1102 | </p>
|
|---|
| 1103 | <ul>
|
|---|
| 1104 | <li> The <b>position vector</b> frame_a.r_0 from the origin of the
|
|---|
| 1105 | world frame to the origin of frame_a of the body, resolved in
|
|---|
| 1106 | the world frame and the <b>absolute velocity</b> v_0 of the origin of
|
|---|
| 1107 | frame_a, resolved in the world frame (= der(frame_a.r_0)).</li>
|
|---|
| 1108 | </li>
|
|---|
| 1109 | <li> If parameter <b>useQuaternions</b> in the \"Advanced\" menu
|
|---|
| 1110 | is <b>true</b> (this is the default), then <b>4 quaternions</b>
|
|---|
| 1111 | are potential states. Additionally, the coordinates of the
|
|---|
| 1112 | absolute angular velocity vector of the
|
|---|
| 1113 | body are 3 potential states.<br>
|
|---|
| 1114 | If <b>useQuaternions</b> in the \"Advanced\" menu
|
|---|
| 1115 | is <b>false</b>, then <b>3 angles</b> and the derivatives of
|
|---|
| 1116 | these angles are potential states. The orientation of frame_a
|
|---|
| 1117 | is computed by rotating the world frame along the axes defined
|
|---|
| 1118 | in parameter vector \"sequence_angleStates\" (default = {1,2,3}, i.e.,
|
|---|
| 1119 | the Cardan angle sequence) around the angles used as potential states.
|
|---|
| 1120 | For example, the default is to rotate the x-axis of the world frame
|
|---|
| 1121 | around angles[1], the new y-axis around angles[2] and the new z-axis
|
|---|
| 1122 | around angles[3], arriving at frame_a.
|
|---|
| 1123 | </li>
|
|---|
| 1124 | </ul>
|
|---|
| 1125 | <p>
|
|---|
| 1126 | The quaternions have the slight disadvantage that there is a
|
|---|
| 1127 | non-linear constraint equation between the 4 quaternions.
|
|---|
| 1128 | Therefore, at least one non-linear equation has to be solved
|
|---|
| 1129 | during simulation. A tool might, however, analytically solve this
|
|---|
| 1130 | simple constraint equation. Using the 3 angles as states has the
|
|---|
| 1131 | disadvantage that there is a singular configuration in which a
|
|---|
| 1132 | division by zero will occur. If it is possible to determine in advance
|
|---|
| 1133 | for an application class that this singular configuration is outside
|
|---|
| 1134 | of the operating region, the 3 angles might be used as potential
|
|---|
| 1135 | states by setting <b>useQuaternions</b> = <b>false</b>.
|
|---|
| 1136 | </p>
|
|---|
| 1137 | <p>
|
|---|
| 1138 | In text books about 3-dimensional mechanics often 3 angles and the
|
|---|
| 1139 | angular velocity are used as states. This is not the case here, since
|
|---|
| 1140 | 3 angles and their derivatives are used as potential states
|
|---|
| 1141 | (if useQuaternions = false). The reason
|
|---|
| 1142 | is that for real-time simulation the discretization formula of the
|
|---|
| 1143 | integrator might be \"inlined\" and solved together with the body equations.
|
|---|
| 1144 | By appropriate symbolic transformation the performance is
|
|---|
| 1145 | drastically increased if angles and their
|
|---|
| 1146 | derivatives are used as states, instead of angles and the angular
|
|---|
| 1147 | velocity.
|
|---|
| 1148 | </p>
|
|---|
| 1149 | <p>
|
|---|
| 1150 | Whether or not variables of the body are used as states is usually
|
|---|
| 1151 | automatically selected by the Modelica translator. If parameter
|
|---|
| 1152 | <b>enforceStates</b> is set to <b>true</b> in the \"Advanced\" menu,
|
|---|
| 1153 | then body variables are forced to be used as states according
|
|---|
| 1154 | to the setting of parameters \"useQuaternions\" and
|
|---|
| 1155 | \"sequence_angleStates\".
|
|---|
| 1156 | </p>
|
|---|
| 1157 | </HTML>"));
|
|---|
| 1158 | end Body;
|
|---|
| 1159 |
|
|---|
| 1160 | annotation(Documentation(info="<HTML>
|
|---|
| 1161 | <p>
|
|---|
| 1162 | Package <b>Parts</b> contains <b>rigid components</b> of a
|
|---|
| 1163 | multi-body system. These components may be used to build up
|
|---|
| 1164 | more complicated structures. For example, a part may be built up of
|
|---|
| 1165 | a \"Body\" and of several \"FixedTranslation\" components.
|
|---|
| 1166 | </p>
|
|---|
| 1167 | <h4>Content</h4>
|
|---|
| 1168 | <table border=1 cellspacing=0 cellpadding=2>
|
|---|
| 1169 | <tr><th><b><i>Model</i></b></th><th><b><i>Description</i></b></th></tr>
|
|---|
| 1170 | <tr><td valign=\"top\"><a href=\"Modelica://Modelica.Mechanics.MultiBody.Parts.Fixed\">Fixed</a></td>
|
|---|
| 1171 | <td valign=\"top\">Frame fixed in world frame at a given position.
|
|---|
| 1172 | It is visualized with a shape, see <b>shapeType</b> below
|
|---|
| 1173 | (the frames on the two
|
|---|
| 1174 | sides do not belong to the component):<br> <br>
|
|---|
| 1175 | <IMG SRC=\"../../Images/MultiBody/Fixed.png\" ALT=\"model Parts.Fixed\">
|
|---|
| 1176 | </td>
|
|---|
| 1177 | </tr>
|
|---|
| 1178 | <tr><td valign=\"top\"><a href=\"Modelica://Modelica.Mechanics.MultiBody.Parts.FixedTranslation\">FixedTranslation</a></td>
|
|---|
| 1179 | <td valign=\"top\">Fixed translation of frame_b with respect to frame_a.
|
|---|
| 1180 | It is visualized with a shape, see <b>shapeType</b> below
|
|---|
| 1181 | (the frames on the two sides do not belong to the component):<br> <br>
|
|---|
| 1182 | <IMG SRC=\"../../Images/MultiBody/FixedTranslation.png\" ALT=\"model Parts.FixedTranslation\">
|
|---|
| 1183 | </td>
|
|---|
| 1184 | </tr>
|
|---|
| 1185 | <tr><td valign=\"top\"><a href=\"Modelica://Modelica.Mechanics.MultiBody.Parts.FixedRotation\">FixedRotation</a></td>
|
|---|
| 1186 | <td valign=\"top\">Fixed translation and fixed rotation of frame_b with respect to frame_a
|
|---|
| 1187 | It is visualized with a shape, see <b>shapeType</b> below
|
|---|
| 1188 | (the frames on the two sides do not belong to the component):<br> <br>
|
|---|
| 1189 | <IMG SRC=\"../../Images/MultiBody/FixedRotation.png\" ALT=\"model Parts.FixedRotation\">
|
|---|
| 1190 | </td>
|
|---|
| 1191 | </tr>
|
|---|
| 1192 | <tr><td valign=\"top\"><a href=\"Modelica://Modelica.Mechanics.MultiBody.Parts.Body\">Body</a></td>
|
|---|
| 1193 | <td valign=\"top\">Rigid body with mass, inertia tensor and one frame connector.
|
|---|
| 1194 | It is visualized with a cylinder and a sphere at the
|
|---|
| 1195 | center of mass:<br> <br>
|
|---|
| 1196 | <IMG SRC=\"../../Images/MultiBody/Body.png\" ALT=\"model Parts.Body\">
|
|---|
| 1197 | </td>
|
|---|
| 1198 | </tr>
|
|---|
| 1199 | <tr><td valign=\"top\"><a href=\"Modelica://Modelica.Mechanics.MultiBody.Parts.BodyShape\">BodyShape</a></td>
|
|---|
| 1200 | <td valign=\"top\">Rigid body with mass, inertia tensor, different shapes
|
|---|
| 1201 | (see <b>shapeType</b> below)
|
|---|
| 1202 | for animation, and two frame connectors:<br> <br>
|
|---|
| 1203 | <IMG SRC=\"../../Images/MultiBody/BodyShape.png\" ALT=\"model Parts.BodyShape\">
|
|---|
| 1204 | </td>
|
|---|
| 1205 | </tr>
|
|---|
| 1206 | <tr><td valign=\"top\"><a href=\"Modelica://Modelica.Mechanics.MultiBody.Parts.Fixed\">Fixed</a>
|
|---|
| 1207 | BodyBox</b></td>
|
|---|
| 1208 | <td valign=\"top\">Rigid body with box shape (mass and animation properties are computed
|
|---|
| 1209 | from box data and from density):<br> <br>
|
|---|
| 1210 | <IMG SRC=\"../../Images/MultiBody/BodyBox.png\" ALT=\"model Parts.BodyBox\">
|
|---|
| 1211 | </td>
|
|---|
| 1212 | </tr>
|
|---|
| 1213 | <tr><td valign=\"top\"><a href=\"Modelica://Modelica.Mechanics.MultiBody.Parts.BodyCylinder\">BodyCylinder</a></td>
|
|---|
| 1214 | <td valign=\"top\">Rigid body with cylinder shape (mass and animation properties
|
|---|
| 1215 | are computed from cylinder data and from density):<br> <br>
|
|---|
| 1216 | <IMG SRC=\"../../Images/MultiBody/BodyCylinder.png\" ALT=\"model Parts.BodyCylinder\">
|
|---|
| 1217 | </td>
|
|---|
| 1218 | </tr>
|
|---|
| 1219 | <tr><td valign=\"top\"><a href=\"Modelica://Modelica.Mechanics.MultiBody.Parts.PointMass\">PointMass</a></td>
|
|---|
| 1220 | <td valign=\"top\">Rigid body where inertia tensor and rotation is neglected:<br> <br>
|
|---|
| 1221 | <IMG SRC=\"../../Images/MultiBody/Parts/PointMass.png\" ALT=\"model Parts.PointMass\">
|
|---|
| 1222 | </td>
|
|---|
| 1223 | </tr>
|
|---|
| 1224 | <tr><td valign=\"top\"><a href=\"Modelica://Modelica.Mechanics.MultiBody.Parts.Mounting1D\">Mounting1D</a></td>
|
|---|
| 1225 | <td valign=\"top\"> Propagate 1-dim. support torque to 3-dim. system
|
|---|
| 1226 | </td>
|
|---|
| 1227 | </tr>
|
|---|
| 1228 | <tr><td valign=\"top\"><a href=\"Modelica://Modelica.Mechanics.MultiBody.Parts.Rotor1D\">Rotor1D</a></td>
|
|---|
| 1229 | <td valign=\"top\">1D inertia attachable on 3-dim. bodies (without neglecting dynamic effects)<br>
|
|---|
| 1230 | <IMG SRC=\"../../Images/MultiBody/Parts/Rotor1D.png\" ALT=\"model Parts.Rotor1D\">
|
|---|
| 1231 | </td>
|
|---|
| 1232 | </tr>
|
|---|
| 1233 | <tr><td valign=\"top\"><a href=\"Modelica://Modelica.Mechanics.MultiBody.Parts.BevelGear1D\">BevelGear1D</a></td>
|
|---|
| 1234 | <td valign=\"top\">1D gearbox with arbitrary shaft directions (3D bearing frame)
|
|---|
| 1235 | </td>
|
|---|
| 1236 | </tr>
|
|---|
| 1237 | </table>
|
|---|
| 1238 | <p>
|
|---|
| 1239 | Components <b>Fixed</b>, <b>FixedTranslation</b>, <b>FixedRotation</b>
|
|---|
| 1240 | and <b>BodyShape</b> are visualized according to parameter
|
|---|
| 1241 | <b>shapeType</b>, that may have the following values (e.g., shapeType = \"box\"): <br> <br>
|
|---|
| 1242 | </p>
|
|---|
| 1243 | <IMG SRC=\"../../Images/MultiBody/FixedShape.png\" ALT=\"model Visualizers.FixedShape\">
|
|---|
| 1244 | <p>
|
|---|
| 1245 | All the details of the visualization shape parameters are
|
|---|
| 1246 | given in
|
|---|
| 1247 | <a href=\"Modelica://Modelica.Mechanics.MultiBody.Visualizers.FixedShape\">Visualizers.FixedShape</a>
|
|---|
| 1248 | </p>
|
|---|
| 1249 | <p>
|
|---|
| 1250 | Colors in all animation parts are defined via parameter <b>color</b>.
|
|---|
| 1251 | This is an Integer vector with 3 elements, {r, g, b}, and specifies the
|
|---|
| 1252 | color of the shape. {r,g,b} are the \"red\", \"green\" and \"blue\" color parts,
|
|---|
| 1253 | given in the ranges 0 .. 255, respectively. The predefined type
|
|---|
| 1254 | <b>MultiBody.Types.Color</b> contains a menu
|
|---|
| 1255 | definition of the colors used in the MultiBody library
|
|---|
| 1256 | (this will be replaced by a color editor).
|
|---|
| 1257 | </p>
|
|---|
| 1258 | </HTML>
|
|---|
| 1259 | "));
|
|---|
| 1260 | end Parts;
|
|---|
| 1261 |
|
|---|
| 1262 | package Interfaces "Connectors and partial models for 3-dim. mechanical components"
|
|---|
| 1263 | extends Modelica.Icons.Library;
|
|---|
| 1264 | connector Frame "Coordinate system fixed to the component with one cut-force and cut-torque (no icon)"
|
|---|
| 1265 | import SI = Modelica.SIunits;
|
|---|
| 1266 | SI.Position r_0[3] "Position vector from world frame to the connector frame origin, resolved in world frame";
|
|---|
| 1267 | Frames.Orientation R "Orientation object to rotate the world frame into the connector frame";
|
|---|
| 1268 | flow SI.Force f[3] "Cut-force resolved in connector frame" annotation(unassignedMessage="All Forces cannot be uniquely calculated.
|
|---|
| 1269 | The reason could be that the mechanism contains
|
|---|
| 1270 | a planar loop or that joints constrain the
|
|---|
| 1271 | same motion. For planar loops, use for one
|
|---|
| 1272 | revolute joint per loop the joint
|
|---|
| 1273 | Joints.RevolutePlanarLoopConstraint instead of
|
|---|
| 1274 | Joints.Revolute.");
|
|---|
| 1275 | flow SI.Torque t[3] "Cut-torque resolved in connector frame";
|
|---|
| 1276 | annotation(Documentation(info="<html>
|
|---|
| 1277 | <p>
|
|---|
| 1278 | Basic definition of a coordinate system that is fixed to a mechanical
|
|---|
| 1279 | component. In the origin of the coordinate system the cut-force
|
|---|
| 1280 | and the cut-torque is acting. This component has no icon definition
|
|---|
| 1281 | and is only used by inheritance from frame connectors to define
|
|---|
| 1282 | different icons.
|
|---|
| 1283 | </p>
|
|---|
| 1284 | </html>"));
|
|---|
| 1285 | end Frame;
|
|---|
| 1286 |
|
|---|
| 1287 | connector Frame_a "Coordinate system fixed to the component with one cut-force and cut-torque (filled rectangular icon)"
|
|---|
| 1288 | extends Frame;
|
|---|
| 1289 | annotation(defaultComponentName="frame_a", Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={1,1}, initialScale=0.16), graphics={Rectangle(extent={{-10,10},{10,-10}}, lineColor={95,95,95}, lineThickness=0.5),Rectangle(extent={{-30,100},{30,-100}}, lineColor={0,0,0}, fillColor={192,192,192}, fillPattern=FillPattern.Solid)}), Diagram(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={1,1}, initialScale=0.16), graphics={Text(extent={{-140,-50},{140,-88}}, lineColor={0,0,0}, textString="%name"),Rectangle(extent={{-12,40},{12,-40}}, lineColor={0,0,0}, fillColor={192,192,192}, fillPattern=FillPattern.Solid)}), Documentation(info="<html>
|
|---|
| 1290 | <p>
|
|---|
| 1291 | Basic definition of a coordinate system that is fixed to a mechanical
|
|---|
| 1292 | component. In the origin of the coordinate system the cut-force
|
|---|
| 1293 | and the cut-torque is acting.
|
|---|
| 1294 | This component has a filled rectangular icon.
|
|---|
| 1295 | </p>
|
|---|
| 1296 | </html>"));
|
|---|
| 1297 | end Frame_a;
|
|---|
| 1298 |
|
|---|
| 1299 | connector Frame_b "Coordinate system fixed to the component with one cut-force and cut-torque (non-filled rectangular icon)"
|
|---|
| 1300 | extends Frame;
|
|---|
| 1301 | annotation(defaultComponentName="frame_b", Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={1,1}, initialScale=0.16), graphics={Rectangle(extent={{-10,10},{10,-10}}, lineColor={95,95,95}, lineThickness=0.5),Rectangle(extent={{-30,100},{30,-100}}, lineColor={0,0,0}, fillColor={255,255,255}, fillPattern=FillPattern.Solid)}), Diagram(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={1,1}, initialScale=0.16), graphics={Text(extent={{-140,-50},{140,-88}}, lineColor={0,0,0}, textString="%name"),Rectangle(extent={{-12,40},{12,-40}}, lineColor={0,0,0}, fillColor={255,255,255}, fillPattern=FillPattern.Solid)}), Documentation(info="<html>
|
|---|
| 1302 | <p>
|
|---|
| 1303 | Basic definition of a coordinate system that is fixed to a mechanical
|
|---|
| 1304 | component. In the origin of the coordinate system the cut-force
|
|---|
| 1305 | and the cut-torque is acting. This component has a non-filled rectangular icon.
|
|---|
| 1306 | </p>
|
|---|
| 1307 | </html>"));
|
|---|
| 1308 | end Frame_b;
|
|---|
| 1309 |
|
|---|
| 1310 | connector Frame_resolve "Coordinate system fixed to the component used to express in which
|
|---|
| 1311 | coordinate system a vector is resolved (non-filled rectangular icon)"
|
|---|
| 1312 | extends Frame;
|
|---|
| 1313 | annotation(defaultComponentName="frame_resolve", Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={1,1}, initialScale=0.16), graphics={Rectangle(extent={{-10,10},{10,-10}}, lineColor={95,95,95}, pattern=LinePattern.Dot),Rectangle(extent={{-30,100},{30,-100}}, lineColor={95,95,95}, pattern=LinePattern.Dot, fillColor={255,255,255}, fillPattern=FillPattern.Solid)}), Diagram(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={1,1}, initialScale=0.16), graphics={Text(extent={{-140,-50},{140,-88}}, lineColor={0,0,0}, textString="%name"),Rectangle(extent={{-12,40},{12,-40}}, lineColor={95,95,95}, pattern=LinePattern.Dot, fillColor={255,255,255}, fillPattern=FillPattern.Solid)}), Documentation(info="<html>
|
|---|
| 1314 | <p>
|
|---|
| 1315 | Basic definition of a coordinate system that is fixed to a mechanical
|
|---|
| 1316 | component. In the origin of the coordinate system the cut-force
|
|---|
| 1317 | and the cut-torque is acting. This coordinate system is used to
|
|---|
| 1318 | express in which coordinate system a vector is resolved.
|
|---|
| 1319 | A component that uses a Frame_resolve connector has to set the
|
|---|
| 1320 | cut-force and cut-torque of this frame to zero. When connecting
|
|---|
| 1321 | from a Frame_resolve connector to another frame connector,
|
|---|
| 1322 | by default the connecting line has line style \"dotted\".
|
|---|
| 1323 | This component has a non-filled rectangular icon.
|
|---|
| 1324 | </p>
|
|---|
| 1325 | </html>"));
|
|---|
| 1326 | end Frame_resolve;
|
|---|
| 1327 |
|
|---|
| 1328 | annotation(Documentation(info="<html>
|
|---|
| 1329 | <p>
|
|---|
| 1330 | This package contains connectors and partial models (i.e. models
|
|---|
| 1331 | that are only used to build other models) of the MultiBody library.
|
|---|
| 1332 | </p>
|
|---|
| 1333 | </html>"));
|
|---|
| 1334 | end Interfaces;
|
|---|
| 1335 |
|
|---|
| 1336 | package Frames "Functions to transform rotational frame quantities"
|
|---|
| 1337 | extends Modelica.Icons.Library;
|
|---|
| 1338 | record Orientation "Orientation object defining rotation from a frame 1 into a frame 2"
|
|---|
| 1339 | import SI = Modelica.SIunits;
|
|---|
| 1340 | extends Modelica.Icons.Record;
|
|---|
| 1341 | Real T[3,3] "Transformation matrix from world frame to local frame";
|
|---|
| 1342 | SI.AngularVelocity w[3] "Absolute angular velocity of local frame, resolved in local frame";
|
|---|
| 1343 | encapsulated function equalityConstraint "Return the constraint residues to express that two frames have the same orientation"
|
|---|
| 1344 | import Modelica;
|
|---|
| 1345 | import Modelica.Mechanics.MultiBody.Frames;
|
|---|
| 1346 | extends Modelica.Icons.Function;
|
|---|
| 1347 | input Frames.Orientation R1 "Orientation object to rotate frame 0 into frame 1";
|
|---|
| 1348 | input Frames.Orientation R2 "Orientation object to rotate frame 0 into frame 2";
|
|---|
| 1349 | output Real residue[3] "The rotation angles around x-, y-, and z-axis of frame 1 to rotate frame 1 into frame 2 for a small rotation (should be zero)";
|
|---|
| 1350 | annotation(Inline=true);
|
|---|
| 1351 | algorithm
|
|---|
| 1352 | residue:={Modelica.Math.atan2(cross(R1.T[1,:], R1.T[2,:])*R2.T[2,:], R1.T[1,:]*R2.T[1,:]),Modelica.Math.atan2(-cross(R1.T[1,:], R1.T[2,:])*R2.T[1,:], R1.T[2,:]*R2.T[2,:]),Modelica.Math.atan2(R1.T[2,:]*R2.T[1,:], R1.T[3,:]*R2.T[3,:])};
|
|---|
| 1353 | end equalityConstraint;
|
|---|
| 1354 |
|
|---|
| 1355 | annotation(Documentation(info="<html>
|
|---|
| 1356 | <p>
|
|---|
| 1357 | This object describes the <b>rotation</b> from a <b>frame 1</b> into a <b>frame 2</b>.
|
|---|
| 1358 | An instance of this type should never be directly accessed but
|
|---|
| 1359 | only with the access functions provided
|
|---|
| 1360 | in package Modelica.Mechanics.MultiBody.Frames. As a consequence, it is not necessary to know
|
|---|
| 1361 | the internal representation of this object as described in the next paragraphs.
|
|---|
| 1362 | </p>
|
|---|
| 1363 | <p>
|
|---|
| 1364 | \"Orientation\" is defined to be a record consisting of two
|
|---|
| 1365 | elements: \"Real T[3,3]\", the transformation matrix to rotate frame 1
|
|---|
| 1366 | into frame 2 and \"Real w[3]\", the angular velocity of frame 2 with
|
|---|
| 1367 | respect to frame 1, resolved in frame 2. Element \"T\"
|
|---|
| 1368 | has the following interpretation:
|
|---|
| 1369 | </p>
|
|---|
| 1370 | <pre>
|
|---|
| 1371 | Orientation R;
|
|---|
| 1372 | <b>R.T</b> = [<b>e</b><sub>x</sub>, <b>e</b><sub>y</sub>, <b>e</b><sub>z</sub>];
|
|---|
| 1373 | e.g., <b>R.T</b> = [1,0,0; 0,1,0; 0,0,1]
|
|---|
| 1374 | </pre>
|
|---|
| 1375 | <p>
|
|---|
| 1376 | where <b>e</b><sub>x</sub>,<b>e</b><sub>y</sub>,<b>e</b><sub>z</sub>
|
|---|
| 1377 | are unit vectors in the direction of the x-axis, y-axis, and z-axis
|
|---|
| 1378 | of frame 1, resolved in frame 2, respectively. Therefore, if <b>v</b><sub>1</sub>
|
|---|
| 1379 | is vector <b>v</b> resolved in frame 1 and <b>v</b><sub>2</sub> is
|
|---|
| 1380 | vector <b>v</b> resolved in frame 2, the following relationship holds:
|
|---|
| 1381 | </p>
|
|---|
| 1382 | <pre>
|
|---|
| 1383 | <b>v</b><sub>2</sub> = <b>R.T</b> * <b>v</b><sub>1</sub>
|
|---|
| 1384 | </pre>
|
|---|
| 1385 | </p>
|
|---|
| 1386 | The <b>inverse</b> orientation
|
|---|
| 1387 | <b>R_inv.T</b> = <b>R.T</b><sup>T</sup> describes the rotation
|
|---|
| 1388 | from frame 2 into frame 1.
|
|---|
| 1389 | </p>
|
|---|
| 1390 | <p>
|
|---|
| 1391 | Since the orientation is described by 9 variables, there are
|
|---|
| 1392 | 6 constraints between these variables. These constraints
|
|---|
| 1393 | are defined in function <b>Frames.orientationConstraint</b>.
|
|---|
| 1394 | </p>
|
|---|
| 1395 | <p>
|
|---|
| 1396 | R.w is the angular velocity of frame 2 with respect to frame 1, resolved
|
|---|
| 1397 | in frame 2. Formally, R.w is defined as:<br>
|
|---|
| 1398 | <b>skew</b>(R.w) = R.T*<b>der</b>(transpose(R.T))
|
|---|
| 1399 | with
|
|---|
| 1400 | </p>
|
|---|
| 1401 | <pre>
|
|---|
| 1402 | | 0 -w[3] w[2] |
|
|---|
| 1403 | <b>skew</b>(w) = | w[3] 0 -w[1] |
|
|---|
| 1404 | | -w[2] w[1] 0 |
|
|---|
| 1405 | </pre>
|
|---|
| 1406 |
|
|---|
| 1407 | </html>
|
|---|
| 1408 | "));
|
|---|
| 1409 | end Orientation;
|
|---|
| 1410 |
|
|---|
| 1411 | function angularVelocity2 "Return angular velocity resolved in frame 2 from orientation object"
|
|---|
| 1412 | extends Modelica.Icons.Function;
|
|---|
| 1413 | input Orientation R "Orientation object to rotate frame 1 into frame 2";
|
|---|
| 1414 | output Modelica.SIunits.AngularVelocity w[3] "Angular velocity of frame 2 with respect to frame 1 resolved in frame 2";
|
|---|
| 1415 | annotation(Inline=true);
|
|---|
| 1416 | algorithm
|
|---|
| 1417 | w:=R.w;
|
|---|
| 1418 | end angularVelocity2;
|
|---|
| 1419 |
|
|---|
| 1420 | function resolve1 "Transform vector from frame 2 to frame 1"
|
|---|
| 1421 | extends Modelica.Icons.Function;
|
|---|
| 1422 | input Orientation R "Orientation object to rotate frame 1 into frame 2";
|
|---|
| 1423 | input Real v2[3] "Vector in frame 2";
|
|---|
| 1424 | output Real v1[3] "Vector in frame 1";
|
|---|
| 1425 | annotation(derivative(noDerivative=R)=Internal.resolve1_der, __Dymola_InlineAfterIndexReduction=true);
|
|---|
| 1426 | algorithm
|
|---|
| 1427 | v1:=transpose(R.T)*v2;
|
|---|
| 1428 | end resolve1;
|
|---|
| 1429 |
|
|---|
| 1430 | function resolve2 "Transform vector from frame 1 to frame 2"
|
|---|
| 1431 | extends Modelica.Icons.Function;
|
|---|
| 1432 | input Orientation R "Orientation object to rotate frame 1 into frame 2";
|
|---|
| 1433 | input Real v1[3] "Vector in frame 1";
|
|---|
| 1434 | output Real v2[3] "Vector in frame 2";
|
|---|
| 1435 | annotation(derivative(noDerivative=R)=Internal.resolve2_der, __Dymola_InlineAfterIndexReduction=true);
|
|---|
| 1436 | algorithm
|
|---|
| 1437 | v2:=R.T*v1;
|
|---|
| 1438 | end resolve2;
|
|---|
| 1439 |
|
|---|
| 1440 | function nullRotation "Return orientation object that does not rotate a frame"
|
|---|
| 1441 | extends Modelica.Icons.Function;
|
|---|
| 1442 | output Orientation R "Orientation object such that frame 1 and frame 2 are identical";
|
|---|
| 1443 | annotation(Inline=true);
|
|---|
| 1444 | algorithm
|
|---|
| 1445 | R:=Orientation(T=identity(3), w=zeros(3));
|
|---|
| 1446 | end nullRotation;
|
|---|
| 1447 |
|
|---|
| 1448 | function absoluteRotation "Return absolute orientation object from another absolute and a relative orientation object"
|
|---|
| 1449 | extends Modelica.Icons.Function;
|
|---|
| 1450 | input Orientation R1 "Orientation object to rotate frame 0 into frame 1";
|
|---|
| 1451 | input Orientation R_rel "Orientation object to rotate frame 1 into frame 2";
|
|---|
| 1452 | output Orientation R2 "Orientation object to rotate frame 0 into frame 2";
|
|---|
| 1453 | annotation(Inline=true);
|
|---|
| 1454 | algorithm
|
|---|
| 1455 | R2:=Orientation(T=R_rel.T*R1.T, w=resolve2(R_rel, R1.w) + R_rel.w);
|
|---|
| 1456 | end absoluteRotation;
|
|---|
| 1457 |
|
|---|
| 1458 | function planarRotation "Return orientation object of a planar rotation"
|
|---|
| 1459 | import Modelica.Math;
|
|---|
| 1460 | extends Modelica.Icons.Function;
|
|---|
| 1461 | input Real e[3](each final unit="1") "Normalized axis of rotation (must have length=1)";
|
|---|
| 1462 | input Modelica.SIunits.Angle angle "Rotation angle to rotate frame 1 into frame 2 along axis e";
|
|---|
| 1463 | input Modelica.SIunits.AngularVelocity der_angle "= der(angle)";
|
|---|
| 1464 | output Orientation R "Orientation object to rotate frame 1 into frame 2";
|
|---|
| 1465 | annotation(Inline=true);
|
|---|
| 1466 | algorithm
|
|---|
| 1467 | R:=Orientation(T=[e]*transpose([e]) + (identity(3) - [e]*transpose([e]))*Math.cos(angle) - skew(e)*Math.sin(angle), w=e*der_angle);
|
|---|
| 1468 | end planarRotation;
|
|---|
| 1469 |
|
|---|
| 1470 | function planarRotationAngle "Return angle of a planar rotation, given the rotation axis and the representations of a vector in frame 1 and frame 2"
|
|---|
| 1471 | extends Modelica.Icons.Function;
|
|---|
| 1472 | input Real e[3](each final unit="1") "Normalized axis of rotation to rotate frame 1 around e into frame 2 (must have length=1)";
|
|---|
| 1473 | input Real v1[3] "A vector v resolved in frame 1 (shall not be parallel to e)";
|
|---|
| 1474 | input Real v2[3] "Vector v resolved in frame 2, i.e., v2 = resolve2(planarRotation(e,angle),v1)";
|
|---|
| 1475 | output Modelica.SIunits.Angle angle "Rotation angle to rotate frame 1 into frame 2 along axis e in the range: -pi <= angle <= pi";
|
|---|
| 1476 | annotation(Inline=true, Documentation(info="<HTML>
|
|---|
| 1477 | <p>
|
|---|
| 1478 | A call to this function of the form
|
|---|
| 1479 | </p>
|
|---|
| 1480 | <pre>
|
|---|
| 1481 | Real[3] e, v1, v2;
|
|---|
| 1482 | Modelica.SIunits.Angle angle;
|
|---|
| 1483 | <b>equation</b>
|
|---|
| 1484 | angle = <b>planarRotationAngle</b>(e, v1, v2);
|
|---|
| 1485 | </pre>
|
|---|
| 1486 | <p>
|
|---|
| 1487 | computes the rotation angle \"<b>angle</b>\" of a planar
|
|---|
| 1488 | rotation along unit vector <b>e</b>, rotating frame 1 into frame 2, given
|
|---|
| 1489 | the coordinate representations of a vector \"v\" in frame 1 (<b>v1</b>)
|
|---|
| 1490 | and in frame 2 (<b>v2</b>). Therefore, the result of this function
|
|---|
| 1491 | fulfills the following equation:
|
|---|
| 1492 | </p>
|
|---|
| 1493 | <pre>
|
|---|
| 1494 | v2 = <b>resolve2</b>(<b>planarRotation</b>(e,angle), v1)
|
|---|
| 1495 | </pre>
|
|---|
| 1496 | <p>
|
|---|
| 1497 | The rotation angle is returned in the range
|
|---|
| 1498 | </p>
|
|---|
| 1499 | <pre>
|
|---|
| 1500 | -<font face=\"Symbol\">p</font> <= angle <= <font face=\"Symbol\">p</font>
|
|---|
| 1501 | </pre>
|
|---|
| 1502 | <p>
|
|---|
| 1503 | This function makes the following assumptions on the input arguments
|
|---|
| 1504 | </p>
|
|---|
| 1505 | <ul>
|
|---|
| 1506 | <li> Vector <b>e</b> has length 1, i.e., length(e) = 1</li>
|
|---|
| 1507 | <li> Vector \"v\" is not parallel to <b>e</b>, i.e.,
|
|---|
| 1508 | length(cross(e,v1)) ≠ 0</li>
|
|---|
| 1509 | </ul>
|
|---|
| 1510 | <p>
|
|---|
| 1511 | The function does not check the above assumptions. If these
|
|---|
| 1512 | assumptions are violated, a wrong result will be returned
|
|---|
| 1513 | and/or a division by zero will occur.
|
|---|
| 1514 | </p>
|
|---|
| 1515 | </HTML>"));
|
|---|
| 1516 | algorithm
|
|---|
| 1517 | angle:=Modelica.Math.atan2(-cross(e, v1)*v2, v1*v2 - e*v1*(e*v2));
|
|---|
| 1518 | end planarRotationAngle;
|
|---|
| 1519 |
|
|---|
| 1520 | function axesRotations "Return fixed rotation object to rotate in sequence around fixed angles along 3 axes"
|
|---|
| 1521 | import TM = Modelica.Mechanics.MultiBody.Frames.TransformationMatrices;
|
|---|
| 1522 | extends Modelica.Icons.Function;
|
|---|
| 1523 | input Integer sequence[3](min={1,1,1}, max={3,3,3})={1,2,3} "Sequence of rotations from frame 1 to frame 2 along axis sequence[i]";
|
|---|
| 1524 | input Modelica.SIunits.Angle angles[3] "Rotation angles around the axes defined in 'sequence'";
|
|---|
| 1525 | input Modelica.SIunits.AngularVelocity der_angles[3] "= der(angles)";
|
|---|
| 1526 | output Orientation R "Orientation object to rotate frame 1 into frame 2";
|
|---|
| 1527 | annotation(Inline=true);
|
|---|
| 1528 | algorithm
|
|---|
| 1529 | R:=Orientation(T=TM.axisRotation(sequence[3], angles[3])*TM.axisRotation(sequence[2], angles[2])*TM.axisRotation(sequence[1], angles[1]), w=Frames.axis(sequence[3])*der_angles[3] + TM.resolve2(TM.axisRotation(sequence[3], angles[3]), Frames.axis(sequence[2])*der_angles[2]) + TM.resolve2(TM.axisRotation(sequence[3], angles[3])*TM.axisRotation(sequence[2], angles[2]), Frames.axis(sequence[1])*der_angles[1]));
|
|---|
| 1530 | end axesRotations;
|
|---|
| 1531 |
|
|---|
| 1532 | function axesRotationsAngles "Return the 3 angles to rotate in sequence around 3 axes to construct the given orientation object"
|
|---|
| 1533 | import SI = Modelica.SIunits;
|
|---|
| 1534 | extends Modelica.Icons.Function;
|
|---|
| 1535 | input Orientation R "Orientation object to rotate frame 1 into frame 2";
|
|---|
| 1536 | input Integer sequence[3](min={1,1,1}, max={3,3,3})={1,2,3} "Sequence of rotations from frame 1 to frame 2 along axis sequence[i]";
|
|---|
| 1537 | input SI.Angle guessAngle1=0 "Select angles[1] such that |angles[1] - guessAngle1| is a minimum";
|
|---|
| 1538 | output SI.Angle angles[3] "Rotation angles around the axes defined in 'sequence' such that R=Frames.axesRotation(sequence,angles); -pi < angles[i] <= pi";
|
|---|
| 1539 | protected
|
|---|
| 1540 | Real e1_1[3](each final unit="1") "First rotation axis, resolved in frame 1";
|
|---|
| 1541 | Real e2_1a[3](each final unit="1") "Second rotation axis, resolved in frame 1a";
|
|---|
| 1542 | Real e3_1[3](each final unit="1") "Third rotation axis, resolved in frame 1";
|
|---|
| 1543 | Real e3_2[3](each final unit="1") "Third rotation axis, resolved in frame 2";
|
|---|
| 1544 | Real A "Coefficient A in the equation A*cos(angles[1])+B*sin(angles[1]) = 0";
|
|---|
| 1545 | Real B "Coefficient B in the equation A*cos(angles[1])+B*sin(angles[1]) = 0";
|
|---|
| 1546 | SI.Angle angle_1a "Solution 1 for angles[1]";
|
|---|
| 1547 | SI.Angle angle_1b "Solution 2 for angles[1]";
|
|---|
| 1548 | TransformationMatrices.Orientation T_1a "Orientation object to rotate frame 1 into frame 1a";
|
|---|
| 1549 | algorithm
|
|---|
| 1550 | assert(sequence[1] <> sequence[2] and sequence[2] <> sequence[3], "input argument 'sequence[1:3]' is not valid");
|
|---|
| 1551 | e1_1:=if sequence[1] == 1 then {1,0,0} else if sequence[1] == 2 then {0,1,0} else {0,0,1};
|
|---|
| 1552 | e2_1a:=if sequence[2] == 1 then {1,0,0} else if sequence[2] == 2 then {0,1,0} else {0,0,1};
|
|---|
| 1553 | e3_1:=R.T[sequence[3],:];
|
|---|
| 1554 | e3_2:=if sequence[3] == 1 then {1,0,0} else if sequence[3] == 2 then {0,1,0} else {0,0,1};
|
|---|
| 1555 | A:=e2_1a*e3_1;
|
|---|
| 1556 | B:=cross(e1_1, e2_1a)*e3_1;
|
|---|
| 1557 | if abs(A) <= 1e-12 and abs(B) <= 1e-12 then
|
|---|
| 1558 | angles[1]:=guessAngle1;
|
|---|
| 1559 | else
|
|---|
| 1560 | angle_1a:=Modelica.Math.atan2(A, -B);
|
|---|
| 1561 | angle_1b:=Modelica.Math.atan2(-A, B);
|
|---|
| 1562 | angles[1]:=if abs(angle_1a - guessAngle1) <= abs(angle_1b - guessAngle1) then angle_1a else angle_1b;
|
|---|
| 1563 | end if;
|
|---|
| 1564 | T_1a:=TransformationMatrices.planarRotation(e1_1, angles[1]);
|
|---|
| 1565 | angles[2]:=planarRotationAngle(e2_1a, TransformationMatrices.resolve2(T_1a, e3_1), e3_2);
|
|---|
| 1566 | angles[3]:=planarRotationAngle(e3_2, e2_1a, TransformationMatrices.resolve2(R.T, TransformationMatrices.resolve1(T_1a, e2_1a)));
|
|---|
| 1567 | annotation(Documentation(info="<HTML>
|
|---|
| 1568 | <p>
|
|---|
| 1569 | A call to this function of the form
|
|---|
| 1570 | </p>
|
|---|
| 1571 | <pre>
|
|---|
| 1572 | Frames.Orientation R;
|
|---|
| 1573 | <b>parameter</b> Integer sequence[3] = {1,2,3};
|
|---|
| 1574 | Modelica.SIunits.Angle angles[3];
|
|---|
| 1575 | <b>equation</b>
|
|---|
| 1576 | angle = <b>axesRotationAngles</b>(R, sequence);
|
|---|
| 1577 | </pre>
|
|---|
| 1578 | <p>
|
|---|
| 1579 | computes the rotation angles \"<b>angles</b>[1:3]\" to rotate frame 1
|
|---|
| 1580 | into frame 2 along axes <b>sequence</b>[1:3], given the orientation
|
|---|
| 1581 | object <b>R</b> from frame 1 to frame 2. Therefore, the result of
|
|---|
| 1582 | this function fulfills the following equation:
|
|---|
| 1583 | </p>
|
|---|
| 1584 | <pre>
|
|---|
| 1585 | R = <b>axesRotation</b>(sequence, angles)
|
|---|
| 1586 | </pre>
|
|---|
| 1587 | <p>
|
|---|
| 1588 | The rotation angles are returned in the range
|
|---|
| 1589 | </p>
|
|---|
| 1590 | <pre>
|
|---|
| 1591 | -<font face=\"Symbol\">p</font> <= angles[i] <= <font face=\"Symbol\">p</font>
|
|---|
| 1592 | </pre>
|
|---|
| 1593 | <p>
|
|---|
| 1594 | There are <b>two solutions</b> for \"angles[1]\" in this range.
|
|---|
| 1595 | Via the third argument <b>guessAngle1</b> (default = 0) the
|
|---|
| 1596 | returned solution is selected such that |angles[1] - guessAngle1| is
|
|---|
| 1597 | minimal. The orientation object R may be in a singular configuration, i.e.,
|
|---|
| 1598 | there is an infinite number of angle values leading to the same R. The returned solution is
|
|---|
| 1599 | selected by setting angles[1] = guessAngle1. Then angles[2]
|
|---|
| 1600 | and angles[3] can be uniquely determined in the above range.
|
|---|
| 1601 | </p>
|
|---|
| 1602 | <p>
|
|---|
| 1603 | Note, that input argument <b>sequence</b> has the restriction that
|
|---|
| 1604 | only values 1,2,3 can be used and that sequence[1] ≠ sequence[2]
|
|---|
| 1605 | and sequence[2] ≠ sequence[3]. Often used values are:
|
|---|
| 1606 | </p>
|
|---|
| 1607 | <pre>
|
|---|
| 1608 | sequence = <b>{1,2,3}</b> // Cardan angle sequence
|
|---|
| 1609 | = <b>{3,1,3}</b> // Euler angle sequence
|
|---|
| 1610 | = <b>{3,2,1}</b> // Tait-Bryan angle sequence
|
|---|
| 1611 | </pre>
|
|---|
| 1612 | </HTML>"));
|
|---|
| 1613 | end axesRotationsAngles;
|
|---|
| 1614 |
|
|---|
| 1615 | function from_nxy "Return fixed orientation object from n_x and n_y vectors"
|
|---|
| 1616 | extends Modelica.Icons.Function;
|
|---|
| 1617 | input Real n_x[3](each final unit="1") "Vector in direction of x-axis of frame 2, resolved in frame 1";
|
|---|
| 1618 | input Real n_y[3](each final unit="1") "Vector in direction of y-axis of frame 2, resolved in frame 1";
|
|---|
| 1619 | output Orientation R "Orientation object to rotate frame 1 into frame 2";
|
|---|
| 1620 | protected
|
|---|
| 1621 | Real abs_n_x=sqrt(n_x*n_x);
|
|---|
| 1622 | Real e_x[3](each final unit="1")=if abs_n_x < 1e-10 then {1,0,0} else n_x/abs_n_x;
|
|---|
| 1623 | Real n_z_aux[3](each final unit="1")=cross(e_x, n_y);
|
|---|
| 1624 | Real n_y_aux[3](each final unit="1")=if n_z_aux*n_z_aux > 1e-06 then n_y else if abs(e_x[1]) > 1e-06 then {0,1,0} else {1,0,0};
|
|---|
| 1625 | Real e_z_aux[3](each final unit="1")=cross(e_x, n_y_aux);
|
|---|
| 1626 | Real e_z[3](each final unit="1")=e_z_aux/sqrt(e_z_aux*e_z_aux);
|
|---|
| 1627 | algorithm
|
|---|
| 1628 | R:=Orientation(T={e_x,cross(e_z, e_x),e_z}, w=zeros(3));
|
|---|
| 1629 | annotation(Documentation(info="<html>
|
|---|
| 1630 | <p>
|
|---|
| 1631 | It is assumed that the two input vectors n_x and n_y are
|
|---|
| 1632 | resolved in frame 1 and are directed along the x and y axis
|
|---|
| 1633 | of frame 2 (i.e., n_x and n_y are orthogonal to each other)
|
|---|
| 1634 | The function returns the orientation object R to rotate from
|
|---|
| 1635 | frame 1 to frame 2.
|
|---|
| 1636 | </p>
|
|---|
| 1637 | <p>
|
|---|
| 1638 | The function is robust in the sense that it returns always
|
|---|
| 1639 | an orientation object R, even if n_y is not orthogonal to n_x.
|
|---|
| 1640 | This is performed in the following way:
|
|---|
| 1641 | </p>
|
|---|
| 1642 | <p>
|
|---|
| 1643 | If n_x and n_y are not orthogonal to each other, first a unit
|
|---|
| 1644 | vector e_y is determined that is orthogonal to n_x and is lying
|
|---|
| 1645 | in the plane spanned by n_x and n_y. If n_x and n_y are parallel
|
|---|
| 1646 | or nearly parallel to each other, a vector e_y is selected
|
|---|
| 1647 | arbitrarily such that e_x and e_y are orthogonal to each other.
|
|---|
| 1648 | </p>
|
|---|
| 1649 | </html>"));
|
|---|
| 1650 | end from_nxy;
|
|---|
| 1651 |
|
|---|
| 1652 | function from_T "Return orientation object R from transformation matrix T"
|
|---|
| 1653 | extends Modelica.Icons.Function;
|
|---|
| 1654 | input Real T[3,3] "Transformation matrix to transform vector from frame 1 to frame 2 (v2=T*v1)";
|
|---|
| 1655 | input Modelica.SIunits.AngularVelocity w[3] "Angular velocity from frame 2 with respect to frame 1, resolved in frame 2 (skew(w)=T*der(transpose(T)))";
|
|---|
| 1656 | output Orientation R "Orientation object to rotate frame 1 into frame 2";
|
|---|
| 1657 | annotation(Inline=true);
|
|---|
| 1658 | algorithm
|
|---|
| 1659 | R:=Orientation(T=T, w=w);
|
|---|
| 1660 | end from_T;
|
|---|
| 1661 |
|
|---|
| 1662 | function from_Q "Return orientation object R from quaternion orientation object Q"
|
|---|
| 1663 | extends Modelica.Icons.Function;
|
|---|
| 1664 | input Quaternions.Orientation Q "Quaternions orientation object to rotate frame 1 into frame 2";
|
|---|
| 1665 | input Modelica.SIunits.AngularVelocity w[3] "Angular velocity from frame 2 with respect to frame 1, resolved in frame 2";
|
|---|
| 1666 | output Orientation R "Orientation object to rotate frame 1 into frame 2";
|
|---|
| 1667 | annotation(Inline=true);
|
|---|
| 1668 | algorithm
|
|---|
| 1669 | R:=Orientation([2*(Q[1]*Q[1] + Q[4]*Q[4]) - 1,2*(Q[1]*Q[2] + Q[3]*Q[4]),2*(Q[1]*Q[3] - Q[2]*Q[4]);2*(Q[2]*Q[1] - Q[3]*Q[4]),2*(Q[2]*Q[2] + Q[4]*Q[4]) - 1,2*(Q[2]*Q[3] + Q[1]*Q[4]);2*(Q[3]*Q[1] + Q[2]*Q[4]),2*(Q[3]*Q[2] - Q[1]*Q[4]),2*(Q[3]*Q[3] + Q[4]*Q[4]) - 1], w=w);
|
|---|
| 1670 | end from_Q;
|
|---|
| 1671 |
|
|---|
| 1672 | function to_Q "Return quaternion orientation object Q from orientation object R"
|
|---|
| 1673 | extends Modelica.Icons.Function;
|
|---|
| 1674 | input Orientation R "Orientation object to rotate frame 1 into frame 2";
|
|---|
| 1675 | input Quaternions.Orientation Q_guess=Quaternions.nullRotation() "Guess value for output Q (there are 2 solutions; the one closer to Q_guess is used";
|
|---|
| 1676 | output Quaternions.Orientation Q "Quaternions orientation object to rotate frame 1 into frame 2";
|
|---|
| 1677 | annotation(Inline=true);
|
|---|
| 1678 | algorithm
|
|---|
| 1679 | Q:=Quaternions.from_T(R.T, Q_guess);
|
|---|
| 1680 | end to_Q;
|
|---|
| 1681 |
|
|---|
| 1682 | function axis "Return unit vector for x-, y-, or z-axis"
|
|---|
| 1683 | extends Modelica.Icons.Function;
|
|---|
| 1684 | input Integer axis(min=1, max=3) "Axis vector to be returned";
|
|---|
| 1685 | output Real e[3](each final unit="1") "Unit axis vector";
|
|---|
| 1686 | annotation(Inline=true);
|
|---|
| 1687 | algorithm
|
|---|
| 1688 | e:=if axis == 1 then {1,0,0} else if axis == 2 then {0,1,0} else {0,0,1};
|
|---|
| 1689 | end axis;
|
|---|
| 1690 |
|
|---|
| 1691 | package Quaternions "Functions to transform rotational frame quantities based on quaternions (also called Euler parameters)"
|
|---|
| 1692 | extends Modelica.Icons.Library;
|
|---|
| 1693 | type Orientation "Orientation type defining rotation from a frame 1 into a frame 2 with quaternions {p1,p2,p3,p0}"
|
|---|
| 1694 | extends Internal.QuaternionBase;
|
|---|
| 1695 | encapsulated function equalityConstraint "Return the constraint residues to express that two frames have the same quaternion orientation"
|
|---|
| 1696 | import Modelica;
|
|---|
| 1697 | import Modelica.Mechanics.MultiBody.Frames.Quaternions;
|
|---|
| 1698 | extends Modelica.Icons.Function;
|
|---|
| 1699 | input Quaternions.Orientation Q1 "Quaternions orientation object to rotate frame 0 into frame 1";
|
|---|
| 1700 | input Quaternions.Orientation Q2 "Quaternions orientation object to rotate frame 0 into frame 2";
|
|---|
| 1701 | output Real residue[3] "The half of the rotation angles around x-, y-, and z-axis of frame 1 to rotate frame 1 into frame 2 for a small rotation (shall be zero)";
|
|---|
| 1702 | annotation(Inline=true);
|
|---|
| 1703 | algorithm
|
|---|
| 1704 | residue:=[Q1[4],Q1[3],-Q1[2],-Q1[1];-Q1[3],Q1[4],Q1[1],-Q1[2];Q1[2],-Q1[1],Q1[4],-Q1[3]]*Q2;
|
|---|
| 1705 | end equalityConstraint;
|
|---|
| 1706 |
|
|---|
| 1707 | annotation(Documentation(info="<html>
|
|---|
| 1708 | <p>
|
|---|
| 1709 | This type describes the <b>rotation</b> to rotate a frame 1 into
|
|---|
| 1710 | a frame 2 using quaternions (also called <b>Euler parameters</b>)
|
|---|
| 1711 | according to the following definition:
|
|---|
| 1712 | </p>
|
|---|
| 1713 | <pre>
|
|---|
| 1714 | Quaternions.Orientation Q;
|
|---|
| 1715 | Real n[3];
|
|---|
| 1716 | Real phi(unit=\"rad\");
|
|---|
| 1717 | Q = [ n*sin(phi/2)
|
|---|
| 1718 | cos(phi/2) ]
|
|---|
| 1719 | </pre>
|
|---|
| 1720 | <p>
|
|---|
| 1721 | where \"n\" is the <b>axis of rotation</b> to rotate frame 1 into
|
|---|
| 1722 | frame 2 and \"phi\" is the <b>rotation angle</b> for this rotation.
|
|---|
| 1723 | Vector \"n\" is either resolved in frame 1 or in frame 2
|
|---|
| 1724 | (the result is the same since the coordinates of \"n\" with respect to
|
|---|
| 1725 | frame 1 are identical to its coordinates with respect to frame 2).
|
|---|
| 1726 | <p>
|
|---|
| 1727 | <p>
|
|---|
| 1728 | The term \"quaternions\" is prefered over the historically
|
|---|
| 1729 | more reasonable \"Euler parameters\" in order to not get
|
|---|
| 1730 | confused with Modelica \"parameters\".
|
|---|
| 1731 | </p>
|
|---|
| 1732 | </html>
|
|---|
| 1733 | "));
|
|---|
| 1734 | end Orientation;
|
|---|
| 1735 |
|
|---|
| 1736 | type der_Orientation= Real[4](each unit="1/s") "First time derivative of Quaternions.Orientation";
|
|---|
| 1737 | function orientationConstraint "Return residues of orientation constraints (shall be zero)"
|
|---|
| 1738 | extends Modelica.Icons.Function;
|
|---|
| 1739 | input Quaternions.Orientation Q "Quaternions orientation object to rotate frame 1 into frame 2";
|
|---|
| 1740 | output Real residue[1] "Residue constraint (shall be zero)";
|
|---|
| 1741 | annotation(Inline=true);
|
|---|
| 1742 | algorithm
|
|---|
| 1743 | residue:={Q*Q - 1};
|
|---|
| 1744 | end orientationConstraint;
|
|---|
| 1745 |
|
|---|
| 1746 | function angularVelocity2 "Compute angular velocity resolved in frame 2 from quaternions orientation object and its derivative"
|
|---|
| 1747 | extends Modelica.Icons.Function;
|
|---|
| 1748 | input Quaternions.Orientation Q "Quaternions orientation object to rotate frame 1 into frame 2";
|
|---|
| 1749 | input der_Orientation der_Q "Derivative of Q";
|
|---|
| 1750 | output Modelica.SIunits.AngularVelocity w[3] "Angular velocity of frame 2 with respect to frame 1 resolved in frame 2";
|
|---|
| 1751 | annotation(Inline=true);
|
|---|
| 1752 | algorithm
|
|---|
| 1753 | w:=2*([Q[4],Q[3],-Q[2],-Q[1];-Q[3],Q[4],Q[1],-Q[2];Q[2],-Q[1],Q[4],-Q[3]]*der_Q);
|
|---|
| 1754 | end angularVelocity2;
|
|---|
| 1755 |
|
|---|
| 1756 | function nullRotation "Return quaternions orientation object that does not rotate a frame"
|
|---|
| 1757 | extends Modelica.Icons.Function;
|
|---|
| 1758 | output Quaternions.Orientation Q "Quaternions orientation object to rotate frame 1 into frame 2";
|
|---|
| 1759 | annotation(Inline=true);
|
|---|
| 1760 | algorithm
|
|---|
| 1761 | Q:={0,0,0,1};
|
|---|
| 1762 | end nullRotation;
|
|---|
| 1763 |
|
|---|
| 1764 | function from_T "Return quaternions orientation object Q from transformation matrix T"
|
|---|
| 1765 | extends Modelica.Icons.Function;
|
|---|
| 1766 | input Real T[3,3] "Transformation matrix to transform vector from frame 1 to frame 2 (v2=T*v1)";
|
|---|
| 1767 | input Quaternions.Orientation Q_guess=nullRotation() "Guess value for Q (there are 2 solutions; the one close to Q_guess is used";
|
|---|
| 1768 | output Quaternions.Orientation Q "Quaternions orientation object to rotate frame 1 into frame 2 (Q and -Q have same transformation matrix)";
|
|---|
| 1769 | protected
|
|---|
| 1770 | Real paux;
|
|---|
| 1771 | Real paux4;
|
|---|
| 1772 | Real c1;
|
|---|
| 1773 | Real c2;
|
|---|
| 1774 | Real c3;
|
|---|
| 1775 | Real c4;
|
|---|
| 1776 | constant Real p4limit=0.1;
|
|---|
| 1777 | constant Real c4limit=4*p4limit*p4limit;
|
|---|
| 1778 | algorithm
|
|---|
| 1779 | c1:=1 + T[1,1] - T[2,2] - T[3,3];
|
|---|
| 1780 | c2:=1 + T[2,2] - T[1,1] - T[3,3];
|
|---|
| 1781 | c3:=1 + T[3,3] - T[1,1] - T[2,2];
|
|---|
| 1782 | c4:=1 + T[1,1] + T[2,2] + T[3,3];
|
|---|
| 1783 | if c4 > c4limit or c4 > c1 and c4 > c2 and c4 > c3 then
|
|---|
| 1784 | paux:=sqrt(c4)/2;
|
|---|
| 1785 | paux4:=4*paux;
|
|---|
| 1786 | Q:={(T[2,3] - T[3,2])/paux4,(T[3,1] - T[1,3])/paux4,(T[1,2] - T[2,1])/paux4,paux};
|
|---|
| 1787 | elseif c1 > c2 and c1 > c3 and c1 > c4 then
|
|---|
| 1788 | paux:=sqrt(c1)/2;
|
|---|
| 1789 | paux4:=4*paux;
|
|---|
| 1790 | Q:={paux,(T[1,2] + T[2,1])/paux4,(T[1,3] + T[3,1])/paux4,(T[2,3] - T[3,2])/paux4};
|
|---|
| 1791 |
|
|---|
| 1792 | elseif c2 > c1 and c2 > c3 and c2 > c4 then
|
|---|
| 1793 | paux:=sqrt(c2)/2;
|
|---|
| 1794 | paux4:=4*paux;
|
|---|
| 1795 | Q:={(T[1,2] + T[2,1])/paux4,paux,(T[2,3] + T[3,2])/paux4,(T[3,1] - T[1,3])/paux4};
|
|---|
| 1796 | else
|
|---|
| 1797 | paux:=sqrt(c3)/2;
|
|---|
| 1798 | paux4:=4*paux;
|
|---|
| 1799 | Q:={(T[1,3] + T[3,1])/paux4,(T[2,3] + T[3,2])/paux4,paux,(T[1,2] - T[2,1])/paux4};
|
|---|
| 1800 | end if;
|
|---|
| 1801 | if Q*Q_guess < 0 then
|
|---|
| 1802 | Q:=-Q;
|
|---|
| 1803 | end if;
|
|---|
| 1804 | end from_T;
|
|---|
| 1805 |
|
|---|
| 1806 | annotation(Documentation(info="<HTML>
|
|---|
| 1807 | <p>
|
|---|
| 1808 | Package <b>Frames.Quaternions</b> contains type definitions and
|
|---|
| 1809 | functions to transform rotational frame quantities with quaternions.
|
|---|
| 1810 | Functions of this package are currently only utilized in
|
|---|
| 1811 | MultiBody.Parts.Body components, when quaternions shall be used
|
|---|
| 1812 | as parts of the body states.
|
|---|
| 1813 | Some functions are also used in a new Modelica package for
|
|---|
| 1814 | B-Spline interpolation that is able to interpolate paths consisting of
|
|---|
| 1815 | position vectors and orientation objects.
|
|---|
| 1816 | </p>
|
|---|
| 1817 | <h4>Content</h4>
|
|---|
| 1818 | <p>In the table below an example is given for every function definition.
|
|---|
| 1819 | The used variables have the following declaration:
|
|---|
| 1820 | </p>
|
|---|
| 1821 | <pre>
|
|---|
| 1822 | Quaternions.Orientation Q, Q1, Q2, Q_rel, Q_inv;
|
|---|
| 1823 | Real[3,3] T, T_inv;
|
|---|
| 1824 | Real[3] v1, v2, w1, w2, n_x, n_y, n_z, res_ori, phi;
|
|---|
| 1825 | Real[6] res_equal;
|
|---|
| 1826 | Real L, angle;
|
|---|
| 1827 | </pre>
|
|---|
| 1828 | <table border=1 cellspacing=0 cellpadding=2>
|
|---|
| 1829 | <tr><th><b><i>Function/type</i></b></th><th><b><i>Description</i></b></th></tr>
|
|---|
| 1830 | <tr><td valign=\"top\"><b>Orientation Q;</b></td>
|
|---|
| 1831 | <td valign=\"top\">New type defining a quaternion object that describes<br>
|
|---|
| 1832 | the rotation of frame 1 into frame 2.
|
|---|
| 1833 | </td>
|
|---|
| 1834 | </tr>
|
|---|
| 1835 | <tr><td valign=\"top\"><b>der_Orientation</b> der_Q;</td>
|
|---|
| 1836 | <td valign=\"top\">New type defining the first time derivative
|
|---|
| 1837 | of Frames.Quaternions.Orientation.
|
|---|
| 1838 | </td>
|
|---|
| 1839 | </tr>
|
|---|
| 1840 | <tr><td valign=\"top\">res_ori = <b>orientationConstraint</b>(Q);</td>
|
|---|
| 1841 | <td valign=\"top\">Return the constraints between the variables of a quaternion object<br>
|
|---|
| 1842 | (shall be zero).</td>
|
|---|
| 1843 | </tr>
|
|---|
| 1844 | <tr><td valign=\"top\">w1 = <b>angularVelocity1</b>(Q, der_Q);</td>
|
|---|
| 1845 | <td valign=\"top\">Return angular velocity resolved in frame 1 from
|
|---|
| 1846 | quaternion object Q<br> and its derivative der_Q.
|
|---|
| 1847 | </td>
|
|---|
| 1848 | </tr>
|
|---|
| 1849 | <tr><td valign=\"top\">w2 = <b>angularVelocity2</b>(Q, der_Q);</td>
|
|---|
| 1850 | <td valign=\"top\">Return angular velocity resolved in frame 2 from
|
|---|
| 1851 | quaternion object Q<br> and its derivative der_Q.
|
|---|
| 1852 | </td>
|
|---|
| 1853 | </tr>
|
|---|
| 1854 | <tr><td valign=\"top\">v1 = <b>resolve1</b>(Q,v2);</td>
|
|---|
| 1855 | <td valign=\"top\">Transform vector v2 from frame 2 to frame 1.
|
|---|
| 1856 | </td>
|
|---|
| 1857 | </tr>
|
|---|
| 1858 | <tr><td valign=\"top\">v2 = <b>resolve2</b>(Q,v1);</td>
|
|---|
| 1859 | <td valign=\"top\">Transform vector v1 from frame 1 to frame 2.
|
|---|
| 1860 | </td>
|
|---|
| 1861 | </tr>
|
|---|
| 1862 | <tr><td valign=\"top\">[v1,w1] = <b>multipleResolve1</b>(Q, [v2,w2]);</td>
|
|---|
| 1863 | <td valign=\"top\">Transform several vectors from frame 2 to frame 1.
|
|---|
| 1864 | </td>
|
|---|
| 1865 | </tr>
|
|---|
| 1866 | <tr><td valign=\"top\">[v2,w2] = <b>multipleResolve2</b>(Q, [v1,w1]);</td>
|
|---|
| 1867 | <td valign=\"top\">Transform several vectors from frame 1 to frame 2.
|
|---|
| 1868 | </td>
|
|---|
| 1869 | </tr>
|
|---|
| 1870 | <tr><td valign=\"top\">Q = <b>nullRotation</b>()</td>
|
|---|
| 1871 | <td valign=\"top\">Return quaternion object R that does not rotate a frame.
|
|---|
| 1872 | </tr>
|
|---|
| 1873 | <tr><td valign=\"top\">Q_inv = <b>inverseRotation</b>(Q);</td>
|
|---|
| 1874 | <td valign=\"top\">Return inverse quaternion object.
|
|---|
| 1875 | </td>
|
|---|
| 1876 | </tr>
|
|---|
| 1877 | <tr><td valign=\"top\">Q_rel = <b>relativeRotation</b>(Q1,Q2);</td>
|
|---|
| 1878 | <td valign=\"top\">Return relative quaternion object from two absolute
|
|---|
| 1879 | quaternion objects.
|
|---|
| 1880 | </td>
|
|---|
| 1881 | </tr>
|
|---|
| 1882 | <tr><td valign=\"top\">Q2 = <b>absoluteRotation</b>(Q1,Q_rel);</td>
|
|---|
| 1883 | <td valign=\"top\">Return absolute quaternion object from another
|
|---|
| 1884 | absolute<br> and a relative quaternion object.
|
|---|
| 1885 | </td>
|
|---|
| 1886 | </tr>
|
|---|
| 1887 | <tr><td valign=\"top\">Q = <b>planarRotation</b>(e, angle);</td>
|
|---|
| 1888 | <td valign=\"top\">Return quaternion object of a planar rotation.
|
|---|
| 1889 | </td>
|
|---|
| 1890 | </tr>
|
|---|
| 1891 | <tr><td valign=\"top\">phi = <b>smallRotation</b>(Q);</td>
|
|---|
| 1892 | <td valign=\"top\">Return rotation angles phi valid for a small rotation.
|
|---|
| 1893 | </td>
|
|---|
| 1894 | </tr>
|
|---|
| 1895 | <tr><td valign=\"top\">Q = <b>from_T</b>(T);</td>
|
|---|
| 1896 | <td valign=\"top\">Return quaternion object Q from transformation matrix T.
|
|---|
| 1897 | </td>
|
|---|
| 1898 | </tr>
|
|---|
| 1899 | <tr><td valign=\"top\">Q = <b>from_T_inv</b>(T_inv);</td>
|
|---|
| 1900 | <td valign=\"top\">Return quaternion object Q from inverse transformation matrix T_inv.
|
|---|
| 1901 | </td>
|
|---|
| 1902 | </tr>
|
|---|
| 1903 | <tr><td valign=\"top\">T = <b>to_T</b>(Q);</td>
|
|---|
| 1904 | <td valign=\"top\">Return transformation matrix T from quaternion object Q.
|
|---|
| 1905 | </tr>
|
|---|
| 1906 | <tr><td valign=\"top\">T_inv = <b>to_T_inv</b>(Q);</td>
|
|---|
| 1907 | <td valign=\"top\">Return inverse transformation matrix T_inv from quaternion object Q.
|
|---|
| 1908 | </td>
|
|---|
| 1909 | </tr>
|
|---|
| 1910 | </table>
|
|---|
| 1911 | </HTML>"));
|
|---|
| 1912 | end Quaternions;
|
|---|
| 1913 |
|
|---|
| 1914 | package TransformationMatrices "Functions for transformation matrices"
|
|---|
| 1915 | extends Modelica.Icons.Library;
|
|---|
| 1916 | type Orientation "Orientation type defining rotation from a frame 1 into a frame 2 with a transformation matrix"
|
|---|
| 1917 | extends Internal.TransformationMatrix;
|
|---|
| 1918 | encapsulated function equalityConstraint "Return the constraint residues to express that two frames have the same orientation"
|
|---|
| 1919 | import Modelica;
|
|---|
| 1920 | import Modelica.Mechanics.MultiBody.Frames.TransformationMatrices;
|
|---|
| 1921 | extends Modelica.Icons.Function;
|
|---|
| 1922 | input TransformationMatrices.Orientation T1 "Orientation object to rotate frame 0 into frame 1";
|
|---|
| 1923 | input TransformationMatrices.Orientation T2 "Orientation object to rotate frame 0 into frame 2";
|
|---|
| 1924 | annotation(Inline=true);
|
|---|
| 1925 | output Real residue[3] "The rotation angles around x-, y-, and z-axis of frame 1 to rotate frame 1 into frame 2 for a small rotation (should be zero)";
|
|---|
| 1926 | algorithm
|
|---|
| 1927 | residue:={cross(T1[1,:], T1[2,:])*T2[2,:],-cross(T1[1,:], T1[2,:])*T2[1,:],T1[2,:]*T2[1,:]};
|
|---|
| 1928 | end equalityConstraint;
|
|---|
| 1929 |
|
|---|
| 1930 | annotation(Documentation(info="<html>
|
|---|
| 1931 | <p>
|
|---|
| 1932 | This type describes the <b>rotation</b> from a <b>frame 1</b> into a <b>frame 2</b>.
|
|---|
| 1933 | An instance <b>R</b> of type <b>Orientation</b> has the following interpretation:
|
|---|
| 1934 | </p>
|
|---|
| 1935 | <pre>
|
|---|
| 1936 | <b>T</b> = [<b>e</b><sub>x</sub>, <b>e</b><sub>y</sub>, <b>e</b><sub>z</sub>];
|
|---|
| 1937 | e.g., <b>T</b> = [1,0,0; 0,1,0; 0,0,1]
|
|---|
| 1938 | </pre>
|
|---|
| 1939 | <p>
|
|---|
| 1940 | where <b>e</b><sub>x</sub>,<b>e</b><sub>y</sub>,<b>e</b><sub>z</sub>
|
|---|
| 1941 | are unit vectors in the direction of the x-axis, y-axis, and z-axis
|
|---|
| 1942 | of frame 1, resolved in frame 2, respectively. Therefore, if <b>v</b><sub>1</sub>
|
|---|
| 1943 | is vector <b>v</b> resolved in frame 1 and <b>v</b><sub>2</sub> is
|
|---|
| 1944 | vector <b>v</b> resolved in frame 2, the following relationship holds:
|
|---|
| 1945 | </p>
|
|---|
| 1946 | <pre>
|
|---|
| 1947 | <b>v</b><sub>2</sub> = <b>T</b> * <b>v</b><sub>1</sub>
|
|---|
| 1948 | </pre>
|
|---|
| 1949 | </p>
|
|---|
| 1950 | The <b>inverse</b> orientation
|
|---|
| 1951 | <b>T_inv</b> = <b>T</b><sup>T</sup> describes the rotation
|
|---|
| 1952 | from frame 2 into frame 1.
|
|---|
| 1953 | </p>
|
|---|
| 1954 | <p>
|
|---|
| 1955 | Since the orientation is described by 9 variables, there are
|
|---|
| 1956 | 6 constraints between these variables. These constraints
|
|---|
| 1957 | are defined in function <b>TransformationMatrices.orientationConstraint</b>.
|
|---|
| 1958 | </p>
|
|---|
| 1959 | <p>
|
|---|
| 1960 | Note, that in the MultiBody library the rotation object is
|
|---|
| 1961 | never directly accessed but only with the access functions provided
|
|---|
| 1962 | in package TransformationMatrices. As a consequence, other implementations of
|
|---|
| 1963 | Rotation can be defined by adapting this package correspondingly.
|
|---|
| 1964 | </p>
|
|---|
| 1965 | </html>
|
|---|
| 1966 | "));
|
|---|
| 1967 | end Orientation;
|
|---|
| 1968 |
|
|---|
| 1969 | function resolve1 "Transform vector from frame 2 to frame 1"
|
|---|
| 1970 | extends Modelica.Icons.Function;
|
|---|
| 1971 | input TransformationMatrices.Orientation T "Orientation object to rotate frame 1 into frame 2";
|
|---|
| 1972 | input Real v2[3] "Vector in frame 2";
|
|---|
| 1973 | output Real v1[3] "Vector in frame 1";
|
|---|
| 1974 | annotation(Inline=true);
|
|---|
| 1975 | algorithm
|
|---|
| 1976 | v1:=transpose(T)*v2;
|
|---|
| 1977 | end resolve1;
|
|---|
| 1978 |
|
|---|
| 1979 | function resolve2 "Transform vector from frame 1 to frame 2"
|
|---|
| 1980 | extends Modelica.Icons.Function;
|
|---|
| 1981 | input TransformationMatrices.Orientation T "Orientation object to rotate frame 1 into frame 2";
|
|---|
| 1982 | input Real v1[3] "Vector in frame 1";
|
|---|
| 1983 | output Real v2[3] "Vector in frame 2";
|
|---|
| 1984 | annotation(Inline=true);
|
|---|
| 1985 | algorithm
|
|---|
| 1986 | v2:=T*v1;
|
|---|
| 1987 | end resolve2;
|
|---|
| 1988 |
|
|---|
| 1989 | function absoluteRotation "Return absolute orientation object from another absolute and a relative orientation object"
|
|---|
| 1990 | extends Modelica.Icons.Function;
|
|---|
| 1991 | input TransformationMatrices.Orientation T1 "Orientation object to rotate frame 0 into frame 1";
|
|---|
| 1992 | input TransformationMatrices.Orientation T_rel "Orientation object to rotate frame 1 into frame 2";
|
|---|
| 1993 | output TransformationMatrices.Orientation T2 "Orientation object to rotate frame 0 into frame 2";
|
|---|
| 1994 | annotation(Inline=true);
|
|---|
| 1995 | algorithm
|
|---|
| 1996 | T2:=T_rel*T1;
|
|---|
| 1997 | end absoluteRotation;
|
|---|
| 1998 |
|
|---|
| 1999 | function planarRotation "Return orientation object of a planar rotation"
|
|---|
| 2000 | import Modelica.Math;
|
|---|
| 2001 | extends Modelica.Icons.Function;
|
|---|
| 2002 | input Real e[3](each final unit="1") "Normalized axis of rotation (must have length=1)";
|
|---|
| 2003 | input Modelica.SIunits.Angle angle "Rotation angle to rotate frame 1 into frame 2 along axis e";
|
|---|
| 2004 | output TransformationMatrices.Orientation T "Orientation object to rotate frame 1 into frame 2";
|
|---|
| 2005 | annotation(Inline=true);
|
|---|
| 2006 | algorithm
|
|---|
| 2007 | T:=[e]*transpose([e]) + (identity(3) - [e]*transpose([e]))*Math.cos(angle) - skew(e)*Math.sin(angle);
|
|---|
| 2008 | end planarRotation;
|
|---|
| 2009 |
|
|---|
| 2010 | function axisRotation "Return rotation object to rotate around one frame axis"
|
|---|
| 2011 | import Modelica.Math.*;
|
|---|
| 2012 | extends Modelica.Icons.Function;
|
|---|
| 2013 | input Integer axis(min=1, max=3) "Rotate around 'axis' of frame 1";
|
|---|
| 2014 | input Modelica.SIunits.Angle angle "Rotation angle to rotate frame 1 into frame 2 along 'axis' of frame 1";
|
|---|
| 2015 | output TransformationMatrices.Orientation T "Orientation object to rotate frame 1 into frame 2";
|
|---|
| 2016 | annotation(Inline=true);
|
|---|
| 2017 | algorithm
|
|---|
| 2018 | T:=if axis == 1 then [1,0,0;0,cos(angle),sin(angle);0,-sin(angle),cos(angle)] else if axis == 2 then [cos(angle),0,-sin(angle);0,1,0;sin(angle),0,cos(angle)] else [cos(angle),sin(angle),0;-sin(angle),cos(angle),0;0,0,1];
|
|---|
| 2019 | end axisRotation;
|
|---|
| 2020 |
|
|---|
| 2021 | function from_nxy "Return orientation object from n_x and n_y vectors"
|
|---|
| 2022 | extends Modelica.Icons.Function;
|
|---|
| 2023 | input Real n_x[3](each final unit="1") "Vector in direction of x-axis of frame 2, resolved in frame 1";
|
|---|
| 2024 | input Real n_y[3](each final unit="1") "Vector in direction of y-axis of frame 2, resolved in frame 1";
|
|---|
| 2025 | output TransformationMatrices.Orientation T "Orientation object to rotate frame 1 into frame 2";
|
|---|
| 2026 | protected
|
|---|
| 2027 | Real abs_n_x=sqrt(n_x*n_x);
|
|---|
| 2028 | Real e_x[3](each final unit="1")=if abs_n_x < 1e-10 then {1,0,0} else n_x/abs_n_x;
|
|---|
| 2029 | Real n_z_aux[3](each final unit="1")=cross(e_x, n_y);
|
|---|
| 2030 | Real n_y_aux[3](each final unit="1")=if n_z_aux*n_z_aux > 1e-06 then n_y else if abs(e_x[1]) > 1e-06 then {0,1,0} else {1,0,0};
|
|---|
| 2031 | Real e_z_aux[3](each final unit="1")=cross(e_x, n_y_aux);
|
|---|
| 2032 | Real e_z[3](each final unit="1")=e_z_aux/sqrt(e_z_aux*e_z_aux);
|
|---|
| 2033 | algorithm
|
|---|
| 2034 | T:={e_x,cross(e_z, e_x),e_z};
|
|---|
| 2035 | annotation(Documentation(info="<html>
|
|---|
| 2036 | <p>
|
|---|
| 2037 | It is assumed that the two input vectors n_x and n_y are
|
|---|
| 2038 | resolved in frame 1 and are directed along the x and y axis
|
|---|
| 2039 | of frame 2 (i.e., n_x and n_y are orthogonal to each other)
|
|---|
| 2040 | The function returns the orientation object T to rotate from
|
|---|
| 2041 | frame 1 to frame 2.
|
|---|
| 2042 | </p>
|
|---|
| 2043 | <p>
|
|---|
| 2044 | The function is robust in the sense that it returns always
|
|---|
| 2045 | an orientation object T, even if n_y is not orthogonal to n_x.
|
|---|
| 2046 | This is performed in the following way:
|
|---|
| 2047 | </p>
|
|---|
| 2048 | <p>
|
|---|
| 2049 | If n_x and n_y are not orthogonal to each other, first a unit
|
|---|
| 2050 | vector e_y is determined that is orthogonal to n_x and is lying
|
|---|
| 2051 | in the plane spanned by n_x and n_y. If n_x and n_y are parallel
|
|---|
| 2052 | or nearly parallel to each other, a vector e_y is selected
|
|---|
| 2053 | arbitrarily such that e_x and e_y are orthogonal to each other.
|
|---|
| 2054 | </p>
|
|---|
| 2055 | </html>"));
|
|---|
| 2056 | end from_nxy;
|
|---|
| 2057 |
|
|---|
| 2058 | annotation(Documentation(info="<HTML>
|
|---|
| 2059 | <p>
|
|---|
| 2060 | Package <b>Frames.TransformationMatrices</b> contains type definitions and
|
|---|
| 2061 | functions to transform rotational frame quantities using
|
|---|
| 2062 | transformation matrices.
|
|---|
| 2063 | </p>
|
|---|
| 2064 | <h4>Content</h4>
|
|---|
| 2065 | <p>In the table below an example is given for every function definition.
|
|---|
| 2066 | The used variables have the following declaration:
|
|---|
| 2067 | </p>
|
|---|
| 2068 | <pre>
|
|---|
| 2069 | Orientation T, T1, T2, T_rel, T_inv;
|
|---|
| 2070 | Real[3] v1, v2, w1, w2, n_x, n_y, n_z, e, e_x, res_ori, phi;
|
|---|
| 2071 | Real[6] res_equal;
|
|---|
| 2072 | Real L, angle;
|
|---|
| 2073 | </pre>
|
|---|
| 2074 | <table border=1 cellspacing=0 cellpadding=2>
|
|---|
| 2075 | <tr><th><b><i>Function/type</i></b></th><th><b><i>Description</i></b></th></tr>
|
|---|
| 2076 | <tr><td valign=\"top\"><b>Orientation T;</b></td>
|
|---|
| 2077 | <td valign=\"top\">New type defining an orientation object that describes<br>
|
|---|
| 2078 | the rotation of frame 1 into frame 2.
|
|---|
| 2079 | </td>
|
|---|
| 2080 | </tr>
|
|---|
| 2081 | <tr><td valign=\"top\"><b>der_Orientation</b> der_T;</td>
|
|---|
| 2082 | <td valign=\"top\">New type defining the first time derivative
|
|---|
| 2083 | of Frames.Orientation.
|
|---|
| 2084 | </td>
|
|---|
| 2085 | </tr>
|
|---|
| 2086 | <tr><td valign=\"top\">res_ori = <b>orientationConstraint</b>(T);</td>
|
|---|
| 2087 | <td valign=\"top\">Return the constraints between the variables of an orientation object<br>
|
|---|
| 2088 | (shall be zero).</td>
|
|---|
| 2089 | </tr>
|
|---|
| 2090 | <tr><td valign=\"top\">w1 = <b>angularVelocity1</b>(T, der_T);</td>
|
|---|
| 2091 | <td valign=\"top\">Return angular velocity resolved in frame 1 from
|
|---|
| 2092 | orientation object T<br> and its derivative der_T.
|
|---|
| 2093 | </td>
|
|---|
| 2094 | </tr>
|
|---|
| 2095 | <tr><td valign=\"top\">w2 = <b>angularVelocity2</b>(T, der_T);</td>
|
|---|
| 2096 | <td valign=\"top\">Return angular velocity resolved in frame 2 from
|
|---|
| 2097 | orientation object T<br> and its derivative der_T.
|
|---|
| 2098 | </td>
|
|---|
| 2099 | </tr>
|
|---|
| 2100 | <tr><td valign=\"top\">v1 = <b>resolve1</b>(T,v2);</td>
|
|---|
| 2101 | <td valign=\"top\">Transform vector v2 from frame 2 to frame 1.
|
|---|
| 2102 | </td>
|
|---|
| 2103 | </tr>
|
|---|
| 2104 | <tr><td valign=\"top\">v2 = <b>resolve2</b>(T,v1);</td>
|
|---|
| 2105 | <td valign=\"top\">Transform vector v1 from frame 1 to frame 2.
|
|---|
| 2106 | </td>
|
|---|
| 2107 | </tr>
|
|---|
| 2108 | <tr><td valign=\"top\">[v1,w1] = <b>multipleResolve1</b>(T, [v2,w2]);</td>
|
|---|
| 2109 | <td valign=\"top\">Transform several vectors from frame 2 to frame 1.
|
|---|
| 2110 | </td>
|
|---|
| 2111 | </tr>
|
|---|
| 2112 | <tr><td valign=\"top\">[v2,w2] = <b>multipleResolve2</b>(T, [v1,w1]);</td>
|
|---|
| 2113 | <td valign=\"top\">Transform several vectors from frame 1 to frame 2.
|
|---|
| 2114 | </td>
|
|---|
| 2115 | </tr>
|
|---|
| 2116 | <tr><td valign=\"top\">D1 = <b>resolveDyade1</b>(T,D2);</td>
|
|---|
| 2117 | <td valign=\"top\">Transform second order tensor D2 from frame 2 to frame 1.
|
|---|
| 2118 | </td>
|
|---|
| 2119 | </tr>
|
|---|
| 2120 | <tr><td valign=\"top\">D2 = <b>resolveDyade2</b>(T,D1);</td>
|
|---|
| 2121 | <td valign=\"top\">Transform second order tensor D1 from frame 1 to frame 2.
|
|---|
| 2122 | </td>
|
|---|
| 2123 | </tr>
|
|---|
| 2124 | <tr><td valign=\"top\">T= <b>nullRotation</b>()</td>
|
|---|
| 2125 | <td valign=\"top\">Return orientation object T that does not rotate a frame.
|
|---|
| 2126 | </tr>
|
|---|
| 2127 | <tr><td valign=\"top\">T_inv = <b>inverseRotation</b>(T);</td>
|
|---|
| 2128 | <td valign=\"top\">Return inverse orientation object.
|
|---|
| 2129 | </td>
|
|---|
| 2130 | </tr>
|
|---|
| 2131 | <tr><td valign=\"top\">T_rel = <b>relativeRotation</b>(T1,T2);</td>
|
|---|
| 2132 | <td valign=\"top\">Return relative orientation object from two absolute
|
|---|
| 2133 | orientation objects.
|
|---|
| 2134 | </td>
|
|---|
| 2135 | </tr>
|
|---|
| 2136 | <tr><td valign=\"top\">T2 = <b>absoluteRotation</b>(T1,T_rel);</td>
|
|---|
| 2137 | <td valign=\"top\">Return absolute orientation object from another
|
|---|
| 2138 | absolute<br> and a relative orientation object.
|
|---|
| 2139 | </td>
|
|---|
| 2140 | </tr>
|
|---|
| 2141 | <tr><td valign=\"top\">T = <b>planarRotation</b>(e, angle);</td>
|
|---|
| 2142 | <td valign=\"top\">Return orientation object of a planar rotation.
|
|---|
| 2143 | </td>
|
|---|
| 2144 | </tr>
|
|---|
| 2145 | <tr><td valign=\"top\">angle = <b>planarRotationAngle</b>(e, v1, v2);</td>
|
|---|
| 2146 | <td valign=\"top\">Return angle of a planar rotation, given the rotation axis<br>
|
|---|
| 2147 | and the representations of a vector in frame 1 and frame 2.
|
|---|
| 2148 | </td>
|
|---|
| 2149 | </tr>
|
|---|
| 2150 | <tr><td valign=\"top\">T = <b>axisRotation</b>(i, angle);</td>
|
|---|
| 2151 | <td valign=\"top\">Return orientation object T for rotation around axis i of frame 1.
|
|---|
| 2152 | </td>
|
|---|
| 2153 | </tr>
|
|---|
| 2154 | <tr><td valign=\"top\">T = <b>axesRotations</b>(sequence, angles);</td>
|
|---|
| 2155 | <td valign=\"top\">Return rotation object to rotate in sequence around 3 axes. Example:<br>
|
|---|
| 2156 | T = axesRotations({1,2,3},{90,45,-90});
|
|---|
| 2157 | </td>
|
|---|
| 2158 | </tr>
|
|---|
| 2159 | <tr><td valign=\"top\">angles = <b>axesRotationsAngles</b>(T, sequence);</td>
|
|---|
| 2160 | <td valign=\"top\">Return the 3 angles to rotate in sequence around 3 axes to<br>
|
|---|
| 2161 | construct the given orientation object.
|
|---|
| 2162 | </td>
|
|---|
| 2163 | </tr>
|
|---|
| 2164 | <tr><td valign=\"top\">phi = <b>smallRotation</b>(T);</td>
|
|---|
| 2165 | <td valign=\"top\">Return rotation angles phi valid for a small rotation.
|
|---|
| 2166 | </td>
|
|---|
| 2167 | </tr>
|
|---|
| 2168 | <tr><td valign=\"top\">T = <b>from_nxy</b>(n_x, n_y);</td>
|
|---|
| 2169 | <td valign=\"top\">Return orientation object from n_x and n_y vectors.
|
|---|
| 2170 | </td>
|
|---|
| 2171 | </tr>
|
|---|
| 2172 | <tr><td valign=\"top\">T = <b>from_nxz</b>(n_x, n_z);</td>
|
|---|
| 2173 | <td valign=\"top\">Return orientation object from n_x and n_z vectors.
|
|---|
| 2174 | </td>
|
|---|
| 2175 | </tr>
|
|---|
| 2176 | <tr><td valign=\"top\">R = <b>from_T</b>(T);</td>
|
|---|
| 2177 | <td valign=\"top\">Return orientation object R from transformation matrix T.
|
|---|
| 2178 | </td>
|
|---|
| 2179 | </tr>
|
|---|
| 2180 | <tr><td valign=\"top\">R = <b>from_T_inv</b>(T_inv);</td>
|
|---|
| 2181 | <td valign=\"top\">Return orientation object R from inverse transformation matrix T_inv.
|
|---|
| 2182 | </td>
|
|---|
| 2183 | </tr>
|
|---|
| 2184 | <tr><td valign=\"top\">T = <b>from_Q</b>(Q);</td>
|
|---|
| 2185 | <td valign=\"top\">Return orientation object T from quaternion orientation object Q.
|
|---|
| 2186 | </td>
|
|---|
| 2187 | </tr>
|
|---|
| 2188 | <tr><td valign=\"top\">T = <b>to_T</b>(R);</td>
|
|---|
| 2189 | <td valign=\"top\">Return transformation matrix T from orientation object R.
|
|---|
| 2190 | </tr>
|
|---|
| 2191 | <tr><td valign=\"top\">T_inv = <b>to_T_inv</b>(R);</td>
|
|---|
| 2192 | <td valign=\"top\">Return inverse transformation matrix T_inv from orientation object R.
|
|---|
| 2193 | </td>
|
|---|
| 2194 | </tr>
|
|---|
| 2195 | <tr><td valign=\"top\">Q = <b>to_Q</b>(T);</td>
|
|---|
| 2196 | <td valign=\"top\">Return quaternione orientation object Q from orientation object T.
|
|---|
| 2197 | </td>
|
|---|
| 2198 | </tr>
|
|---|
| 2199 | <tr><td valign=\"top\">exy = <b>to_exy</b>(T);</td>
|
|---|
| 2200 | <td valign=\"top\">Return [e_x, e_y] matrix of an orientation object T, <br>
|
|---|
| 2201 | with e_x and e_y vectors of frame 2, resolved in frame 1.
|
|---|
| 2202 | </tr>
|
|---|
| 2203 | </table>
|
|---|
| 2204 | </HTML>"));
|
|---|
| 2205 | end TransformationMatrices;
|
|---|
| 2206 |
|
|---|
| 2207 | package Internal "Internal definitions that may be removed or changed (do not use)"
|
|---|
| 2208 | extends Modelica.Icons.Library;
|
|---|
| 2209 | type TransformationMatrix= Real[3,3];
|
|---|
| 2210 | type QuaternionBase= Real[4];
|
|---|
| 2211 | function resolve1_der "Derivative of function Frames.resolve1(..)"
|
|---|
| 2212 | import Modelica.Mechanics.MultiBody.Frames;
|
|---|
| 2213 | extends Modelica.Icons.Function;
|
|---|
| 2214 | input Orientation R "Orientation object to rotate frame 1 into frame 2";
|
|---|
| 2215 | input Real v2[3] "Vector resolved in frame 2";
|
|---|
| 2216 | input Real v2_der[3] "= der(v2)";
|
|---|
| 2217 | output Real v1_der[3] "Derivative of vector v resolved in frame 1";
|
|---|
| 2218 | annotation(Inline=true);
|
|---|
| 2219 | algorithm
|
|---|
| 2220 | v1_der:=Frames.resolve1(R, v2_der + cross(R.w, v2));
|
|---|
| 2221 | end resolve1_der;
|
|---|
| 2222 |
|
|---|
| 2223 | function resolve2_der "Derivative of function Frames.resolve2(..)"
|
|---|
| 2224 | import Modelica.Mechanics.MultiBody.Frames;
|
|---|
| 2225 | extends Modelica.Icons.Function;
|
|---|
| 2226 | input Orientation R "Orientation object to rotate frame 1 into frame 2";
|
|---|
| 2227 | input Real v1[3] "Vector resolved in frame 1";
|
|---|
| 2228 | input Real v1_der[3] "= der(v1)";
|
|---|
| 2229 | output Real v2_der[3] "Derivative of vector v resolved in frame 2";
|
|---|
| 2230 | annotation(Inline=true);
|
|---|
| 2231 | algorithm
|
|---|
| 2232 | v2_der:=Frames.resolve2(R, v1_der) - cross(R.w, Frames.resolve2(R, v1));
|
|---|
| 2233 | end resolve2_der;
|
|---|
| 2234 |
|
|---|
| 2235 | end Internal;
|
|---|
| 2236 |
|
|---|
| 2237 | annotation(Documentation(info="<HTML>
|
|---|
| 2238 | <p>
|
|---|
| 2239 | Package <b>Frames</b> contains type definitions and
|
|---|
| 2240 | functions to transform rotational frame quantities. The basic idea is to
|
|---|
| 2241 | hide the actual definition of an <b>orientation</b> in this package
|
|---|
| 2242 | by providing essentially type <b>Orientation</b> together with
|
|---|
| 2243 | <b>functions</b> operating on instances of this type.
|
|---|
| 2244 | </p>
|
|---|
| 2245 | <h4>Content</h4>
|
|---|
| 2246 | <p>In the table below an example is given for every function definition.
|
|---|
| 2247 | The used variables have the following declaration:
|
|---|
| 2248 | </p>
|
|---|
| 2249 | <pre>
|
|---|
| 2250 | Frames.Orientation R, R1, R2, R_rel, R_inv;
|
|---|
| 2251 | Real[3,3] T, T_inv;
|
|---|
| 2252 | Real[3] v1, v2, w1, w2, n_x, n_y, n_z, e, e_x, res_ori, phi;
|
|---|
| 2253 | Real[6] res_equal;
|
|---|
| 2254 | Real L, angle;
|
|---|
| 2255 | </pre>
|
|---|
| 2256 | <table border=1 cellspacing=0 cellpadding=2>
|
|---|
| 2257 | <tr><th><b><i>Function/type</i></b></th><th><b><i>Description</i></b></th></tr>
|
|---|
| 2258 | <tr><td valign=\"top\"><b>Orientation R;</b></td>
|
|---|
| 2259 | <td valign=\"top\">New type defining an orientation object that describes<br>
|
|---|
| 2260 | the rotation of frame 1 into frame 2.
|
|---|
| 2261 | </td>
|
|---|
| 2262 | </tr>
|
|---|
| 2263 | <tr><td valign=\"top\">res_ori = <b>orientationConstraint</b>(R);</td>
|
|---|
| 2264 | <td valign=\"top\">Return the constraints between the variables of an orientation object<br>
|
|---|
| 2265 | (shall be zero).</td>
|
|---|
| 2266 | </tr>
|
|---|
| 2267 | <tr><td valign=\"top\">w1 = <b>angularVelocity1</b>(R);</td>
|
|---|
| 2268 | <td valign=\"top\">Return angular velocity resolved in frame 1 from
|
|---|
| 2269 | orientation object R.
|
|---|
| 2270 | </td>
|
|---|
| 2271 | </tr>
|
|---|
| 2272 | <tr><td valign=\"top\">w2 = <b>angularVelocity2</b>(R);</td>
|
|---|
| 2273 | <td valign=\"top\">Return angular velocity resolved in frame 2 from
|
|---|
| 2274 | orientation object R.
|
|---|
| 2275 | </td>
|
|---|
| 2276 | </tr>
|
|---|
| 2277 | <tr><td valign=\"top\">v1 = <b>resolve1</b>(R,v2);</td>
|
|---|
| 2278 | <td valign=\"top\">Transform vector v2 from frame 2 to frame 1.
|
|---|
| 2279 | </td>
|
|---|
| 2280 | </tr>
|
|---|
| 2281 | <tr><td valign=\"top\">v2 = <b>resolve2</b>(R,v1);</td>
|
|---|
| 2282 | <td valign=\"top\">Transform vector v1 from frame 1 to frame 2.
|
|---|
| 2283 | </td>
|
|---|
| 2284 | </tr>
|
|---|
| 2285 | <tr><td valign=\"top\">v2 = <b>resolveRelative</b>(v1,R1,R2);</td>
|
|---|
| 2286 | <td valign=\"top\">Transform vector v1 from frame 1 to frame 2
|
|---|
| 2287 | using absolute orientation objects R1 of frame 1 and R2 of frame 2.
|
|---|
| 2288 | </td>
|
|---|
| 2289 | </tr>
|
|---|
| 2290 | <tr><td valign=\"top\">D1 = <b>resolveDyade1</b>(R,D2);</td>
|
|---|
| 2291 | <td valign=\"top\">Transform second order tensor D2 from frame 2 to frame 1.
|
|---|
| 2292 | </td>
|
|---|
| 2293 | </tr>
|
|---|
| 2294 | <tr><td valign=\"top\">D2 = <b>resolveDyade2</b>(R,D1);</td>
|
|---|
| 2295 | <td valign=\"top\">Transform second order tensor D1 from frame 1 to frame 2.
|
|---|
| 2296 | </td>
|
|---|
| 2297 | </tr>
|
|---|
| 2298 | <tr><td valign=\"top\">R = <b>nullRotation</b>()</td>
|
|---|
| 2299 | <td valign=\"top\">Return orientation object R that does not rotate a frame.
|
|---|
| 2300 | </tr>
|
|---|
| 2301 | <tr><td valign=\"top\">R_inv = <b>inverseRotation</b>(R);</td>
|
|---|
| 2302 | <td valign=\"top\">Return inverse orientation object.
|
|---|
| 2303 | </td>
|
|---|
| 2304 | </tr>
|
|---|
| 2305 | <tr><td valign=\"top\">R_rel = <b>relativeRotation</b>(R1,R2);</td>
|
|---|
| 2306 | <td valign=\"top\">Return relative orientation object from two absolute
|
|---|
| 2307 | orientation objects.
|
|---|
| 2308 | </td>
|
|---|
| 2309 | </tr>
|
|---|
| 2310 | <tr><td valign=\"top\">R2 = <b>absoluteRotation</b>(R1,R_rel);</td>
|
|---|
| 2311 | <td valign=\"top\">Return absolute orientation object from another
|
|---|
| 2312 | absolute<br> and a relative orientation object.
|
|---|
| 2313 | </td>
|
|---|
| 2314 | </tr>
|
|---|
| 2315 | <tr><td valign=\"top\">R = <b>planarRotation</b>(e, angle, der_angle);</td>
|
|---|
| 2316 | <td valign=\"top\">Return orientation object of a planar rotation.
|
|---|
| 2317 | </td>
|
|---|
| 2318 | </tr>
|
|---|
| 2319 | <tr><td valign=\"top\">angle = <b>planarRotationAngle</b>(e, v1, v2);</td>
|
|---|
| 2320 | <td valign=\"top\">Return angle of a planar rotation, given the rotation axis<br>
|
|---|
| 2321 | and the representations of a vector in frame 1 and frame 2.
|
|---|
| 2322 | </td>
|
|---|
| 2323 | </tr>
|
|---|
| 2324 | <tr><td valign=\"top\">R = <b>axisRotation</b>(axis, angle, der_angle);</td>
|
|---|
| 2325 | <td valign=\"top\">Return orientation object R to rotate around angle along axis of frame 1.
|
|---|
| 2326 | </td>
|
|---|
| 2327 | </tr>
|
|---|
| 2328 | <tr><td valign=\"top\">R = <b>axesRotations</b>(sequence, angles, der_angles);</td>
|
|---|
| 2329 | <td valign=\"top\">Return rotation object to rotate in sequence around 3 axes. Example:<br>
|
|---|
| 2330 | R = axesRotations({1,2,3},{pi/2,pi/4,-pi}, zeros(3));
|
|---|
| 2331 | </td>
|
|---|
| 2332 | </tr>
|
|---|
| 2333 | <tr><td valign=\"top\">angles = <b>axesRotationsAngles</b>(R, sequence);</td>
|
|---|
| 2334 | <td valign=\"top\">Return the 3 angles to rotate in sequence around 3 axes to<br>
|
|---|
| 2335 | construct the given orientation object.
|
|---|
| 2336 | </td>
|
|---|
| 2337 | </tr>
|
|---|
| 2338 | <tr><td valign=\"top\">phi = <b>smallRotation</b>(R);</td>
|
|---|
| 2339 | <td valign=\"top\">Return rotation angles phi valid for a small rotation R.
|
|---|
| 2340 | </td>
|
|---|
| 2341 | </tr>
|
|---|
| 2342 | <tr><td valign=\"top\">R = <b>from_nxy</b>(n_x, n_y);</td>
|
|---|
| 2343 | <td valign=\"top\">Return orientation object from n_x and n_y vectors.
|
|---|
| 2344 | </td>
|
|---|
| 2345 | </tr>
|
|---|
| 2346 | <tr><td valign=\"top\">R = <b>from_nxz</b>(n_x, n_z);</td>
|
|---|
| 2347 | <td valign=\"top\">Return orientation object from n_x and n_z vectors.
|
|---|
| 2348 | </td>
|
|---|
| 2349 | </tr>
|
|---|
| 2350 | <tr><td valign=\"top\">R = <b>from_T</b>(T,w);</td>
|
|---|
| 2351 | <td valign=\"top\">Return orientation object R from transformation matrix T and
|
|---|
| 2352 | its angular velocity w.
|
|---|
| 2353 | </td>
|
|---|
| 2354 | </tr>
|
|---|
| 2355 | <tr><td valign=\"top\">R = <b>from_T2</b>(T,der(T));</td>
|
|---|
| 2356 | <td valign=\"top\">Return orientation object R from transformation matrix T and
|
|---|
| 2357 | its derivative der(T).
|
|---|
| 2358 | </td>
|
|---|
| 2359 | </tr>
|
|---|
| 2360 | <tr><td valign=\"top\">R = <b>from_T_inv</b>(T_inv,w);</td>
|
|---|
| 2361 | <td valign=\"top\">Return orientation object R from inverse transformation matrix T_inv and
|
|---|
| 2362 | its angular velocity w.
|
|---|
| 2363 | </td>
|
|---|
| 2364 | </tr>
|
|---|
| 2365 | <tr><td valign=\"top\">R = <b>from_Q</b>(Q,w);</td>
|
|---|
| 2366 | <td valign=\"top\">Return orientation object R from quaternion orientation object Q
|
|---|
| 2367 | and its angular velocity w.
|
|---|
| 2368 | </td>
|
|---|
| 2369 | </tr>
|
|---|
| 2370 | <tr><td valign=\"top\">T = <b>to_T</b>(R);</td>
|
|---|
| 2371 | <td valign=\"top\">Return transformation matrix T from orientation object R.
|
|---|
| 2372 | </tr>
|
|---|
| 2373 | <tr><td valign=\"top\">T_inv = <b>to_T_inv</b>(R);</td>
|
|---|
| 2374 | <td valign=\"top\">Return inverse transformation matrix T_inv from orientation object R.
|
|---|
| 2375 | </td>
|
|---|
| 2376 | </tr>
|
|---|
| 2377 | <tr><td valign=\"top\">Q = <b>to_Q</b>(R);</td>
|
|---|
| 2378 | <td valign=\"top\">Return quaternione orientation object Q from orientation object R.
|
|---|
| 2379 | </td>
|
|---|
| 2380 | </tr>
|
|---|
| 2381 | <tr><td valign=\"top\">exy = <b>to_exy</b>(R);</td>
|
|---|
| 2382 | <td valign=\"top\">Return [e_x, e_y] matrix of an orientation object R, <br>
|
|---|
| 2383 | with e_x and e_y vectors of frame 2, resolved in frame 1.
|
|---|
| 2384 | </tr>
|
|---|
| 2385 | <tr><td valign=\"top\">L = <b>length</b>(n_x);</td>
|
|---|
| 2386 | <td valign=\"top\">Return length L of a vector n_x.
|
|---|
| 2387 | </td>
|
|---|
| 2388 | </tr>
|
|---|
| 2389 | <tr><td valign=\"top\">e_x = <b>normalize</b>(n_x);</td>
|
|---|
| 2390 | <td valign=\"top\">Return normalized vector e_x of n_x such that length of e_x is one.
|
|---|
| 2391 | </td>
|
|---|
| 2392 | </tr>
|
|---|
| 2393 | <tr><td valign=\"top\">e = <b>axis</b>(i);</td>
|
|---|
| 2394 | <td valign=\"top\">Return unit vector e directed along axis i
|
|---|
| 2395 | </td>
|
|---|
| 2396 | </tr>
|
|---|
| 2397 | <tr><td valign=\"top\"><a href=\"Modelica://Modelica.Mechanics.MultiBody.Frames.Quaternions\">Quaternions</a></td>
|
|---|
| 2398 | <td valign=\"top\"><b>Package</b> with functions to transform rotational frame quantities based
|
|---|
| 2399 | on quaternions (also called Euler parameters).
|
|---|
| 2400 | </td>
|
|---|
| 2401 | </tr>
|
|---|
| 2402 | <tr><td valign=\"top\"><a href=\"Modelica://Modelica.Mechanics.MultiBody.Frames.TransformationMatrices\">TransformationMatrices</a></td>
|
|---|
| 2403 | <td valign=\"top\"><b>Package</b> with functions to transform rotational frame quantities based
|
|---|
| 2404 | on transformation matrices.
|
|---|
| 2405 | </td>
|
|---|
| 2406 | </tr>
|
|---|
| 2407 | </table>
|
|---|
| 2408 | </HTML>"));
|
|---|
| 2409 | end Frames;
|
|---|
| 2410 |
|
|---|
| 2411 | end MultiBody;
|
|---|
| 2412 |
|
|---|
| 2413 | end Mechanics;
|
|---|
| 2414 |
|
|---|
| 2415 | package Math "Library of mathematical functions (e.g., sin, cos) and of functions operating on vectors and matrices"
|
|---|
| 2416 | import SI = Modelica.SIunits;
|
|---|
| 2417 | extends Modelica.Icons.Library2;
|
|---|
| 2418 | package Vectors "Library of functions operating on vectors"
|
|---|
| 2419 | extends Modelica.Icons.Library;
|
|---|
| 2420 | function length "Return length of a vectorReturn length of a vector (better as norm(), if further symbolic processing is performed)"
|
|---|
| 2421 | extends Modelica.Icons.Function;
|
|---|
| 2422 | input Real v[:] "Vector";
|
|---|
| 2423 | output Real result "Length of vector v";
|
|---|
| 2424 | annotation(Inline=true, Documentation(info="<html>
|
|---|
| 2425 | <h4>Syntax</h4>
|
|---|
| 2426 | <blockquote><pre>
|
|---|
| 2427 | Vectors.<b>length</b>(v);
|
|---|
| 2428 | </pre></blockquote>
|
|---|
| 2429 | <h4>Description</h4>
|
|---|
| 2430 | <p>
|
|---|
| 2431 | The function call \"<code>Vectors.<b>length</b>(v)</code>\" returns the
|
|---|
| 2432 | <b>Euclidean length</b> \"<code>sqrt(v*v)</code>\" of vector v.
|
|---|
| 2433 | The function call is equivalent to Vectors.norm(v). The advantage of
|
|---|
| 2434 | length(v) over norm(v)\"is that function length(..) is implemented
|
|---|
| 2435 | in one statement and therefore the function is usually automatically
|
|---|
| 2436 | inlined. Further symbolic processing is therefore possible, which is
|
|---|
| 2437 | not the case with function norm(..).
|
|---|
| 2438 | </p>
|
|---|
| 2439 | <h4>Example</h4>
|
|---|
| 2440 | <blockquote><pre>
|
|---|
| 2441 | v = {2, -4, -2, -1};
|
|---|
| 2442 | <b>length</b>(v); // = 5
|
|---|
| 2443 | </pre></blockquote>
|
|---|
| 2444 | <h4>See also</h4>
|
|---|
| 2445 | <a href=\"Modelica://Modelica.Math.Vectors.norm\">Vectors.norm</a>
|
|---|
| 2446 | </html>"));
|
|---|
| 2447 | algorithm
|
|---|
| 2448 | result:=sqrt(v*v);
|
|---|
| 2449 | end length;
|
|---|
| 2450 |
|
|---|
| 2451 | function normalize "Return normalized vector such that length = 1Return normalized vector such that length = 1 and prevent zero-division for zero vector"
|
|---|
| 2452 | extends Modelica.Icons.Function;
|
|---|
| 2453 | input Real v[:] "Vector";
|
|---|
| 2454 | input Real eps=100*Modelica.Constants.eps "if |v| < eps then result = v/eps";
|
|---|
| 2455 | output Real result[size(v, 1)] "Input vector v normalized to length=1";
|
|---|
| 2456 | annotation(Inline=true, Documentation(info="<html>
|
|---|
| 2457 | <h4>Syntax</h4>
|
|---|
| 2458 | <blockquote><pre>
|
|---|
| 2459 | Vectors.<b>normalize</b>(v);
|
|---|
| 2460 | Vectors.<b>normalize</b>(v,eps=100*Modelica.Constants.eps);
|
|---|
| 2461 | </pre></blockquote>
|
|---|
| 2462 | <h4>Description</h4>
|
|---|
| 2463 | <p>
|
|---|
| 2464 | The function call \"<code>Vectors.<b>normalize</b>(v)</code>\" returns the
|
|---|
| 2465 | <b>unit vector</b> \"<code>v/length(v)</code>\" of vector v.
|
|---|
| 2466 | If length(v) is close to zero (more precisely, if length(v) < eps),
|
|---|
| 2467 | v/eps is returned in order to avoid
|
|---|
| 2468 | a division by zero. For many applications this is useful, because
|
|---|
| 2469 | often the unit vector <b>e</b> = <b>v</b>/length(<b>v</b>) is used to compute
|
|---|
| 2470 | a vector x*<b>e</b>, where the scalar x is in the order of length(<b>v</b>),
|
|---|
| 2471 | i.e., x*<b>e</b> is small, when length(<b>v</b>) is small and then
|
|---|
| 2472 | it is fine to replace <b>e</b> by <b>v</b> to avoid a division by zero.
|
|---|
| 2473 | </p>
|
|---|
| 2474 | <p>
|
|---|
| 2475 | Since the function is implemented in one statement,
|
|---|
| 2476 | it is usually inlined and therefore symbolic processing is
|
|---|
| 2477 | possible.
|
|---|
| 2478 | </p>
|
|---|
| 2479 | <h4>Example</h4>
|
|---|
| 2480 | <blockquote><pre>
|
|---|
| 2481 | <b>normalize</b>({1,2,3}); // = {0.267, 0.534, 0.802}
|
|---|
| 2482 | <b>normalize</b>({0,0,0}); // = {0,0,0}
|
|---|
| 2483 | </pre></blockquote>
|
|---|
| 2484 | <h4>See also</h4>
|
|---|
| 2485 | <a href=\"Modelica://Modelica.Math.Vectors.length\">Vectors.length</a>
|
|---|
| 2486 | </html>"));
|
|---|
| 2487 | algorithm
|
|---|
| 2488 | result:=smooth(0, if length(v) >= eps then v/length(v) else v/eps);
|
|---|
| 2489 | end normalize;
|
|---|
| 2490 |
|
|---|
| 2491 | annotation(preferedView="info", Documentation(info="<HTML>
|
|---|
| 2492 | <h4>Library content</h4>
|
|---|
| 2493 | <p>
|
|---|
| 2494 | This library provides functions operating on vectors:
|
|---|
| 2495 | </p>
|
|---|
| 2496 | <table border=1 cellspacing=0 cellpadding=2>
|
|---|
| 2497 | <tr><th><i>Function</i></th>
|
|---|
| 2498 | <th><i>Description</i></th>
|
|---|
| 2499 | </tr>
|
|---|
| 2500 | <tr><td valign=\"top\"><a href=\"Modelica://Modelica.Math.Vectors.isEqual\">isEqual</a>(v1, v2)</td>
|
|---|
| 2501 | <td valign=\"top\">Determines whether two vectors have the same size and elements</td>
|
|---|
| 2502 | </tr>
|
|---|
| 2503 | <tr><td valign=\"top\"><a href=\"Modelica://Modelica.Math.Vectors.norm\">norm</a>(v,p)</td>
|
|---|
| 2504 | <td valign=\"top\">p-norm of vector v</td>
|
|---|
| 2505 | </tr>
|
|---|
| 2506 | <tr><td valign=\"top\"><a href=\"Modelica://Modelica.Math.Vectors.length\">length</a>(v)</td>
|
|---|
| 2507 | <td valign=\"top\">Length of vector v (= norm(v,2), but inlined and therefore usable in
|
|---|
| 2508 | symbolic manipulations) </td>
|
|---|
| 2509 | </tr>
|
|---|
| 2510 | <tr><td valign=\"top\"><a href=\"Modelica://Modelica.Math.Vectors.normalize\">normalize</a>(v)</td>
|
|---|
| 2511 | <td valign=\"top\">Return normalized vector such that length = 1 and prevent
|
|---|
| 2512 | zero-division for zero vector</td>
|
|---|
| 2513 | </tr>
|
|---|
| 2514 | <tr><td valign=\"top\"><a href=\"Modelica://Modelica.Math.Vectors.reverse\">reverse</a>(v)</td>
|
|---|
| 2515 | <td valign=\"top\">Reverse vector elements</td>
|
|---|
| 2516 | </tr>
|
|---|
| 2517 | <tr><td valign=\"top\"><a href=\"Modelica://Modelica.Math.Vectors.sort\">sort</a>(v)</td>
|
|---|
| 2518 | <td valign=\"top\">Sort elements of vector in ascending or descending order</td>
|
|---|
| 2519 | </tr>
|
|---|
| 2520 | </table>
|
|---|
| 2521 | <h4>See also</h4>
|
|---|
| 2522 | <a href=\"Modelica://Modelica.Math.Matrices\">Matrices</a>
|
|---|
| 2523 | </HTML>"));
|
|---|
| 2524 | end Vectors;
|
|---|
| 2525 |
|
|---|
| 2526 | function sin "Sine"
|
|---|
| 2527 | extends baseIcon1;
|
|---|
| 2528 | input SI.Angle u;
|
|---|
| 2529 | output Real y;
|
|---|
| 2530 |
|
|---|
| 2531 | external "C" y=sin(u) ;
|
|---|
| 2532 | annotation(Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={2,2}), graphics={Line(points={{-90,0},{68,0}}, color={192,192,192}),Polygon(points={{90,0},{68,8},{68,-8},{90,0}}, lineColor={192,192,192}, fillColor={192,192,192}, fillPattern=FillPattern.Solid),Line(points={{-80,0},{-68.7,34.2},{-61.5,53.1},{-55.1,66.4},{-49.4,74.6},{-43.8,79.1},{-38.2,79.8},{-32.6,76.6},{-26.9,69.7},{-21.3,59.4},{-14.9,44.1},{-6.83,21.2},{10.1,-30.8},{17.3,-50.2},{23.7,-64.2},{29.3,-73.1},{35,-78.4},{40.6,-80},{46.2,-77.6},{51.9,-71.5},{57.5,-61.9},{63.9,-47.2},{72,-24.8},{80,0}}, color={0,0,0}),Text(extent={{12,84},{84,36}}, lineColor={192,192,192}, textString="sin")}), Diagram(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={2,2}), graphics={Line(points={{-100,0},{84,0}}, color={95,95,95}),Polygon(points={{100,0},{84,6},{84,-6},{100,0}}, lineColor={95,95,95}, fillColor={95,95,95}, fillPattern=FillPattern.Solid),Line(points={{-80,0},{-68.7,34.2},{-61.5,53.1},{-55.1,66.4},{-49.4,74.6},{-43.8,79.1},{-38.2,79.8},{-32.6,76.6},{-26.9,69.7},{-21.3,59.4},{-14.9,44.1},{-6.83,21.2},{10.1,-30.8},{17.3,-50.2},{23.7,-64.2},{29.3,-73.1},{35,-78.4},{40.6,-80},{46.2,-77.6},{51.9,-71.5},{57.5,-61.9},{63.9,-47.2},{72,-24.8},{80,0}}, color={0,0,255}, thickness=0.5),Text(extent={{-105,72},{-85,88}}, textString="1", lineColor={0,0,255}),Text(extent={{70,25},{90,5}}, textString="2*pi", lineColor={0,0,255}),Text(extent={{-103,-72},{-83,-88}}, textString="-1", lineColor={0,0,255}),Text(extent={{82,-6},{102,-26}}, lineColor={95,95,95}, textString="u"),Line(points={{-80,80},{-28,80}}, color={175,175,175}, smooth=Smooth.None),Line(points={{-80,-80},{50,-80}}, color={175,175,175}, smooth=Smooth.None)}), Documentation(info="<html>
|
|---|
| 2533 | <p>
|
|---|
| 2534 | This function returns y = sin(u), with -∞ < u < ∞:
|
|---|
| 2535 | </p>
|
|---|
| 2536 |
|
|---|
| 2537 | <p>
|
|---|
| 2538 | <img src=\"../Images/Math/sin.png\">
|
|---|
| 2539 | </p>
|
|---|
| 2540 | </html>"), Library="ModelicaExternalC");
|
|---|
| 2541 | end sin;
|
|---|
| 2542 |
|
|---|
| 2543 | function cos "Cosine"
|
|---|
| 2544 | extends baseIcon1;
|
|---|
| 2545 | input SI.Angle u;
|
|---|
| 2546 | output Real y;
|
|---|
| 2547 |
|
|---|
| 2548 | external "C" y=cos(u) ;
|
|---|
| 2549 | annotation(Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={2,2}), graphics={Line(points={{-90,0},{68,0}}, color={192,192,192}),Polygon(points={{90,0},{68,8},{68,-8},{90,0}}, lineColor={192,192,192}, fillColor={192,192,192}, fillPattern=FillPattern.Solid),Line(points={{-80,80},{-74.4,78.1},{-68.7,72.3},{-63.1,63},{-56.7,48.7},{-48.6,26.6},{-29.3,-32.5},{-22.1,-51.7},{-15.7,-65.3},{-10.1,-73.8},{-4.42,-78.8},{1.21,-79.9},{6.83,-77.1},{12.5,-70.6},{18.1,-60.6},{24.5,-45.7},{32.6,-23},{50.3,31.3},{57.5,50.7},{63.9,64.6},{69.5,73.4},{75.2,78.6},{80,80}}, color={0,0,0}),Text(extent={{-36,82},{36,34}}, lineColor={192,192,192}, textString="cos")}), Diagram(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={2,2}), graphics={Text(extent={{-103,72},{-83,88}}, textString="1", lineColor={0,0,255}),Text(extent={{-103,-72},{-83,-88}}, textString="-1", lineColor={0,0,255}),Text(extent={{70,25},{90,5}}, textString="2*pi", lineColor={0,0,255}),Line(points={{-100,0},{84,0}}, color={95,95,95}),Polygon(points={{98,0},{82,6},{82,-6},{98,0}}, lineColor={95,95,95}, fillColor={95,95,95}, fillPattern=FillPattern.Solid),Line(points={{-80,80},{-74.4,78.1},{-68.7,72.3},{-63.1,63},{-56.7,48.7},{-48.6,26.6},{-29.3,-32.5},{-22.1,-51.7},{-15.7,-65.3},{-10.1,-73.8},{-4.42,-78.8},{1.21,-79.9},{6.83,-77.1},{12.5,-70.6},{18.1,-60.6},{24.5,-45.7},{32.6,-23},{50.3,31.3},{57.5,50.7},{63.9,64.6},{69.5,73.4},{75.2,78.6},{80,80}}, color={0,0,255}, thickness=0.5),Text(extent={{78,-6},{98,-26}}, lineColor={95,95,95}, textString="u"),Line(points={{-80,-80},{18,-80}}, color={175,175,175}, smooth=Smooth.None)}), Documentation(info="<html>
|
|---|
| 2550 | <p>
|
|---|
| 2551 | This function returns y = cos(u), with -∞ < u < ∞:
|
|---|
| 2552 | </p>
|
|---|
| 2553 |
|
|---|
| 2554 | <p>
|
|---|
| 2555 | <img src=\"../Images/Math/cos.png\">
|
|---|
| 2556 | </p>
|
|---|
| 2557 | </html>"), Library="ModelicaExternalC");
|
|---|
| 2558 | end cos;
|
|---|
| 2559 |
|
|---|
| 2560 | function asin "Inverse sine (-1 <= u <= 1)"
|
|---|
| 2561 | extends baseIcon2;
|
|---|
| 2562 | input Real u;
|
|---|
| 2563 | output SI.Angle y;
|
|---|
| 2564 |
|
|---|
| 2565 | external "C" y=asin(u) ;
|
|---|
| 2566 | annotation(Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={2,2}), graphics={Line(points={{-90,0},{68,0}}, color={192,192,192}),Polygon(points={{90,0},{68,8},{68,-8},{90,0}}, lineColor={192,192,192}, fillColor={192,192,192}, fillPattern=FillPattern.Solid),Line(points={{-80,-80},{-79.2,-72.8},{-77.6,-67.5},{-73.6,-59.4},{-66.3,-49.8},{-53.5,-37.3},{-30.2,-19.7},{37.4,24.8},{57.5,40.8},{68.7,52.7},{75.2,62.2},{77.6,67.5},{80,80}}, color={0,0,0}),Text(extent={{-88,78},{-16,30}}, lineColor={192,192,192}, textString="asin")}), Diagram(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={2,2}), graphics={Text(extent={{-40,-72},{-15,-88}}, textString="-pi/2", lineColor={0,0,255}),Text(extent={{-38,88},{-13,72}}, textString=" pi/2", lineColor={0,0,255}),Text(extent={{68,-9},{88,-29}}, textString="+1", lineColor={0,0,255}),Text(extent={{-90,21},{-70,1}}, textString="-1", lineColor={0,0,255}),Line(points={{-100,0},{84,0}}, color={95,95,95}),Polygon(points={{98,0},{82,6},{82,-6},{98,0}}, lineColor={95,95,95}, fillColor={95,95,95}, fillPattern=FillPattern.Solid),Line(points={{-80,-80},{-79.2,-72.8},{-77.6,-67.5},{-73.6,-59.4},{-66.3,-49.8},{-53.5,-37.3},{-30.2,-19.7},{37.4,24.8},{57.5,40.8},{68.7,52.7},{75.2,62.2},{77.6,67.5},{80,80}}, color={0,0,255}, thickness=0.5),Text(extent={{82,24},{102,4}}, lineColor={95,95,95}, textString="u"),Line(points={{0,80},{86,80}}, color={175,175,175}, smooth=Smooth.None),Line(points={{80,86},{80,-10}}, color={175,175,175}, smooth=Smooth.None)}), Documentation(info="<html>
|
|---|
| 2567 | <p>
|
|---|
| 2568 | This function returns y = asin(u), with -1 ≤ u ≤ +1:
|
|---|
| 2569 | </p>
|
|---|
| 2570 |
|
|---|
| 2571 | <p>
|
|---|
| 2572 | <img src=\"../Images/Math/asin.png\">
|
|---|
| 2573 | </p>
|
|---|
| 2574 | </html>"), Library="ModelicaExternalC");
|
|---|
| 2575 | end asin;
|
|---|
| 2576 |
|
|---|
| 2577 | function atan2 "Four quadrant inverse tangent"
|
|---|
| 2578 | extends baseIcon2;
|
|---|
| 2579 | input Real u1;
|
|---|
| 2580 | input Real u2;
|
|---|
| 2581 | output SI.Angle y;
|
|---|
| 2582 |
|
|---|
| 2583 | external "C" y=atan2(u1,u2) ;
|
|---|
| 2584 | annotation(Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={2,2}), graphics={Line(points={{-90,0},{68,0}}, color={192,192,192}),Polygon(points={{90,0},{68,8},{68,-8},{90,0}}, lineColor={192,192,192}, fillColor={192,192,192}, fillPattern=FillPattern.Solid),Line(points={{0,-80},{8.93,-67.2},{17.1,-59.3},{27.3,-53.6},{42.1,-49.4},{69.9,-45.8},{80,-45.1}}, color={0,0,0}),Line(points={{-80,-34.9},{-46.1,-31.4},{-29.4,-27.1},{-18.3,-21.5},{-10.3,-14.5},{-2.03,-3.17},{7.97,11.6},{15.5,19.4},{24.3,25},{39,30},{62.1,33.5},{80,34.9}}, color={0,0,0}),Line(points={{-80,45.1},{-45.9,48.7},{-29.1,52.9},{-18.1,58.6},{-10.2,65.8},{-1.82,77.2},{0,80}}, color={0,0,0}),Text(extent={{-90,-46},{-18,-94}}, lineColor={192,192,192}, textString="atan2")}), Diagram(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={2,2}), graphics={Line(points={{-100,0},{84,0}}, color={95,95,95}),Polygon(points={{96,0},{80,6},{80,-6},{96,0}}, lineColor={95,95,95}, fillColor={95,95,95}, fillPattern=FillPattern.Solid),Line(points={{0,-80},{8.93,-67.2},{17.1,-59.3},{27.3,-53.6},{42.1,-49.4},{69.9,-45.8},{80,-45.1}}, color={0,0,255}, thickness=0.5),Line(points={{-80,-34.9},{-46.1,-31.4},{-29.4,-27.1},{-18.3,-21.5},{-10.3,-14.5},{-2.03,-3.17},{7.97,11.6},{15.5,19.4},{24.3,25},{39,30},{62.1,33.5},{80,34.9}}, color={0,0,255}, thickness=0.5),Line(points={{-80,45.1},{-45.9,48.7},{-29.1,52.9},{-18.1,58.6},{-10.2,65.8},{-1.82,77.2},{0,80}}, color={0,0,255}, thickness=0.5),Text(extent={{-32,89},{-10,74}}, textString="pi", lineColor={0,0,255}),Text(extent={{-32,-72},{-4,-88}}, textString="-pi", lineColor={0,0,255}),Text(extent={{0,55},{20,42}}, textString="pi/2", lineColor={0,0,255}),Line(points={{0,40},{-8,40}}, color={192,192,192}),Line(points={{0,-40},{-8,-40}}, color={192,192,192}),Text(extent={{0,-23},{20,-42}}, textString="-pi/2", lineColor={0,0,255}),Text(extent={{62,-4},{94,-26}}, lineColor={95,95,95}, textString="u1, u2"),Line(points={{-88,40},{86,40}}, color={175,175,175}, smooth=Smooth.None),Line(points={{-86,-40},{86,-40}}, color={175,175,175}, smooth=Smooth.None)}), Documentation(info="<HTML>
|
|---|
| 2585 | This function returns y = atan2(u1,u2) such that tan(y) = u1/u2 and
|
|---|
| 2586 | y is in the range -pi < y ≤ pi. u2 may be zero, provided
|
|---|
| 2587 | u1 is not zero. Usually u1, u2 is provided in such a form that
|
|---|
| 2588 | u1 = sin(y) and u2 = cos(y):
|
|---|
| 2589 | </p>
|
|---|
| 2590 |
|
|---|
| 2591 | <p>
|
|---|
| 2592 | <img src=\"../Images/Math/atan2.png\">
|
|---|
| 2593 | </p>
|
|---|
| 2594 |
|
|---|
| 2595 | </HTML>
|
|---|
| 2596 | "), Library="ModelicaExternalC");
|
|---|
| 2597 | end atan2;
|
|---|
| 2598 |
|
|---|
| 2599 | function exp "Exponential, base e"
|
|---|
| 2600 | extends baseIcon2;
|
|---|
| 2601 | input Real u;
|
|---|
| 2602 | output Real y;
|
|---|
| 2603 |
|
|---|
| 2604 | external "C" y=exp(u) ;
|
|---|
| 2605 | annotation(Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={2,2}), graphics={Line(points={{-90,-80.3976},{68,-80.3976}}, color={192,192,192}),Polygon(points={{90,-80.3976},{68,-72.3976},{68,-88.3976},{90,-80.3976}}, lineColor={192,192,192}, fillColor={192,192,192}, fillPattern=FillPattern.Solid),Line(points={{-80,-80},{-31,-77.9},{-6.03,-74},{10.9,-68.4},{23.7,-61},{34.2,-51.6},{43,-40.3},{50.3,-27.8},{56.7,-13.5},{62.3,2.23},{67.1,18.6},{72,38.2},{76,57.6},{80,80}}, color={0,0,0}),Text(extent={{-86,50},{-14,2}}, lineColor={192,192,192}, textString="exp")}), Diagram(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={2,2}), graphics={Line(points={{-100,-80.3976},{84,-80.3976}}, color={95,95,95}),Polygon(points={{98,-80.3976},{82,-74.3976},{82,-86.3976},{98,-80.3976}}, lineColor={95,95,95}, fillColor={95,95,95}, fillPattern=FillPattern.Solid),Line(points={{-80,-80},{-31,-77.9},{-6.03,-74},{10.9,-68.4},{23.7,-61},{34.2,-51.6},{43,-40.3},{50.3,-27.8},{56.7,-13.5},{62.3,2.23},{67.1,18.6},{72,38.2},{76,57.6},{80,80}}, color={0,0,255}, thickness=0.5),Text(extent={{-31,72},{-11,88}}, textString="20", lineColor={0,0,255}),Text(extent={{-92,-81},{-72,-101}}, textString="-3", lineColor={0,0,255}),Text(extent={{66,-81},{86,-101}}, textString="3", lineColor={0,0,255}),Text(extent={{2,-69},{22,-89}}, textString="1", lineColor={0,0,255}),Text(extent={{78,-54},{98,-74}}, lineColor={95,95,95}, textString="u"),Line(points={{0,80},{88,80}}, color={175,175,175}, smooth=Smooth.None),Line(points={{80,84},{80,-84}}, color={175,175,175}, smooth=Smooth.None)}), Documentation(info="<html>
|
|---|
| 2606 | <p>
|
|---|
| 2607 | This function returns y = exp(u), with -∞ < u < ∞:
|
|---|
| 2608 | </p>
|
|---|
| 2609 |
|
|---|
| 2610 | <p>
|
|---|
| 2611 | <img src=\"../Images/Math/exp.png\">
|
|---|
| 2612 | </p>
|
|---|
| 2613 | </html>"), Library="ModelicaExternalC");
|
|---|
| 2614 | end exp;
|
|---|
| 2615 |
|
|---|
| 2616 | partial function baseIcon1 "Basic icon for mathematical function with y-axis on left side"
|
|---|
| 2617 | annotation(Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}), graphics={Rectangle(extent={{-100,100},{100,-100}}, lineColor={0,0,0}, fillColor={255,255,255}, fillPattern=FillPattern.Solid),Line(points={{-80,-80},{-80,68}}, color={192,192,192}),Polygon(points={{-80,90},{-88,68},{-72,68},{-80,90}}, lineColor={192,192,192}, fillColor={192,192,192}, fillPattern=FillPattern.Solid),Text(extent={{-150,150},{150,110}}, textString="%name", lineColor={0,0,255})}), Diagram(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}), graphics={Line(points={{-80,80},{-88,80}}, color={95,95,95}),Line(points={{-80,-80},{-88,-80}}, color={95,95,95}),Line(points={{-80,-90},{-80,84}}, color={95,95,95}),Text(extent={{-75,104},{-55,84}}, lineColor={95,95,95}, textString="y"),Polygon(points={{-80,98},{-86,82},{-74,82},{-80,98}}, lineColor={95,95,95}, fillColor={95,95,95}, fillPattern=FillPattern.Solid)}), Documentation(info="<html>
|
|---|
| 2618 | <p>
|
|---|
| 2619 | Icon for a mathematical function, consisting of an y-axis on the left side.
|
|---|
| 2620 | It is expected, that an x-axis is added and a plot of the function.
|
|---|
| 2621 | </p>
|
|---|
| 2622 | </html>"));
|
|---|
| 2623 | end baseIcon1;
|
|---|
| 2624 |
|
|---|
| 2625 | partial function baseIcon2 "Basic icon for mathematical function with y-axis in middle"
|
|---|
| 2626 | annotation(Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}), graphics={Rectangle(extent={{-100,100},{100,-100}}, lineColor={0,0,0}, fillColor={255,255,255}, fillPattern=FillPattern.Solid),Line(points={{0,-80},{0,68}}, color={192,192,192}),Polygon(points={{0,90},{-8,68},{8,68},{0,90}}, lineColor={192,192,192}, fillColor={192,192,192}, fillPattern=FillPattern.Solid),Text(extent={{-150,150},{150,110}}, textString="%name", lineColor={0,0,255})}), Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-100,-100},{100,100}}), graphics={Line(points={{0,80},{-8,80}}, color={95,95,95}),Line(points={{0,-80},{-8,-80}}, color={95,95,95}),Line(points={{0,-90},{0,84}}, color={95,95,95}),Text(extent={{5,104},{25,84}}, lineColor={95,95,95}, textString="y"),Polygon(points={{0,98},{-6,82},{6,82},{0,98}}, lineColor={95,95,95}, fillColor={95,95,95}, fillPattern=FillPattern.Solid)}), Documentation(revisions="<html>
|
|---|
| 2627 | <p>
|
|---|
| 2628 | Icon for a mathematical function, consisting of an y-axis in the middle.
|
|---|
| 2629 | It is expected, that an x-axis is added and a plot of the function.
|
|---|
| 2630 | </p>
|
|---|
| 2631 | </html>"));
|
|---|
| 2632 | end baseIcon2;
|
|---|
| 2633 |
|
|---|
| 2634 | annotation(Invisible=true, Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}), graphics={Text(extent={{-59,-9},{42,-56}}, lineColor={0,0,0}, textString="f(x)")}), Documentation(info="<HTML>
|
|---|
| 2635 | <p>
|
|---|
| 2636 | This package contains <b>basic mathematical functions</b> (such as sin(..)),
|
|---|
| 2637 | as well as functions operating on <b>vectors</b> and <b>matrices</b>.
|
|---|
| 2638 | </p>
|
|---|
| 2639 |
|
|---|
| 2640 | <dl>
|
|---|
| 2641 | <dt><b>Main Author:</b>
|
|---|
| 2642 | <dd><a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a><br>
|
|---|
| 2643 | Deutsches Zentrum für Luft und Raumfahrt e.V. (DLR)<br>
|
|---|
| 2644 | Institut für Robotik und Mechatronik<br>
|
|---|
| 2645 | Postfach 1116<br>
|
|---|
| 2646 | D-82230 Wessling<br>
|
|---|
| 2647 | Germany<br>
|
|---|
| 2648 | email: <A HREF=\"mailto:Martin.Otter@dlr.de\">Martin.Otter@dlr.de</A><br>
|
|---|
| 2649 | </dl>
|
|---|
| 2650 |
|
|---|
| 2651 | <p>
|
|---|
| 2652 | Copyright © 1998-2009, Modelica Association and DLR.
|
|---|
| 2653 | </p>
|
|---|
| 2654 | <p>
|
|---|
| 2655 | <i>This Modelica package is <b>free</b> software; it can be redistributed and/or modified
|
|---|
| 2656 | under the terms of the <b>Modelica license</b>, see the license conditions
|
|---|
| 2657 | and the accompanying <b>disclaimer</b>
|
|---|
| 2658 | <a href=\"Modelica://Modelica.UsersGuide.ModelicaLicense2\">here</a>.</i>
|
|---|
| 2659 | </p><br>
|
|---|
| 2660 | </HTML>
|
|---|
| 2661 | ", revisions="<html>
|
|---|
| 2662 | <ul>
|
|---|
| 2663 | <li><i>October 21, 2002</i>
|
|---|
| 2664 | by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a>
|
|---|
| 2665 | and <a href=\"http://www.robotic.dlr.de/Christian.Schweiger/\">Christian Schweiger</a>:<br>
|
|---|
| 2666 | Function tempInterpol2 added.</li>
|
|---|
| 2667 | <li><i>Oct. 24, 1999</i>
|
|---|
| 2668 | by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a>:<br>
|
|---|
| 2669 | Icons for icon and diagram level introduced.</li>
|
|---|
| 2670 | <li><i>June 30, 1999</i>
|
|---|
| 2671 | by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a>:<br>
|
|---|
| 2672 | Realized.</li>
|
|---|
| 2673 | </ul>
|
|---|
| 2674 |
|
|---|
| 2675 | </html>"));
|
|---|
| 2676 | end Math;
|
|---|
| 2677 |
|
|---|
| 2678 | package Blocks "Library of basic input/output control blocks (continuous, discrete, logical, table blocks)"
|
|---|
| 2679 | import SI = Modelica.SIunits;
|
|---|
| 2680 | extends Modelica.Icons.Library2;
|
|---|
| 2681 | annotation(Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}), graphics={Rectangle(extent={{-32,-6},{16,-35}}, lineColor={0,0,0}),Rectangle(extent={{-32,-56},{16,-85}}, lineColor={0,0,0}),Line(points={{16,-20},{49,-20},{49,-71},{16,-71}}, color={0,0,0}),Line(points={{-32,-72},{-64,-72},{-64,-21},{-32,-21}}, color={0,0,0}),Polygon(points={{16,-71},{29,-67},{29,-74},{16,-71}}, lineColor={0,0,0}, fillColor={0,0,0}, fillPattern=FillPattern.Solid),Polygon(points={{-32,-21},{-46,-17},{-46,-25},{-32,-21}}, lineColor={0,0,0}, fillColor={0,0,0}, fillPattern=FillPattern.Solid)}), Documentation(info="<html>
|
|---|
| 2682 | <p>
|
|---|
| 2683 | This library contains input/output blocks to build up block diagrams.
|
|---|
| 2684 | </p>
|
|---|
| 2685 |
|
|---|
| 2686 | <dl>
|
|---|
| 2687 | <dt><b>Main Author:</b>
|
|---|
| 2688 | <dd><a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a><br>
|
|---|
| 2689 | Deutsches Zentrum für Luft und Raumfahrt e. V. (DLR)<br>
|
|---|
| 2690 | Oberpfaffenhofen<br>
|
|---|
| 2691 | Postfach 1116<br>
|
|---|
| 2692 | D-82230 Wessling<br>
|
|---|
| 2693 | email: <A HREF=\"mailto:Martin.Otter@dlr.de\">Martin.Otter@dlr.de</A><br>
|
|---|
| 2694 | </dl>
|
|---|
| 2695 | <p>
|
|---|
| 2696 | Copyright © 1998-2009, Modelica Association and DLR.
|
|---|
| 2697 | </p>
|
|---|
| 2698 | <p>
|
|---|
| 2699 | <i>This Modelica package is <b>free</b> software; it can be redistributed and/or modified
|
|---|
| 2700 | under the terms of the <b>Modelica license</b>, see the license conditions
|
|---|
| 2701 | and the accompanying <b>disclaimer</b>
|
|---|
| 2702 | <a href=\"Modelica://Modelica.UsersGuide.ModelicaLicense2\">here</a>.</i>
|
|---|
| 2703 | </p>
|
|---|
| 2704 | </HTML>
|
|---|
| 2705 | ", revisions="<html>
|
|---|
| 2706 | <ul>
|
|---|
| 2707 | <li><i>June 23, 2004</i>
|
|---|
| 2708 | by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a>:<br>
|
|---|
| 2709 | Introduced new block connectors and adapated all blocks to the new connectors.
|
|---|
| 2710 | Included subpackages Continuous, Discrete, Logical, Nonlinear from
|
|---|
| 2711 | package ModelicaAdditions.Blocks.
|
|---|
| 2712 | Included subpackage ModelicaAdditions.Table in Modelica.Blocks.Sources
|
|---|
| 2713 | and in the new package Modelica.Blocks.Tables.
|
|---|
| 2714 | Added new blocks to Blocks.Sources and Blocks.Logical.
|
|---|
| 2715 | </li>
|
|---|
| 2716 | <li><i>October 21, 2002</i>
|
|---|
| 2717 | by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a>
|
|---|
| 2718 | and <a href=\"http://www.robotic.dlr.de/Christian.Schweiger/\">Christian Schweiger</a>:<br>
|
|---|
| 2719 | New subpackage Examples, additional components.
|
|---|
| 2720 | </li>
|
|---|
| 2721 | <li><i>June 20, 2000</i>
|
|---|
| 2722 | by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a> and
|
|---|
| 2723 | Michael Tiller:<br>
|
|---|
| 2724 | Introduced a replaceable signal type into
|
|---|
| 2725 | Blocks.Interfaces.RealInput/RealOutput:
|
|---|
| 2726 | <pre>
|
|---|
| 2727 | replaceable type SignalType = Real
|
|---|
| 2728 | </pre>
|
|---|
| 2729 | in order that the type of the signal of an input/output block
|
|---|
| 2730 | can be changed to a physical type, for example:
|
|---|
| 2731 | <pre>
|
|---|
| 2732 | Sine sin1(outPort(redeclare type SignalType=Modelica.SIunits.Torque))
|
|---|
| 2733 | </pre>
|
|---|
| 2734 | </li>
|
|---|
| 2735 | <li><i>Sept. 18, 1999</i>
|
|---|
| 2736 | by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a>:<br>
|
|---|
| 2737 | Renamed to Blocks. New subpackages Math, Nonlinear.
|
|---|
| 2738 | Additional components in subpackages Interfaces, Continuous
|
|---|
| 2739 | and Sources. </li>
|
|---|
| 2740 | <li><i>June 30, 1999</i>
|
|---|
| 2741 | by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a>:<br>
|
|---|
| 2742 | Realized a first version, based on an existing Dymola library
|
|---|
| 2743 | of Dieter Moormann and Hilding Elmqvist.</li>
|
|---|
| 2744 | </ul>
|
|---|
| 2745 | </html>"));
|
|---|
| 2746 | package Math "Library of mathematical functions as input/output blocks"
|
|---|
| 2747 | import Modelica.SIunits;
|
|---|
| 2748 | import Modelica.Blocks.Interfaces;
|
|---|
| 2749 | extends Modelica.Icons.Library;
|
|---|
| 2750 | block Add "Output the sum of the two inputs"
|
|---|
| 2751 | extends Interfaces.SI2SO;
|
|---|
| 2752 | parameter Real k1=+1 "Gain of upper input";
|
|---|
| 2753 | parameter Real k2=+1 "Gain of lower input";
|
|---|
| 2754 | equation
|
|---|
| 2755 | y=k1*u1 + k2*u2;
|
|---|
| 2756 | annotation(Documentation(info="
|
|---|
| 2757 | <HTML>
|
|---|
| 2758 | <p>
|
|---|
| 2759 | This blocks computes output <b>y</b> as <i>sum</i> of the
|
|---|
| 2760 | two input signals <b>u1</b> and <b>u2</b>:
|
|---|
| 2761 | </p>
|
|---|
| 2762 | <pre>
|
|---|
| 2763 | <b>y</b> = k1*<b>u1</b> + k2*<b>u2</b>;
|
|---|
| 2764 | </pre>
|
|---|
| 2765 | <p>
|
|---|
| 2766 | Example:
|
|---|
| 2767 | </p>
|
|---|
| 2768 | <pre>
|
|---|
| 2769 | parameter: k1= +2, k2= -3
|
|---|
| 2770 |
|
|---|
| 2771 | results in the following equations:
|
|---|
| 2772 |
|
|---|
| 2773 | y = 2 * u1 - 3 * u2
|
|---|
| 2774 | </pre>
|
|---|
| 2775 |
|
|---|
| 2776 | </HTML>
|
|---|
| 2777 | "), Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={2,2}), graphics={Text(extent={{-98,-52},{7,-92}}, lineColor={0,0,0}, textString="%k2"),Text(extent={{-100,90},{5,50}}, lineColor={0,0,0}, textString="%k1"),Text(extent={{-150,150},{150,110}}, textString="%name", lineColor={0,0,255}),Line(points={{-100,60},{-40,60},{-30,40}}, color={0,0,255}),Ellipse(extent={{-50,50},{50,-50}}, lineColor={0,0,255}),Line(points={{-100,-60},{-40,-60},{-30,-40}}, color={0,0,255}),Line(points={{-15,-25.99},{15,25.99}}, color={0,0,0}),Rectangle(extent={{-100,-100},{100,100}}, lineColor={0,0,127}, fillColor={255,255,255}, fillPattern=FillPattern.Solid),Line(points={{50,0},{100,0}}, color={0,0,255}),Line(points={{-100,60},{-74,24},{-44,24}}, color={0,0,127}),Line(points={{-100,-60},{-74,-28},{-42,-28}}, color={0,0,127}),Ellipse(extent={{-50,50},{50,-50}}, lineColor={0,0,127}),Line(points={{50,0},{100,0}}, color={0,0,127}),Text(extent={{-38,34},{38,-34}}, lineColor={0,0,0}, textString="+"),Text(extent={{-100,52},{5,92}}, lineColor={0,0,0}, textString="%k1"),Text(extent={{-100,-52},{5,-92}}, lineColor={0,0,0}, textString="%k2")}), Diagram(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={2,2}), graphics={Rectangle(extent={{-100,-100},{100,100}}, lineColor={0,0,255}, fillColor={255,255,255}, fillPattern=FillPattern.Solid),Text(extent={{-98,-52},{7,-92}}, lineColor={0,0,0}, textString="%k2"),Text(extent={{-100,90},{5,50}}, lineColor={0,0,0}, textString="%k1"),Line(points={{-100,60},{-40,60},{-30,40}}, color={0,0,255}),Ellipse(extent={{-50,50},{50,-50}}, lineColor={0,0,255}),Line(points={{-100,-60},{-40,-60},{-30,-40}}, color={0,0,255}),Line(points={{-15,-25.99},{15,25.99}}, color={0,0,0}),Rectangle(extent={{-100,-100},{100,100}}, lineColor={0,0,127}, fillColor={255,255,255}, fillPattern=FillPattern.Solid),Line(points={{50,0},{100,0}}, color={0,0,255}),Line(points={{-100,60},{-74,24},{-44,24}}, color={0,0,127}),Line(points={{-100,-60},{-74,-28},{-42,-28}}, color={0,0,127}),Ellipse(extent={{-50,50},{50,-50}}, lineColor={0,0,127}),Line(points={{50,0},{100,0}}, color={0,0,127}),Text(extent={{-38,34},{38,-34}}, lineColor={0,0,0}, textString="+"),Text(extent={{-100,52},{5,92}}, lineColor={0,0,0}, textString="k1"),Text(extent={{-100,-52},{5,-92}}, lineColor={0,0,0}, textString="k2")}));
|
|---|
| 2778 | end Add;
|
|---|
| 2779 |
|
|---|
| 2780 | annotation(Documentation(info="
|
|---|
| 2781 | <HTML>
|
|---|
| 2782 | <p>
|
|---|
| 2783 | This package contains basic <b>mathematical operations</b>,
|
|---|
| 2784 | such as summation and multiplication, and basic <b>mathematical
|
|---|
| 2785 | functions</b>, such as <b>sqrt</b> and <b>sin</b>, as
|
|---|
| 2786 | input/output blocks. All blocks of this library can be either
|
|---|
| 2787 | connected with continuous blocks or with sampled-data blocks.
|
|---|
| 2788 | </p>
|
|---|
| 2789 | </HTML>
|
|---|
| 2790 | ", revisions="<html>
|
|---|
| 2791 | <ul>
|
|---|
| 2792 | <li><i>October 21, 2002</i>
|
|---|
| 2793 | by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a>
|
|---|
| 2794 | and <a href=\"http://www.robotic.dlr.de/Christian.Schweiger/\">Christian Schweiger</a>:<br>
|
|---|
| 2795 | New blocks added: RealToInteger, IntegerToReal, Max, Min, Edge, BooleanChange, IntegerChange.</li>
|
|---|
| 2796 | <li><i>August 7, 1999</i>
|
|---|
| 2797 | by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a>:<br>
|
|---|
| 2798 | Realized (partly based on an existing Dymola library
|
|---|
| 2799 | of Dieter Moormann and Hilding Elmqvist).
|
|---|
| 2800 | </li>
|
|---|
| 2801 | </ul>
|
|---|
| 2802 | </html>"));
|
|---|
| 2803 | end Math;
|
|---|
| 2804 |
|
|---|
| 2805 | package Interfaces "Library of connectors and partial models for input/output blocks"
|
|---|
| 2806 | import Modelica.SIunits;
|
|---|
| 2807 | extends Modelica.Icons.Library;
|
|---|
| 2808 | connector RealInput= input Real "'input Real' as connector" annotation(defaultComponentName="u", Icon(graphics={Polygon(points={{-100,100},{100,0},{-100,-100},{-100,100}}, lineColor={0,0,127}, fillColor={0,0,127}, fillPattern=FillPattern.Solid)}, coordinateSystem(extent={{-100,-100},{100,100}}, preserveAspectRatio=true, initialScale=0.2)), Diagram(coordinateSystem(preserveAspectRatio=true, initialScale=0.2, extent={{-100,-100},{100,100}}, grid={1,1}), graphics={Polygon(points={{0,50},{100,0},{0,-50},{0,50}}, lineColor={0,0,127}, fillColor={0,0,127}, fillPattern=FillPattern.Solid),Text(extent={{-10,85},{-10,60}}, lineColor={0,0,127}, textString="%name")}), Documentation(info="<html>
|
|---|
| 2809 | <p>
|
|---|
| 2810 | Connector with one input signal of type Real.
|
|---|
| 2811 | </p>
|
|---|
| 2812 | </html>"));
|
|---|
| 2813 | connector RealOutput= output Real "'output Real' as connector" annotation(defaultComponentName="y", Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={1,1}), graphics={Polygon(points={{-100,100},{100,0},{-100,-100},{-100,100}}, lineColor={0,0,127}, fillColor={255,255,255}, fillPattern=FillPattern.Solid)}), Diagram(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={1,1}), graphics={Polygon(points={{-100,50},{0,0},{-100,-50},{-100,50}}, lineColor={0,0,127}, fillColor={255,255,255}, fillPattern=FillPattern.Solid),Text(extent={{30,110},{30,60}}, lineColor={0,0,127}, textString="%name")}), Documentation(info="<html>
|
|---|
| 2814 | <p>
|
|---|
| 2815 | Connector with one output signal of type Real.
|
|---|
| 2816 | </p>
|
|---|
| 2817 | </html>"));
|
|---|
| 2818 | partial block BlockIcon "Basic graphical layout of input/output block"
|
|---|
| 2819 | annotation(Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}), graphics={Rectangle(extent={{-100,-100},{100,100}}, lineColor={0,0,127}, fillColor={255,255,255}, fillPattern=FillPattern.Solid),Text(extent={{-150,150},{150,110}}, textString="%name", lineColor={0,0,255})}), Documentation(info="<html>
|
|---|
| 2820 | <p>
|
|---|
| 2821 | Block that has only the basic icon for an input/output
|
|---|
| 2822 | block (no declarations, no equations). Most blocks
|
|---|
| 2823 | of package Modelica.Blocks inherit directly or indirectly
|
|---|
| 2824 | from this block.
|
|---|
| 2825 | </p>
|
|---|
| 2826 | </html>"));
|
|---|
| 2827 | end BlockIcon;
|
|---|
| 2828 |
|
|---|
| 2829 | partial block SI2SO "2 Single Input / 1 Single Output continuous control block"
|
|---|
| 2830 | extends BlockIcon;
|
|---|
| 2831 | RealInput u1 "Connector of Real input signal 1" annotation(Placement(transformation(extent={{-140,40},{-100,80}}, rotation=0)));
|
|---|
| 2832 | RealInput u2 "Connector of Real input signal 2" annotation(Placement(transformation(extent={{-140,-80},{-100,-40}}, rotation=0)));
|
|---|
| 2833 | RealOutput y "Connector of Real output signal" annotation(Placement(transformation(extent={{100,-10},{120,10}}, rotation=0)));
|
|---|
| 2834 | annotation(Documentation(info="<html>
|
|---|
| 2835 | <p>
|
|---|
| 2836 | Block has two continuous Real input signals u1 and u2 and one
|
|---|
| 2837 | continuous Real output signal y.
|
|---|
| 2838 | </p>
|
|---|
| 2839 | </html>"), Diagram(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={2,2}), graphics));
|
|---|
| 2840 | end SI2SO;
|
|---|
| 2841 |
|
|---|
| 2842 | annotation(Documentation(info="<HTML>
|
|---|
| 2843 | <p>
|
|---|
| 2844 | This package contains interface definitions for
|
|---|
| 2845 | <b>continuous</b> input/output blocks with Real,
|
|---|
| 2846 | Integer and Boolean signals. Furthermore, it contains
|
|---|
| 2847 | partial models for continuous and discrete blocks.
|
|---|
| 2848 | </p>
|
|---|
| 2849 |
|
|---|
| 2850 | </HTML>
|
|---|
| 2851 | ", revisions="<html>
|
|---|
| 2852 | <ul>
|
|---|
| 2853 | <li><i>Oct. 21, 2002</i>
|
|---|
| 2854 | by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a>
|
|---|
| 2855 | and <a href=\"http://www.robotic.dlr.de/Christian.Schweiger/\">Christian Schweiger</a>:<br>
|
|---|
| 2856 | Added several new interfaces. <a href=\"../Documentation/ChangeNotes1.5.html\">Detailed description</a> available.
|
|---|
| 2857 | <li><i>Oct. 24, 1999</i>
|
|---|
| 2858 | by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a>:<br>
|
|---|
| 2859 | RealInputSignal renamed to RealInput. RealOutputSignal renamed to
|
|---|
| 2860 | output RealOutput. GraphBlock renamed to BlockIcon. SISOreal renamed to
|
|---|
| 2861 | SISO. SOreal renamed to SO. I2SOreal renamed to M2SO.
|
|---|
| 2862 | SignalGenerator renamed to SignalSource. Introduced the following
|
|---|
| 2863 | new models: MIMO, MIMOs, SVcontrol, MVcontrol, DiscreteBlockIcon,
|
|---|
| 2864 | DiscreteBlock, DiscreteSISO, DiscreteMIMO, DiscreteMIMOs,
|
|---|
| 2865 | BooleanBlockIcon, BooleanSISO, BooleanSignalSource, MI2BooleanMOs.</li>
|
|---|
| 2866 | <li><i>June 30, 1999</i>
|
|---|
| 2867 | by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a>:<br>
|
|---|
| 2868 | Realized a first version, based on an existing Dymola library
|
|---|
| 2869 | of Dieter Moormann and Hilding Elmqvist.</li>
|
|---|
| 2870 | </ul>
|
|---|
| 2871 | </html>
|
|---|
| 2872 | "));
|
|---|
| 2873 | end Interfaces;
|
|---|
| 2874 |
|
|---|
| 2875 | end Blocks;
|
|---|
| 2876 |
|
|---|
| 2877 | package SIunits "Library of type and unit definitions based on SI units according to ISO 31-1992"
|
|---|
| 2878 | extends Modelica.Icons.Library2;
|
|---|
| 2879 | package Conversions "Conversion functions to/from non SI units and type definitions of non SI units"
|
|---|
| 2880 | extends Modelica.Icons.Library2;
|
|---|
| 2881 | package NonSIunits "Type definitions of non SI units"
|
|---|
| 2882 | extends Modelica.Icons.Library2;
|
|---|
| 2883 | type Temperature_degC= Real(final quantity="ThermodynamicTemperature", final unit="degC") "Absolute temperature in degree Celsius (for relative temperature use SIunits.TemperatureDifference)" annotation(__Dymola_absoluteValue=true);
|
|---|
| 2884 | type Angle_deg= Real(final quantity="Angle", final unit="deg") "Angle in degree";
|
|---|
| 2885 | annotation(Documentation(info="<HTML>
|
|---|
| 2886 | <p>
|
|---|
| 2887 | This package provides predefined types, such as <b>Angle_deg</b> (angle in
|
|---|
| 2888 | degree), <b>AngularVelocity_rpm</b> (angular velocity in revolutions per
|
|---|
| 2889 | minute) or <b>Temperature_degF</b> (temperature in degree Fahrenheit),
|
|---|
| 2890 | which are in common use but are not part of the international standard on
|
|---|
| 2891 | units according to ISO 31-1992 \"General principles concerning quantities,
|
|---|
| 2892 | units and symbols\" and ISO 1000-1992 \"SI units and recommendations for
|
|---|
| 2893 | the use of their multiples and of certain other units\".</p>
|
|---|
| 2894 | <p>If possible, the types in this package should not be used. Use instead
|
|---|
| 2895 | types of package Modelica.SIunits. For more information on units, see also
|
|---|
| 2896 | the book of Francois Cardarelli <b>Scientific Unit Conversion - A
|
|---|
| 2897 | Practical Guide to Metrication</b> (Springer 1997).</p>
|
|---|
| 2898 | <p>Some units, such as <b>Temperature_degC/Temp_C</b> are both defined in
|
|---|
| 2899 | Modelica.SIunits and in Modelica.Conversions.NonSIunits. The reason is that these
|
|---|
| 2900 | definitions have been placed erroneously in Modelica.SIunits although they
|
|---|
| 2901 | are not SIunits. For backward compatibility, these type definitions are
|
|---|
| 2902 | still kept in Modelica.SIunits.</p>
|
|---|
| 2903 | </HTML>
|
|---|
| 2904 | "), Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}), graphics={Text(extent={{-66,-13},{52,-67}}, lineColor={0,0,0}, textString="[km/h]")}));
|
|---|
| 2905 | end NonSIunits;
|
|---|
| 2906 |
|
|---|
| 2907 | function from_deg "Convert from degree to radian"
|
|---|
| 2908 | extends ConversionIcon;
|
|---|
| 2909 | input NonSIunits.Angle_deg degree "degree value";
|
|---|
| 2910 | output Angle radian "radian value";
|
|---|
| 2911 | algorithm
|
|---|
| 2912 | radian:=Modelica.Constants.pi/180.0*degree;
|
|---|
| 2913 | annotation(Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}), graphics={Text(extent={{-20,100},{-100,20}}, lineColor={0,0,0}, textString="deg"),Text(extent={{100,-20},{20,-100}}, lineColor={0,0,0}, textString="rad")}));
|
|---|
| 2914 | end from_deg;
|
|---|
| 2915 |
|
|---|
| 2916 | partial function ConversionIcon "Base icon for conversion functions"
|
|---|
| 2917 | annotation(Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}), graphics={Rectangle(extent={{-100,100},{100,-100}}, lineColor={191,0,0}, fillColor={255,255,255}, fillPattern=FillPattern.Solid),Line(points={{-90,0},{30,0}}, color={191,0,0}),Polygon(points={{90,0},{30,20},{30,-20},{90,0}}, lineColor={191,0,0}, fillColor={191,0,0}, fillPattern=FillPattern.Solid),Text(extent={{-115,155},{115,105}}, textString="%name", lineColor={0,0,255})}));
|
|---|
| 2918 | end ConversionIcon;
|
|---|
| 2919 |
|
|---|
| 2920 | annotation(Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}), graphics={Text(extent={{-33,-7},{-92,-67}}, lineColor={0,0,0}, lineThickness=1, textString="°C"),Text(extent={{82,-7},{22,-67}}, lineColor={0,0,0}, textString="K"),Line(points={{-26,-36},{6,-36}}, color={0,0,0}),Polygon(points={{6,-28},{6,-45},{26,-37},{6,-28}}, pattern=LinePattern.None, fillColor={0,0,0}, fillPattern=FillPattern.Solid, lineColor={0,0,255})}), Documentation(info="<HTML>
|
|---|
| 2921 | <p>This package provides conversion functions from the non SI Units
|
|---|
| 2922 | defined in package Modelica.SIunits.Conversions.NonSIunits to the
|
|---|
| 2923 | corresponding SI Units defined in package Modelica.SIunits and vice
|
|---|
| 2924 | versa. It is recommended to use these functions in the following
|
|---|
| 2925 | way (note, that all functions have one Real input and one Real output
|
|---|
| 2926 | argument):</p>
|
|---|
| 2927 | <pre>
|
|---|
| 2928 | <b>import</b> SI = Modelica.SIunits;
|
|---|
| 2929 | <b>import</b> Modelica.SIunits.Conversions.*;
|
|---|
| 2930 | ...
|
|---|
| 2931 | <b>parameter</b> SI.Temperature T = from_degC(25); // convert 25 degree Celsius to Kelvin
|
|---|
| 2932 | <b>parameter</b> SI.Angle phi = from_deg(180); // convert 180 degree to radian
|
|---|
| 2933 | <b>parameter</b> SI.AngularVelocity w = from_rpm(3600); // convert 3600 revolutions per minutes
|
|---|
| 2934 | // to radian per seconds
|
|---|
| 2935 | </pre>
|
|---|
| 2936 |
|
|---|
| 2937 | </HTML>
|
|---|
| 2938 | "));
|
|---|
| 2939 | end Conversions;
|
|---|
| 2940 |
|
|---|
| 2941 | type Angle= Real(final quantity="Angle", final unit="rad", displayUnit="deg");
|
|---|
| 2942 | type Length= Real(final quantity="Length", final unit="m");
|
|---|
| 2943 | type Position= Length;
|
|---|
| 2944 | type Distance= Length(min=0);
|
|---|
| 2945 | type Diameter= Length(min=0);
|
|---|
| 2946 | type AngularVelocity= Real(final quantity="AngularVelocity", final unit="rad/s");
|
|---|
| 2947 | type AngularAcceleration= Real(final quantity="AngularAcceleration", final unit="rad/s2");
|
|---|
| 2948 | type Velocity= Real(final quantity="Velocity", final unit="m/s");
|
|---|
| 2949 | type Acceleration= Real(final quantity="Acceleration", final unit="m/s2");
|
|---|
| 2950 | type Mass= Real(quantity="Mass", final unit="kg", min=0);
|
|---|
| 2951 | type MomentOfInertia= Real(final quantity="MomentOfInertia", final unit="kg.m2");
|
|---|
| 2952 | type Inertia= MomentOfInertia;
|
|---|
| 2953 | type Force= Real(final quantity="Force", final unit="N");
|
|---|
| 2954 | type Torque= Real(final quantity="Torque", final unit="N.m");
|
|---|
| 2955 | type FaradayConstant= Real(final quantity="FaradayConstant", final unit="C/mol");
|
|---|
| 2956 | annotation(Invisible=true, Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}), graphics={Text(extent={{-63,-13},{45,-67}}, lineColor={0,0,0}, textString="[kg.m2]")}), Documentation(info="<html>
|
|---|
| 2957 | <p>This package provides predefined types, such as <i>Mass</i>,
|
|---|
| 2958 | <i>Angle</i>, <i>Time</i>, based on the international standard
|
|---|
| 2959 | on units, e.g.,
|
|---|
| 2960 | </p>
|
|---|
| 2961 |
|
|---|
| 2962 | <pre> <b>type</b> Angle = Real(<b>final</b> quantity = \"Angle\",
|
|---|
| 2963 | <b>final</b> unit = \"rad\",
|
|---|
| 2964 | displayUnit = \"deg\");
|
|---|
| 2965 | </pre>
|
|---|
| 2966 |
|
|---|
| 2967 | <p>
|
|---|
| 2968 | as well as conversion functions from non SI-units to SI-units
|
|---|
| 2969 | and vice versa in subpackage
|
|---|
| 2970 | <a href=\"Modelica://Modelica.SIunits.Conversions\">Conversions</a>.
|
|---|
| 2971 | </p>
|
|---|
| 2972 |
|
|---|
| 2973 | <p>
|
|---|
| 2974 | For an introduction how units are used in the Modelica standard library
|
|---|
| 2975 | with package SIunits, have a look at:
|
|---|
| 2976 | <a href=\"Modelica://Modelica.SIunits.UsersGuide.HowToUseSIunits\">How to use SIunits</a>.
|
|---|
| 2977 | </p>
|
|---|
| 2978 |
|
|---|
| 2979 | <p>
|
|---|
| 2980 | Copyright © 1998-2009, Modelica Association and DLR.
|
|---|
| 2981 | </p>
|
|---|
| 2982 | <p>
|
|---|
| 2983 | <i>This Modelica package is <b>free</b> software; it can be redistributed and/or modified
|
|---|
| 2984 | under the terms of the <b>Modelica license</b>, see the license conditions
|
|---|
| 2985 | and the accompanying <b>disclaimer</b>
|
|---|
| 2986 | <a href=\"Modelica://Modelica.UsersGuide.ModelicaLicense2\">here</a>.</i>
|
|---|
| 2987 | </p>
|
|---|
| 2988 |
|
|---|
| 2989 | </html>", revisions="<html>
|
|---|
| 2990 | <ul>
|
|---|
| 2991 | <li><i>Dec. 14, 2005</i>
|
|---|
| 2992 | by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a>:<br>
|
|---|
| 2993 | Add User's Guide and removed \"min\" values for Resistance and Conductance.</li>
|
|---|
| 2994 | <li><i>October 21, 2002</i>
|
|---|
| 2995 | by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a>
|
|---|
| 2996 | and <a href=\"http://www.robotic.dlr.de/Christian.Schweiger/\">Christian Schweiger</a>:<br>
|
|---|
| 2997 | Added new package <b>Conversions</b>. Corrected typo <i>Wavelenght</i>.</li>
|
|---|
| 2998 | <li><i>June 6, 2000</i>
|
|---|
| 2999 | by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a>:<br>
|
|---|
| 3000 | Introduced the following new types<br>
|
|---|
| 3001 | type Temperature = ThermodynamicTemperature;<br>
|
|---|
| 3002 | types DerDensityByEnthalpy, DerDensityByPressure,
|
|---|
| 3003 | DerDensityByTemperature, DerEnthalpyByPressure,
|
|---|
| 3004 | DerEnergyByDensity, DerEnergyByPressure<br>
|
|---|
| 3005 | Attribute \"final\" removed from min and max values
|
|---|
| 3006 | in order that these values can still be changed to narrow
|
|---|
| 3007 | the allowed range of values.<br>
|
|---|
| 3008 | Quantity=\"Stress\" removed from type \"Stress\", in order
|
|---|
| 3009 | that a type \"Stress\" can be connected to a type \"Pressure\".</li>
|
|---|
| 3010 | <li><i>Oct. 27, 1999</i>
|
|---|
| 3011 | by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a>:<br>
|
|---|
| 3012 | New types due to electrical library: Transconductance, InversePotential,
|
|---|
| 3013 | Damping.</li>
|
|---|
| 3014 | <li><i>Sept. 18, 1999</i>
|
|---|
| 3015 | by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a>:<br>
|
|---|
| 3016 | Renamed from SIunit to SIunits. Subpackages expanded, i.e., the
|
|---|
| 3017 | SIunits package, does no longer contain subpackages.</li>
|
|---|
| 3018 | <li><i>Aug 12, 1999</i>
|
|---|
| 3019 | by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a>:<br>
|
|---|
| 3020 | Type \"Pressure\" renamed to \"AbsolutePressure\" and introduced a new
|
|---|
| 3021 | type \"Pressure\" which does not contain a minimum of zero in order
|
|---|
| 3022 | to allow convenient handling of relative pressure. Redefined
|
|---|
| 3023 | BulkModulus as an alias to AbsolutePressure instead of Stress, since
|
|---|
| 3024 | needed in hydraulics.</li>
|
|---|
| 3025 | <li><i>June 29, 1999</i>
|
|---|
| 3026 | by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a>:<br>
|
|---|
| 3027 | Bug-fix: Double definition of \"Compressibility\" removed
|
|---|
| 3028 | and appropriate \"extends Heat\" clause introduced in
|
|---|
| 3029 | package SolidStatePhysics to incorporate ThermodynamicTemperature.</li>
|
|---|
| 3030 | <li><i>April 8, 1998</i>
|
|---|
| 3031 | by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a>
|
|---|
| 3032 | and Astrid Jaschinski:<br>
|
|---|
| 3033 | Complete ISO 31 chapters realized.</li>
|
|---|
| 3034 | <li><i>Nov. 15, 1997</i>
|
|---|
| 3035 | by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a>
|
|---|
| 3036 | and <a href=\"http://www.control.lth.se/~hubertus/\">Hubertus Tummescheit</a>:<br>
|
|---|
| 3037 | Some chapters realized.</li>
|
|---|
| 3038 | </ul>
|
|---|
| 3039 | </html>"), Diagram(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}), graphics={Rectangle(extent={{169,86},{349,236}}, fillColor={235,235,235}, fillPattern=FillPattern.Solid, lineColor={0,0,255}),Polygon(points={{169,236},{189,256},{369,256},{349,236},{169,236}}, fillColor={235,235,235}, fillPattern=FillPattern.Solid, lineColor={0,0,255}),Polygon(points={{369,256},{369,106},{349,86},{349,236},{369,256}}, fillColor={235,235,235}, fillPattern=FillPattern.Solid, lineColor={0,0,255}),Text(extent={{179,226},{339,196}}, lineColor={160,160,164}, textString="Library"),Text(extent={{206,173},{314,119}}, lineColor={0,0,0}, textString="[kg.m2]"),Text(extent={{163,320},{406,264}}, lineColor={255,0,0}, textString="Modelica.SIunits")}));
|
|---|
| 3040 | end SIunits;
|
|---|
| 3041 |
|
|---|
| 3042 | package Icons "Library of icons"
|
|---|
| 3043 | partial package Library "Icon for library"
|
|---|
| 3044 | annotation(Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={1,1}), graphics={Rectangle(extent={{-100,-100},{80,50}}, fillColor={235,235,235}, fillPattern=FillPattern.Solid, lineColor={0,0,255}),Polygon(points={{-100,50},{-80,70},{100,70},{80,50},{-100,50}}, fillColor={235,235,235}, fillPattern=FillPattern.Solid, lineColor={0,0,255}),Polygon(points={{100,70},{100,-80},{80,-100},{80,50},{100,70}}, fillColor={235,235,235}, fillPattern=FillPattern.Solid, lineColor={0,0,255}),Text(extent={{-85,35},{65,-85}}, lineColor={0,0,255}, textString="Library"),Text(extent={{-120,122},{120,73}}, lineColor={255,0,0}, textString="%name")}), Documentation(info="<html>
|
|---|
| 3045 | <p>
|
|---|
| 3046 | This icon is designed for a <b>library</b>.
|
|---|
| 3047 | </p>
|
|---|
| 3048 | </html>"));
|
|---|
| 3049 | end Library;
|
|---|
| 3050 |
|
|---|
| 3051 | partial package Library2 "Icon for library where additional icon elements shall be added"
|
|---|
| 3052 | annotation(Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={1,1}), graphics={Rectangle(extent={{-100,-100},{80,50}}, fillColor={235,235,235}, fillPattern=FillPattern.Solid, lineColor={0,0,255}),Polygon(points={{-100,50},{-80,70},{100,70},{80,50},{-100,50}}, fillColor={235,235,235}, fillPattern=FillPattern.Solid, lineColor={0,0,255}),Polygon(points={{100,70},{100,-80},{80,-100},{80,50},{100,70}}, fillColor={235,235,235}, fillPattern=FillPattern.Solid, lineColor={0,0,255}),Text(extent={{-120,125},{120,70}}, lineColor={255,0,0}, textString="%name"),Text(extent={{-90,40},{70,10}}, lineColor={160,160,164}, textString="Library")}), Documentation(info="<html>
|
|---|
| 3053 | <p>
|
|---|
| 3054 | This icon is designed for a <b>package</b> where a package
|
|---|
| 3055 | specific graphic is additionally included in the icon.
|
|---|
| 3056 | </p>
|
|---|
| 3057 | </html>"));
|
|---|
| 3058 | end Library2;
|
|---|
| 3059 |
|
|---|
| 3060 | partial model Example "Icon for an example model"
|
|---|
| 3061 | annotation(Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={1,1}), graphics={Rectangle(extent={{-100,-100},{80,50}}, fillColor={255,255,255}, fillPattern=FillPattern.Solid, lineColor={0,0,255}),Polygon(points={{-100,50},{-80,70},{100,70},{80,50},{-100,50}}, fillColor={255,255,255}, fillPattern=FillPattern.Solid, lineColor={0,0,255}),Polygon(points={{100,70},{100,-80},{80,-100},{80,50},{100,70}}, fillColor={255,255,255}, fillPattern=FillPattern.Solid, lineColor={0,0,255}),Text(extent={{-96,3},{77,-49}}, lineColor={0,0,255}, textString="Example"),Text(extent={{-120,132},{120,73}}, lineColor={255,0,0}, textString="%name")}), Documentation(info="<html>
|
|---|
| 3062 | <p>
|
|---|
| 3063 | This icon is designed for an <b>Example package</b>,
|
|---|
| 3064 | i.e. a package containing executable demo models.
|
|---|
| 3065 | </p>
|
|---|
| 3066 | </html>"));
|
|---|
| 3067 | end Example;
|
|---|
| 3068 |
|
|---|
| 3069 | partial function Function "Icon for a function"
|
|---|
| 3070 | annotation(Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}), graphics={Text(extent={{-140,162},{136,102}}, textString="%name", lineColor={0,0,255}),Ellipse(extent={{-100,100},{100,-100}}, lineColor={255,127,0}, fillColor={255,255,255}, fillPattern=FillPattern.Solid),Text(extent={{-100,100},{100,-100}}, lineColor={255,127,0}, textString="f")}), Documentation(info="<html>
|
|---|
| 3071 | <p>
|
|---|
| 3072 | This icon is designed for a <b>function</b>
|
|---|
| 3073 | </p>
|
|---|
| 3074 | </html>"));
|
|---|
| 3075 | end Function;
|
|---|
| 3076 |
|
|---|
| 3077 | partial record Record "Icon for a record"
|
|---|
| 3078 | annotation(Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}), graphics={Rectangle(extent={{-100,50},{100,-100}}, fillColor={255,255,127}, fillPattern=FillPattern.Solid, lineColor={0,0,255}),Text(extent={{-127,115},{127,55}}, textString="%name", lineColor={0,0,255}),Line(points={{-100,-50},{100,-50}}, color={0,0,0}),Line(points={{-100,0},{100,0}}, color={0,0,0}),Line(points={{0,50},{0,-100}}, color={0,0,0})}), Documentation(info="<html>
|
|---|
| 3079 | <p>
|
|---|
| 3080 | This icon is designed for a <b>record</b>
|
|---|
| 3081 | </p>
|
|---|
| 3082 | </html>"));
|
|---|
| 3083 | end Record;
|
|---|
| 3084 |
|
|---|
| 3085 | type TypeReal "Icon for a Real type"
|
|---|
| 3086 | extends Real;
|
|---|
| 3087 | annotation(Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}), graphics={Rectangle(extent={{-100,100},{100,-100}}, lineColor={0,0,0}, fillColor={181,181,181}, fillPattern=FillPattern.Solid),Text(extent={{-94,94},{94,-94}}, lineColor={0,0,0}, textString="R")}), Documentation(info="<html>
|
|---|
| 3088 | <p>
|
|---|
| 3089 | This icon is designed for a <b>Real</b> type.
|
|---|
| 3090 | </p>
|
|---|
| 3091 | </html>"));
|
|---|
| 3092 | end TypeReal;
|
|---|
| 3093 |
|
|---|
| 3094 | type TypeInteger "Icon for an Integer type"
|
|---|
| 3095 | extends Integer;
|
|---|
| 3096 | annotation(Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}), graphics={Rectangle(extent={{-100,100},{100,-100}}, lineColor={0,0,0}, fillColor={181,181,181}, fillPattern=FillPattern.Solid),Text(extent={{-94,94},{94,-94}}, lineColor={0,0,0}, textString="I")}), Documentation(info="<html>
|
|---|
| 3097 | <p>
|
|---|
| 3098 | This icon is designed for an <b>Integer</b> type.
|
|---|
| 3099 | </p>
|
|---|
| 3100 | </html>"));
|
|---|
| 3101 | end TypeInteger;
|
|---|
| 3102 |
|
|---|
| 3103 | type TypeString "Icon for a String type"
|
|---|
| 3104 | extends String;
|
|---|
| 3105 | annotation(Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}), graphics={Rectangle(extent={{-100,100},{100,-100}}, lineColor={0,0,0}, fillColor={181,181,181}, fillPattern=FillPattern.Solid),Text(extent={{-94,94},{94,-94}}, lineColor={0,0,0}, textString="S")}), Documentation(info="<html>
|
|---|
| 3106 | <p>
|
|---|
| 3107 | This icon is designed for a <b>String</b> type.
|
|---|
| 3108 | </p>
|
|---|
| 3109 | </html>"));
|
|---|
| 3110 | end TypeString;
|
|---|
| 3111 |
|
|---|
| 3112 | partial model RotationalSensor "Icon representing rotational measurement device"
|
|---|
| 3113 | annotation(Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={1,1}), graphics={Ellipse(extent={{-70,70},{70,-70}}, lineColor={0,0,0}, fillColor={255,255,255}, fillPattern=FillPattern.Solid),Line(points={{0,70},{0,40}}, color={0,0,0}),Line(points={{22.9,32.8},{40.2,57.3}}, color={0,0,0}),Line(points={{-22.9,32.8},{-40.2,57.3}}, color={0,0,0}),Line(points={{37.6,13.7},{65.8,23.9}}, color={0,0,0}),Line(points={{-37.6,13.7},{-65.8,23.9}}, color={0,0,0}),Line(points={{0,0},{9.02,28.6}}, color={0,0,0}),Polygon(points={{-0.48,31.6},{18,26},{18,57.2},{-0.48,31.6}}, lineColor={0,0,0}, fillColor={0,0,0}, fillPattern=FillPattern.Solid),Ellipse(extent={{-5,5},{5,-5}}, lineColor={0,0,0}, fillColor={0,0,0}, fillPattern=FillPattern.Solid)}), Diagram(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={1,1}), graphics), Documentation(info="<html>
|
|---|
| 3114 | <p>
|
|---|
| 3115 | This icon is designed for a <b>rotational sensor</b> model.
|
|---|
| 3116 | </p>
|
|---|
| 3117 | </html>"));
|
|---|
| 3118 | end RotationalSensor;
|
|---|
| 3119 |
|
|---|
| 3120 | annotation(Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}), graphics={Rectangle(extent={{-100,-100},{80,50}}, fillColor={235,235,235}, fillPattern=FillPattern.Solid, lineColor={0,0,255}),Polygon(points={{-100,50},{-80,70},{100,70},{80,50},{-100,50}}, fillColor={235,235,235}, fillPattern=FillPattern.Solid, lineColor={0,0,255}),Polygon(points={{100,70},{100,-80},{80,-100},{80,50},{100,70}}, fillColor={235,235,235}, fillPattern=FillPattern.Solid, lineColor={0,0,255}),Text(extent={{-120,135},{120,70}}, lineColor={255,0,0}, textString="%name"),Text(extent={{-90,40},{70,10}}, lineColor={160,160,164}, textString="Library"),Rectangle(extent={{-100,-100},{80,50}}, fillColor={235,235,235}, fillPattern=FillPattern.Solid, lineColor={0,0,255}),Polygon(points={{-100,50},{-80,70},{100,70},{80,50},{-100,50}}, fillColor={235,235,235}, fillPattern=FillPattern.Solid, lineColor={0,0,255}),Polygon(points={{100,70},{100,-80},{80,-100},{80,50},{100,70}}, fillColor={235,235,235}, fillPattern=FillPattern.Solid, lineColor={0,0,255}),Text(extent={{-90,40},{70,10}}, lineColor={160,160,164}, textString="Library"),Polygon(points={{-64,-20},{-50,-4},{50,-4},{36,-20},{-64,-20},{-64,-20}}, lineColor={0,0,0}, fillColor={192,192,192}, fillPattern=FillPattern.Solid),Rectangle(extent={{-64,-20},{36,-84}}, lineColor={0,0,0}, fillColor={192,192,192}, fillPattern=FillPattern.Solid),Text(extent={{-60,-24},{32,-38}}, lineColor={128,128,128}, textString="Library"),Polygon(points={{50,-4},{50,-70},{36,-84},{36,-20},{50,-4}}, lineColor={0,0,0}, fillColor={192,192,192}, fillPattern=FillPattern.Solid)}), Documentation(info="<html>
|
|---|
| 3121 | <p>
|
|---|
| 3122 | This package contains definitions for the graphical layout of
|
|---|
| 3123 | components which may be used in different libraries.
|
|---|
| 3124 | The icons can be utilized by inheriting them in the desired class
|
|---|
| 3125 | using \"extends\" or by directly copying the \"icon\" layer.
|
|---|
| 3126 | </p>
|
|---|
| 3127 |
|
|---|
| 3128 | <dl>
|
|---|
| 3129 | <dt><b>Main Author:</b>
|
|---|
| 3130 | <dd><a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a><br>
|
|---|
| 3131 | Deutsches Zentrum fuer Luft und Raumfahrt e.V. (DLR)<br>
|
|---|
| 3132 | Oberpfaffenhofen<br>
|
|---|
| 3133 | Postfach 1116<br>
|
|---|
| 3134 | D-82230 Wessling<br>
|
|---|
| 3135 | email: <A HREF=\"mailto:Martin.Otter@dlr.de\">Martin.Otter@dlr.de</A><br>
|
|---|
| 3136 | </dl>
|
|---|
| 3137 |
|
|---|
| 3138 | <p>
|
|---|
| 3139 | Copyright © 1998-2009, Modelica Association and DLR.
|
|---|
| 3140 | </p>
|
|---|
| 3141 | <p>
|
|---|
| 3142 | <i>This Modelica package is <b>free</b> software; it can be redistributed and/or modified
|
|---|
| 3143 | under the terms of the <b>Modelica license</b>, see the license conditions
|
|---|
| 3144 | and the accompanying <b>disclaimer</b>
|
|---|
| 3145 | <a href=\"Modelica://Modelica.UsersGuide.ModelicaLicense2\">here</a>.</i>
|
|---|
| 3146 | </p><br>
|
|---|
| 3147 | </HTML>
|
|---|
| 3148 | ", revisions="<html>
|
|---|
| 3149 | <ul>
|
|---|
| 3150 | <li><i>October 21, 2002</i>
|
|---|
| 3151 | by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a>
|
|---|
| 3152 | and <a href=\"http://www.robotic.dlr.de/Christian.Schweiger/\">Christian Schweiger</a>:<br>
|
|---|
| 3153 | Added new icons <b>Function</b>, <b>Enumerations</b> and <b>Record</b>.</li>
|
|---|
| 3154 | <li><i>June 6, 2000</i>
|
|---|
| 3155 | by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a>:<br>
|
|---|
| 3156 | Replaced <b>model</b> keyword by <b>package</b> if the main
|
|---|
| 3157 | usage is for inheriting from a package.<br>
|
|---|
| 3158 | New icons <b>GearIcon</b> and <b>MotorIcon</b>.</li>
|
|---|
| 3159 | <li><i>Sept. 18, 1999</i>
|
|---|
| 3160 | by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a>:<br>
|
|---|
| 3161 | Renaming package Icon to Icons.
|
|---|
| 3162 | Model Advanced removed (icon not accepted on the Modelica meeting).
|
|---|
| 3163 | New model Library2, which is the Library icon with enough place
|
|---|
| 3164 | to add library specific elements in the icon. Icon also used in diagram
|
|---|
| 3165 | level for models Info, TranslationalSensor, RotationalSensor.</li>
|
|---|
| 3166 | <li><i>July 15, 1999</i>
|
|---|
| 3167 | by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a>:<br>
|
|---|
| 3168 | Model Caution renamed to Advanced, model Sensor renamed to
|
|---|
| 3169 | TranslationalSensor, new model RotationalSensor.</li>
|
|---|
| 3170 | <li><i>June 30, 1999</i>
|
|---|
| 3171 | by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a>:<br>
|
|---|
| 3172 | Realized a first version.</li>
|
|---|
| 3173 | </ul>
|
|---|
| 3174 | <br>
|
|---|
| 3175 | </html>"));
|
|---|
| 3176 | end Icons;
|
|---|
| 3177 |
|
|---|
| 3178 | package Constants "Library of mathematical constants and constants of nature (e.g., pi, eps, R, sigma)"
|
|---|
| 3179 | import SI = Modelica.SIunits;
|
|---|
| 3180 | import NonSI = Modelica.SIunits.Conversions.NonSIunits;
|
|---|
| 3181 | extends Modelica.Icons.Library2;
|
|---|
| 3182 | final constant Real e=Modelica.Math.exp(1.0);
|
|---|
| 3183 | final constant Real pi=2*Modelica.Math.asin(1.0);
|
|---|
| 3184 | final constant Real D2R=pi/180 "Degree to Radian";
|
|---|
| 3185 | final constant Real R2D=180/pi "Radian to Degree";
|
|---|
| 3186 | final constant Real eps=1e-15 "Biggest number such that 1.0 + eps = 1.0";
|
|---|
| 3187 | final constant Real small=1e-60 "Smallest number such that small and -small are representable on the machine";
|
|---|
| 3188 | final constant Real inf=1e+60 "Biggest Real number such that inf and -inf are representable on the machine";
|
|---|
| 3189 | final constant Integer Integer_inf=1073741823 "Biggest Integer number such that Integer_inf and -Integer_inf are representable on the machine";
|
|---|
| 3190 | final constant SI.Velocity c=299792458 "Speed of light in vacuum";
|
|---|
| 3191 | final constant SI.Acceleration g_n=9.80665 "Standard acceleration of gravity on earth";
|
|---|
| 3192 | final constant Real G(final unit="m3/(kg.s2)")=6.6742e-11 "Newtonian constant of gravitation";
|
|---|
| 3193 | final constant SI.FaradayConstant F=96485.3399 "Faraday constant, C/mol";
|
|---|
| 3194 | final constant Real h(final unit="J.s")=6.6260693e-34 "Planck constant";
|
|---|
| 3195 | final constant Real k(final unit="J/K")=1.3806505e-23 "Boltzmann constant";
|
|---|
| 3196 | final constant Real R(final unit="J/(mol.K)")=8.314472 "Molar gas constant";
|
|---|
| 3197 | final constant Real sigma(final unit="W/(m2.K4)")=5.6704e-08 "Stefan-Boltzmann constant";
|
|---|
| 3198 | final constant Real N_A(final unit="1/mol")=6.0221415e+23 "Avogadro constant";
|
|---|
| 3199 | final constant Real mue_0(final unit="N/A2")=4*pi*1e-07 "Magnetic constant";
|
|---|
| 3200 | final constant Real epsilon_0(final unit="F/m")=1/(mue_0*c*c) "Electric constant";
|
|---|
| 3201 | final constant NonSI.Temperature_degC T_zero=-273.15 "Absolute zero temperature";
|
|---|
| 3202 | annotation(Documentation(info="<html>
|
|---|
| 3203 | <p>
|
|---|
| 3204 | This package provides often needed constants from mathematics, machine
|
|---|
| 3205 | dependent constants and constants from nature. The latter constants
|
|---|
| 3206 | (name, value, description) are from the following source:
|
|---|
| 3207 | </p>
|
|---|
| 3208 |
|
|---|
| 3209 | <dl>
|
|---|
| 3210 | <dt>Peter J. Mohr and Barry N. Taylor (1999):</dt>
|
|---|
| 3211 | <dd><b>CODATA Recommended Values of the Fundamental Physical Constants: 1998</b>.
|
|---|
| 3212 | Journal of Physical and Chemical Reference Data, Vol. 28, No. 6, 1999 and
|
|---|
| 3213 | Reviews of Modern Physics, Vol. 72, No. 2, 2000. See also <a href=
|
|---|
| 3214 | \"http://physics.nist.gov/cuu/Constants/\">http://physics.nist.gov/cuu/Constants/</a></dd>
|
|---|
| 3215 | </dl>
|
|---|
| 3216 |
|
|---|
| 3217 | <p>CODATA is the Committee on Data for Science and Technology.</p>
|
|---|
| 3218 |
|
|---|
| 3219 | <dl>
|
|---|
| 3220 | <dt><b>Main Author:</b></dt>
|
|---|
| 3221 | <dd><a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a><br>
|
|---|
| 3222 | Deutsches Zentrum für Luft und Raumfahrt e. V. (DLR)<br>
|
|---|
| 3223 | Oberpfaffenhofen<br>
|
|---|
| 3224 | Postfach 11 16<br>
|
|---|
| 3225 | D-82230 Weßling<br>
|
|---|
| 3226 | email: <a href=\"mailto:Martin.Otter@dlr.de\">Martin.Otter@dlr.de</a></dd>
|
|---|
| 3227 | </dl>
|
|---|
| 3228 |
|
|---|
| 3229 |
|
|---|
| 3230 | <p>
|
|---|
| 3231 | Copyright © 1998-2009, Modelica Association and DLR.
|
|---|
| 3232 | </p>
|
|---|
| 3233 | <p>
|
|---|
| 3234 | <i>This Modelica package is <b>free</b> software; it can be redistributed and/or modified
|
|---|
| 3235 | under the terms of the <b>Modelica license</b>, see the license conditions
|
|---|
| 3236 | and the accompanying <b>disclaimer</b>
|
|---|
| 3237 | <a href=\"Modelica://Modelica.UsersGuide.ModelicaLicense2\">here</a>.</i>
|
|---|
| 3238 | </p><br>
|
|---|
| 3239 | </html>
|
|---|
| 3240 | ", revisions="<html>
|
|---|
| 3241 | <ul>
|
|---|
| 3242 | <li><i>Nov 8, 2004</i>
|
|---|
| 3243 | by <a href=\"http://www.robotic.dlr.de/Christian.Schweiger/\">Christian Schweiger</a>:<br>
|
|---|
| 3244 | Constants updated according to 2002 CODATA values.</li>
|
|---|
| 3245 | <li><i>Dec 9, 1999</i>
|
|---|
| 3246 | by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a>:<br>
|
|---|
| 3247 | Constants updated according to 1998 CODATA values. Using names, values
|
|---|
| 3248 | and description text from this source. Included magnetic and
|
|---|
| 3249 | electric constant.</li>
|
|---|
| 3250 | <li><i>Sep 18, 1999</i>
|
|---|
| 3251 | by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a>:<br>
|
|---|
| 3252 | Constants eps, inf, small introduced.</li>
|
|---|
| 3253 | <li><i>Nov 15, 1997</i>
|
|---|
| 3254 | by <a href=\"http://www.robotic.dlr.de/Martin.Otter/\">Martin Otter</a>:<br>
|
|---|
| 3255 | Realized.</li>
|
|---|
| 3256 | </ul>
|
|---|
| 3257 | </html>"), Invisible=true, Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}), graphics={Line(points={{-34,-38},{12,-38}}, color={0,0,0}, thickness=0.5),Line(points={{-20,-38},{-24,-48},{-28,-56},{-34,-64}}, color={0,0,0}, thickness=0.5),Line(points={{-2,-38},{2,-46},{8,-56},{14,-64}}, color={0,0,0}, thickness=0.5)}), Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-100,-100},{100,100}}), graphics={Rectangle(extent={{200,162},{380,312}}, fillColor={235,235,235}, fillPattern=FillPattern.Solid, lineColor={0,0,255}),Polygon(points={{200,312},{220,332},{400,332},{380,312},{200,312}}, fillColor={235,235,235}, fillPattern=FillPattern.Solid, lineColor={0,0,255}),Polygon(points={{400,332},{400,182},{380,162},{380,312},{400,332}}, fillColor={235,235,235}, fillPattern=FillPattern.Solid, lineColor={0,0,255}),Text(extent={{210,302},{370,272}}, lineColor={160,160,164}, textString="Library"),Line(points={{266,224},{312,224}}, color={0,0,0}, thickness=1),Line(points={{280,224},{276,214},{272,206},{266,198}}, color={0,0,0}, thickness=1),Line(points={{298,224},{302,216},{308,206},{314,198}}, color={0,0,0}, thickness=1),Text(extent={{152,412},{458,334}}, lineColor={255,0,0}, textString="Modelica.Constants")}));
|
|---|
| 3258 | end Constants;
|
|---|
| 3259 |
|
|---|
| 3260 | end Modelica;
|
|---|
| 3261 | package ObsoleteModelica3 "Library that contains components from Modelica Standard Library 2.2.2 that have been removed from version 3.0"
|
|---|
| 3262 | annotation(uses(Modelica(version="3.1")), Documentation(info="<html>
|
|---|
| 3263 | <p>
|
|---|
| 3264 | This package contains models and blocks from the Modelica Standard Library
|
|---|
| 3265 | version 2.2.2 that are no longer available in version 3.0.
|
|---|
| 3266 | The conversion script for version 3.0 changes references in existing
|
|---|
| 3267 | user models automatically to the models and blocks of package
|
|---|
| 3268 | ObsoleteModelica3. The user should <b>manually</b> replace all
|
|---|
| 3269 | references to ObsoleteModelica3 in his/her models to the models
|
|---|
| 3270 | that are recommended in the documentation of the respective model.
|
|---|
| 3271 | </p>
|
|---|
| 3272 |
|
|---|
| 3273 | <p>
|
|---|
| 3274 | In most cases, this means that a model with the name
|
|---|
| 3275 | \"ObsoleteModelica3.XXX\" should be renamed to \"Modelica.XXX\" (version 3.0)
|
|---|
| 3276 | and then a manual adaptation is needed. For example, a reference to
|
|---|
| 3277 | ObsoleteModelica3.Mechanics.MultiBody.Sensors.AbsoluteSensor
|
|---|
| 3278 | should be replaced by
|
|---|
| 3279 | Modelica.Mechanics.MultiBody.Sensors.AbsoluteSensor (version 3.0).
|
|---|
| 3280 | Since the design of the component has changed (e.g., several
|
|---|
| 3281 | optional connectors, and no longer one connector where all signals
|
|---|
| 3282 | are packed together), this requires some changes at the place where
|
|---|
| 3283 | the model is used (besides the renaming of the underlying class).
|
|---|
| 3284 | </p>
|
|---|
| 3285 |
|
|---|
| 3286 | <p>
|
|---|
| 3287 | The models in ObsoleteModelica3 are either not according to the Modelica Language
|
|---|
| 3288 | version 3.0 and higher, or the model was changed to get a better design.
|
|---|
| 3289 | In all cases, an automatic conversion to the new implementation
|
|---|
| 3290 | was not feasible, since too complicated.
|
|---|
| 3291 | </p>
|
|---|
| 3292 |
|
|---|
| 3293 | <p>
|
|---|
| 3294 | In order to easily detect obsolete models and blocks, all of them are specially
|
|---|
| 3295 | marked in the icon layer with a red box.
|
|---|
| 3296 | </p>
|
|---|
| 3297 |
|
|---|
| 3298 | <p>
|
|---|
| 3299 | Copyright © 2007-2009, Modelica Association.
|
|---|
| 3300 | </p>
|
|---|
| 3301 | <p>
|
|---|
| 3302 | <i>This Modelica package is <b>free</b> software; it can be redistributed and/or modified
|
|---|
| 3303 | under the terms of the <b>Modelica license</b>, see the license conditions
|
|---|
| 3304 | and the accompanying <b>disclaimer</b>
|
|---|
| 3305 | <a href=\"Modelica://Modelica.UsersGuide.ModelicaLicense2\">here</a>.</i>
|
|---|
| 3306 | </p>
|
|---|
| 3307 |
|
|---|
| 3308 | </html>"));
|
|---|
| 3309 | package Icons "Library of icons"
|
|---|
| 3310 | partial model ObsoleteModel "Icon for an obsolete model (use only for this case)"
|
|---|
| 3311 | annotation(__Dymola_obsolete="Only used to mark an obsolete model. Do not use otherwise.", Icon(coordinateSystem(preserveAspectRatio=false, extent={{-100,-100},{100,100}}), graphics={Rectangle(extent={{-102,102},{102,-102}}, lineColor={255,0,0}, pattern=LinePattern.Dash, lineThickness=0.5)}), Documentation(info="<html>
|
|---|
| 3312 | <p>
|
|---|
| 3313 | This partial model is intended to provide a <u>default icon
|
|---|
| 3314 | for an obsolete model</u> that will be removed from the
|
|---|
| 3315 | corresponding library in a future release.
|
|---|
| 3316 | <p>
|
|---|
| 3317 | </html>"));
|
|---|
| 3318 | end ObsoleteModel;
|
|---|
| 3319 |
|
|---|
| 3320 | end Icons;
|
|---|
| 3321 |
|
|---|
| 3322 | package Mechanics "Library of 1-dim. and 3-dim. mechanical components (multi-body, rotational, translational)"
|
|---|
| 3323 | package MultiBody "Library to model 3-dimensional mechanical systems"
|
|---|
| 3324 | package Interfaces "Connectors and partial models for 3-dim. mechanical components"
|
|---|
| 3325 | partial model PartialCutForceSensor "Obsolete model. Use instead instead a model from Modelica.Mechanics.MultiBody.Sensors"
|
|---|
| 3326 | extends Modelica.Icons.RotationalSensor;
|
|---|
| 3327 | extends ObsoleteModelica3.Icons.ObsoleteModel;
|
|---|
| 3328 | Modelica.Mechanics.MultiBody.Interfaces.Frame_a frame_a "Coordinate system with one cut-force and cut-torque" annotation(Placement(transformation(extent={{-116,-16},{-84,16}}, rotation=0)));
|
|---|
| 3329 | Modelica.Mechanics.MultiBody.Interfaces.Frame_b frame_b "Coordinate system with one cut-force and cut-torque" annotation(Placement(transformation(extent={{84,-16},{116,16}}, rotation=0)));
|
|---|
| 3330 | Modelica.Mechanics.MultiBody.Interfaces.Frame_resolve frame_resolve "If connected, the output signals are resolved in this frame (cut-force/-torque are set to zero)" annotation(Placement(transformation(origin={80,-100}, extent={{-16,-16},{16,16}}, rotation=270)));
|
|---|
| 3331 | annotation(Window(x=0.37, y=0.02, width=0.6, height=0.65), __Dymola_obsolete="Model equations depend on cardinality(..) which will become obsolete in the Modelica language. Use instead a model from Modelica.Mechanics.MultiBody.Sensors", Documentation(info="
|
|---|
| 3332 | <HTML>
|
|---|
| 3333 | <p>
|
|---|
| 3334 | This is a base class for 3-dim. mechanical components with two frames
|
|---|
| 3335 | and one output port in order to measure the cut-force and/or
|
|---|
| 3336 | cut-torque acting between the two frames and
|
|---|
| 3337 | to provide the measured signals as output for further processing
|
|---|
| 3338 | with the blocks of package Modelica.Blocks.
|
|---|
| 3339 | </p>
|
|---|
| 3340 | </HTML>
|
|---|
| 3341 | "), Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={1,1}), graphics={Line(points={{-70,0},{-101,0}}, color={0,0,0}),Line(points={{70,0},{100,0}}, color={0,0,0}),Line(points={{-80,-100},{-80,0}}, color={0,0,127}),Text(extent={{-132,76},{129,124}}, textString="%name", lineColor={0,0,255}),Text(extent={{-118,55},{-82,30}}, lineColor={128,128,128}, textString="a"),Text(extent={{83,55},{119,30}}, lineColor={128,128,128}, textString="b"),Text(extent={{-31,-72},{100,-97}}, lineColor={192,192,192}, textString="resolve"),Line(points={{80,0},{80,-100}}, color={95,95,95}, pattern=LinePattern.Dot)}), Diagram(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={1,1}), graphics={Line(points={{-70,0},{-100,0}}, color={0,0,0}),Line(points={{70,0},{100,0}}, color={0,0,0}),Line(points={{-80,-100},{-80,0}}, color={0,0,127}),Line(points={{80,0},{80,-100}}, color={95,95,95}, pattern=LinePattern.Dot)}));
|
|---|
| 3342 | protected
|
|---|
| 3343 | outer Modelica.Mechanics.MultiBody.World world;
|
|---|
| 3344 | equation
|
|---|
| 3345 | defineBranch(frame_a.R, frame_b.R);
|
|---|
| 3346 | assert(cardinality(frame_a) > 0, "Connector frame_a of cut-force/-torque sensor object is not connected");
|
|---|
| 3347 | assert(cardinality(frame_b) > 0, "Connector frame_b of cut-force/-torque sensor object is not connected");
|
|---|
| 3348 | frame_a.r_0=frame_b.r_0;
|
|---|
| 3349 | frame_a.R=frame_b.R;
|
|---|
| 3350 | zeros(3)=frame_a.f + frame_b.f;
|
|---|
| 3351 | zeros(3)=frame_a.t + frame_b.t;
|
|---|
| 3352 | if cardinality(frame_resolve) == 1 then
|
|---|
| 3353 | frame_resolve.f=zeros(3);
|
|---|
| 3354 | frame_resolve.t=zeros(3);
|
|---|
| 3355 | else
|
|---|
| 3356 | frame_resolve.r_0=zeros(3);
|
|---|
| 3357 | frame_resolve.R=Modelica.Mechanics.MultiBody.Frames.nullRotation();
|
|---|
| 3358 | end if;
|
|---|
| 3359 | end PartialCutForceSensor;
|
|---|
| 3360 |
|
|---|
| 3361 | end Interfaces;
|
|---|
| 3362 |
|
|---|
| 3363 | package Sensors "Sensors to measure variables"
|
|---|
| 3364 | model CutForceAndTorque "Obsolete model. Use instead Modelica.Mechanics.MultiBody.Sensors.CutForceAndTorque"
|
|---|
| 3365 | import SI = Modelica.SIunits;
|
|---|
| 3366 | import Modelica.Mechanics.MultiBody.Types;
|
|---|
| 3367 | extends ObsoleteModelica3.Mechanics.MultiBody.Interfaces.PartialCutForceSensor;
|
|---|
| 3368 | Modelica.Blocks.Interfaces.RealOutput load[6] "Cut force and cut torque resolved in frame_a/frame_b or in frame_resolved, if connected" annotation(Placement(transformation(origin={-80,-110}, extent={{10,-10},{-10,10}}, rotation=90)));
|
|---|
| 3369 | parameter Boolean animation=true "= true, if animation shall be enabled (show force and torque arrow)";
|
|---|
| 3370 | parameter Boolean positiveSign=true "= true, if force and torque with positive sign is returned (= frame_a.f/.t), otherwise with negative sign (= frame_b.f/.t)";
|
|---|
| 3371 | parameter Boolean resolveInFrame_a=true "= true, if force and torque are resolved in frame_a/frame_b, otherwise in the world frame (if connector frame_resolve is connected, the force/torque is resolved in frame_resolve)";
|
|---|
| 3372 | input Real N_to_m(unit="N/m")=1000 " Force arrow scaling (length = force/N_to_m)" annotation(Dialog(group="if animation = true", enable=animation));
|
|---|
| 3373 | input Real Nm_to_m(unit="N.m/m")=1000 " Torque arrow scaling (length = torque/Nm_to_m)" annotation(Dialog(group="if animation = true", enable=animation));
|
|---|
| 3374 | input SI.Diameter forceDiameter=world.defaultArrowDiameter " Diameter of force arrow" annotation(Dialog(group="if animation = true", enable=animation));
|
|---|
| 3375 | input SI.Diameter torqueDiameter=forceDiameter " Diameter of torque arrow" annotation(Dialog(group="if animation = true", enable=animation));
|
|---|
| 3376 | input Types.Color forceColor=Modelica.Mechanics.MultiBody.Types.Defaults.ForceColor " Color of force arrow" annotation(Dialog(group="if animation = true", enable=animation));
|
|---|
| 3377 | input Types.Color torqueColor=Modelica.Mechanics.MultiBody.Types.Defaults.TorqueColor " Color of torque arrow" annotation(Dialog(group="if animation = true", enable=animation));
|
|---|
| 3378 | input Types.SpecularCoefficient specularCoefficient=world.defaultSpecularCoefficient "Reflection of ambient light (= 0: light is completely absorbed)" annotation(Dialog(group="if animation = true", enable=animation));
|
|---|
| 3379 | SI.Force force[3] "Cut force resolved in frame_a/frame_b or in frame_resolved, if connected";
|
|---|
| 3380 | SI.Torque torque[3] "Cut torque resolved in frame_a/frame_b or in frame_resolved, if connected";
|
|---|
| 3381 | annotation(__Dymola_obsolete="Based on a packed result signal which is not a good design. Use instead Modelica.Mechanics.MultiBody.Sensors.CutForceAndTorque", preferedView="info", Icon(coordinateSystem(preserveAspectRatio=false, extent={{-100,-100},{100,100}}), graphics), Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-100,-100},{100,100}}), graphics), Documentation(info="<HTML>
|
|---|
| 3382 | <p>
|
|---|
| 3383 | The cut-force and cut-torque acting at the component to which frame_b is
|
|---|
| 3384 | connected are determined and provided at the output signal connector
|
|---|
| 3385 | <b>load</b>:
|
|---|
| 3386 | </p>
|
|---|
| 3387 | <pre>
|
|---|
| 3388 | load[1:3] = frame_a.f;
|
|---|
| 3389 | load[4:6] = frame_a.t;
|
|---|
| 3390 | </pre>
|
|---|
| 3391 | <p>
|
|---|
| 3392 | If parameter <b>positiveSign</b> =
|
|---|
| 3393 | <b>false</b>, the negative cut-force and negative
|
|---|
| 3394 | cut-torque is provided (= frame_b.f and frame_b.t).
|
|---|
| 3395 | If <b>frame_resolve</b> is connected to another frame, then the
|
|---|
| 3396 | cut-force and cut-torque are resolved in frame_resolve.
|
|---|
| 3397 | If <b>frame_resolve</b> is <b>not</b> connected then the
|
|---|
| 3398 | coordinate system in which the cut-force and cut-torque is resolved
|
|---|
| 3399 | is defined by parameter <b>resolveInFrame_a</b>.
|
|---|
| 3400 | If this parameter is <b>true</b>, then the
|
|---|
| 3401 | cut-force and cut-torque is resolved in frame_a, otherwise it is
|
|---|
| 3402 | resolved in the world frame.
|
|---|
| 3403 | </p>
|
|---|
| 3404 | <p>
|
|---|
| 3405 | In the following figure the animation of a CutForceAndTorque
|
|---|
| 3406 | sensor is shown. The dark blue coordinate system is frame_b,
|
|---|
| 3407 | and the green arrows are the cut force and the cut torque,
|
|---|
| 3408 | respectively, acting at frame_b and
|
|---|
| 3409 | with negative sign at frame_a.
|
|---|
| 3410 | </p>
|
|---|
| 3411 | <p align=\"center\">
|
|---|
| 3412 | <IMG SRC=\"../Images/MultiBody/Sensors/CutForceAndTorque.png\">
|
|---|
| 3413 | </p>
|
|---|
| 3414 | </HTML>"));
|
|---|
| 3415 | protected
|
|---|
| 3416 | outer Modelica.Mechanics.MultiBody.World world;
|
|---|
| 3417 | parameter Integer csign=if positiveSign then +1 else -1;
|
|---|
| 3418 | SI.Position f_in_m[3]=frame_a.f*csign/N_to_m "Force mapped from N to m for animation";
|
|---|
| 3419 | SI.Position t_in_m[3]=frame_a.t*csign/Nm_to_m "Torque mapped from Nm to m for animation";
|
|---|
| 3420 | Modelica.Mechanics.MultiBody.Visualizers.Advanced.Arrow forceArrow(diameter=forceDiameter, color=forceColor, specularCoefficient=specularCoefficient, R=frame_b.R, r=frame_b.r_0, r_tail=f_in_m, r_head=-f_in_m) if world.enableAnimation and animation;
|
|---|
| 3421 | Modelica.Mechanics.MultiBody.Visualizers.Advanced.DoubleArrow torqueArrow(diameter=torqueDiameter, color=torqueColor, specularCoefficient=specularCoefficient, R=frame_b.R, r=frame_b.r_0, r_tail=t_in_m, r_head=-t_in_m) if world.enableAnimation and animation;
|
|---|
| 3422 | equation
|
|---|
| 3423 | if cardinality(frame_resolve) == 1 then
|
|---|
| 3424 | force=Modelica.Mechanics.MultiBody.Frames.resolve2(frame_resolve.R, Modelica.Mechanics.MultiBody.Frames.resolve1(frame_a.R, frame_a.f))*csign;
|
|---|
| 3425 | torque=Modelica.Mechanics.MultiBody.Frames.resolve2(frame_resolve.R, Modelica.Mechanics.MultiBody.Frames.resolve1(frame_a.R, frame_a.t))*csign;
|
|---|
| 3426 | elseif resolveInFrame_a then
|
|---|
| 3427 | force=frame_a.f*csign;
|
|---|
| 3428 | torque=frame_a.t*csign;
|
|---|
| 3429 | else
|
|---|
| 3430 | force=Modelica.Mechanics.MultiBody.Frames.resolve1(frame_a.R, frame_a.f)*csign;
|
|---|
| 3431 | torque=Modelica.Mechanics.MultiBody.Frames.resolve1(frame_a.R, frame_a.t)*csign;
|
|---|
| 3432 | end if;
|
|---|
| 3433 | load[1:3]=force;
|
|---|
| 3434 | load[4:6]=torque;
|
|---|
| 3435 | end CutForceAndTorque;
|
|---|
| 3436 |
|
|---|
| 3437 | end Sensors;
|
|---|
| 3438 |
|
|---|
| 3439 | end MultiBody;
|
|---|
| 3440 |
|
|---|
| 3441 | end Mechanics;
|
|---|
| 3442 |
|
|---|
| 3443 | end ObsoleteModelica3;
|
|---|
| 3444 | package ModelicaServices "Models and functions used in the Modelica Standard Library requiring a tool specific implementation"
|
|---|
| 3445 | package Animation "Models and functions for 3-dim. animation"
|
|---|
| 3446 | model Shape "Different visual shapes with variable size; all data have to be set as modifiers (see info layer)"
|
|---|
| 3447 | extends Modelica.Utilities.Internal.PartialModelicaServices.Animation.PartialShape;
|
|---|
| 3448 | import T = Modelica.Mechanics.MultiBody.Frames.TransformationMatrices;
|
|---|
| 3449 | import SI = Modelica.SIunits;
|
|---|
| 3450 | import Modelica.Mechanics.MultiBody.Frames;
|
|---|
| 3451 | import Modelica.Mechanics.MultiBody.Types;
|
|---|
| 3452 | protected
|
|---|
| 3453 | Real abs_n_x(final unit="1")=Modelica.Math.Vectors.length(lengthDirection) annotation(HideResult=true);
|
|---|
| 3454 | Real e_x[3](each final unit="1")=noEvent(if abs_n_x < 1e-10 then {1,0,0} else lengthDirection/abs_n_x) annotation(HideResult=true);
|
|---|
| 3455 | Real n_z_aux[3](each final unit="1")=cross(e_x, widthDirection) annotation(HideResult=true);
|
|---|
| 3456 | Real e_y[3](each final unit="1")=noEvent(cross(Modelica.Math.Vectors.normalize(cross(e_x, if n_z_aux*n_z_aux > 1e-06 then widthDirection else if abs(e_x[1]) > 1e-06 then {0,1,0} else {1,0,0})), e_x)) annotation(HideResult=true);
|
|---|
| 3457 | output Real Form annotation(HideResult=false);
|
|---|
| 3458 | public
|
|---|
| 3459 | output Real rxvisobj[3](each final unit="1") "x-axis unit vector of shape, resolved in world frame" annotation(HideResult=false);
|
|---|
| 3460 | output Real ryvisobj[3](each final unit="1") "y-axis unit vector of shape, resolved in world frame" annotation(HideResult=false);
|
|---|
| 3461 | output SI.Position rvisobj[3] "position vector from world frame to shape frame, resolved in world frame" annotation(HideResult=false);
|
|---|
| 3462 | protected
|
|---|
| 3463 | output SI.Length size[3] "{length,width,height} of shape" annotation(HideResult=false);
|
|---|
| 3464 | output Real Material annotation(HideResult=false);
|
|---|
| 3465 | output Real Extra annotation(HideResult=false);
|
|---|
| 3466 | equation
|
|---|
| 3467 | Form=(987000 + PackShape(shapeType))*1e+20;
|
|---|
| 3468 | rxvisobj=transpose(R.T)*e_x;
|
|---|
| 3469 | ryvisobj=transpose(R.T)*e_y;
|
|---|
| 3470 | rvisobj=r + T.resolve1(R.T, r_shape);
|
|---|
| 3471 | size={length,width,height};
|
|---|
| 3472 | Material=PackMaterial(color[1]/255.0, color[2]/255.0, color[3]/255.0, specularCoefficient);
|
|---|
| 3473 | Extra=extra;
|
|---|
| 3474 | annotation(Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,100}}, grid={2,2}), graphics={Rectangle(extent={{-100,-100},{80,60}}, lineColor={0,0,255}, fillColor={255,255,255}, fillPattern=FillPattern.Solid),Polygon(points={{-100,60},{-80,100},{100,100},{80,60},{-100,60}}, lineColor={0,0,255}, fillColor={192,192,192}, fillPattern=FillPattern.Solid),Polygon(points={{100,100},{100,-60},{80,-100},{80,60},{100,100}}, lineColor={0,0,255}, fillColor={160,160,164}, fillPattern=FillPattern.Solid),Text(extent={{-100,-100},{80,60}}, lineColor={0,0,0}, textString="%shapeType"),Text(extent={{-132,160},{128,100}}, textString="%name", lineColor={0,0,255})}), Documentation(info="<html>
|
|---|
| 3475 |
|
|---|
| 3476 | <p>
|
|---|
| 3477 | This model is documented at
|
|---|
| 3478 | <a href=\"Modelica://Modelica.Mechanics.MultiBody.Visualizers.Advanced.Shape\">Modelica.Mechanics.MultiBody.Visualizers.Advanced.Shape</a>.
|
|---|
| 3479 | </p>
|
|---|
| 3480 |
|
|---|
| 3481 |
|
|---|
| 3482 | </html>
|
|---|
| 3483 | "));
|
|---|
| 3484 | end Shape;
|
|---|
| 3485 |
|
|---|
| 3486 | end Animation;
|
|---|
| 3487 |
|
|---|
| 3488 | annotation(preferredView="info", version="1.0", versionDate="2009-06-21", versionBuild=2, revisionId="$Id:: package.mo 3120 2009-11-08 18:22:04Z #$", Documentation(info="<html>
|
|---|
| 3489 | <p>
|
|---|
| 3490 | This package contains a set of functions and models to be used in the
|
|---|
| 3491 | Modelica Standard Library that requires a tool specific implementation.
|
|---|
| 3492 | These are:
|
|---|
| 3493 | </p>
|
|---|
| 3494 |
|
|---|
| 3495 | <ul>
|
|---|
| 3496 | <li> <a href=\"Modelica://ModelicaServices.Animation.Shape\">ModelicaServices.Animation.Shape</a>.
|
|---|
| 3497 | provides a 3-dim. visualization of
|
|---|
| 3498 | mechanical objects. It is used in
|
|---|
| 3499 | <a href=\"Modelica://Modelica.Mechanics.MultiBody.Visualizers.Advanced.Shape\">Modelica.Mechanics.MultiBody.Visualizers.Advanced.Shape</a>
|
|---|
| 3500 | via inheritance.</li>
|
|---|
| 3501 | </ul>
|
|---|
| 3502 |
|
|---|
| 3503 | <p>
|
|---|
| 3504 | <b>Licensed by DLR and Dynasim under the Modelica License 2</b><br>
|
|---|
| 3505 | Copyright © 2009, DLR and Dynasim.
|
|---|
| 3506 | </p>
|
|---|
| 3507 |
|
|---|
| 3508 | <p>
|
|---|
| 3509 | <i>This Modelica package is <u>free</u> software and
|
|---|
| 3510 | the use is completely at <u>your own risk</u>;
|
|---|
| 3511 | it can be redistributed and/or modified under the terms of the
|
|---|
| 3512 | Modelica license 2, see the license conditions (including the
|
|---|
| 3513 | disclaimer of warranty)
|
|---|
| 3514 | <a href=\"Modelica://ModelicaServices.UsersGuide.ModelicaLicense2\">here</a></u>
|
|---|
| 3515 | or at
|
|---|
| 3516 | <a href=\"http://www.Modelica.org/licenses/ModelicaLicense2\">
|
|---|
| 3517 | http://www.Modelica.org/licenses/ModelicaLicense2</a>.
|
|---|
| 3518 | </p>
|
|---|
| 3519 |
|
|---|
| 3520 | </html>"), uses(Modelica(version="3.1")));
|
|---|
| 3521 | end ModelicaServices;
|
|---|
| 3522 | function PackMaterial
|
|---|
| 3523 | input Real r;
|
|---|
| 3524 | input Real g;
|
|---|
| 3525 | input Real b;
|
|---|
| 3526 | input Real spec;
|
|---|
| 3527 | output Real packedMaterial;
|
|---|
| 3528 | Integer i1;
|
|---|
| 3529 | Integer i2;
|
|---|
| 3530 | Integer i3;
|
|---|
| 3531 | Integer i4;
|
|---|
| 3532 | algorithm
|
|---|
| 3533 | i1:=integer(floor(r*99));
|
|---|
| 3534 | if i1 < 0 then
|
|---|
| 3535 | i1:=0;
|
|---|
| 3536 | end if;
|
|---|
| 3537 | if i1 > 99 then
|
|---|
| 3538 | i1:=99;
|
|---|
| 3539 | end if;
|
|---|
| 3540 | i2:=integer(floor(g*99));
|
|---|
| 3541 | if i2 < 0 then
|
|---|
| 3542 | i2:=0;
|
|---|
| 3543 | end if;
|
|---|
| 3544 | if i2 > 99 then
|
|---|
| 3545 | i2:=99;
|
|---|
| 3546 | end if;
|
|---|
| 3547 | i3:=integer(floor(b*99));
|
|---|
| 3548 | if i3 < 0 then
|
|---|
| 3549 | i3:=0;
|
|---|
| 3550 | end if;
|
|---|
| 3551 | if i3 > 99 then
|
|---|
| 3552 | i3:=99;
|
|---|
| 3553 | end if;
|
|---|
| 3554 | i4:=integer(floor(spec*9));
|
|---|
| 3555 | if i4 < 0 then
|
|---|
| 3556 | i4:=0;
|
|---|
| 3557 | end if;
|
|---|
| 3558 | if i4 > 99 then
|
|---|
| 3559 | i4:=9;
|
|---|
| 3560 | end if;
|
|---|
| 3561 | packedMaterial:=((i1*100 + i2)*100 + i3)*10 + i4;
|
|---|
| 3562 | end PackMaterial;
|
|---|
| 3563 | function PackShape
|
|---|
| 3564 | input String shape;
|
|---|
| 3565 | output Real packedShape;
|
|---|
| 3566 | function atoi
|
|---|
| 3567 | input String str;
|
|---|
| 3568 | output Integer i;
|
|---|
| 3569 |
|
|---|
| 3570 | external "C" ;
|
|---|
| 3571 |
|
|---|
| 3572 | end atoi;
|
|---|
| 3573 |
|
|---|
| 3574 | algorithm
|
|---|
| 3575 | if shape == "box" then
|
|---|
| 3576 | packedShape:=101.0;
|
|---|
| 3577 | elseif shape == "sphere" then
|
|---|
| 3578 | packedShape:=102.0;
|
|---|
| 3579 |
|
|---|
| 3580 | elseif shape == "cylinder" then
|
|---|
| 3581 | packedShape:=103.0;
|
|---|
| 3582 |
|
|---|
| 3583 | elseif shape == "cone" then
|
|---|
| 3584 | packedShape:=104.0;
|
|---|
| 3585 |
|
|---|
| 3586 | elseif shape == "pipe" then
|
|---|
| 3587 | packedShape:=105.0;
|
|---|
| 3588 |
|
|---|
| 3589 | elseif shape == "beam" then
|
|---|
| 3590 | packedShape:=106.0;
|
|---|
| 3591 |
|
|---|
| 3592 | elseif shape == "wirebox" then
|
|---|
| 3593 | packedShape:=107.0;
|
|---|
| 3594 |
|
|---|
| 3595 | elseif shape == "gearwheel" then
|
|---|
| 3596 | packedShape:=108.0;
|
|---|
| 3597 |
|
|---|
| 3598 | elseif shape == "pipecylinder" then
|
|---|
| 3599 | packedShape:=110.0;
|
|---|
| 3600 |
|
|---|
| 3601 | elseif shape == "spring" then
|
|---|
| 3602 | packedShape:=111.0;
|
|---|
| 3603 | else
|
|---|
| 3604 | packedShape:=200 + atoi(shape);
|
|---|
| 3605 | end if;
|
|---|
| 3606 | end PackShape;
|
|---|
| 3607 | package ModelicaTest "Library to test components of library Modelica "
|
|---|
| 3608 | annotation(version="1.1", versionDate="2007-10-19", uses(Modelica(version="3.1")), Documentation(info="<html>
|
|---|
| 3609 | <p>
|
|---|
| 3610 | This library provides models and functions to test components of
|
|---|
| 3611 | <b>package Modelica</b> (the Modelica Standard Library).
|
|---|
| 3612 | </p>
|
|---|
| 3613 |
|
|---|
| 3614 | <p>
|
|---|
| 3615 | Further development of this library should be performed in the following
|
|---|
| 3616 | way:
|
|---|
| 3617 | </p>
|
|---|
| 3618 |
|
|---|
| 3619 | <ul>
|
|---|
| 3620 | <li> Functions that are added to this library to test functions of the
|
|---|
| 3621 | Modelica Standard Library, should be called in \"ModelicaTest.testAllFunctions()\".
|
|---|
| 3622 | The idea is that all test functions are called, when calling
|
|---|
| 3623 | \"testAllFunctions()\".</li>
|
|---|
| 3624 |
|
|---|
| 3625 | <li> Models that are added to this library should have the annotation
|
|---|
| 3626 | (with an appropriate StopTime):
|
|---|
| 3627 | <pre>
|
|---|
| 3628 | <b>annotation</b>(experiment(StopTime=1.1)); </pre>
|
|---|
| 3629 | This gives the tool vendors the possibility to automatically identify
|
|---|
| 3630 | the models that shall be simulated and, e.g., that shall be used in an automatic
|
|---|
| 3631 | regression test.</li>
|
|---|
| 3632 | </ul>
|
|---|
| 3633 |
|
|---|
| 3634 | <p>
|
|---|
| 3635 | Copyright © 1998-2007, Modelica Association.
|
|---|
| 3636 | </p>
|
|---|
| 3637 | <p>
|
|---|
| 3638 | <i>This Modelica package is <b>free</b> software; it can be redistributed and/or modified
|
|---|
| 3639 | under the terms of the <b>Modelica license</b>, see the license conditions
|
|---|
| 3640 | and the accompanying <b>disclaimer</b>
|
|---|
| 3641 | <a href=\"Modelica://Modelica.UsersGuide.ModelicaLicense\">here</a>.</i>
|
|---|
| 3642 | </p>
|
|---|
| 3643 | </html>"), conversion(from(version="1.0", script="ConvertFromModelicaTest_1.0.mos")));
|
|---|
| 3644 | package MultiBody "Test models for Modelica.Mechanics.MultiBody"
|
|---|
| 3645 | package Sensors "Test MultiBody.Sensors"
|
|---|
| 3646 | model CutForceAndTorque1
|
|---|
| 3647 | extends Modelica.Icons.Example;
|
|---|
| 3648 | annotation(experiment(StopTime=1.1));
|
|---|
| 3649 | inner Modelica.Mechanics.MultiBody.World world annotation(Placement(transformation(extent={{-100,0},{-80,20}}, rotation=0)));
|
|---|
| 3650 | ObsoleteModelica3.Mechanics.MultiBody.Sensors.CutForceAndTorque cutForce1a(N_to_m=10, Nm_to_m=10) annotation(Placement(transformation(extent={{-20,20},{0,0}}, rotation=0)));
|
|---|
| 3651 | Modelica.Mechanics.MultiBody.Parts.FixedTranslation translate1a(r={0,-1,0}) annotation(Placement(transformation(origin={30,10}, extent={{10,-10},{-10,10}}, rotation=180)));
|
|---|
| 3652 | Modelica.Mechanics.MultiBody.Parts.Body body1a annotation(Placement(transformation(extent={{60,0},{80,20}}, rotation=0)));
|
|---|
| 3653 | ObsoleteModelica3.Mechanics.MultiBody.Sensors.CutForceAndTorque cutForce2a(positiveSign=false, resolveInFrame_a=false, N_to_m=10, Nm_to_m=10) annotation(Placement(transformation(extent={{-20,-40},{0,-20}}, rotation=0)));
|
|---|
| 3654 | Modelica.Mechanics.MultiBody.Parts.FixedTranslation translate2a(r={0,-1,0}) annotation(Placement(transformation(origin={30,-30}, extent={{10,-10},{-10,10}}, rotation=180)));
|
|---|
| 3655 | Modelica.Mechanics.MultiBody.Parts.Body body2a annotation(Placement(transformation(extent={{60,-40},{80,-20}}, rotation=0)));
|
|---|
| 3656 | Modelica.Mechanics.MultiBody.Parts.FixedRotation rotate1a(n={0,0,1}, angle=90, r={0,0,-0.2}) annotation(Placement(transformation(extent={{-60,0},{-40,20}}, rotation=0)));
|
|---|
| 3657 | Modelica.Mechanics.MultiBody.Parts.FixedRotation rotate2a(n={0,0,1}, angle=90, r={0,0,0.2}) annotation(Placement(transformation(extent={{-60,-40},{-40,-20}}, rotation=0)));
|
|---|
| 3658 | ObsoleteModelica3.Mechanics.MultiBody.Sensors.CutForceAndTorque cutForce1b(N_to_m=10, Nm_to_m=10) annotation(Placement(transformation(extent={{-20,60},{0,80}}, rotation=0)));
|
|---|
| 3659 | Modelica.Mechanics.MultiBody.Parts.FixedTranslation translate1b(r={0,-1,0}) annotation(Placement(transformation(origin={30,70}, extent={{10,-10},{-10,10}}, rotation=180)));
|
|---|
| 3660 | Modelica.Mechanics.MultiBody.Parts.Body body1b annotation(Placement(transformation(extent={{60,60},{80,80}}, rotation=0)));
|
|---|
| 3661 | Modelica.Mechanics.MultiBody.Parts.FixedRotation rotate1b(n={0,0,1}, angle=90, r={0,0,-0.6}) annotation(Placement(transformation(extent={{-60,60},{-40,80}}, rotation=0)));
|
|---|
| 3662 | Modelica.Blocks.Math.Add err1[6](each k2=-1) annotation(Placement(transformation(extent={{10,30},{30,50}}, rotation=0)));
|
|---|
| 3663 | ObsoleteModelica3.Mechanics.MultiBody.Sensors.CutForceAndTorque cutForce2b(positiveSign=false, resolveInFrame_a=false, N_to_m=10, Nm_to_m=10) annotation(Placement(transformation(extent={{-20,-80},{0,-100}}, rotation=0)));
|
|---|
| 3664 | Modelica.Mechanics.MultiBody.Parts.FixedTranslation translate2b(r={0,-1,0}) annotation(Placement(transformation(origin={30,-90}, extent={{10,-10},{-10,10}}, rotation=180)));
|
|---|
| 3665 | Modelica.Mechanics.MultiBody.Parts.Body body2b annotation(Placement(transformation(extent={{60,-100},{80,-80}}, rotation=0)));
|
|---|
| 3666 | Modelica.Mechanics.MultiBody.Parts.FixedRotation rotate2b(n={0,0,1}, angle=90, r={0,0,0.6}) annotation(Placement(transformation(extent={{-60,-100},{-40,-80}}, rotation=0)));
|
|---|
| 3667 | Modelica.Blocks.Math.Add err2[6](each k2=-1) annotation(Placement(transformation(extent={{8,-72},{28,-52}}, rotation=0)));
|
|---|
| 3668 | equation
|
|---|
| 3669 | annotation(Diagram(graphics));
|
|---|
| 3670 | connect(world.frame_b,rotate1a.frame_a) annotation(Line(points={{-80,10},{-60,10}}, color={0,0,0}, thickness=0.5));
|
|---|
| 3671 | connect(rotate1a.frame_b,cutForce1a.frame_a) annotation(Line(points={{-40,10},{-20,10}}, color={0,0,0}, thickness=0.5));
|
|---|
| 3672 | connect(rotate2a.frame_b,cutForce2a.frame_a) annotation(Line(points={{-40,-30},{-20,-30}}, color={0,0,0}, thickness=0.5));
|
|---|
| 3673 | connect(rotate2a.frame_a,world.frame_b) annotation(Line(points={{-60,-30},{-70,-30},{-70,10},{-80,10}}, color={0,0,0}, thickness=0.5));
|
|---|
| 3674 | connect(rotate1b.frame_b,cutForce1b.frame_a) annotation(Line(points={{-40,70},{-20,70}}, color={0,0,0}, thickness=0.5));
|
|---|
| 3675 | connect(cutForce1b.frame_resolve,rotate1b.frame_b) annotation(Line(points={{-2,60},{-20,60},{-20,46},{-40,46},{-40,70}}, color={0,0,0}, pattern=LinePattern.Dot));
|
|---|
| 3676 | connect(cutForce1b.load,err1.u1) annotation(Line(points={{-18,59},{-18,46},{8,46}}, color={0,0,255}));
|
|---|
| 3677 | connect(cutForce1a.load,err1.u2) annotation(Line(points={{-18,21},{-18,34},{8,34}}, color={0,0,255}));
|
|---|
| 3678 | connect(world.frame_b,rotate1b.frame_a) annotation(Line(points={{-80,10},{-70,10},{-70,70},{-60,70}}, color={0,0,0}, thickness=0.5));
|
|---|
| 3679 | connect(rotate2b.frame_b,cutForce2b.frame_a) annotation(Line(points={{-40,-90},{-20,-90}}, color={0,0,0}, thickness=0.5));
|
|---|
| 3680 | connect(rotate2b.frame_a,world.frame_b) annotation(Line(points={{-60,-90},{-70,-90},{-70,10},{-80,10}}, color={0,0,0}, thickness=0.5));
|
|---|
| 3681 | connect(cutForce2a.load,err2.u1) annotation(Line(points={{-18,-41},{-18,-56},{6,-56}}, color={0,0,255}));
|
|---|
| 3682 | connect(cutForce2b.load,err2.u2) annotation(Line(points={{-18,-79},{-18,-68},{6,-68}}, color={0,0,255}));
|
|---|
| 3683 | connect(cutForce2b.frame_resolve,world.frame_b) annotation(Line(points={{-2,-80},{-2,-58},{-74,-58},{-74,10},{-80,10}}, color={0,0,0}, pattern=LinePattern.Dot));
|
|---|
| 3684 | connect(cutForce1b.frame_b,translate1b.frame_a) annotation(Line(points={{0,70},{20,70}}, color={0,0,0}, thickness=0.5));
|
|---|
| 3685 | connect(translate1b.frame_b,body1b.frame_a) annotation(Line(points={{40,70},{60,70}}, color={0,0,0}, thickness=0.5));
|
|---|
| 3686 | connect(cutForce1a.frame_b,translate1a.frame_a) annotation(Line(points={{0,10},{10,10},{10,10},{20,10}}, color={0,0,0}, thickness=0.5));
|
|---|
| 3687 | connect(translate1a.frame_b,body1a.frame_a) annotation(Line(points={{40,10},{50,10},{50,10},{60,10}}, color={0,0,0}, thickness=0.5));
|
|---|
| 3688 | connect(cutForce2a.frame_b,translate2a.frame_a) annotation(Line(points={{0,-30},{20,-30}}, color={0,0,0}, thickness=0.5));
|
|---|
| 3689 | connect(translate2a.frame_b,body2a.frame_a) annotation(Line(points={{40,-30},{60,-30}}, color={0,0,0}, thickness=0.5));
|
|---|
| 3690 | connect(cutForce2b.frame_b,translate2b.frame_a) annotation(Line(points={{0,-90},{20,-90}}, color={0,0,0}, thickness=0.5));
|
|---|
| 3691 | connect(translate2b.frame_b,body2b.frame_a) annotation(Line(points={{40,-90},{60,-90}}, color={0,0,0}, thickness=0.5));
|
|---|
| 3692 | end CutForceAndTorque1;
|
|---|
| 3693 |
|
|---|
| 3694 | end Sensors;
|
|---|
| 3695 |
|
|---|
| 3696 | end MultiBody;
|
|---|
| 3697 |
|
|---|
| 3698 | end ModelicaTest;
|
|---|
| 3699 | model ModelicaTest_MultiBody_Sensors_CutForceAndTorque1
|
|---|
| 3700 | extends ModelicaTest.MultiBody.Sensors.CutForceAndTorque1;
|
|---|
| 3701 | end ModelicaTest_MultiBody_Sensors_CutForceAndTorque1;
|
|---|