ICAROUS
All Classes Namespaces Files Functions Variables Enumerations Enumerator Macros Modules Pages
Public Member Functions | Private Member Functions | Private Attributes | Static Private Attributes | List of all members
larcfm::TripleBands Class Reference

#include <TripleBands.h>

Inheritance diagram for larcfm::TripleBands:
larcfm::GenericDHStateBands larcfm::ErrorReporter larcfm::GenericStateBands larcfm::GenericBands

Public Member Functions

 TripleBands (double D, const std::string &dunit, double H, const std::string &hunit, double Tnear, double Tmid, const std::string &tunit, double max_gs, const std::string &gsunit, double max_vs, const std::string &vsunit)
 
 TripleBands ()
 
void setTimeNear (double t, const std::string &unit)
 
double getTimeNear (const std::string &unit) const
 
void setTimeMid (double t, const std::string &unit)
 
double getTimeMid (const std::string &unit) const
 
void setLookaheadTime (double t, const std::string &unit)
 
double getLookaheadTime (const std::string &unit) const
 
void setTimeRange (double b, double t, const std::string &tunit)
 
double getStartTime (const std::string &unit) const
 
bool isLatLon () const
 
void setDistance (double d, const std::string &unit)
 
double getDistance (const std::string &unit) const
 
void setHeight (double h, const std::string &unit)
 
double getHeight (const std::string &unit) const
 
void setMaxGroundSpeed (double gs, const std::string &unit)
 
double getMaxGroundSpeed (const std::string &unit)
 
void setMaxVerticalSpeed (double vs, const std::string &unit)
 
double getMaxVerticalSpeed (const std::string &unit)
 
void setTrackTolerance (double trk, const std::string &unit)
 
double getTrackTolerance (const std::string &unit) const
 
void setGroundSpeedTolerance (double gs, const std::string &unit)
 
double getGroundSpeedTolerance (const std::string &unit) const
 
void setVerticalSpeedTolerance (double vs, const std::string &unit)
 
double getVerticalSpeedTolerance (const std::string &unit) const
 
void setOwnship (const std::string &id, const Position &s, const Velocity &v)
 
void setOwnshipLL (double lat, double lon, const std::string &hunit, double alt, const std::string &vunit, double trk, const std::string &trkunit, double gs, const std::string &gsunit, double vs, const std::string &vsunit)
 
void setOwnshipXYZ (double sx, double sy, const std::string &hpunit, double sz, const std::string &vpunit, double vx, double vy, const std::string &hvunit, double vz, const std::string &vvunit)
 
void addTraffic (const std::string &id, const Position &p, const Velocity &v)
 
void addTrafficLL (double lat, double lon, const std::string &hunit, double alt, const std::string &vunit, double trk, const std::string &trkunit, double gs, const std::string &gsunit, double vs, const std::string &vsunit)
 
void addTrafficXYZ (double sx, double sy, const std::string &hpunit, double sz, const std::string &vpunit, double vx, double vy, const std::string &hvunit, double vz, const std::string &vvunit)
 
void clear ()
 
int trackLength ()
 
Interval track (int i, const std::string &unit)
 
BandsRegion::Region trackRegion (int i)
 
BandsRegion::Region regionOfTrack (double trk, const std::string &unit)
 
int groundSpeedLength ()
 
Interval groundSpeed (int i, const std::string &unit)
 
BandsRegion::Region groundSpeedRegion (int i)
 
BandsRegion::Region regionOfGroundSpeed (double gs, const std::string &unit)
 
int verticalSpeedLength ()
 
Interval verticalSpeed (int i, const std::string &unit)
 
BandsRegion::Region verticalSpeedRegion (int i)
 
BandsRegion::Region regionOfVerticalSpeed (double vs, const std::string &unit)
 
std::string toString () const
 
bool hasError () const
 
bool hasMessage () const
 
std::string getMessage ()
 
std::string getMessageNoClear () const
 
- Public Member Functions inherited from larcfm::GenericBands
virtual double getMaxGroundSpeed (const std::string &unit) const =0
 
virtual double getMaxVerticalSpeed (const std::string &unit) const =0
 

Private Member Functions

Interval track (int i, double unit)
 
Interval groundSpeed (int i, double unit)
 
Interval verticalSpeed (int i, double unit)
 
void init (double D, const std::string &dunit, double H, const std::string &hunit, double Tnear, double Tmid, const std::string &tunit, double max_gs, const std::string &gsunit, double max_vs, const std::string &vsunit)
 
void recompute ()
 
void trackCompute ()
 
void groundCompute ()
 
void verticalCompute ()
 
void toArrays (Interval interval[], BandsRegion::Region intRegion[], int &size, const IntervalSet &red, const IntervalSet &amber, const IntervalSet &green)
 
void add (Interval arr[], int size, int i, const Interval &r)
 
void add (BandsRegion::Region arr[], int size, int i, BandsRegion::Region color)
 
int order (Interval arr[], int size, const Interval &n)
 

Private Attributes

BandsCore red
 
BandsCore amber
 
bool ownship
 
bool needCompute
 
IntervalSet tmp_amber
 
IntervalSet tmp_green
 
ErrorLog error
 
Position so
 
Velocity vo
 
Interval trackArray [NUM_REGIONS]
 
BandsRegion::Region trackRegionArray [NUM_REGIONS]
 
int trackSize
 
Interval groundArray [NUM_REGIONS]
 
BandsRegion::Region groundRegionArray [NUM_REGIONS]
 
int groundSize
 
Interval verticalArray [NUM_REGIONS]
 
BandsRegion::Region verticalRegionArray [NUM_REGIONS]
 
int verticalSize
 

Static Private Attributes

static const int NUM_REGIONS = 400
 

Detailed Description

Objects of class "TripleBands" compute the near term, mid term, and 'no conflict' conflict prevention (CP) bands using linear state-based preditions of ownship and (multiple) traffic aircraft positions. The bands consist of ranges of guidance maneuvers: track angles, ground speeds, and vertical speeds. If the ownship immediately executes a "no conflict" guidance maneuver and no traffic aircraft maneuvers, then the new path is conflict free (within the mid-term lookahead time). If the ownship immediately executes an "MID" guidance maneuver and no traffic aircraft maneuvers, then the new path is conflict free within the near term lookahead, but there is a conflict before the mid-term lookahead time. If the ownship immediately executes a "NEAR" guidance maneuver and no traffic aircraft maneuvers, then there will be a loss of separation within the near term lookahead time.

Note that in the case of geodetic coordinates, bands performs an internal projection of the coordinates and velocities into the Euclidean frame (see Util/Projection). An error will be logged if the distance between traffic and ownship exceeds Util.Projection.projectionMaxRange().

Disclaimer: Only the mathematical core of these algorithms have been formally verified, certain book-keeping operations have not been verified. Even with a formal verification, there will still be certain assumptions. For instance, the formal proofs use real numbers while these implementations use floating point numbers, so numerical differences could result. In addition, the geodesic computations include certain inaccuracies, especially near the earth's poles.

The basic usage is

TripleBands b(..with configuration parameters..);
b.setOwnship(position of ownship, velocity of ownship);
b.addTraffic(position of traffic, velocity of traffic);
b.addTraffic(position of traffic, velocity of traffic);
...add other aircraft...

for (int i = 0; i < b.trackLength(); i++) {
   use band information from b.track(i) and b.trackRegion(i);
}
..similar for ground speed and vertical speed bands..

When any configuration parameter is set (horizontal separation distance, etc.), any previous bands information is cleared out; therefore, all configuration parameters must be set, before any traffic aircraft information is added. For more complete example usage see the file Batch.cpp.

Constructor & Destructor Documentation

◆ TripleBands() [1/2]

larcfm::TripleBands::TripleBands ( double  D,
const std::string &  dunit,
double  H,
const std::string &  hunit,
double  Tnear,
double  Tmid,
const std::string &  tunit,
double  max_gs,
const std::string &  gsunit,
double  max_vs,
const std::string &  vsunit 
)

Construct a TripleBands object with the given configuration parameters. The bands always begin as "NONE" bands: track bands from 0 to 2pi, ground speed bands from 0 to max_gs, and vertical speed bands from -max_vs to max_vs. Both the positions and velocities of the aircraft are assumed to be in Euclidean coordinates (see setLatLon() and setTrackVelocity() to change this behavior).

Parameters
Dthe minimum horizontal separation distance [nmi]
Hthe minimum vertical separation distance [feet]
Tnearthe near-term lookahead time [s]
Tmidthe mid-term lookahead time [s]
max_gsthe maximum ground speed that is output by Bands, the minimum is 0. [knots]
max_vsthe range of vertical speeds is -max_vs to max_vs [feet/min]

◆ TripleBands() [2/2]

larcfm::TripleBands::TripleBands ( )

Construct a TripleBands object with default values for configuration parameters. These default values include: 5 nmi horizontal separation, 1000 ft vertical separation, 3 minutes for a near term lookahead time, 5 minutes for a mid-term lookahead time, 1000 knots max ground speed, 5000 fpm max vertical speed. The bands always begin as "NONE" bands: track bands from 0 to 2pi, ground speed bands from 0 to max_gs, and vertical speed bands from -max_vs to max_vs. Both the positions and velocities of the aircraft are assumed to be in Euclidean coordinates (see setLatLon() and setTrackVelocity() to change this behavior).

Member Function Documentation

◆ addTraffic()

void larcfm::TripleBands::addTraffic ( const std::string &  id,
const Position si,
const Velocity vi 
)
virtual

