Skip to content

Engineering/sink.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
#   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 sink {
  arguments {
    MissionTimeout = 2 hour
      """
      Maximum duration of mission.
      """

    Depth = 20 meter
      """
      Target depth
      """

    DepthDeadband = 1 meter
      """
      How much vertical drift from the specified depth is allowed during the
      mission.
      """

    SurfaceThreshold = 2.5 meter
      """
      Surface threshold depth, relevant only to the ascent.
      """

    WaitToFloat = 20 minute
      """
      Timeout for reaching surface threshold on float ascent, vehicle will drive up when
      reached
      """

    TargetDepthTimeout = 20 minute
      """
      Maximum wait time for the vehicle to reach the target depth.
      """

    DoBallastAndTrim = true
      """
      If true, run B&T, if false, just sit at depth.
      """

    BTSettleTime = 10 minute
      """
      If running B&T, how long to wait after reaching target depth before starting
      """

    EstimationTimeout = 45 minute
      """
      If running B&T, timeout for estimation.
      """

    MinEstimationTime = 10 minute
      """
      If running B&T, minimum time to run estimation before determining convergence
      (must be shorter than timeout).
      """

    MassEstimationErrorBound = 0.5 millimeter
      """
      If running B&T, desired range of the estimated sample mean from the true
      mean statistic (smaller values take longer to converge).
      """

    BuoyEstimationErrorBound = 25 cubic_centimeter
      """
      If running B&T, desired range of the estimated sample mean from the true
      mean statistic (smaller values take longer to converge).
      """

    EstimationConfidence = 98 percent
      """
      If running B&T, confidence level that the estimator has reached the desired
      error range (larger values take longer to converge).
      """

    MinAltitude = 5 meter
      """
      Minimum height above the sea floor for the entire mission.
      """

    MaxDepth = 30 meter
      """
      Maximum depth for the entire mission.
      """

    MinOffshore = 2 kilometer
      """
      Minimum offshore distance for the entire mission.
      """
  }

  timeout duration=MissionTimeout

  insert Insert/Science.tl

  insert id="NeedComms" Insert/NeedComms.tl
  assign in sequence NeedComms:DiveInterval = MissionTimeout

  insert Insert/StandardEnvelopes.tl
  assign in sequence StandardEnvelopes:MinAltitude = MinAltitude
  assign in sequence StandardEnvelopes:MaxDepth = MaxDepth
  assign in sequence StandardEnvelopes:MinOffshore = MinOffshore

  insert Insert/BackseatDriver.tl

  insert Insert/PowerOnly.tl

  call id="StartingMission" refId="NeedComms"

  aggregate RunSink {
    run in sequence

    insert Insert/BallastAndTrim.tl {
      redefineArg InsertDepthDeadband = DepthDeadband
      redefineArg InsertApproachDepthTimeout = TargetDepthTimeout
      redefineArg InsertSettleTime = BTSettleTime
      redefineArg EstTimeout = EstimationTimeout
      redefineArg MinEstTime = MinEstimationTime
      redefineArg MassEstErrorBound = MassEstimationErrorBound
      redefineArg BuoyEstErrorBound = BuoyEstimationErrorBound
      redefineArg EstConfidence = EstimationConfidence
    }

    aggregate RunBallastAndTrim {
      run in sequence

      break if (
        isNaN ( Depth )
        or not DoBallastAndTrim
      )

      assign in sequence BallastAndTrim:InsertDepth = Depth

      call refId="BallastAndTrim"
    }

    aggregate JustSink {
      run in sequence

      break if (
        isNaN ( Depth )
        or DoBallastAndTrim
      )

      assign in sequence BallastAndTrim:InsertDepth = Depth
      # The B&T insert will never actually invoke the B&T behavior here.
      # This is a little bit of a hack to avoid duplicating the ApproachDepth etc.
      # logic the B&T insert uses.
      assign in sequence BTSettleTime = MissionTimeout

      call refId="BallastAndTrim"
    }
  }

  aggregate Float_Up {
    """
    Float to surface instead of driving.
    """

    run in sequence

    break if ( Universal:depth < SurfaceThreshold )

    behavior Guidance:Buoyancy {
      run in parallel

      set position = Control:VerticalControl.buoyancyDefault
    }

    behavior Guidance:Wait {
      run in sequence

      set duration = WaitToFloat
    }
  }

  call id="EndingMission" refId="NeedComms"
}