Skip to content

Engineering/control_test_straight.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
#   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 control_test_straight {
  """
  Vehicle drives towards the specified waypoint or at the specified heading
  spending a fixed duration at each of up to five depths, using some
  combination of actuators for control.
  """

  arguments {
    MissionTimeout = 1 hour
      """
      Maximum duration of mission.
      """

    Repeat = 1 count
      """
      Number of times the vehicle should try to cycle through depths.
      """

    Lat = NaN degree
      """
      Latitude of waypoint. Uses heading if NaN.
      """

    Lon = NaN degree
      """
      Longitude of waypoint. Uses heading if NaN.
      """

    Heading[1..5] = NaN degree
      """
      If waypoint is NaN, absolute heading at which to drive for leg {$}.
      """

    LegDuration = 10 minute
      """
      Duration of each leg.
      """

    Depth[1..5] = NaN meter
      """
      Depth of leg {$}. NaN to skip leg.
      """

    Speed[1..5] = 1 meter_per_second
      """
      Speed of leg {$}.
      """

    UseElevators = true
      """
      Whether or not to use elevators for control
      """

    ElevatorDefault = 0 degree
      """
      Elevator setpoint if UseElevators is false
      """

    UseMass = false
      """
      Whether or not to use mass for control
      """

    MassDefault = Control:VerticalControl.massDefault
      """
      Mass setpoint if UseMass is false
      """

    UseBuoyancy = false
      """
      Whether or not to use buoyancy for control
      """

    BuoyancyDefault = Control:VerticalControl.buoyancyNeutral
      """
      Buoyancy setpoint if UseBuoyancy is false
      """

    SinkOffSurface = false
      """
      If true, use buoyancy only to decend to SinkDepth before driving to first target depth
      """

    SinkDepth = 3 meter
      """
      Initial depth to decend using only buoyancy before driving
      """

    SinkDepthTimeout = 10 minute
      """
      Max wait time for the vehicle to reach the target depth
      """

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

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

    NeedCommsTime = 1 hour
      """
      How often to surface for comms. Will interrupt legs, should probably equal MissionTimeout.
      """
  }

  output {
    ReachedWaypoint = false

    DoingComms = false

    NeedsSink = SinkOffSurface
  }

  timeout duration=MissionTimeout

  # Run science, because why not.
  insert Insert/Science.tl

  insert id="NeedComms" Insert/NeedComms.tl

  insert Insert/StandardEnvelopes.tl

  assign in sequence StandardEnvelopes:MinAltitude = MinAltitude

  assign in sequence StandardEnvelopes:MaxDepth = MaxDepth

  insert Insert/BackseatDriver.tl

  insert Insert/PowerOnly.tl

  call id="StartingMission" refId="NeedComms"

  aggregate SurfaceComms {
    run when (
      called
      or ( elapsed ( Universal:time_fix ) > NeedCommsTime )
    )

    assign in sequence DoingComms = true

    call refId="NeedComms"

    assign in sequence DoingComms = false
    assign in sequence NeedsSink = SinkOffSurface
  }

  aggregate DoSink {
    run when ( called )

    break if ( not SinkOffSurface )

    # Fix fixed vertical control actuators
    behavior Guidance:Buoyancy id="BuoyancyHold" {
      run while ( NeedsSink )

      set position = NaN cc
    }

    behavior Guidance:SetSpeed {
      run while ( NeedsSink )

      set speed = 0 m/s
    }

    syslog info "Sinking to " + SinkDepth~meter

    behavior Guidance:Pitch {
      run in sequence

      timeout duration=SinkDepthTimeout {
        syslog important "Timed out while trying to reach target sink depth at current depth of "
             + Universal:depth~meter
      }

      set depth = SinkDepth
    }

    assign in sequence NeedsSink = false
  }

  # Set up fixed waypoint control, heading can be varied by leg
  aggregate UseWaypoint {
    run while (
      not isNaN ( Lat )
      and not isNaN ( Lon )
      and not ReachedWaypoint
    )

    behavior Guidance:Waypoint {
      run in sequence

      set latitude = Lat
      set longitude = Lon
    }

    assign in sequence ReachedWaypoint = true
  }

  # Fix fixed vertical control actuators
  behavior Guidance:Buoyancy id="BuoyancyHold" {
    run while (
      not UseBuoyancy
      and not NeedsSink
    )

    set position = BuoyancyDefault
  }

  behavior Guidance:Pitch id="MassHold" {
    run while ( not UseMass )

    set massPosition = MassDefault
  }

  behavior Guidance:Pitch id="ElevatorHold" {
    run while ( not UseElevators )

    set elevatorAngle = ElevatorDefault
  }

  # Vary leg depths and speeds
  aggregate Lap {
    run in sequence repeat=Repeat

    break if ( ReachedWaypoint )

    aggregate InitialSink {
      run while (
        NeedsSink
        and not DoingComms
      )

      call refId="DoSink"
    }

    macro $i = 1..5 {
      aggregate Leg$i {
        run in sequence

        break if (
          isNaN ( Depth[$i] )
          or ReachedWaypoint
        )

        syslog info "Running leg at depth" + Depth[$i]~meter

        behavior Guidance:Point {
          run while (
            isNaN ( Lat )
            and isNaN ( Lon )
            and not isNaN ( Heading[$i] )
          )

          set heading = Heading[$i]
        }

        behavior Guidance:SetSpeed {
          run in parallel

          set speed = Speed[$i]
        }

        behavior Guidance:Pitch {
          run in parallel

          set depth = Depth[$i]
        }

        behavior Guidance:Wait {
          run in sequence

          timeout duration=LegDuration
        }
      }
    }
  }
}