Skip to content

Maintenance/line_capture_homing_lab.tl

  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
        }
      }
    }
  }
}