...
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:
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.
Next, add a takeoff state to path manager that calls the
Either use waypoints or passby to set the throttle and move the drone.LandingTakeoffManager
to figure out Path/speed targetsUse 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
Landing Takeoff Manager:
Ideally calculate .
Velocity Waypoint Targets
Calculate ascent speed using Gaussian Profile:
https://www.desmos.com/calculator/5pmkyu7h3ttjtx8ogtno
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 | ||
---|---|---|
| ||
_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;
} |