Add a traffic aircraft to this set of the conflict prevention bands. No traffic aircraft can be added until the ownship is set (see setOwnship()). The coordinate frame of the traffic position must be the same as that of the object.

Parameters
siposition of the traffic
vivelocity of the traffic

Implements larcfm::GenericStateBands.

◆ clear()

void larcfm::TripleBands::clear ( )
virtual

Clear all bands information.

Implements larcfm::GenericBands.

◆ getDistance()

double larcfm::TripleBands::getDistance ( const std::string &  uni) const
virtual

Returns the minimum horizontal separation distance [nmi]

Implements larcfm::GenericDHStateBands.

◆ getHeight()

double larcfm::TripleBands::getHeight ( const std::string &  unit) const
virtual

Returns the minimum vertical separation distance. [feet]

Implements larcfm::GenericDHStateBands.

◆ getLookaheadTime()

double larcfm::TripleBands::getLookaheadTime ( const std::string &  unit) const
virtual

Interface method that behaves the same as getTimeNear().

Implements larcfm::GenericBands.

◆ getMessage()

std::string larcfm::TripleBands::getMessage ( )
inlinevirtual

Return a string representation of any errors or warnings. Calling this method will clear any messages and reset both the error and warning status to none.

Returns
error and warning messages. If there are no messages, an empty string is returned.

Implements larcfm::ErrorReporter.

◆ getMessageNoClear()

std::string larcfm::TripleBands::getMessageNoClear ( ) const
inlinevirtual

Return a string representation of any errors or warnings. Calling this method will not clear the error or warning status (i.e., hasError() will return the same value before and after this call.)

Returns
error and warning messages. If there are no messages, an empty string is returned.

Implements larcfm::ErrorReporter.

◆ getStartTime()

double larcfm::TripleBands::getStartTime ( const std::string &  unit) const

Interface method that get minimum time for near bands

◆ getTimeMid()

double larcfm::TripleBands::getTimeMid ( const std::string &  unit) const

Returns the mid-term lookahead time. [s]

◆ getTimeNear()

double larcfm::TripleBands::getTimeNear ( const std::string &  unit) const

Returns the time of the near-term lookahead time. [s]

◆ groundCompute()

void larcfm::TripleBands::groundCompute ( )
private

Provide a copy of the ground speed bands [knots]. The range of ground speed bands is from 0 to max_gs.

◆ groundSpeed()

Interval larcfm::TripleBands::groundSpeed ( int  i,
const std::string &  unit 
)
virtual

Return i-th interval of the ground speed bands in the given unit.

Implements larcfm::GenericBands.

◆ groundSpeedLength()

int larcfm::TripleBands::groundSpeedLength ( )
virtual

Return the number of bands of ground speeds

Implements larcfm::GenericBands.

◆ groundSpeedRegion()

BandsRegion::Region larcfm::TripleBands::groundSpeedRegion ( int  i)
virtual

Return the region type of the i-th ground speed band. If a single time version of bands is used, then [NEAR|NONE] is returned. If a version of bands with two times is used, then [NEAR|MID|NONE] is returned.

Implements larcfm::GenericBands.

◆ hasError()

bool larcfm::TripleBands::hasError ( ) const
inlinevirtual

Does this object have an error?

Returns
true if there is an error.

Implements larcfm::ErrorReporter.

◆ hasMessage()

bool larcfm::TripleBands::hasMessage ( ) const
inlinevirtual

Does this object have an error or a warning?

Returns
true if there is an error or warning.

Implements larcfm::ErrorReporter.

◆ isLatLon()

bool larcfm::TripleBands::isLatLon ( ) const
virtual

Returns whether the aircraft positions are specified in latitude/longitude or Euclidean coordinates. If the ownship has not been set, then this value is undefined.

Implements larcfm::GenericBands.

◆ regionOfGroundSpeed()

BandsRegion::Region larcfm::TripleBands::regionOfGroundSpeed ( double  gs,
const std::string &  unit 
)
virtual

Return the region type of the given ground speed in knots, out of range speeds are returned as NEAR. If a single time version of bands is used, then [NEAR|NONE] is returned. If a version of bands with two times is used, then [NEAR|MID|NONE] is returned.

Implements larcfm::GenericBands.

◆ regionOfTrack()

BandsRegion::Region larcfm::TripleBands::regionOfTrack ( double  trk,
const std::string &  unit 
)
virtual

Return the region type of the given track angle [degrees, clockwise from true north]. An angle outside of a 0..360 degree range returns NEAR. If a single time version of bands is used, then [NEAR|NONE] is returned. If a version of bands with two times is used, then [NEAR|MID|NONE] is returned.

Implements larcfm::GenericBands.

◆ regionOfVerticalSpeed()

BandsRegion::Region larcfm::TripleBands::regionOfVerticalSpeed ( double  vs,
const std::string &  unit 
)
virtual

