Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  • Spin up to takeoff speed (Reduce current spikes/easier on ESC & motors)

  • Automated, but can be pilot overridden

  • Transition to hover at set height (3-5m4m) if no pilot input

  • If comms loss during takeoff transition to hover in place and if timeout passes transition to landing?

  • Uneven takeoff surface

The Plan:

MVP first:

  • Add a single takeoff state to path manager that calls the LandingTakeoffManager to figure out Path/speed targets

  • At signal (Not when powered on) can lift off and ascend using a state in path manager that passes targets to attitude manager

  • At another signal transitions out of takeoff state

Later steps:

  • After ascent, transitions to a hover target

  • Update the target ground height with a sensor (Would be nice to stop assuming earth is flat)

  • Use Passby control to “spin up” motors to 20% throttle before takeoff, this reduces current spikes and increases motor longevity.

  • Use optical Flow sensor to keep waypoint targets perfectly vertical

  • On Comms Loss transition to Landing

  • Handling of fatal failures

Path Manager Component:

Call the LandingTakeoffManager to calculate the velocity at the current waypoints to follow to get to the takeoff height. Feed that data into the waypoint attitude manager

...

.

Velocity Waypoint Targets

Calculate ascent speed using Gaussian Profile:

https://www.desmos.com/calculator/ljhfyjlrvhtjtx8ogtno

To ascend to a set height (3-4m)(4m)

Math Screenshots in case Desmos link fails

...

Velocity-less design (Ideally not in use for 2023)

Uses waypoints which cannot match the smoothness of a velocity profile.

Use waypoints as targets that the drone attempts to meet at a set frequency. As drone approaches target, shorten the distance to the next waypoint to slow down drone ascent.

The profile to be used can be seen below:

https://www.desmos.com/calculator/kbamddthi9

Code Prototype:

For calculating waypoint targets during Takeoff.

Code Block
languagecpp
_PathData LandingTakeoffManager::createTakeoffWaypoint(const SFOutput_t & input)
{
    // Use current Lat/long if origin not known
    if (startLat == -1 and startLong == -1) {
        startLat = input.latitude;
        startLong = input.longitude;
    }
    _PathData desiredWaypoint;

    desiredWaypoint.latitude = startLat;
    desiredWaypoint.longitude = startLong;
    desiredWaypoint.waypointType = TAKEOFF_WAYPOINT;

    int curAltitude = input.altitude;

    desiredWaypoint.altitude = getTakeoffAltitudeTarget(curAltitude, groundHeight);

    return desiredWaypoint;
}

double LandingTakeoffManager::getTakeoffAltitudeTarget(double curAltitude, double targetAltitude)
{
    double waypointTarget;
    double targetDistance = (targetAltitude - curAltitude);
    if (targetDistance < 1.0) {
        // Final Takeoff speed of 0.1 m/s, set as waypoint targets at PM Freq
        waypointTarget = curAltitude + (0.1 / PM_FREQ);
    } else {
        // Scale ascent velocity based on 0.2 * targetDistance (Eg. 0.4 m/s at 2m away)
        // Use altitude waypoint targets geing calculated at PM Freq
        waypointTarget = droneHeight * (1.2 / PM_FREQ);
    }
    return waypointTarget;
}