FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
AuvSurvey.xml
1<!--
2 The AUV survey scenario, exposed for co-simulation.
3
4 This is examples/input/AuvSurvey.xml with three objects added and one connection
5 rewired, and nothing else. Read that file for the scenario itself: the site, the
6 fields, the vehicle, the autopilot gains, the undulation envelope and the
7 instruments are all documented there and are identical here.
8
9 ## The fields come from a file beside this one
10
11 The five scalar fields are ScalarField.<Name>.Model = "Parametric" and are read from
12 auv_ocean_fields.json, which lives beside the non-FMU scenario in
13 examples/input/. They are three-dimensional: a temperature and salinity front, two
14 Calanus patches, two mackerel schools, and a cod layer that is SEAFLOOR referenced
15 and so follows the rolling bottom rather than sitting at a fixed depth.
16
17 The ConfigFile path is resolved against the PROCESS working directory and not
18 against the directory of this file, and the path written below is the one that
19 works for a run started in playpen/bin, which is where FhSim and the ctest run of
20 this scenario both start. An instantiated FMU does not start there: it sets its
21 working directory to its own binaries/<platform> folder, where that path resolves
22 to nothing. That is what the autocopy export flag in AuvSurvey.fmu.yaml is for; it
23 is written there with two leading hyphens, which an XML comment may not contain. The
24 exporter
25 copies every file a model attribute names into resources/auto_copied/ and rewrites
26 the attribute to point at the copy, so the fields travel inside the FMU and the
27 path in the exported model is not the path below. Remove the flag and the model
28 loads with five unreadable field configurations.
29
30 ## Causality is inverted
31
32 The ExternalLinkStandard object's OUTPUT ports feed FhSim and therefore become FMU
33 INPUTS; its INPUT ports are fed by FhSim and become FMU OUTPUTS. That is the one
34 thing about this file which is easy to read backwards. The worked minimal example is
35 fhsim_base/examples/input/FMU/MassSpring.xml.
36
37 ## The interface
38
39 FMU inputs, both of which default to zero, meaning "do not intervene":
40
41 CruiseSpeedOverride m/s. When it is strictly positive it replaces the mission
42 control's commanded speed. At zero or below, the mission
43 control commands the speed, including the zero it commands
44 once the track is flown.
45 AbortMission A flag. Strictly positive commands zero speed immediately,
46 whatever the mission control and the override are asking
47 for. The vehicle coasts to a stop and keeps flying its
48 undulation; FhSim cannot terminate on a signal, so an abort
49 is a speed command and the host stops stepping.
50
51 FMU outputs, the vehicle state a co-simulation host needs plus one reading from each
52 instrument:
53
54 Pos, Euler, Depth, Altitude, BatteryFraction the vehicle
55 EndMission the mission control's latch
56 CtdMeasurement salinity, temperature and depth
57 SilCamConcentration, SilCamSizeMean the plankton counter
58 EchoAltitude the measured height over the seabed
59
60 Altitude appears twice on purpose and with the same name and units on both sides:
61 Auv.Altitude is the true height above the seabed, taken straight from the
62 bathymetry, and Echo.Altitude is the sounder's measurement of it. A host that wants
63 to see the sensor error subtracts one from the other, and a scenario that wants the
64 dive control to fly on the measurement instead of on the truth is a one line rewire
65 of the Dive.Altitude connection.
66
67 ## The two switches, and why no C++ was written for them
68
69 Neither input can be wired straight to a port, because there is no port on the
70 mission control that means "override the speed" and none that means "abort". Two
71 fhsim_base Signal/Switch objects express both without a new SimObject:
72
73 SpeedSelect passes CruiseSpeedOverride when CruiseSpeedOverride is positive, and
74 Mission.Speed otherwise, so zero means "leave it to the mission".
75 AbortGate passes zero when AbortMission is positive, and SpeedSelect.Out
76 otherwise.
77
78 Both are pure functions of their inputs, so they add direct feedthrough. They sit
79 between the mission control and the speed PID, which is the one place in the control
80 stack where that is harmless: the mission control has no feedthrough of its own and
81 the PID output is a member written in AcceptedStep, so the cycle around the vehicle
82 stays non algebraic.
83
84 ## The visualisers travel with it
85
86 AuvSurvey.fmu.yaml declares variants: [headless, visual], so this model is exported
87 twice and one of the two is expected to draw something. It therefore carries the same
88 three environment visualisers as examples/input/AuvSurvey.xml - the Calanus and cod
89 volumes and the temperature section - and they are documented there and beside the
90 objects below. They cost the headless variant nothing at run time: they have no
91 ports, no state and no OdeFcn, they are never stepped, and their one piece of
92 headless work is the field lookup in FinalSetup.
93
94 What this file does NOT get is a <Visualization> observer, and it does not need one.
95 It has no OBSERVERS block at all, so the legacy default set applies and a live view
96 is registered whenever one is attached. Adding an OBSERVERS block here to hold the
97 observer would silence the default FileOutput with it.
98
99 ## Stepping it
100
101 At the FMU boundary the host's communicationStepSize is an exact sampling grid, so
102 make it an integer divisor of the instrument periods: the CTD samples at 0.0625 s,
103 the SilCam frames at 0.25 s and the sounder pings at 1.0 s. 0.0625 s divides all
104 three; 0.0125 s, which is the integrator StepMax, divides all three as well, and is
105 the value a host should prefer if it can afford the exchanges.
106-->
107<Contents>
108 <OBJECTS>
109 <Lib
110 LibName = "environment"
111 SimObject = "Environment"
112 Name = "Env"
113 RandomSeed = "20240601"
114 Waves.Model = "Component"
115 Waves.NumWaves = "0"
116 Current.Model = "Constant"
117 Current.Vector = "0, 0, 0"
118
119 Bathymetry.Model = "SumOfSines"
120 Bathymetry.Depth = "140"
121 Bathymetry.NumStructures = "10"
122 Bathymetry.StructureLengthMin = "150"
123 Bathymetry.StructureLengthMax = "600"
124 Bathymetry.StructureMaxHeight = "6"
125
126 ScalarField.Names = "SeaTemperature, SeaSalinity, Calanus, Mackerel, Cod"
127
128 ScalarField.SeaTemperature.Quantity = "Temperature"
129 ScalarField.SeaTemperature.Unit = "degC"
130 ScalarField.SeaTemperature.Model = "Parametric"
131 ScalarField.SeaTemperature.ConfigFile = "../examples/input/fishery/auv_ocean_fields.json"
132 ScalarField.SeaTemperature.ConfigKey = "SeaTemperature"
133
134 ScalarField.SeaSalinity.Quantity = "Salinity"
135 ScalarField.SeaSalinity.Unit = "PSU"
136 ScalarField.SeaSalinity.Model = "Parametric"
137 ScalarField.SeaSalinity.ConfigFile = "../examples/input/fishery/auv_ocean_fields.json"
138 ScalarField.SeaSalinity.ConfigKey = "SeaSalinity"
139
140 ScalarField.Calanus.Quantity = "SpeciesConcentration"
141 ScalarField.Calanus.Unit = "kg/m^3"
142 ScalarField.Calanus.Model = "Parametric"
143 ScalarField.Calanus.ConfigFile = "../examples/input/fishery/auv_ocean_fields.json"
144 ScalarField.Calanus.ConfigKey = "Calanus"
145 ScalarField.Calanus.PropertyNames = "MassKg, LengthM, LengthStdM, TargetStrengthRefDb, RefFreqkHz, TsSlopeDbPerOctave"
146 ScalarField.Calanus.PropertyValues = "0.0000011, 0.0028, 0.0007, -38.9, 200, 12"
147
148 ScalarField.Mackerel.Quantity = "SpeciesConcentration"
149 ScalarField.Mackerel.Unit = "kg/m^3"
150 ScalarField.Mackerel.Model = "Parametric"
151 ScalarField.Mackerel.ConfigFile = "../examples/input/fishery/auv_ocean_fields.json"
152 ScalarField.Mackerel.ConfigKey = "Mackerel"
153 ScalarField.Mackerel.PropertyNames = "MassKg, LengthM, TargetStrengthRefDb, RefFreqkHz, TsSlopeDbPerOctave"
154 ScalarField.Mackerel.PropertyValues = "0.35, 0.35, -44.9, 38, 2"
155
156 ScalarField.Cod.Quantity = "SpeciesConcentration"
157 ScalarField.Cod.Unit = "kg/m^3"
158 ScalarField.Cod.Model = "Parametric"
159 ScalarField.Cod.ConfigFile = "../examples/input/fishery/auv_ocean_fields.json"
160 ScalarField.Cod.ConfigKey = "Cod"
161 ScalarField.Cod.PropertyNames = "MassKg, LengthM, TargetStrengthRefDb, RefFreqkHz, TsSlopeDbPerOctave"
162 ScalarField.Cod.PropertyValues = "2.3, 0.60, -27.5, 38, 0"
163 />
164
165 <!-- ConfigKey is given on every field even though it defaults to the field name,
166 because one JSON document holds all five entries and the mapping from an
167 XML field name to a key in that document is worth being able to read here.
168 The Cod entry is the seafloor referenced one; see the header. -->
169
170 <!-- ================================================================
171 The environment, drawn.
172
173 Three fhsim_environment visualisers, all of them standalone: they have no
174 ports and no connections, they find the Environment through the shared
175 "Environment" resource rather than by its name, and they find their field by
176 the name it is listed under in ScalarField.Names. That lookup and the
177 time-invariance check happen in VisualBakedScalarField::FinalSetup, which
178 runs in the HEADLESS binary too, so a typo in FieldName below fails the
179 regression run and not only the live view. That is deliberate.
180
181 Each one bakes its field once, at startup, into a texture and costs nothing
182 per frame afterwards, so the resolutions below are a startup cost and not a
183 frame cost. They are kept modest all the same - about 200 k cells per volume
184 against the 3.5 M of fhsim_environment's own ScalarVolumeBlobs demo - because
185 the bake is CPU work and this scenario is usually watched over software GL.
186
187 ReferenceLength is the path length AlphaRange is quoted over. The default of
188 1 m makes any ray crossing more than a few metres of visible field opaque, so
189 it is set here to the vertical scale of each structure: 20 m for the Calanus
190 band, 10 m for the thinner cod layer.
191
192 Mackerel is deliberately NOT drawn. Its field fills the whole upper 45 m and
193 would sit inside the Calanus box over its entire footprint, so the two
194 ray-marched volumes would blend into one wash and neither would be readable.
195 Adding a third <Lib> for it is a copy of the Calanus block with FieldName,
196 ColorRange and VisibleRange changed, if that is the picture wanted.
197
198 Two occlusion artefacts of VisualScalarVolume are documented and accepted
199 upstream and are not defects: a ray that passes through the seabed still
200 blends its below-seabed samples over the seafloor unless the field masks them
201 (all three species fields here set mask_below_seabed, so they do not), and
202 while the camera is INSIDE a box the fragment is depth-tested at the far box
203 face, so the seafloor erases the volume across its whole footprint. Backing
204 the camera out of the box restores it.
205 ================================================================ -->
206
207 <!-- The Calanus layer over the survey box. The band is centred at 28 m with a 9 m
208 standard deviation, so a 0..60 m box holds all of it; 1.25 m of vertical
209 spacing resolves the band, 5 m horizontally is plenty for a field that has no
210 horizontal structure worth the name inside this box. VisibleRange starts at
211 3.0e-4, just above the 1e-4 to 3e-4 background, so the ambient water is clear
212 and only the layer is drawn. -->
213 <Lib
214 LibName = "environment"
215 SimObject = "VisualScalarVolume"
216 Name = "CalanusVolume"
217 FieldName = "Calanus"
218 BoxCentre = "150, 50, 30"
219 BoxSize = "420, 260, 60"
220 Resolution = "84, 52, 48"
221 ReferenceLength = "20"
222 ColorRange = "3.0e-4, 2.2e-3"
223 VisibleRange = "3.0e-4, 2.6e-3"
224 AlphaRange = "0.02, 0.30"
225 />
226
227 <!-- The demersal cod layer. This is the one that shows what a seafloor-referenced
228 field buys: the layer is 5 m above the BOTTOM, so it rides the rolling
229 bathymetry, and the box is a flat 110..154 m slab that the layer wanders
230 through rather than a band the layer fills. 1 m of vertical spacing, because
231 the band's sigma is 2.5 m. -->
232 <Lib
233 LibName = "environment"
234 SimObject = "VisualScalarVolume"
235 Name = "CodVolume"
236 FieldName = "Cod"
237 BoxCentre = "150, 50, 132"
238 BoxSize = "420, 260, 44"
239 Resolution = "84, 52, 44"
240 ReferenceLength = "10"
241 ColorRange = "1.0e-3, 1.2e-2"
242 VisibleRange = "1.0e-3, 1.6e-2"
243 AlphaRange = "0.03, 0.45"
244 />
245
246 <!-- A vertical temperature section along the track, from the surface to the
247 seabed. It is 1900 m long and the survey box is 300 m of that on purpose: the
248 water mass front sits 1000 m out and inside the box it is very nearly a
249 constant -0.53 degC offset, so a slice cropped to the box would show the
250 thermocline and nothing else. Run north far enough and the front, and the
251 warm lens on top of it, are both in the picture, and it is then visible that
252 this mission samples one corner of a much larger structure.
253
254 It sits at the EASTERN edge of the survey box, flush with the far face of
255 the two volumes, and not down the middle of it. That is not cosmetic: the
256 slice is nearly opaque where the field is strong, so anywhere it stands
257 between the camera and the vehicle it is a wall rather than a section. At the
258 far face it is a backdrop, and from the default camera - which is south of
259 the box at East 0, looking north - it is off to the right and seen at a
260 glancing angle. 4 m by 1 m sampling is 66.5 k cells, a tenth of either
261 volume. -->
262 <Lib
263 LibName = "environment"
264 SimObject = "VisualScalarPlane"
265 Name = "TemperatureSection"
266 FieldName = "SeaTemperature"
267 Position = "600, 180, 70"
268 LocalX = "1, 0, 0"
269 LocalY = "0, 0, 1"
270 Size = "1900, 140"
271 Resolution = "475, 140"
272 ColorRange = "6.5, 9.8"
273 VisibleRange = "6.2, 10.4"
274 AlphaRange = "0.45, 0.80"
275 />
276
277 <Lib
278 LibName = "fishery"
279 SimObject = "Auv/Vehicle"
280 Name = "Auv"
281 Length = "2.0"
282 Diameter = "0.20"
283 AverageDensity = "1025"
284 Rho = "1025"
285 COG = "0, 0, 0.020"
286 AddedMass = "3.2, 58, 58, 0.1, 19, 19"
287 ThrustPerPower = "0.30"
288 MaxPropulsionPower = "120"
289 HotelPower = "15"
290 ThrusterPos = "-1.0, 0, 0"
291 AxialDragCoeff = "0.25"
292 CrossFlowDragCoeff = "1.1"
293 RollDampingLinear = "4.6"
294 RollDampingQuadratic = "1.0"
295 RudderArea = "0.016"
296 RudderAspectRatio = "1.25"
297 RudderPos = "-0.85, 0, 0"
298 RudderClMax = "0.8"
299 RudderAoaMax = "0.436"
300 RudderCd0 = "0.02"
301 RudderOswald = "0.9"
302 MaxRudderAngle = "0.35"
303 InitialBattery = "1.8e6"
304 />
305
306 <!-- A short three leg survey box: 300 m north, 100 m east, 300 m south. About
307 700 m of track, that is about 470 s at cruise, so the mission finishes well
308 inside the 600 s run and EndMission has time to latch. RecoveryPosition is
309 the last waypoint, so no return leg is added. -->
310 <Lib
311 LibName = "fishery"
312 SimObject = "Auv/UndulateMissionControl"
313 Name = "Mission"
314 WaypointsX = "300, 300, 0"
315 WaypointsY = " 0, 100, 100"
316 RecoveryPosition = "0, 100"
317 WaypointRadius = "15"
318 CruiseSpeed = "1.5"
319 BatteryAtEndOfMission = "2.7e5"
320 LoopWaypoints = "0"
321 UpdatePeriod = "1.0"
322 />
323
324 <Lib
325 LibName = "fishery"
326 SimObject = "Auv/UndulateDiveControl"
327 Name = "Dive"
328 MaxDepth = "45"
329 MinDepth = "10"
330 MinSeafloorDistance = "15"
331 DiveAngle = "0.349"
332 DepthHysteresis = "4.0"
333 UpdatePeriod = "1.0"
334 />
335
336 <!-- Heading. POSITIVE gains; Ki deliberately zero, because a symmetric vehicle
337 needs no steady rudder and an integrator winds up through the saturated part
338 of a large step. -->
339 <Lib
340 LibName = "fishery"
341 SimObject = "Trawl/PIDController"
342 Name = "HeadingPid"
343 InitOutput = "0"
344 ProportionalGain = "0.4"
345 IntegratorGain = "0"
346 DerivativeGain = "0.6"
347 MinOut = "-0.35"
348 MaxOut = "0.35"
349 MaxDerivativePart = "0.2"
350 MaxIntegratorPart = "0.1"
351 />
352
353 <!-- Pitch. NEGATIVE gains, because a positive RudderDive lowers the pitch. -->
354 <Lib
355 LibName = "fishery"
356 SimObject = "Trawl/PIDController"
357 Name = "PitchPid"
358 InitOutput = "0"
359 ProportionalGain = "-0.6"
360 IntegratorGain = "-0.05"
361 DerivativeGain = "-0.8"
362 MinOut = "-0.35"
363 MaxOut = "0.35"
364 MaxDerivativePart = "0.2"
365 MaxIntegratorPart = "0.2"
366 />
367
368 <!-- Speed. POSITIVE gains. InitOutput 30 W is the cruise feed forward for the
369 commanded 1.5 m/s; change it with CruiseSpeed. -->
370 <Lib
371 LibName = "fishery"
372 SimObject = "Trawl/PIDController"
373 Name = "SpeedPid"
374 InitOutput = "30"
375 ProportionalGain = "200"
376 IntegratorGain = "10"
377 DerivativeGain = "0"
378 MinOut = "0"
379 MaxOut = "120"
380 MaxIntegratorPart = "120"
381 />
382
383 <!-- The CTD head is on the nose, ahead of the hull wake. The time constants and
384 the noise are an SBE49 FastCAT. NoiseSeed is non zero, so the instrument is
385 realistic rather than perfect, and the hand rolled generators make it
386 reproducible across compilers all the same. -->
387 <Lib
388 LibName = "fishery"
389 SimObject = "Auv/CTD"
390 Name = "Ctd"
391 TemperatureFieldName = "SeaTemperature"
392 SalinityFieldName = "SeaSalinity"
393 MountOffset = "0.8, 0, 0"
394 SamplePeriod = "0.0625"
395 TemperatureTimeConstant = "0.07"
396 ConductivityTimeConstant = "0.06"
397 DepthTimeConstant = "0.02"
398 NoiseSeed = "7"
399 />
400
401 <!-- The silhouette camera images 1.43e-4 cubic metres per frame, so a single
402 frame is almost pure noise: at the design Calanus peak the rate is 0.22
403 particles per frame after the capture and detection efficiencies. Forty
404 frames, that is 10 s and about 15 m of track, brings it to about 9 counts
405 and a 33 percent counting error. That is why the aggregation exists. -->
406 <Lib
407 LibName = "fishery"
408 SimObject = "Auv/SilCam"
409 Name = "SilCam"
410 SpeciesFieldName = "Calanus"
411 MountOffset = "0.6, 0, 0"
412 FrameRate = "4.0"
413 FramesPerOutput = "40"
414 SampleVolume = "0.040, 0.055, 0.065"
415 CaptureEfficiency = "0.85"
416 DetectionProbability = "0.92"
417 FalsePositiveRate = "0.05"
418 SizeErrorStdRelative = "0.08"
419 NumSizeBins = "8"
420 SizeBinMin = "0.0005"
421 SizeBinMax = "0.0060"
422 NoiseSeed = "11"
423 />
424
425 <!-- MountDirection must be given. SensorFrame defaults a beam axis to body x,
426 which is 90 degrees wrong for a nadir sounder.
427
428 NoiseSeed is non zero on purpose, and it is not only about realism: with the
429 seed at zero the instrument adds no range noise, no speckle AND no noise
430 floor, and the noise floor is precisely what makes the Calanus layer
431 invisible at 38 kHz and visible at 120 and 200 kHz.
432
433 PingPeriod is 1 s rather than the 0.5 s default. One hertz is a realistic
434 survey rate, it halves a file that would otherwise reach about 7.5 MB over
435 this mission, and StepMax of 0.0125 s still puts 80 integrator steps in a
436 ping interval. MaxRangeUp is 50 m rather than 150 m because the vehicle flies
437 between 10 m and 45 m and an up beam longer than the depth samples bins
438 above the free surface; see FISH-0040. -->
439 <!-- The co-simulation boundary. Mind the inversion: outputPortNames become the
440 FMU's inputs and inputPortNames become its outputs. -->
441 <Lib
442 LibName = "base"
443 SimObject = "System/ExternalLinkStandard"
444 Name = "fmi"
445 outputPortNames = "CruiseSpeedOverride, AbortMission"
446 Initial_CruiseSpeedOverride = "0"
447 Initial_AbortMission = "0"
448 inputPortNames = "Pos, Euler, Depth, Altitude, BatteryFraction, EndMission, CtdMeasurement, SilCamConcentration, SilCamSizeMean, EchoAltitude"
449 Size_Pos = "3"
450 Size_Euler = "3"
451 Size_Depth = "1"
452 Size_Altitude = "1"
453 Size_BatteryFraction = "1"
454 Size_EndMission = "1"
455 Size_CtdMeasurement = "3"
456 Size_SilCamConcentration = "1"
457 Size_SilCamSizeMean = "1"
458 Size_EchoAltitude = "1"
459 />
460
461 <!-- Pass In1 when In2 is positive, otherwise In3. -->
462 <Lib
463 LibName = "base"
464 SimObject = "Signal/Switch"
465 Name = "SpeedSelect"
466 PortWidth = "1"
467 SwitchType = "gt"
468 />
469 <Lib
470 LibName = "base"
471 SimObject = "Signal/Switch"
472 Name = "AbortGate"
473 PortWidth = "1"
474 SwitchType = "gt"
475 />
476
477 <Lib
478 LibName = "fishery"
479 SimObject = "Auv/Echosounder"
480 Name = "Echo"
481 MountOffset = "0, 0, 0.10"
482 MountDirection = "0, 0, 1"
483 PingPeriod = "1.0"
484 MaxRangeDown = "150"
485 MaxRangeUp = "50"
486 RayStepSize = "1.0"
487 RayTolerance = "0.01"
488 SpeciesFieldNames = "Calanus, Mackerel, Cod"
489 BinSize = "1.0"
490 SvPrecision = "2"
491 FlushEveryNPings = "20"
492 WriteFile = "1"
493 FileName = "AuvSurvey_echogram.csv"
494 NoiseSeed = "13"
495 />
496 </OBJECTS>
497
498 <INTERCONNECTIONS>
499 <Connection Mission.Pos = "Auv.Pos" Mission.Battery = "Auv.Battery" Mission.Heading = "Auv.Heading"/>
500 <Connection Dive.Depth = "Auv.Depth" Dive.Altitude = "Auv.Altitude"/>
501
502 <Connection HeadingPid.Reference = "Mission.Heading" HeadingPid.Measurement = "Auv.Heading"/>
503 <Connection PitchPid.Reference = "Dive.PitchRef" PitchPid.Measurement = "Auv.Pitch"/>
504 <!-- The speed reference passes through the two override switches rather than
505 coming straight from the mission control. -->
506 <Connection SpeedSelect.In1 = "fmi.CruiseSpeedOverride"
507 SpeedSelect.In2 = "fmi.CruiseSpeedOverride"
508 SpeedSelect.In3 = "Mission.Speed"/>
509 <Connection AbortGate.In1 = "0"
510 AbortGate.In2 = "fmi.AbortMission"
511 AbortGate.In3 = "SpeedSelect.Out"/>
512 <Connection SpeedPid.Reference = "AbortGate.Out" SpeedPid.Measurement = "Auv.Speed"/>
513
514 <!-- Two cycles, neither of them algebraic: Mission, Dive and PidController all
515 return output members written only in AcceptedStep, so nothing in either
516 cycle has direct feedthrough. -->
517 <Connection
518 Auv.RudderYaw = "HeadingPid.Out"
519 Auv.RudderDive = "PitchPid.Out"
520 Auv.ThrustPower = "SpeedPid.Out"
521 Auv.ExternalForce = "0,0,0"
522 />
523
524 <!-- The instruments ride the vehicle. Each one rotates its own mount offset and
525 beam axis out of the body frame, so the pose is all they need. -->
526 <Connection Ctd.Pos = "Auv.Pos" Ctd.Quater = "Auv.Quater"/>
527 <Connection SilCam.Pos = "Auv.Pos" SilCam.Quater = "Auv.Quater"/>
528 <Connection Echo.Pos = "Auv.Pos" Echo.Quater = "Auv.Quater"/>
529
530 <!-- What the host reads back. These are the ExternalLinkStandard's INPUT ports,
531 so they are the FMU's outputs. -->
532 <Connection
533 fmi.Pos = "Auv.Pos"
534 fmi.Euler = "Auv.Euler"
535 fmi.Depth = "Auv.Depth"
536 fmi.Altitude = "Auv.Altitude"
537 fmi.BatteryFraction = "Auv.BatteryFraction"
538 fmi.EndMission = "Mission.EndMission"
539 fmi.CtdMeasurement = "Ctd.Measurement"
540 fmi.SilCamConcentration = "SilCam.Concentration"
541 fmi.SilCamSizeMean = "SilCam.SizeMean"
542 fmi.EchoAltitude = "Echo.Altitude"
543 />
544 </INTERCONNECTIONS>
545
546 <INITIALIZATION>
547 <InitialCondition
548 Auv.Pos = "0,0,20"
549 Auv.Quater = "1,0,0,0"
550 Auv.LocalVel = "1.5,0,0"
551 Auv.Omega = "0,0,0"
552 />
553 </INITIALIZATION>
554
555 <SIMULATION>
556 <Timing TStart="0" TEnd="600"/>
557 <Integrator Method="RK45_i" NumCores="1">
558 <StepControl StepMax="0.0125" StepMin="1e-8" AbsTol="1e-4" RelTol="1e-4"/>
559 </Integrator>
560 </SIMULATION>
561
562</Contents>