ICAROUS
|
#include <TripleBands.h>
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 |
![]() | |
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 |
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
.
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).
D | the minimum horizontal separation distance [nmi] |
H | the minimum vertical separation distance [feet] |
Tnear | the near-term lookahead time [s] |
Tmid | the mid-term lookahead time [s] |
max_gs | the maximum ground speed that is output by Bands, the minimum is 0. [knots] |
max_vs | the range of vertical speeds is -max_vs to max_vs [feet/min] |
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).
|
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.
si | position of the traffic |
vi | velocity of the traffic |
Implements larcfm::GenericStateBands.
|
virtual |
Clear all bands information.
Implements larcfm::GenericBands.
|
virtual |
Returns the minimum horizontal separation distance [nmi]
Implements larcfm::GenericDHStateBands.
|
virtual |
Returns the minimum vertical separation distance. [feet]
Implements larcfm::GenericDHStateBands.
|
virtual |
Interface method that behaves the same as getTimeNear().
Implements larcfm::GenericBands.
|
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.
Implements larcfm::ErrorReporter.
|
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.)
Implements larcfm::ErrorReporter.
double larcfm::TripleBands::getStartTime | ( | const std::string & | unit | ) | const |
Interface method that get minimum time for near bands
double larcfm::TripleBands::getTimeMid | ( | const std::string & | unit | ) | const |
Returns the mid-term lookahead time. [s]
double larcfm::TripleBands::getTimeNear | ( | const std::string & | unit | ) | const |
Returns the time of the near-term lookahead time. [s]
|
private |
Provide a copy of the ground speed bands [knots]. The range of ground speed bands is from 0 to max_gs.
|
virtual |
Return i-th interval of the ground speed bands in the given unit.
Implements larcfm::GenericBands.
|
virtual |
Return the number of bands of ground speeds
Implements larcfm::GenericBands.
|
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.
|
inlinevirtual |
|
inlinevirtual |
Does this object have an error or a warning?
Implements larcfm::ErrorReporter.
|
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.
|
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.
|
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.
|
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.
|
virtual |
Sets the minimum horizontal separation distance [nmi]. When this parameter is set any existing band information is cleared.
Implements larcfm::GenericDHStateBands.
|
virtual |
Sets the minimum vertical separation distance [feet]. When this parameter is set any existing band information is cleared.
Implements larcfm::GenericDHStateBands.
|
virtual |
Interface method that behaves the same as setTimeNear().
Implements larcfm::GenericBands.
|
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.
|
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.
|
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.
s | ownship position |
v | ownship velocity |
Implements larcfm::GenericStateBands.
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.
void larcfm::TripleBands::setTimeNear | ( | double | t, |
const std::string & | unit | ||
) |
Set the near-term lookahead time [s]. Any existing bands information is cleared.
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)
|
virtual |
Return a string representing this object
Implements larcfm::GenericBands.
|
virtual |
Return the i-th interval of the track bands in the given unit.
Implements larcfm::GenericBands.
|
private |
Provide a copy of the track angle bands. The angles are in 'compass' angles: 0 to 360 degrees, counter-clockwise from true north.
|
virtual |
Return the number of bands of track angles
Implements larcfm::GenericBands.
|
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.
|
private |
Provide a copy of the vertical speed bands [feet/min]. The range of vertical speeds is -max_vs to max_vs.
|
virtual |
Return the i-th interval of the vertical speed band in the given unit.
Implements larcfm::GenericBands.
|
virtual |
Return the number of bands of vertical speeds
Implements larcfm::GenericBands.
|
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.