The Lambert orbital transfer provides a way to transfer from one elliptical orbit to another, even when the destination orbit does not share the same inclination. It allows more complex transfers than are available with Hohmann or bi-elliptic transfers both of which assume circular, co-planar orbits.
Conceptually, the Lambert problem is simply stated: “What is the orbital path that connects two points?”. The problem has a long history and was first studied by astronomers when they were predicting the orbits of asteroids from two observations. (In that scenario, there is an additional constraint, since the orbit must also match the time the object required to move between the points).
Lambert algorithms are described in detail in “Fundamentals of Astrodynamics and Applications”, David Vallado, Space Technology Library. 4th Edition) – hereafter Vallado.
Gravity engine implements a Lambert calculation that can be used in two ways:
- Find the minimum energy Lambert transfer between two points and determine the time for the transfer.
- Find the transfer given the two points AND the requirement that the transfer take a specific time. For some times the transfer will be a hyperbola or may not be possible.
TransferShip
In GE 4.0 and later the preferred implementation of a Lambert transfer is via the TransferShip component with one of the Lambert transfers selected. This component is attached to the ship that will be doing the orbit transfer. Depending on the sub-type of Lambert transfer selected the specific arguments may differ. Most of the Lambert transfers offer a TimeFactor field. By default a Lambert transfer will use the time for the minimum energy transfer. The time factor is a multiplier applied to this time factor. Values less than one result in a faster transfer, values greater a slower transfer. Note that the minimum energy orbit is not necessarily the transfer with minimum dV. The LAMBERT_MINDVSQ transfer uses an approximate algorithm to find the least possible dV transfer and in this case the transfer time is not adjustable.
Depending on the Lambert sub-type additional information will be requested in the inspector:
- LAMBERT_POINT: Requires a target point
- LAMBERT_ORBIT: Requires an OrbitUniversal for the target orbit (typically from an OrbitPredictor) and the phase on the orbit to transfer to
- LAMBERT_INTERCEPT: An NBody the transfer should intercept
- LAMBERT_RDVS: An NBody to rendezvous with
Controllers that interact with the TransferShip component can be found in the Transfers-Lambert folder in Scenes/Demos/Scenes.
Internal Implementation
Lambert transfers are computed by the LambertUniversal class (an extension of the OrbitTransfer class). As with most OrbitTransfer extensions the constructor takes a pair of OrbitData objects that designate the to and from orbits:
lambertUniversal = new LambertUniversal(shipData, targetData);
The constructor uses the Lambert Minimum energy algorithm to determine the minimum energy transfer (from Vallado) and determines the time required for this transfer. This time can be retrieved from a member variable:
// use the t_min determined by the constructor transferTime = lambertUniversal.t_min;
If a specific transfer time is required the required transfer can be computed via a member of the class:
const bool reverse = false; const bool df = false; const int nrev = 0; int error = lambertUniversal.ComputeXfer(reverse, df, nrev, transferTime);
The parameters are:
- reverse:
- df:
- nrev: Number of revolutions to accomplish the transfer
- transferTime: desired time for the transfer (in physics time/GE internal time units)
A non-zero error code will be returned if there is no solution.
The maneuvers required can then be retrieved with GetManeuvers() in the usual way for orbit transfers.
LambertXfer Demo Scenes
There are two demo scenes to illustrate this feature. They differ only in the choice of units for the GravityEngine: one is dimensionless the other uses solar units.
These scenes have a new Controller class, LambertDemoController, to allow the Lambert transfer to be explored in an interactive way. The scene presents several target orbits. The keybindings of the controller are:
- N: select the next orbit as target (use N to cycle through target orbits)
- M: Maneuver to the selected ellipse
- A/D: move the point on the target orbit to maneuver to
- X: execute the maneuver