1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155 | # Copyright (c) 2024 MBARI
# MBARI Proprietary Information. Confidential. All Rights Reserved
# Unauthorized copying or distribution of this file via any medium is strictly
# prohibited.
#
# WARNING - This file contains information whose export is restricted by the
# Export Administration Act of 1979 (Title 50, U.S.C., App. 2401 et seq.), as
# amended. Violations of these export laws are subject to severe civil and/or
# criminal penalties.
aggregate NeedComms {
arguments {
DiveInterval = 1 hour
"""
Elapsed time after most recent surfacing when vehicle will begin to
ascend to the surface again. The timing is actually based on the
variable Universal:time_fix instead of the variable
Universal:platform_communications because the latter is not toggled
until the message queue is clear. As a result, there are situations
where the vehicle might dive for the first half of a yo, then return to
the surface to continue communications, rendering the communications
timeout useless. When adjusting this parameter, do not use "set", use
Assign in a mission, or set NeedComms:DiveInterval from the command
line.
"""
WaitForPitchUp = 10 minute
"""
Extra time to wait for the vehicle to pitch up (avoid truncating a yo).
"""
SurfacePitch = 20 degree
"""
Pitch to maintain while ascending
"""
SurfaceDepthRate = NaN meter_per_second
"""
Depth rate to maintain while ascending. Set to NaN if using pitch
"""
SurfaceSpeed = 1 meter_per_second
"""
Standard speed during surfacing. Don't reduce this too much below 1 m/s
-- the elevators can stall. (At 0.5 m/s, we have observed evidence of
stall in the past.)
"""
SurfacingTimeout = 1500 second
"""
The maximum time allowed for the ascent to surface.
"""
GPSTimeout = 7 minute
"""
Maximum amount of time to spend trying to get each GPS fix.
"""
CommsTimeout = 30 minute
"""
Maximum amount of time to spend on the surface trying to communicate
before giving up, getting another GPS fix, and diving again.
"""
DoingCommsMode = 0 count
"""
Value to set DiveMode to while doing communications. The mission should set
this to its DoingComms mode value.
"""
RestoreMode = 0 count
"""
Value to restore DiveMode to after communications complete. The mission
should set this based on its desired next dive mode (e.g., YoYo or SurfaceSink).
"""
}
output {
IsActive = false
"""
True when NeedComms is actively running (doing communications).
The mission can use this to conditionally override its DiveMode.
"""
RequiredDiveMode = 0 count
"""
The dive mode that should be active. Set to DoingCommsMode when active,
then set to RestoreMode when completing so the mission's sync aggregate
can automatically restore DiveMode.
"""
}
run when (
called
or ( elapsed ( Universal:time_fix ) > ( DiveInterval + WaitForPitchUp ) )
or (
elapsed ( Universal:time_fix ) > DiveInterval
and ( Universal:platform_pitch_angle > 0 degree )
)
)
syslog info "last time_fix was: " + Universal:time_fix~epoch_second
aggregate setActive {
run in sequence
assign in sequence RequiredDiveMode = DoingCommsMode
assign in sequence IsActive = true
}
behavior Guidance:GoToSurface {
run in progression
set pitch = SurfacePitch
set depthRate = SurfaceDepthRate
set speed = SurfaceSpeed
set surfaceTimeout = SurfacingTimeout
}
readDatum {
timeout duration=GPSTimeout {
syslog important "first GPS update timeout"
}
Universal:time_fix
}
readDatum {
timeout duration=CommsTimeout {
syslog important "Comms timed out after " + CommsTimeout~minute + "minutes"
}
Universal:platform_communications
}
readDatum {
timeout duration=GPSTimeout {
syslog important "second GPS update timeout"
}
Universal:time_fix
}
aggregate setRestoreMode {
run in sequence
assign in sequence RequiredDiveMode = RestoreMode
}
aggregate setInactive {
run in sequence
assign in sequence IsActive = false
}
}
|