Return the region type of the given vertical speed [feet/min], out of range speeds are returned as red. If a single time version of bands is used, then [NEAR|NONE] is returned. If a version of bands with two times is used, then [NEAR|MID|NONE] is returned.

Implements larcfm::GenericBands.

◆ setDistance()

void larcfm::TripleBands::setDistance ( double  d,
const std::string &  unit 
)
virtual

Sets the minimum horizontal separation distance [nmi]. When this parameter is set any existing band information is cleared.

Implements larcfm::GenericDHStateBands.

◆ setHeight()

void larcfm::TripleBands::setHeight ( double  h,
const std::string &  unit 
)
virtual

Sets the minimum vertical separation distance [feet]. When this parameter is set any existing band information is cleared.

Implements larcfm::GenericDHStateBands.

◆ setLookaheadTime()

void larcfm::TripleBands::setLookaheadTime ( double  t,
const std::string &  unit 
)
virtual

Interface method that behaves the same as setTimeNear().

Implements larcfm::GenericBands.

◆ setMaxGroundSpeed()

void larcfm::TripleBands::setMaxGroundSpeed ( double  gs,
const std::string &  unit 
)
virtual

Sets the maximum ground speed that is output by Bands, the minimum is 0 [knots]. When this parameter is set any existing band information is cleared.

Implements larcfm::GenericBands.

◆ setMaxVerticalSpeed()

void larcfm::TripleBands::setMaxVerticalSpeed ( double  vs,
const std::string &  unit 
)
virtual

Sets the range of vertical speeds output by Bands, -max_vs to max_vs [fpm]. When this parameter is set any existing band information is cleared.

Implements larcfm::GenericBands.

◆ setOwnship()

void larcfm::TripleBands::setOwnship ( const std::string &  id,
const Position s,
const Velocity v 
)
virtual

Specify the ownship's position and velocity. Once the ownship is set, any existing 'band' information is cleared. This also sets the coordinate frame for this object.

Parameters
sownship position
vownship velocity

Implements larcfm::GenericStateBands.

◆ setTimeMid()

void larcfm::TripleBands::setTimeMid ( double  t,
const std::string &  unit 
)

Sets the mid-term lookahead time. It is assumed that the mid-term lookahead time is greater than or equal to the near-term lookahead time, then it is ignored [s]. Any existing bands information is cleared.

◆ setTimeNear()

void larcfm::TripleBands::setTimeNear ( double  t,
const std::string &  unit 
)

Set the near-term lookahead time [s]. Any existing bands information is cleared.

◆ setTimeRange()

void larcfm::TripleBands::setTimeRange ( double  b,
double  t,
const std::string &  tunit 
)

Interface method that sets minimum and maximum time range for near bands (only)

◆ toString()

std::string larcfm::TripleBands::toString ( ) const
virtual

Return a string representing this object

Implements larcfm::GenericBands.

◆ track()

Interval larcfm::TripleBands::track ( int  i,
const std::string &  unit 
)
virtual

Return the i-th interval of the track bands in the given unit.

Implements larcfm::GenericBands.

◆ trackCompute()

void larcfm::TripleBands::trackCompute ( )
private

Provide a copy of the track angle bands. The angles are in 'compass' angles: 0 to 360 degrees, counter-clockwise from true north.

◆ trackLength()

int larcfm::TripleBands::trackLength ( )
virtual

Return the number of bands of track angles

Implements larcfm::GenericBands.

◆ trackRegion()

BandsRegion::Region larcfm::TripleBands::trackRegion ( int  i)
virtual

Return the region type of the i-th track band. If a single time version of bands is used, then [NEAR|NONE] is returned. If a version of bands with two times is used, then [NEAR|MID|NONE] is returned.

Implements larcfm::GenericBands.

◆ verticalCompute()

void larcfm::TripleBands::verticalCompute ( )
private

Provide a copy of the vertical speed bands [feet/min]. The range of vertical speeds is -max_vs to max_vs.

◆ verticalSpeed()

Interval larcfm::TripleBands::verticalSpeed ( int  i,
const std::string &  unit 
)
virtual

Return the i-th interval of the vertical speed band in the given unit.

Implements larcfm::GenericBands.

◆ verticalSpeedLength()

int larcfm::TripleBands::verticalSpeedLength ( )
virtual

Return the number of bands of vertical speeds

Implements larcfm::GenericBands.

◆ verticalSpeedRegion()

BandsRegion::Region larcfm::TripleBands::verticalSpeedRegion ( int  i)
virtual

Return the region type of the i-th vertical speed band. If a single time version of bands is used, then [NEAR|NONE] is returned. If a version of bands with two times is used, then [NEAR|MID|NONE] is returned.

Implements larcfm::GenericBands.


The documentation for this class was generated from the following file: