1 | package ModelicaServices
|
---|
2 | extends Modelica.Icons.Package;
|
---|
3 |
|
---|
4 | package Animation
|
---|
5 | extends Modelica.Icons.Package;
|
---|
6 |
|
---|
7 | model Shape
|
---|
8 | extends Modelica.Utilities.Internal.PartialModelicaServices.Animation.PartialShape;
|
---|
9 | end Shape;
|
---|
10 |
|
---|
11 | model Surface
|
---|
12 | extends Modelica.Utilities.Internal.PartialModelicaServices.Animation.PartialSurface;
|
---|
13 | end Surface;
|
---|
14 | end Animation;
|
---|
15 |
|
---|
16 | package Machine
|
---|
17 | extends Modelica.Icons.Package;
|
---|
18 | final constant Real eps = 1.e-15;
|
---|
19 | final constant Real small = 1.e-60;
|
---|
20 | final constant Real inf = 1.e+60;
|
---|
21 | final constant Integer Integer_inf = OpenModelica.Internal.Architecture.integerMax();
|
---|
22 | end Machine;
|
---|
23 | end ModelicaServices;
|
---|
24 |
|
---|
25 | package Modelica
|
---|
26 | extends Modelica.Icons.Package;
|
---|
27 |
|
---|
28 | package Mechanics
|
---|
29 | extends Modelica.Icons.Package;
|
---|
30 |
|
---|
31 | package MultiBody
|
---|
32 | extends Modelica.Icons.Package;
|
---|
33 |
|
---|
34 | model World
|
---|
35 | Interfaces.Frame_b frame_b;
|
---|
36 | parameter Boolean enableAnimation = true;
|
---|
37 | parameter Boolean animateWorld = true;
|
---|
38 | parameter Boolean animateGravity = true;
|
---|
39 | parameter .Modelica.Mechanics.MultiBody.Types.AxisLabel label1 = "x";
|
---|
40 | parameter .Modelica.Mechanics.MultiBody.Types.AxisLabel label2 = "y";
|
---|
41 | parameter .Modelica.Mechanics.MultiBody.Types.GravityTypes gravityType = Types.GravityTypes.UniformGravity annotation(Evaluate = true);
|
---|
42 | parameter .Modelica.SIunits.Acceleration g = 9.81;
|
---|
43 | parameter .Modelica.Mechanics.MultiBody.Types.Axis n = {0, -1, 0} annotation(Evaluate = true);
|
---|
44 | parameter Real mue(unit = "m3/s2", min = 0) = 3.986e14;
|
---|
45 | parameter Boolean driveTrainMechanics3D = true;
|
---|
46 | parameter .Modelica.SIunits.Distance axisLength = nominalLength / 2;
|
---|
47 | parameter .Modelica.SIunits.Distance axisDiameter = axisLength / defaultFrameDiameterFraction;
|
---|
48 | parameter Boolean axisShowLabels = true;
|
---|
49 | input .Modelica.Mechanics.MultiBody.Types.Color axisColor_x = Types.Defaults.FrameColor;
|
---|
50 | input .Modelica.Mechanics.MultiBody.Types.Color axisColor_y = axisColor_x;
|
---|
51 | input .Modelica.Mechanics.MultiBody.Types.Color axisColor_z = axisColor_x;
|
---|
52 | parameter .Modelica.SIunits.Position[3] gravityArrowTail = {0, 0, 0};
|
---|
53 | parameter .Modelica.SIunits.Length gravityArrowLength = axisLength / 2;
|
---|
54 | parameter .Modelica.SIunits.Diameter gravityArrowDiameter = gravityArrowLength / defaultWidthFraction;
|
---|
55 | input .Modelica.Mechanics.MultiBody.Types.Color gravityArrowColor = {0, 230, 0};
|
---|
56 | parameter .Modelica.SIunits.Diameter gravitySphereDiameter = 12742000;
|
---|
57 | input .Modelica.Mechanics.MultiBody.Types.Color gravitySphereColor = {0, 230, 0};
|
---|
58 | parameter .Modelica.SIunits.Length nominalLength = 1;
|
---|
59 | parameter .Modelica.SIunits.Length defaultAxisLength = nominalLength / 5;
|
---|
60 | parameter .Modelica.SIunits.Length defaultJointLength = nominalLength / 10;
|
---|
61 | parameter .Modelica.SIunits.Length defaultJointWidth = nominalLength / 20;
|
---|
62 | parameter .Modelica.SIunits.Length defaultForceLength = nominalLength / 10;
|
---|
63 | parameter .Modelica.SIunits.Length defaultForceWidth = nominalLength / 20;
|
---|
64 | parameter .Modelica.SIunits.Length defaultBodyDiameter = nominalLength / 9;
|
---|
65 | parameter Real defaultWidthFraction = 20;
|
---|
66 | parameter .Modelica.SIunits.Length defaultArrowDiameter = nominalLength / 40;
|
---|
67 | parameter Real defaultFrameDiameterFraction = 40;
|
---|
68 | parameter Real defaultSpecularCoefficient(min = 0) = 0.7;
|
---|
69 | parameter Real defaultN_to_m(unit = "N/m", min = 0) = 1000;
|
---|
70 | parameter Real defaultNm_to_m(unit = "N.m/m", min = 0) = 1000;
|
---|
71 | protected
|
---|
72 | parameter Integer ndim = if enableAnimation and animateWorld then 1 else 0;
|
---|
73 | parameter Integer ndim2 = if enableAnimation and animateWorld and axisShowLabels then 1 else 0;
|
---|
74 | parameter .Modelica.SIunits.Length headLength = min(axisLength, axisDiameter * Types.Defaults.FrameHeadLengthFraction);
|
---|
75 | parameter .Modelica.SIunits.Length headWidth = axisDiameter * Types.Defaults.FrameHeadWidthFraction;
|
---|
76 | parameter .Modelica.SIunits.Length lineLength = max(0, axisLength - headLength);
|
---|
77 | parameter .Modelica.SIunits.Length lineWidth = axisDiameter;
|
---|
78 | parameter .Modelica.SIunits.Length scaledLabel = Types.Defaults.FrameLabelHeightFraction * axisDiameter;
|
---|
79 | parameter .Modelica.SIunits.Length labelStart = 1.05 * axisLength;
|
---|
80 | 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;
|
---|
81 | 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;
|
---|
82 | 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;
|
---|
83 | 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;
|
---|
84 | 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;
|
---|
85 | 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;
|
---|
86 | 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;
|
---|
87 | 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;
|
---|
88 | 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;
|
---|
89 | parameter .Modelica.SIunits.Length gravityHeadLength = min(gravityArrowLength, gravityArrowDiameter * Types.Defaults.ArrowHeadLengthFraction);
|
---|
90 | parameter .Modelica.SIunits.Length gravityHeadWidth = gravityArrowDiameter * Types.Defaults.ArrowHeadWidthFraction;
|
---|
91 | parameter .Modelica.SIunits.Length gravityLineLength = max(0, gravityArrowLength - gravityHeadLength);
|
---|
92 | 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 == Types.GravityTypes.UniformGravity;
|
---|
93 | 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 == Types.GravityTypes.UniformGravity;
|
---|
94 | parameter Integer ndim_pointGravity = if enableAnimation and animateGravity and gravityType == Types.GravityTypes.UniformGravity then 1 else 0;
|
---|
95 | 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 == Types.GravityTypes.PointGravity;
|
---|
96 | equation
|
---|
97 | Connections.root(frame_b.R);
|
---|
98 | assert(Modelica.Math.Vectors.length(n) > 1.e-10, "Parameter n of World object is wrong (length(n) > 0 required)");
|
---|
99 | frame_b.r_0 = zeros(3);
|
---|
100 | frame_b.R = Frames.nullRotation();
|
---|
101 | end World;
|
---|
102 |
|
---|
103 | package Frames
|
---|
104 | extends Modelica.Icons.Package;
|
---|
105 |
|
---|
106 | record Orientation
|
---|
107 | extends Modelica.Icons.Record;
|
---|
108 | Real[3, 3] T;
|
---|
109 | .Modelica.SIunits.AngularVelocity[3] w;
|
---|
110 |
|
---|
111 | encapsulated function equalityConstraint
|
---|
112 | extends .Modelica.Icons.Function;
|
---|
113 | input .Modelica.Mechanics.MultiBody.Frames.Orientation R1;
|
---|
114 | input .Modelica.Mechanics.MultiBody.Frames.Orientation R2;
|
---|
115 | output Real[3] residue;
|
---|
116 | algorithm
|
---|
117 | 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, :])};
|
---|
118 | end equalityConstraint;
|
---|
119 | end Orientation;
|
---|
120 |
|
---|
121 | function nullRotation
|
---|
122 | extends Modelica.Icons.Function;
|
---|
123 | output Orientation R;
|
---|
124 | algorithm
|
---|
125 | R := Orientation(T = identity(3), w = zeros(3));
|
---|
126 | end nullRotation;
|
---|
127 |
|
---|
128 | package TransformationMatrices
|
---|
129 | extends Modelica.Icons.Package;
|
---|
130 |
|
---|
131 | type Orientation
|
---|
132 | extends Internal.TransformationMatrix;
|
---|
133 |
|
---|
134 | encapsulated function equalityConstraint
|
---|
135 | extends .Modelica.Icons.Function;
|
---|
136 | input .Modelica.Mechanics.MultiBody.Frames.TransformationMatrices.Orientation T1;
|
---|
137 | input .Modelica.Mechanics.MultiBody.Frames.TransformationMatrices.Orientation T2;
|
---|
138 | output Real[3] residue;
|
---|
139 | algorithm
|
---|
140 | residue := {cross(T1[1, :], T1[2, :]) * T2[2, :], -cross(T1[1, :], T1[2, :]) * T2[1, :], T1[2, :] * T2[1, :]};
|
---|
141 | end equalityConstraint;
|
---|
142 | end Orientation;
|
---|
143 |
|
---|
144 | function resolve1
|
---|
145 | extends Modelica.Icons.Function;
|
---|
146 | input TransformationMatrices.Orientation T;
|
---|
147 | input Real[3] v2;
|
---|
148 | output Real[3] v1;
|
---|
149 | algorithm
|
---|
150 | v1 := transpose(T) * v2;
|
---|
151 | end resolve1;
|
---|
152 |
|
---|
153 | function absoluteRotation
|
---|
154 | extends Modelica.Icons.Function;
|
---|
155 | input TransformationMatrices.Orientation T1;
|
---|
156 | input TransformationMatrices.Orientation T_rel;
|
---|
157 | output TransformationMatrices.Orientation T2;
|
---|
158 | algorithm
|
---|
159 | T2 := T_rel * T1;
|
---|
160 | end absoluteRotation;
|
---|
161 |
|
---|
162 | function from_nxy
|
---|
163 | extends Modelica.Icons.Function;
|
---|
164 | input Real[3] n_x(each final unit = "1");
|
---|
165 | input Real[3] n_y(each final unit = "1");
|
---|
166 | output TransformationMatrices.Orientation T;
|
---|
167 | protected
|
---|
168 | Real abs_n_x = sqrt(n_x * n_x);
|
---|
169 | Real[3] e_x(each final unit = "1") = if abs_n_x < 1.e-10 then {1, 0, 0} else n_x / abs_n_x;
|
---|
170 | Real[3] n_z_aux(each final unit = "1") = cross(e_x, n_y);
|
---|
171 | Real[3] n_y_aux(each final unit = "1") = if n_z_aux * n_z_aux > 1.0e-6 then n_y else if abs(e_x[1]) > 1.0e-6 then {0, 1, 0} else {1, 0, 0};
|
---|
172 | Real[3] e_z_aux(each final unit = "1") = cross(e_x, n_y_aux);
|
---|
173 | Real[3] e_z(each final unit = "1") = e_z_aux / sqrt(e_z_aux * e_z_aux);
|
---|
174 | algorithm
|
---|
175 | T := {e_x, cross(e_z, e_x), e_z};
|
---|
176 | end from_nxy;
|
---|
177 | end TransformationMatrices;
|
---|
178 |
|
---|
179 | package Internal
|
---|
180 | extends Modelica.Icons.InternalPackage;
|
---|
181 | type TransformationMatrix = Real[3, 3];
|
---|
182 | end Internal;
|
---|
183 | end Frames;
|
---|
184 |
|
---|
185 | package Interfaces
|
---|
186 | extends Modelica.Icons.InterfacesPackage;
|
---|
187 |
|
---|
188 | connector Frame
|
---|
189 | .Modelica.SIunits.Position[3] r_0;
|
---|
190 | Frames.Orientation R;
|
---|
191 | flow .Modelica.SIunits.Force[3] f annotation(unassignedMessage = "All Forces cannot be uniquely calculated.
|
---|
192 | The reason could be that the mechanism contains
|
---|
193 | a planar loop or that joints constrain the
|
---|
194 | same motion. For planar loops, use for one
|
---|
195 | revolute joint per loop the joint
|
---|
196 | Joints.RevolutePlanarLoopConstraint instead of
|
---|
197 | Joints.Revolute.");
|
---|
198 | flow .Modelica.SIunits.Torque[3] t;
|
---|
199 | end Frame;
|
---|
200 |
|
---|
201 | connector Frame_b
|
---|
202 | extends Frame;
|
---|
203 | end Frame_b;
|
---|
204 |
|
---|
205 | partial function partialSurfaceCharacteristic
|
---|
206 | extends Modelica.Icons.Function;
|
---|
207 | input Integer nu;
|
---|
208 | input Integer nv;
|
---|
209 | input Boolean multiColoredSurface = false;
|
---|
210 | output Modelica.SIunits.Position[nu, nv] X;
|
---|
211 | output Modelica.SIunits.Position[nu, nv] Y;
|
---|
212 | output Modelica.SIunits.Position[nu, nv] Z;
|
---|
213 | output Real[if multiColoredSurface then nu else 0, if multiColoredSurface then nv else 0, 3] C;
|
---|
214 | end partialSurfaceCharacteristic;
|
---|
215 | end Interfaces;
|
---|
216 |
|
---|
217 | package Visualizers
|
---|
218 | extends Modelica.Icons.Package;
|
---|
219 |
|
---|
220 | package Advanced
|
---|
221 | extends Modelica.Icons.Package;
|
---|
222 |
|
---|
223 | model Shape
|
---|
224 | extends ModelicaServices.Animation.Shape;
|
---|
225 | extends Modelica.Utilities.Internal.PartialModelicaServices.Animation.PartialShape;
|
---|
226 | end Shape;
|
---|
227 |
|
---|
228 | model Surface
|
---|
229 | extends Modelica.Mechanics.MultiBody.Icons.Surface;
|
---|
230 | extends Modelica.Utilities.Internal.PartialModelicaServices.Animation.PartialSurface;
|
---|
231 | extends ModelicaServices.Animation.Surface;
|
---|
232 | end Surface;
|
---|
233 | end Advanced;
|
---|
234 |
|
---|
235 | package Internal
|
---|
236 | extends Modelica.Icons.InternalPackage;
|
---|
237 |
|
---|
238 | model Lines
|
---|
239 | input Modelica.Mechanics.MultiBody.Frames.Orientation R = .Modelica.Mechanics.MultiBody.Frames.nullRotation();
|
---|
240 | input .Modelica.SIunits.Position[3] r = {0, 0, 0};
|
---|
241 | input .Modelica.SIunits.Position[3] r_lines = {0, 0, 0};
|
---|
242 | input Real[3] n_x(each final unit = "1") = {1, 0, 0};
|
---|
243 | input Real[3] n_y(each final unit = "1") = {0, 1, 0};
|
---|
244 | input .Modelica.SIunits.Position[:, 2, 2] lines = zeros(0, 2, 2);
|
---|
245 | input .Modelica.SIunits.Length diameter(min = 0) = 0.05;
|
---|
246 | input Modelica.Mechanics.MultiBody.Types.Color color = {0, 128, 255};
|
---|
247 | input .Modelica.Mechanics.MultiBody.Types.SpecularCoefficient specularCoefficient = 0.7;
|
---|
248 | protected
|
---|
249 | parameter Integer n = size(lines, 1);
|
---|
250 | .Modelica.Mechanics.MultiBody.Frames.TransformationMatrices.Orientation R_rel = .Modelica.Mechanics.MultiBody.Frames.TransformationMatrices.from_nxy(n_x, n_y);
|
---|
251 | .Modelica.Mechanics.MultiBody.Frames.TransformationMatrices.Orientation R_lines = .Modelica.Mechanics.MultiBody.Frames.TransformationMatrices.absoluteRotation(R.T, R_rel);
|
---|
252 | Modelica.SIunits.Position[3] r_abs = r + .Modelica.Mechanics.MultiBody.Frames.TransformationMatrices.resolve1(R.T, r_lines);
|
---|
253 | Modelica.Mechanics.MultiBody.Visualizers.Advanced.Shape[n] cylinders(each shapeType = "cylinder", lengthDirection = array(.Modelica.Mechanics.MultiBody.Frames.TransformationMatrices.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 + .Modelica.Mechanics.MultiBody.Frames.TransformationMatrices.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);
|
---|
254 | end Lines;
|
---|
255 | end Internal;
|
---|
256 | end Visualizers;
|
---|
257 |
|
---|
258 | package Types
|
---|
259 | extends Modelica.Icons.TypesPackage;
|
---|
260 | type Axis = Modelica.Icons.TypeReal[3](each final unit = "1");
|
---|
261 | type AxisLabel = Modelica.Icons.TypeString;
|
---|
262 | type Color = Modelica.Icons.TypeInteger[3](each min = 0, each max = 255);
|
---|
263 | type SpecularCoefficient = Modelica.Icons.TypeReal(min = 0);
|
---|
264 | type ShapeType = Modelica.Icons.TypeString;
|
---|
265 | type ShapeExtra = Modelica.Icons.TypeReal;
|
---|
266 | type GravityTypes = enumeration(NoGravity, UniformGravity, PointGravity);
|
---|
267 |
|
---|
268 | package Defaults
|
---|
269 | extends Modelica.Icons.Package;
|
---|
270 | constant Types.Color FrameColor = {0, 0, 0};
|
---|
271 | constant Real FrameHeadLengthFraction = 5.0;
|
---|
272 | constant Real FrameHeadWidthFraction = 3.0;
|
---|
273 | constant Real FrameLabelHeightFraction = 3.0;
|
---|
274 | constant Real ArrowHeadLengthFraction = 4.0;
|
---|
275 | constant Real ArrowHeadWidthFraction = 3.0;
|
---|
276 | end Defaults;
|
---|
277 | end Types;
|
---|
278 |
|
---|
279 | package Icons
|
---|
280 | extends Modelica.Icons.IconsPackage;
|
---|
281 |
|
---|
282 | model Surface end Surface;
|
---|
283 | end Icons;
|
---|
284 | end MultiBody;
|
---|
285 | end Mechanics;
|
---|
286 |
|
---|
287 | package Math
|
---|
288 | extends Modelica.Icons.Package;
|
---|
289 |
|
---|
290 | package Icons
|
---|
291 | extends Modelica.Icons.IconsPackage;
|
---|
292 |
|
---|
293 | partial function AxisCenter end AxisCenter;
|
---|
294 | end Icons;
|
---|
295 |
|
---|
296 | package Vectors
|
---|
297 | extends Modelica.Icons.Package;
|
---|
298 |
|
---|
299 | function length
|
---|
300 | extends Modelica.Icons.Function;
|
---|
301 | input Real[:] v;
|
---|
302 | output Real result;
|
---|
303 | algorithm
|
---|
304 | result := sqrt(v * v);
|
---|
305 | end length;
|
---|
306 |
|
---|
307 | function normalize
|
---|
308 | extends Modelica.Icons.Function;
|
---|
309 | input Real[:] v;
|
---|
310 | input Real eps(min = 0.0) = 100 * Modelica.Constants.eps;
|
---|
311 | output Real[size(v, 1)] result;
|
---|
312 | algorithm
|
---|
313 | result := smooth(0, noEvent(if length(v) >= eps then v / length(v) else v / eps));
|
---|
314 | end normalize;
|
---|
315 | end Vectors;
|
---|
316 |
|
---|
317 | function asin
|
---|
318 | extends Modelica.Math.Icons.AxisCenter;
|
---|
319 | input Real u;
|
---|
320 | output .Modelica.SIunits.Angle y;
|
---|
321 | external "builtin" y = asin(u);
|
---|
322 | end asin;
|
---|
323 |
|
---|
324 | function atan2
|
---|
325 | extends Modelica.Math.Icons.AxisCenter;
|
---|
326 | input Real u1;
|
---|
327 | input Real u2;
|
---|
328 | output .Modelica.SIunits.Angle y;
|
---|
329 | external "builtin" y = atan2(u1, u2);
|
---|
330 | end atan2;
|
---|
331 |
|
---|
332 | function exp
|
---|
333 | extends Modelica.Math.Icons.AxisCenter;
|
---|
334 | input Real u;
|
---|
335 | output Real y;
|
---|
336 | external "builtin" y = exp(u);
|
---|
337 | end exp;
|
---|
338 | end Math;
|
---|
339 |
|
---|
340 | package Utilities
|
---|
341 | extends Modelica.Icons.Package;
|
---|
342 |
|
---|
343 | package Internal
|
---|
344 | extends Modelica.Icons.InternalPackage;
|
---|
345 |
|
---|
346 | partial package PartialModelicaServices
|
---|
347 | extends Modelica.Icons.InternalPackage;
|
---|
348 |
|
---|
349 | package Animation
|
---|
350 | extends Modelica.Icons.Package;
|
---|
351 |
|
---|
352 | partial model PartialShape
|
---|
353 | parameter .Modelica.Mechanics.MultiBody.Types.ShapeType shapeType = "box";
|
---|
354 | input .Modelica.Mechanics.MultiBody.Frames.Orientation R = .Modelica.Mechanics.MultiBody.Frames.nullRotation();
|
---|
355 | input .Modelica.SIunits.Position[3] r = {0, 0, 0};
|
---|
356 | input .Modelica.SIunits.Position[3] r_shape = {0, 0, 0};
|
---|
357 | input Real[3] lengthDirection(each final unit = "1") = {1, 0, 0};
|
---|
358 | input Real[3] widthDirection(each final unit = "1") = {0, 1, 0};
|
---|
359 | input .Modelica.SIunits.Length length = 0;
|
---|
360 | input .Modelica.SIunits.Length width = 0;
|
---|
361 | input .Modelica.SIunits.Length height = 0;
|
---|
362 | input .Modelica.Mechanics.MultiBody.Types.ShapeExtra extra = 0.0;
|
---|
363 | input Real[3] color = {255, 0, 0};
|
---|
364 | input .Modelica.Mechanics.MultiBody.Types.SpecularCoefficient specularCoefficient = 0.7;
|
---|
365 | end PartialShape;
|
---|
366 |
|
---|
367 | model PartialSurface
|
---|
368 | input .Modelica.Mechanics.MultiBody.Frames.Orientation R = .Modelica.Mechanics.MultiBody.Frames.nullRotation();
|
---|
369 | input Modelica.SIunits.Position[3] r_0 = {0, 0, 0};
|
---|
370 | parameter Integer nu = 2;
|
---|
371 | parameter Integer nv = 2;
|
---|
372 | replaceable function surfaceCharacteristic = Modelica.Mechanics.MultiBody.Interfaces.partialSurfaceCharacteristic;
|
---|
373 | parameter Boolean wireframe = false;
|
---|
374 | parameter Boolean multiColoredSurface = false;
|
---|
375 | input Real[3] color = {255, 0, 0};
|
---|
376 | input .Modelica.Mechanics.MultiBody.Types.SpecularCoefficient specularCoefficient = 0.7;
|
---|
377 | input Real transparency = 0;
|
---|
378 | end PartialSurface;
|
---|
379 | end Animation;
|
---|
380 | end PartialModelicaServices;
|
---|
381 | end Internal;
|
---|
382 | end Utilities;
|
---|
383 |
|
---|
384 | package Constants
|
---|
385 | extends Modelica.Icons.Package;
|
---|
386 | final constant Real pi = 2 * Math.asin(1.0);
|
---|
387 | final constant Real eps = ModelicaServices.Machine.eps;
|
---|
388 | final constant .Modelica.SIunits.Velocity c = 299792458;
|
---|
389 | final constant Real mue_0(final unit = "N/A2") = 4 * pi * 1.e-7;
|
---|
390 | end Constants;
|
---|
391 |
|
---|
392 | package Icons
|
---|
393 | extends Icons.Package;
|
---|
394 |
|
---|
395 | partial model Example end Example;
|
---|
396 |
|
---|
397 | partial package Package end Package;
|
---|
398 |
|
---|
399 | partial package VariantsPackage
|
---|
400 | extends Modelica.Icons.Package;
|
---|
401 | end VariantsPackage;
|
---|
402 |
|
---|
403 | partial package InterfacesPackage
|
---|
404 | extends Modelica.Icons.Package;
|
---|
405 | end InterfacesPackage;
|
---|
406 |
|
---|
407 | partial package TypesPackage
|
---|
408 | extends Modelica.Icons.Package;
|
---|
409 | end TypesPackage;
|
---|
410 |
|
---|
411 | partial package IconsPackage
|
---|
412 | extends Modelica.Icons.Package;
|
---|
413 | end IconsPackage;
|
---|
414 |
|
---|
415 | partial package InternalPackage end InternalPackage;
|
---|
416 |
|
---|
417 | partial function Function end Function;
|
---|
418 |
|
---|
419 | partial record Record end Record;
|
---|
420 |
|
---|
421 | type TypeReal
|
---|
422 | extends Real;
|
---|
423 | end TypeReal;
|
---|
424 |
|
---|
425 | type TypeInteger
|
---|
426 | extends Integer;
|
---|
427 | end TypeInteger;
|
---|
428 |
|
---|
429 | type TypeString
|
---|
430 | extends String;
|
---|
431 | end TypeString;
|
---|
432 | end Icons;
|
---|
433 |
|
---|
434 | package SIunits
|
---|
435 | extends Modelica.Icons.Package;
|
---|
436 |
|
---|
437 | package Conversions
|
---|
438 | extends Modelica.Icons.Package;
|
---|
439 |
|
---|
440 | package NonSIunits
|
---|
441 | extends Modelica.Icons.Package;
|
---|
442 | type Temperature_degC = Real(final quantity = "ThermodynamicTemperature", final unit = "degC");
|
---|
443 | end NonSIunits;
|
---|
444 | end Conversions;
|
---|
445 |
|
---|
446 | type Angle = Real(final quantity = "Angle", final unit = "rad", displayUnit = "deg");
|
---|
447 | type Length = Real(final quantity = "Length", final unit = "m");
|
---|
448 | type Position = Length;
|
---|
449 | type Distance = Length(min = 0);
|
---|
450 | type Radius = Length(min = 0);
|
---|
451 | type Diameter = Length(min = 0);
|
---|
452 | type AngularVelocity = Real(final quantity = "AngularVelocity", final unit = "rad/s");
|
---|
453 | type Velocity = Real(final quantity = "Velocity", final unit = "m/s");
|
---|
454 | type Acceleration = Real(final quantity = "Acceleration", final unit = "m/s2");
|
---|
455 | type Force = Real(final quantity = "Force", final unit = "N");
|
---|
456 | type Torque = Real(final quantity = "Torque", final unit = "N.m");
|
---|
457 | type FaradayConstant = Real(final quantity = "FaradayConstant", final unit = "C/mol");
|
---|
458 | end SIunits;
|
---|
459 | end Modelica;
|
---|
460 |
|
---|
461 | package VehicleInterfaces
|
---|
462 | extends Modelica.Icons.Package;
|
---|
463 |
|
---|
464 | package Icons
|
---|
465 | extends Modelica.Icons.Package;
|
---|
466 |
|
---|
467 | partial class VariantLibrary
|
---|
468 | extends Modelica.Icons.VariantsPackage;
|
---|
469 | end VariantLibrary;
|
---|
470 | end Icons;
|
---|
471 |
|
---|
472 | package Roads
|
---|
473 | extends VehicleInterfaces.Icons.VariantLibrary;
|
---|
474 |
|
---|
475 | package Interfaces
|
---|
476 | extends Modelica.Icons.InterfacesPackage;
|
---|
477 |
|
---|
478 | partial function positionBase
|
---|
479 | extends Modelica.Icons.Function;
|
---|
480 | input Real s = 0;
|
---|
481 | input Real w = 0;
|
---|
482 | output Modelica.SIunits.Position[3] r_0 = zeros(3);
|
---|
483 | end positionBase;
|
---|
484 |
|
---|
485 | partial function trackOffsetBase
|
---|
486 | extends Modelica.Icons.Function;
|
---|
487 | input Real s = 0;
|
---|
488 | input Real w = 0;
|
---|
489 | output Modelica.SIunits.Position[3] trackOffset = zeros(3);
|
---|
490 | end trackOffsetBase;
|
---|
491 |
|
---|
492 | partial function normalBase
|
---|
493 | extends Modelica.Icons.Function;
|
---|
494 | input Real s = 0;
|
---|
495 | input Real w = 0;
|
---|
496 | output Real[3] e_n_0 = {0, 0, 1};
|
---|
497 | end normalBase;
|
---|
498 |
|
---|
499 | partial function headingDirectionBase
|
---|
500 | extends Modelica.Icons.Function;
|
---|
501 | input Real s = 0;
|
---|
502 | input Real w = 0;
|
---|
503 | output Real[3] e_s_0 = {1, 0, 0};
|
---|
504 | end headingDirectionBase;
|
---|
505 |
|
---|
506 | partial function frictionCoefficientBase
|
---|
507 | extends Modelica.Icons.Function;
|
---|
508 | input Real s = 0;
|
---|
509 | input Real w = 0;
|
---|
510 | output Real mue = 1;
|
---|
511 | end frictionCoefficientBase;
|
---|
512 |
|
---|
513 | partial model Base
|
---|
514 | replaceable function position = VehicleInterfaces.Roads.Interfaces.positionBase;
|
---|
515 | replaceable function trackOffset = VehicleInterfaces.Roads.Interfaces.trackOffsetBase;
|
---|
516 | replaceable function normal = VehicleInterfaces.Roads.Interfaces.normalBase;
|
---|
517 | replaceable function headingDirection = VehicleInterfaces.Roads.Interfaces.headingDirectionBase;
|
---|
518 | replaceable function frictionCoefficient = VehicleInterfaces.Roads.Interfaces.frictionCoefficientBase;
|
---|
519 | end Base;
|
---|
520 | end Interfaces;
|
---|
521 |
|
---|
522 | model CircleRoad
|
---|
523 | extends VehicleInterfaces.Roads.Interfaces.Base(redeclare final function position = circlePosition(radius = radius, width = width), redeclare final function trackOffset = constantOffset, redeclare final function normal = circleNormal, redeclare final function headingDirection = circleHeadingDirection(radius = radius), redeclare final function frictionCoefficient = circleFrictionCoefficient(mue_fixed = mue));
|
---|
524 | parameter Boolean animation = true;
|
---|
525 | parameter Modelica.SIunits.Radius radius;
|
---|
526 | parameter Modelica.SIunits.Length width;
|
---|
527 | parameter Real mue;
|
---|
528 | parameter Modelica.Mechanics.MultiBody.Types.Color roadColor = {255, 0, 0};
|
---|
529 | constant Real pi = Modelica.Constants.pi;
|
---|
530 | protected
|
---|
531 | outer Modelica.Mechanics.MultiBody.World world;
|
---|
532 | VehicleInterfaces.Roads.Internal.VisualizeSimpleRoads roadShape(ns = 100, nw = 10, s_min = 0, s_max = 2 * pi * radius, w_min = -width / 2, w_max = width / 2, color = roadColor) if animation and world.enableAnimation;
|
---|
533 |
|
---|
534 | function r_middle
|
---|
535 | extends Modelica.Icons.Function;
|
---|
536 | input Real s = 0;
|
---|
537 | input Real radius = 1;
|
---|
538 | output Real[3] r_0 = {radius * sin(s / radius), -radius * cos(s / radius), 0};
|
---|
539 | algorithm
|
---|
540 | r_0 := {radius * sin(s / radius), -radius * cos(s / radius), 0};
|
---|
541 | end r_middle;
|
---|
542 |
|
---|
543 | function circlePosition
|
---|
544 | extends VehicleInterfaces.Roads.Interfaces.positionBase;
|
---|
545 | input Modelica.SIunits.Radius radius = 1;
|
---|
546 | input Modelica.SIunits.Length width = 1;
|
---|
547 | algorithm
|
---|
548 | r_0 := r_middle(s, radius) + w * .Modelica.Math.Vectors.normalize(r_middle(s, radius));
|
---|
549 | end circlePosition;
|
---|
550 |
|
---|
551 | function constantOffset
|
---|
552 | extends VehicleInterfaces.Roads.Interfaces.trackOffsetBase;
|
---|
553 | algorithm
|
---|
554 | trackOffset := {0, 0, 0};
|
---|
555 | end constantOffset;
|
---|
556 |
|
---|
557 | function circleNormal
|
---|
558 | extends VehicleInterfaces.Roads.Interfaces.normalBase;
|
---|
559 | algorithm
|
---|
560 | e_n_0 := {0, 0, 1};
|
---|
561 | end circleNormal;
|
---|
562 |
|
---|
563 | function circleHeadingDirection
|
---|
564 | extends VehicleInterfaces.Roads.Interfaces.headingDirectionBase;
|
---|
565 | input Modelica.SIunits.Radius radius = 1;
|
---|
566 | algorithm
|
---|
567 | e_s_0 := {cos(s / radius), sin(s / radius), 0};
|
---|
568 | end circleHeadingDirection;
|
---|
569 |
|
---|
570 | function circleFrictionCoefficient
|
---|
571 | extends VehicleInterfaces.Roads.Interfaces.frictionCoefficientBase;
|
---|
572 | input Real mue_fixed = 1;
|
---|
573 | algorithm
|
---|
574 | mue := mue_fixed;
|
---|
575 | end circleFrictionCoefficient;
|
---|
576 | end CircleRoad;
|
---|
577 |
|
---|
578 | package Internal
|
---|
579 | extends Modelica.Icons.InternalPackage;
|
---|
580 |
|
---|
581 | model VisualizeSimpleRoads
|
---|
582 | parameter Integer ns(min = 2) = 2;
|
---|
583 | parameter Integer nw(min = 2) = 2;
|
---|
584 | extends Modelica.Mechanics.MultiBody.Visualizers.Advanced.Surface(final nu = ns, final nv = nw, redeclare final function surfaceCharacteristic = roadSurfaceCharacteristic(final position = road.position, final s_min = s_min, final s_max = s_max, final w_min = w_min, final w_max = w_max));
|
---|
585 | parameter Real s_min = 0;
|
---|
586 | parameter Real s_max = 1;
|
---|
587 | parameter Real w_min = -1;
|
---|
588 | parameter Real w_max = 1;
|
---|
589 | protected
|
---|
590 | outer VehicleInterfaces.Roads.Interfaces.Base road;
|
---|
591 |
|
---|
592 | encapsulated function roadSurfaceCharacteristic
|
---|
593 | extends .Modelica.Mechanics.MultiBody.Interfaces.partialSurfaceCharacteristic(final multiColoredSurface = false);
|
---|
594 | input .VehicleInterfaces.Roads.Interfaces.positionBase position;
|
---|
595 | input Real s_min = 0;
|
---|
596 | input Real s_max = 1;
|
---|
597 | input Real w_min = -1;
|
---|
598 | input Real w_max = 1;
|
---|
599 | protected
|
---|
600 | Real s;
|
---|
601 | Real w;
|
---|
602 | Real[3] r;
|
---|
603 | parameter Real ds = s_max - s_min;
|
---|
604 | parameter Real dw = w_max - w_min;
|
---|
605 | algorithm
|
---|
606 | for j in 1:nv loop
|
---|
607 | w := w_min + (j - 1) * dw / (nv - 1);
|
---|
608 | for i in 1:nu loop
|
---|
609 | s := s_min + (i - 1) * ds / (nu - 1);
|
---|
610 | r := position(s, w);
|
---|
611 | X[i, j] := r[1];
|
---|
612 | Y[i, j] := r[2];
|
---|
613 | Z[i, j] := r[3];
|
---|
614 | end for;
|
---|
615 | end for;
|
---|
616 | end roadSurfaceCharacteristic;
|
---|
617 | end VisualizeSimpleRoads;
|
---|
618 |
|
---|
619 | model DummyTyre
|
---|
620 | parameter .Modelica.SIunits.Radius wheelRadius = 1;
|
---|
621 | input Real[3] e_axis;
|
---|
622 | input .Modelica.SIunits.Position[3] r_wheel;
|
---|
623 | output .Modelica.SIunits.Position[3] r_CP(start = {0, -wheelRadius, 0});
|
---|
624 | output .Modelica.SIunits.Length penetrationDepth;
|
---|
625 | output Real mue;
|
---|
626 | Real s(start = 0);
|
---|
627 | Real w(start = 0);
|
---|
628 | outer VehicleInterfaces.Roads.Interfaces.Base road;
|
---|
629 | protected
|
---|
630 | Real[3] e_n;
|
---|
631 | Real[3] e_s;
|
---|
632 | Real[3] e_w;
|
---|
633 | Real[3] e_CP;
|
---|
634 | Real[3] d_CP;
|
---|
635 | Modelica.SIunits.Radius reducedRadius;
|
---|
636 | equation
|
---|
637 | r_CP = road.position(s, w);
|
---|
638 | e_n = road.normal(s, w);
|
---|
639 | e_s = road.headingDirection(s, w);
|
---|
640 | e_w = cross(e_n, e_s);
|
---|
641 | e_CP = .Modelica.Math.Vectors.normalize(e_n - e_n * e_axis * e_axis);
|
---|
642 | d_CP = r_wheel - r_CP;
|
---|
643 | reducedRadius = e_n * d_CP / (e_n * e_CP);
|
---|
644 | penetrationDepth = wheelRadius - reducedRadius;
|
---|
645 | 0 = e_s * d_CP - reducedRadius * (e_s * e_CP);
|
---|
646 | 0 = e_w * d_CP - reducedRadius * (e_w * e_CP);
|
---|
647 | mue = road.frictionCoefficient(s, w);
|
---|
648 | end DummyTyre;
|
---|
649 |
|
---|
650 | model CheckContactCalculation
|
---|
651 | extends Modelica.Icons.Example;
|
---|
652 | parameter Real wheelRadius = 1;
|
---|
653 | Real phi;
|
---|
654 | Real radius_wheel;
|
---|
655 | Real[3] axis_wheel;
|
---|
656 | Real[3] r_circle = {road.radius * sin(phi), -road.radius * cos(phi), 0};
|
---|
657 | VehicleInterfaces.Roads.Internal.DummyTyre tyre(wheelRadius = wheelRadius, e_axis = Modelica.Math.Vectors.normalize(axis_wheel), r_wheel = {radius_wheel * sin(phi), -radius_wheel * cos(phi), 1 + sin(phi) / 20});
|
---|
658 | inner VehicleInterfaces.Roads.CircleRoad road(radius = 50, width = 8, mue = 0.5, roadColor = {100, 100, 100});
|
---|
659 | inner Modelica.Mechanics.MultiBody.World world(enableAnimation = true, axisLength = 20, n = {0, 0, -1});
|
---|
660 | equation
|
---|
661 | phi = time;
|
---|
662 | radius_wheel = road.radius + road.radius / 20 * sin(20 * phi);
|
---|
663 | axis_wheel = {sin(phi), -cos(phi), sin(10 * phi) / 10};
|
---|
664 | end CheckContactCalculation;
|
---|
665 | end Internal;
|
---|
666 | end Roads;
|
---|
667 | end VehicleInterfaces;
|
---|
668 |
|
---|
669 | model CheckContactCalculation
|
---|
670 | extends VehicleInterfaces.Roads.Internal.CheckContactCalculation;
|
---|
671 | annotation(experiment(StopTime = 6.2));
|
---|
672 | end CheckContactCalculation;
|
---|