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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500 | # 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.
mission lineCaptureHoming {
"""
Home to transponder while maintaining altitude. The mission sequence:
(*) Start (1) Midcourse guidance: nav to target WP while querying
transponder (2) Terminal guidance: home to target using DUSBL tracking
data, fire up SCPI when in range (4) Dock: final approach using fixed
heading (5) Rollout: break off from dock, then nav back to start wp or
move away from the target at the last commanded heading (*) repeat Note:
since there's a possibility that no altitude reading will be available
form the surface (e.g., when the bottom is out of DVL range), the
vehicle first descends from the surface to a commanded depth and then
starts following the commanded altitude.
"""
arguments {
# Define mission arguments
MissionTimeout = 4 hour
"""
Maximum length of mission
"""
Repeat = 1 count
"""
Number of times the vehicle should try to cycle through the homing
sequence.
"""
DockLat = 36.7436 degree
"""
Latitude of docking station waypoint.
"""
DockLon = -121.8800 degree
"""
Longitude of docking station waypoint.
"""
StartLat = NaN degree
"""
Latitude of docking sequance start waypoint. The vehicle navigates back
to this waypoint at the end of each homing attempt. If set to NaN, the
vehicle moves away from the target at the last commanded heading until
*RolloutTime* has passed.
"""
StartLon = NaN degree
"""
Longitude of docking sequance start waypoint. The vehicle navigates back
to this waypoint at the end of each homing attempt. If set to NaN, the
vehicle moves away from the target at the last commanded heading until
*RolloutTime* has passed.
"""
TerminalRange = 650.0 meter
"""
Range at which the vehicle should switch from navigating to the dock wp
and start homing to the target using DUSBL tracking data. Max is ??
meters due to DUSBL ???.
"""
ArmRange = 40.0 meter
"""
Range to deploy the whiskers, open the latch, and activate the camera.
"""
DockRange = 1.0 meter
"""
Range from dock to stop commanding heading.
"""
TerminalGuidanceTimeout = 30 minute
"""
Maximum time duration for running in terminal guidance mode.
"""
DockTimeout = 60 second
"""
Maximum time duration for running in Dock lockout mode.
"""
UpdateNav = false
"""
When true, the mission updates the vehicle's position to DockLat/Lon
when it comes within *DockRange* from the transponder.
"""
WaitOnDockTimeout = 90 second
"""
Time duration to wait on the dock after a successful line capture.
"""
RolloutDistance = 150 meter
"""
Distance to move away from the target (rollout) in response to missing
the target.
"""
RolloutTime = 5 minute
"""
Drive on your last heading for this long after detaching from the dock.
This argument is *ignored* if start Lat/Lon are specified.
"""
InitDepth = 20 meter
"""
Initial depth. The vehicle will dive to this depth when leaving the
surface. Necessary if no altitude reading is available form the surface
(e.g., when the bottom is out of DVL range).
"""
InitDepthTimeout = 30 minute
"""
Maximum time duration for the vehicle to reach the initial depth. The
vehicle will switch over to altitude following after the timeout is
expired.
"""
TransponderCode = 2 count
"""
Transponder Address.
"""
TrackingUpdatePeriod = 2.5 second
"""
How long to wait between acoustic queries.
"""
NumberOfPings = 1 count
"""
Number of pings requested each time.
"""
KpHeading = 0.8 none
"""
Heading proportional gain to use during Terminal Homing.
"""
KiHeading = 0.002 reciprocal_second
"""
Heading Integral gain to use during Terminal Homing.
"""
KpHeadingFinal = 1.6 none
"""
Heading proportional gain to use during Final Approach.
"""
KiHeadingFinal = 0.004 reciprocal_second
"""
Heading Integral gain to use during Final Approach.
"""
RudderDeadband = 0.05 arcdeg
"""
Degree of rounding in rudder command output values to use during
Terminal Homing.
"""
Verbose = true
"""
Send LineCapture/Undock syslog messages to shore.
"""
}
output {
# Mission Variables (don't change)
HomingActive = true
"""
Mission variable (don't change). The mission sets this to true when the
vehicle is homing.
"""
Docked = false
"""
Mission variable (don't change). The mission sets this to true to
indicate a successful line capture.
"""
DockingDepth = 25 meter
"""
Mission variable (don't change). The mission sets this to the vehicle's
depth following a successful line capture.
"""
DiveMode = 0 count
"""
Mission variable (don't change). The mission sets this variable to
switch between dive modes.
"""
MaintainAltitude = 2 count
"""
Mission variable (don't change). The mission will run in this mode to
dive the vehicle at a commanded altitude.
"""
WaitOnDock = 3 count
"""
Mission variable (don't change). The mission will run in this mode to
maintatin depth while the vehicle is latched on the dock.
"""
DetachFromDock = 4 count
"""
Mission variable (don't change). The mission will run in this mode to
drift away from the dock after is unlatched.
"""
}
# Mission timeout
timeout duration=MissionTimeout
# Add track acoustic contact directive high in the stack.
aggregate TrackTransponder {
run while ( HomingActive )
behavior Estimation:TrackAcousticContact {
run in parallel
set contactLabelSetting = TransponderCode
set numberOfSamplesSetting = NumberOfPings
set updatePeriodSetting = TrackingUpdatePeriod
}
}
# Set default mass position
behavior Guidance:Mass {
run in parallel
set position = Control:VerticalControl.massDefault
}
# Callable aggregates (priority matters, so these are done below important safety directives
aggregate DiveCmd {
"""
Called when the vehicle should be underwater. Arbitrates between 3
dive modes: 1) descend from the surface to initial depth. 2) follow
commanded altitude. 3) drift away from dock to initial depth.
"""
run when ( called )
aggregate DockHold {
"""
Wait on dock after vehicle latches.
"""
run while ( DiveMode == WaitOnDock )
aggregate dive {
run in parallel
behavior Guidance:SetSpeed {
run in parallel
set speed = 0 meter_per_second
}
behavior Guidance:Pitch {
run in parallel
set depth = DockingDepth
}
}
}
aggregate DriftAwayFromDock {
"""
Drift away from the dock after vehicle unlatches.
"""
run while ( DiveMode == DetachFromDock )
aggregate dive {
run in sequence
behavior Guidance:SetSpeed {
run in parallel
set speed = 0 meter_per_second
}
behavior Guidance:Pitch {
run in sequence
timeout duration=InitDepthTimeout {
syslog important "Timed out while trying to detach from dock at current depth of "
+ Universal:depth~meter + "."
behavior Guidance:Execute {
run in sequence
set command = "stop"
}
}
set depth = InitDepth
}
assign in sequence DiveMode = MaintainAltitude
}
}
}
# Start mission sequence.
aggregate Lap {
run in sequence repeat=Repeat
syslog important "Initiating homing sequence."
assign in sequence HomingActive = true
aggregate MidcourseGuidance {
"""
Navigate toward the dock waypoint while querying the dock
transponder. Continue until you approach within *TerminalRange*,
then move on to the next aggregate.
"""
run in sequence
break if (
Estimation:TrackAcousticContact.range_to_contact < TerminalRange
)
behavior Guidance:Waypoint {
run in sequence
set latitude = DockLat
set longitude = DockLon
}
}
aggregate TerminalGuidance {
"""
Move toward the target using DUSBL tracking data and update the
commanded heading with each cycle, activate SCPI when in range.
Continue until you're within *DockRange*, then move on to the
next aggregate.
"""
run in sequence
assign in parallel Control:HorizontalControl.rudDeadband = RudderDeadband
syslog important "Terminal guidance at range: "
+ Estimation:TrackAcousticContact.range_to_contact~meter + "."
assign in sequence Docked = true
behavior Dock:LineCapture {
run in sequence
timeout duration=TerminalGuidanceTimeout {
assign in sequence Docked = false
syslog important "Timed out while trying to dock at range: "
+ Estimation:TrackAcousticContact.range_to_contact~meter + "."
}
set armRange = ArmRange
set lockoutRange = DockRange
set interceptTimeout = DockTimeout
set rolloutDistance = RolloutDistance
set kpHeadingTerminalGuidance = KpHeading
set kiHeadingTerminalGuidance = KiHeading
set kpHeadingFinalApproach = KpHeadingFinal
set kiHeadingFinalApproach = KiHeadingFinal
set verbose = Verbose
}
aggregate Dock {
run in sequence
break if ( not ( Docked ) )
# Hold at the current depth while latched on the line
assign in sequence DockingDepth = Universal:depth
syslog important "Holding depth at: " + DockingDepth~meter + "."
assign in sequence DiveMode = WaitOnDock
# Dactivate homing while relaxing on the line
assign in sequence HomingActive = false
aggregate UpdateNav {
run in sequence
break if ( not ( UpdateNav ) )
behavior Dock:SetNav {
run in sequence
set latitude = DockLat
set longitude = DockLon
}
}
behavior Guidance:Wait {
run in sequence
set duration = WaitOnDockTimeout
}
aggregate BreakOffDock {
run in sequence
assign in sequence HomingActive = true
syslog important "Breaking off. Range: "
+ Estimation:TrackAcousticContact.range_to_contact~meter + "."
assign in sequence DiveMode = DetachFromDock
behavior Dock:Undock {
run in sequence
}
assign in sequence Docked = false
}
}
}
# Homing sequance complete
aggregate Rollout {
"""
Navigate back to the start waypoint or move away from the target
at the last commanded heading until *RolloutTime* has passed.
"""
run in sequence
assign in sequence Docked = false
assign in sequence HomingActive = false
# Let's make sure we're in the right dive mode
assign in sequence DiveMode = MaintainAltitude
aggregate NavToStart {
run in sequence
break if (
isNaN ( StartLat )
or ( isNaN ( StartLon ) )
)
syslog important "Rollout to start WP at range: "
+ Estimation:TrackAcousticContact.range_to_contact~meter + "."
behavior Guidance:Waypoint {
run in sequence
set latitude = StartLat
set longitude = StartLon
}
}
aggregate MaintainHeading {
run in sequence
break if (
not ( isNaN ( StartLat ) )
or ( not ( isNaN ( StartLon ) ) )
)
syslog important "Rollout at range: "
+ Estimation:TrackAcousticContact.range_to_contact~meter + "."
behavior Guidance:Wait {
run in sequence
set duration = RolloutTime
}
}
}
}
}
|