View on GitHub

im_sample_algorithm

MITRE's Interval Management Sample Algorithm. An implementation of RTCA DO-361A Appendix C.

BADA Usage Guide

Back to Landing Page

This Sample Algorithm code uses EUROCONTROL’s BADA for aircraft performance data and some calculations. But, the use of BADA data is limited and you may not need to use the same approach that we did.

For discussions of IM Speed Limiting, see also DO-361A Section 2.2.4.5.3, Appendix C.4.7, and Appendix K.

NOTE: The kinematic trajectory prediction algorithms (e.g. KinematicDescent4DPredictor.cpp) do not use BADA at all.

Code Overview of BADA Usage

As a minimum operational requirement, your algorithm implementation must limit the IM Speeds according to ownship’s flight envelope. In our implementation, we chose to use BADA’s flight envelope as a way to meet the miniumum requirements. It provided the data to help us ensure that the IM Speeds produced by the algorithm were within ownship’s speed bounds.

The significant portion of this implementation is found in IMAlgorithm::LimitImSpeedCommand():

Units::Speed IMAlgorithm::LimitImSpeedCommand(
    const Units::Speed im_speed_command_ias,
    const double reference_velocity_mps,
    const Units::Length distance_to_go_to_abp,
    const BadaWithCalc &bada_with_calc,
    const Units::Length ownship_altitude,
    const int flap_configuration,
    const Units::Speed rf_upper_limit) {

...
   // flight envelope protection
   if (limitedspeed > bada_with_calc.flight_envelope.V_mo) {
      limitedspeed = bada_with_calc.flight_envelope.V_mo;
      if (m_quantize_flag) {
         int ilimitspeed = Units::KnotsSpeed(limitedspeed).value();
         int iqthreshold = Units::KnotsSpeed(qThreshold).value();
         limitedspeed = Units::KnotsSpeed(ilimitspeed - (ilimitspeed % iqthreshold));
      }
      m_active_filter_flag |= 64;
   }

...
   // flaps deployed protection
   if (flap_configuration > 0) {
      if (flap_configuration == 1 && limitedspeed > bada_with_calc.mFlapSpeeds.VappMax) {
         limitedspeed = bada_with_calc.mFlapSpeeds.VappMax;
         m_active_filter_flag |= 512;
      } else if (flap_configuration == 2 && limitedspeed > bada_with_calc.mFlapSpeeds.VlndMax) {
         limitedspeed = bada_with_calc.mFlapSpeeds.VlndMax;
         m_active_filter_flag |= 512;
      } else if (flap_configuration == 3 && limitedspeed > bada_with_calc.mFlapSpeeds.VgearMax) {
         limitedspeed = bada_with_calc.mFlapSpeeds.VgearMax;
         m_active_filter_flag |= 512;
      }
   }

...

    }

Using this Code without BADA

External users of this code may prefer not to rely upon the BADA model for aircraft performance data. It is possible to fully remove BADA references from this code base and still get desired performance. To do so, supply an alternate data source for ownship’s flight envelope (e.g. min/max speeds under various operating conditions) and provide those instead. Pay particular attention to populating the code in IMAlgorithm::LimitImSpeedCommand().

As an alternative to BADA, one may consider using the open-source WRAP aviation data product. However no attempt has been made by MITRE to use that project. Let us know how it goes! :four_leaf_clover: