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
#   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
      """

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

  timeout duration=MissionTimeout

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

  insert id="NeedComms" Insert/NeedComms.tl

  assign in sequence NeedComms:DiveInterval = NeedCommsTime

  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"

  # Set up fixed waypoint control, heading can be varied by leg
  behavior Guidance:Waypoint {
    run while (
      not isNaN ( Lat )
      and not isNaN ( Lon )
    )

    set latitude = Lat
    set longitude = Lon
  }

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

    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

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

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

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