1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-03-02 19:29:15 +01:00

Merge branch 'corvuscorax/OP-1036_fixed-wing-improvements' into next

This commit is contained in:
Corvus Corax 2013-07-16 13:00:22 +02:00
commit be1eb43b72
10 changed files with 97 additions and 69 deletions

View File

@ -130,7 +130,7 @@ static float northVelIntegral = 0;
static float eastVelIntegral = 0; static float eastVelIntegral = 0;
static float downVelIntegral = 0; static float downVelIntegral = 0;
static float bearingIntegral = 0; static float courseIntegral = 0;
static float speedIntegral = 0; static float speedIntegral = 0;
static float powerIntegral = 0; static float powerIntegral = 0;
static float airspeedErrorInt = 0; static float airspeedErrorInt = 0;
@ -231,7 +231,7 @@ static void pathfollowerTask(__attribute__((unused)) void *parameters)
northVelIntegral = 0; northVelIntegral = 0;
eastVelIntegral = 0; eastVelIntegral = 0;
downVelIntegral = 0; downVelIntegral = 0;
bearingIntegral = 0; courseIntegral = 0;
speedIntegral = 0; speedIntegral = 0;
powerIntegral = 0; powerIntegral = 0;
@ -255,10 +255,10 @@ static void updatePathVelocity()
VelocityStateData velocityState; VelocityStateData velocityState;
VelocityStateGet(&velocityState); VelocityStateGet(&velocityState);
// look ahead fixedwingpathfollowerSettings.HeadingFeedForward seconds // look ahead fixedwingpathfollowerSettings.CourseFeedForward seconds
float cur[3] = { positionState.North + (velocityState.North * fixedwingpathfollowerSettings.HeadingFeedForward), float cur[3] = { positionState.North + (velocityState.North * fixedwingpathfollowerSettings.CourseFeedForward),
positionState.East + (velocityState.East * fixedwingpathfollowerSettings.HeadingFeedForward), positionState.East + (velocityState.East * fixedwingpathfollowerSettings.CourseFeedForward),
positionState.Down + (velocityState.Down * fixedwingpathfollowerSettings.HeadingFeedForward) }; positionState.Down + (velocityState.Down * fixedwingpathfollowerSettings.CourseFeedForward) };
struct path_status progress; struct path_status progress;
path_progress(pathDesired.Start, pathDesired.End, cur, &progress, pathDesired.Mode); path_progress(pathDesired.Start, pathDesired.End, cur, &progress, pathDesired.Mode);
@ -384,6 +384,7 @@ static uint8_t updateFixedDesiredAttitude()
StabilizationSettingsData stabSettings; StabilizationSettingsData stabSettings;
FixedWingPathFollowerStatusData fixedwingpathfollowerStatus; FixedWingPathFollowerStatusData fixedwingpathfollowerStatus;
AirspeedStateData airspeedState; AirspeedStateData airspeedState;
SystemSettingsData systemSettings;
float groundspeedState; float groundspeedState;
float groundspeedDesired; float groundspeedDesired;
@ -397,8 +398,12 @@ static uint8_t updateFixedDesiredAttitude()
float descentspeedError; float descentspeedError;
float powerCommand; float powerCommand;
float bearingError; float bearing;
float bearingCommand; float heading;
float headingError;
float course;
float courseError;
float courseCommand;
FixedWingPathFollowerStatusGet(&fixedwingpathfollowerStatus); FixedWingPathFollowerStatusGet(&fixedwingpathfollowerStatus);
@ -408,6 +413,7 @@ static uint8_t updateFixedDesiredAttitude()
AttitudeStateGet(&attitudeState); AttitudeStateGet(&attitudeState);
StabilizationSettingsGet(&stabSettings); StabilizationSettingsGet(&stabSettings);
AirspeedStateGet(&airspeedState); AirspeedStateGet(&airspeedState);
SystemSettingsGet(&systemSettings);
/** /**
@ -424,8 +430,8 @@ static uint8_t updateFixedDesiredAttitude()
// Desired ground speed // Desired ground speed
groundspeedDesired = sqrtf(velocityDesired.North * velocityDesired.North + velocityDesired.East * velocityDesired.East); groundspeedDesired = sqrtf(velocityDesired.North * velocityDesired.North + velocityDesired.East * velocityDesired.East);
indicatedAirspeedDesired = bound(groundspeedDesired + indicatedAirspeedStateBias, indicatedAirspeedDesired = bound(groundspeedDesired + indicatedAirspeedStateBias,
fixedwingpathfollowerSettings.BestClimbRateSpeed, fixedwingpathfollowerSettings.HorizontalVelMin,
fixedwingpathfollowerSettings.CruiseSpeed); fixedwingpathfollowerSettings.HorizontalVelMax);
// Airspeed error // Airspeed error
airspeedError = indicatedAirspeedDesired - indicatedAirspeedState; airspeedError = indicatedAirspeedDesired - indicatedAirspeedState;
@ -437,32 +443,22 @@ static uint8_t updateFixedDesiredAttitude()
fixedwingpathfollowerSettings.VerticalVelMax); fixedwingpathfollowerSettings.VerticalVelMax);
descentspeedError = descentspeedDesired - velocityState.Down; descentspeedError = descentspeedDesired - velocityState.Down;
// Error condition: wind speed is higher than maximum allowed speed. We are forced backwards!
fixedwingpathfollowerStatus.Errors[FIXEDWINGPATHFOLLOWERSTATUS_ERRORS_WIND] = 0;
if (groundspeedDesired - indicatedAirspeedStateBias <= 0) {
fixedwingpathfollowerStatus.Errors[FIXEDWINGPATHFOLLOWERSTATUS_ERRORS_WIND] = 1;
result = 0;
}
// Error condition: plane too slow or too fast // Error condition: plane too slow or too fast
fixedwingpathfollowerStatus.Errors[FIXEDWINGPATHFOLLOWERSTATUS_ERRORS_HIGHSPEED] = 0; fixedwingpathfollowerStatus.Errors[FIXEDWINGPATHFOLLOWERSTATUS_ERRORS_HIGHSPEED] = 0;
fixedwingpathfollowerStatus.Errors[FIXEDWINGPATHFOLLOWERSTATUS_ERRORS_LOWSPEED] = 0; fixedwingpathfollowerStatus.Errors[FIXEDWINGPATHFOLLOWERSTATUS_ERRORS_LOWSPEED] = 0;
if (indicatedAirspeedState > fixedwingpathfollowerSettings.AirSpeedMax) { if (indicatedAirspeedState > systemSettings.AirSpeedMax) {
fixedwingpathfollowerStatus.Errors[FIXEDWINGPATHFOLLOWERSTATUS_ERRORS_OVERSPEED] = 1; fixedwingpathfollowerStatus.Errors[FIXEDWINGPATHFOLLOWERSTATUS_ERRORS_OVERSPEED] = 1;
result = 0; result = 0;
} }
if (indicatedAirspeedState > fixedwingpathfollowerSettings.CruiseSpeed * 1.2f) { if (indicatedAirspeedState > fixedwingpathfollowerSettings.HorizontalVelMax * 1.2f) {
fixedwingpathfollowerStatus.Errors[FIXEDWINGPATHFOLLOWERSTATUS_ERRORS_HIGHSPEED] = 1; fixedwingpathfollowerStatus.Errors[FIXEDWINGPATHFOLLOWERSTATUS_ERRORS_HIGHSPEED] = 1;
result = 0; result = 0;
} }
if (indicatedAirspeedState < fixedwingpathfollowerSettings.BestClimbRateSpeed * 0.8f && 1) { // The next three && 1 are placeholders for UAVOs representing LANDING and TAKEOFF if (indicatedAirspeedState < fixedwingpathfollowerSettings.HorizontalVelMin * 0.8f) {
fixedwingpathfollowerStatus.Errors[FIXEDWINGPATHFOLLOWERSTATUS_ERRORS_LOWSPEED] = 1; fixedwingpathfollowerStatus.Errors[FIXEDWINGPATHFOLLOWERSTATUS_ERRORS_LOWSPEED] = 1;
result = 0; result = 0;
} }
if (indicatedAirspeedState < fixedwingpathfollowerSettings.StallSpeedClean && 1 && 1) { // Where the && 1 represents the UAVO that will control whether the airplane is prepped for landing or not if (indicatedAirspeedState < systemSettings.AirSpeedMin) {
fixedwingpathfollowerStatus.Errors[FIXEDWINGPATHFOLLOWERSTATUS_ERRORS_STALLSPEED] = 1;
result = 0;
}
if (indicatedAirspeedState < fixedwingpathfollowerSettings.StallSpeedDirty && 1) {
fixedwingpathfollowerStatus.Errors[FIXEDWINGPATHFOLLOWERSTATUS_ERRORS_STALLSPEED] = 1; fixedwingpathfollowerStatus.Errors[FIXEDWINGPATHFOLLOWERSTATUS_ERRORS_STALLSPEED] = 1;
result = 0; result = 0;
} }
@ -487,7 +483,7 @@ static uint8_t updateFixedDesiredAttitude()
// Compute the cross feed from vertical speed to pitch, with saturation // Compute the cross feed from vertical speed to pitch, with saturation
float speedErrorToPowerCommandComponent = bound( float speedErrorToPowerCommandComponent = bound(
(airspeedError / fixedwingpathfollowerSettings.BestClimbRateSpeed) * fixedwingpathfollowerSettings.AirspeedToPowerCrossFeed[FIXEDWINGPATHFOLLOWERSETTINGS_AIRSPEEDTOPOWERCROSSFEED_KP], (airspeedError / fixedwingpathfollowerSettings.HorizontalVelMin) * fixedwingpathfollowerSettings.AirspeedToPowerCrossFeed[FIXEDWINGPATHFOLLOWERSETTINGS_AIRSPEEDTOPOWERCROSSFEED_KP],
-fixedwingpathfollowerSettings.AirspeedToPowerCrossFeed[FIXEDWINGPATHFOLLOWERSETTINGS_AIRSPEEDTOPOWERCROSSFEED_MAX], -fixedwingpathfollowerSettings.AirspeedToPowerCrossFeed[FIXEDWINGPATHFOLLOWERSETTINGS_AIRSPEEDTOPOWERCROSSFEED_MAX],
fixedwingpathfollowerSettings.AirspeedToPowerCrossFeed[FIXEDWINGPATHFOLLOWERSETTINGS_AIRSPEEDTOPOWERCROSSFEED_MAX] fixedwingpathfollowerSettings.AirspeedToPowerCrossFeed[FIXEDWINGPATHFOLLOWERSETTINGS_AIRSPEEDTOPOWERCROSSFEED_MAX]
); );
@ -567,35 +563,58 @@ static uint8_t updateFixedDesiredAttitude()
result = 0; result = 0;
} }
/**
* Calculate where we are heading and why (wind issues)
*/
bearing = attitudeState.Yaw;
heading = RAD2DEG(atan2f(velocityState.East, velocityState.North));
headingError = heading - bearing;
if (headingError < -180.0f) {
headingError += 360.0f;
}
if (headingError > 180.0f) {
headingError -= 360.0f;
}
// Error condition: wind speed is higher than airspeed. We are forced backwards!
fixedwingpathfollowerStatus.Errors[FIXEDWINGPATHFOLLOWERSTATUS_ERRORS_WIND] = 0;
if (headingError > 90.0f || headingError < -90.0f) {
// we are flying backwards
fixedwingpathfollowerStatus.Errors[FIXEDWINGPATHFOLLOWERSTATUS_ERRORS_WIND] = 1;
result = 0;
}
/** /**
* Compute desired roll command * Compute desired roll command
*/ */
if (groundspeedDesired > 1e-6f) { if (groundspeedDesired > 1e-6f) {
bearingError = RAD2DEG(atan2f(velocityDesired.East, velocityDesired.North) - atan2f(velocityState.East, velocityState.North)); course = RAD2DEG(atan2f(velocityDesired.East, velocityDesired.North));
courseError = course - heading;
} else { } else {
// if we are not supposed to move, run in a circle // if we are not supposed to move, run in a circle
bearingError = -90.0f; courseError = -90.0f;
result = 0;
} }
if (bearingError < -180.0f) { if (courseError < -180.0f) {
bearingError += 360.0f; courseError += 360.0f;
} }
if (bearingError > 180.0f) { if (courseError > 180.0f) {
bearingError -= 360.0f; courseError -= 360.0f;
} }
bearingIntegral = bound(bearingIntegral + bearingError * dT * fixedwingpathfollowerSettings.BearingPI[FIXEDWINGPATHFOLLOWERSETTINGS_BEARINGPI_KI], courseIntegral = bound(courseIntegral + courseError * dT * fixedwingpathfollowerSettings.CoursePI[FIXEDWINGPATHFOLLOWERSETTINGS_COURSEPI_KI],
-fixedwingpathfollowerSettings.BearingPI[FIXEDWINGPATHFOLLOWERSETTINGS_BEARINGPI_ILIMIT], -fixedwingpathfollowerSettings.CoursePI[FIXEDWINGPATHFOLLOWERSETTINGS_COURSEPI_ILIMIT],
fixedwingpathfollowerSettings.BearingPI[FIXEDWINGPATHFOLLOWERSETTINGS_BEARINGPI_ILIMIT]); fixedwingpathfollowerSettings.CoursePI[FIXEDWINGPATHFOLLOWERSETTINGS_COURSEPI_ILIMIT]);
bearingCommand = (bearingError * fixedwingpathfollowerSettings.BearingPI[FIXEDWINGPATHFOLLOWERSETTINGS_BEARINGPI_KP] + courseCommand = (courseError * fixedwingpathfollowerSettings.CoursePI[FIXEDWINGPATHFOLLOWERSETTINGS_COURSEPI_KP] +
bearingIntegral); courseIntegral);
fixedwingpathfollowerStatus.Error[FIXEDWINGPATHFOLLOWERSTATUS_ERROR_BEARING] = bearingError; fixedwingpathfollowerStatus.Error[FIXEDWINGPATHFOLLOWERSTATUS_ERROR_COURSE] = courseError;
fixedwingpathfollowerStatus.ErrorInt[FIXEDWINGPATHFOLLOWERSTATUS_ERRORINT_BEARING] = bearingIntegral; fixedwingpathfollowerStatus.ErrorInt[FIXEDWINGPATHFOLLOWERSTATUS_ERRORINT_COURSE] = courseIntegral;
fixedwingpathfollowerStatus.Command[FIXEDWINGPATHFOLLOWERSTATUS_COMMAND_BEARING] = bearingCommand; fixedwingpathfollowerStatus.Command[FIXEDWINGPATHFOLLOWERSTATUS_COMMAND_COURSE] = courseCommand;
stabDesired.Roll = bound(fixedwingpathfollowerSettings.RollLimit[FIXEDWINGPATHFOLLOWERSETTINGS_ROLLLIMIT_NEUTRAL] + stabDesired.Roll = bound(fixedwingpathfollowerSettings.RollLimit[FIXEDWINGPATHFOLLOWERSETTINGS_ROLLLIMIT_NEUTRAL] +
bearingCommand, courseCommand,
fixedwingpathfollowerSettings.RollLimit[FIXEDWINGPATHFOLLOWERSETTINGS_ROLLLIMIT_MIN], fixedwingpathfollowerSettings.RollLimit[FIXEDWINGPATHFOLLOWERSETTINGS_ROLLLIMIT_MIN],
fixedwingpathfollowerSettings.RollLimit[FIXEDWINGPATHFOLLOWERSETTINGS_ROLLLIMIT_MAX]); fixedwingpathfollowerSettings.RollLimit[FIXEDWINGPATHFOLLOWERSETTINGS_ROLLLIMIT_MAX]);

View File

@ -61,7 +61,7 @@
#if defined(PIOS_MANUAL_STACK_SIZE) #if defined(PIOS_MANUAL_STACK_SIZE)
#define STACK_SIZE_BYTES PIOS_MANUAL_STACK_SIZE #define STACK_SIZE_BYTES PIOS_MANUAL_STACK_SIZE
#else #else
#define STACK_SIZE_BYTES 1024 #define STACK_SIZE_BYTES 1152
#endif #endif
#define TASK_PRIORITY (tskIDLE_PRIORITY + 4) #define TASK_PRIORITY (tskIDLE_PRIORITY + 4)
@ -323,9 +323,12 @@ static void manualControlTask(__attribute__((unused)) void *parameters)
cmd.Yaw = 0; cmd.Yaw = 0;
cmd.Pitch = 0; cmd.Pitch = 0;
cmd.Collective = 0; cmd.Collective = 0;
// cmd.FlightMode = MANUALCONTROLCOMMAND_FLIGHTMODE_AUTO; // don't do until AUTO implemented and functioning if (settings.FailsafeBehavior != MANUALCONTROLSETTINGS_FAILSAFEBEHAVIOR_NONE) {
// Important: Throttle < 0 will reset Stabilization coefficients among other things. Either change this, FlightStatusGet(&flightStatus);
// or leave throttle at IDLE speed or above when going into AUTO-failsafe.
flightStatus.FlightMode = settings.FlightModePosition[settings.FailsafeBehavior - 1];
FlightStatusSet(&flightStatus);
}
AlarmsSet(SYSTEMALARMS_ALARM_MANUALCONTROL, SYSTEMALARMS_ALARM_WARNING); AlarmsSet(SYSTEMALARMS_ALARM_MANUALCONTROL, SYSTEMALARMS_ALARM_WARNING);
AccessoryDesiredData accessory; AccessoryDesiredData accessory;
@ -724,15 +727,17 @@ static void updatePathDesired(__attribute__((unused)) ManualControlCommandData *
// Simple Return To Base mode - keep altitude the same, fly to home position // Simple Return To Base mode - keep altitude the same, fly to home position
PositionStateData positionState; PositionStateData positionState;
PositionStateGet(&positionState); PositionStateGet(&positionState);
ManualControlSettingsData settings;
ManualControlSettingsGet(&settings);
PathDesiredData pathDesired; PathDesiredData pathDesired;
PathDesiredGet(&pathDesired); PathDesiredGet(&pathDesired);
pathDesired.Start[PATHDESIRED_START_NORTH] = 0; pathDesired.Start[PATHDESIRED_START_NORTH] = 0;
pathDesired.Start[PATHDESIRED_START_EAST] = 0; pathDesired.Start[PATHDESIRED_START_EAST] = 0;
pathDesired.Start[PATHDESIRED_START_DOWN] = positionState.Down - 10; pathDesired.Start[PATHDESIRED_START_DOWN] = positionState.Down - settings.ReturnToHomeAltitudeOffset;
pathDesired.End[PATHDESIRED_END_NORTH] = 0; pathDesired.End[PATHDESIRED_END_NORTH] = 0;
pathDesired.End[PATHDESIRED_END_EAST] = 0; pathDesired.End[PATHDESIRED_END_EAST] = 0;
pathDesired.End[PATHDESIRED_END_DOWN] = positionState.Down - 10; pathDesired.End[PATHDESIRED_END_DOWN] = positionState.Down - settings.ReturnToHomeAltitudeOffset;
pathDesired.StartingVelocity = 1; pathDesired.StartingVelocity = 1;
pathDesired.EndingVelocity = 0; pathDesired.EndingVelocity = 0;
pathDesired.Mode = PATHDESIRED_MODE_FLYENDPOINT; pathDesired.Mode = PATHDESIRED_MODE_FLYENDPOINT;
@ -937,6 +942,9 @@ static uint32_t timeDifferenceMs(portTickType start_time, portTickType end_time)
*/ */
static bool okToArm(void) static bool okToArm(void)
{ {
// update checks
configuration_check();
// read alarms // read alarms
SystemAlarmsData alarms; SystemAlarmsData alarms;

View File

@ -371,7 +371,7 @@ static uint8_t conditionDistanceToTarget()
if (pathAction.ConditionParameters[1] > 0.5f) { if (pathAction.ConditionParameters[1] > 0.5f) {
distance = sqrtf(powf(waypoint.Position[0] - positionState.North, 2) distance = sqrtf(powf(waypoint.Position[0] - positionState.North, 2)
+ powf(waypoint.Position[1] - positionState.East, 2) + powf(waypoint.Position[1] - positionState.East, 2)
+ powf(waypoint.Position[1] - positionState.Down, 2)); + powf(waypoint.Position[2] - positionState.Down, 2));
} else { } else {
distance = sqrtf(powf(waypoint.Position[0] - positionState.North, 2) distance = sqrtf(powf(waypoint.Position[0] - positionState.North, 2)
+ powf(waypoint.Position[1] - positionState.East, 2)); + powf(waypoint.Position[1] - positionState.East, 2));

View File

@ -41,7 +41,7 @@
<field name="R" units="1^2" type="float" defaultvalue=" <field name="R" units="1^2" type="float" defaultvalue="
10, 10, 1000, 10, 10, 1000,
1, 1, 1, 1, 1, 1,
1000, 1000, 1000, 5000, 5000, 5000,
1"> 1">
<elementnames> <elementnames>
<elementname>GPSPosNorth</elementname> <elementname>GPSPosNorth</elementname>

View File

@ -3,48 +3,42 @@
<description>Settings for the @ref FixedWingPathFollowerModule</description> <description>Settings for the @ref FixedWingPathFollowerModule</description>
<!-- these coefficients control desired movement in airspace --> <!-- these coefficients control desired movement in airspace -->
<field name="AirSpeedMax" units="m/s" type="float" elements="1" defaultvalue="30"/> <field name="HorizontalVelMax" units="m/s" type="float" elements="1" defaultvalue="20"/>
<!-- Vne, i.e. maximum airspeed the airframe can handle -->
<field name="CruiseSpeed" units="m/s" type="float" elements="1" defaultvalue="20"/>
<!-- Maximum speed the autopilot will try to achieve, usually for long distances --> <!-- Maximum speed the autopilot will try to achieve, usually for long distances -->
<field name="BestClimbRateSpeed" units="m/s" type="float" elements="1" defaultvalue="10"/> <field name="HorizontalVelMin" units="m/s" type="float" elements="1" defaultvalue="10"/>
<!-- V_y, Minimum speed the autopilot will try to fly, for example when loitering --> <!-- V_y, Minimum speed the autopilot will try to fly, for example when loitering -->
<field name="StallSpeedClean" units="m/s" type="float" elements="1" defaultvalue="8"/>
<!-- Vs1, i.e. stall speed in clean configuration- leave some safety margin -->
<field name="StallSpeedDirty" units="m/s" type="float" elements="1" defaultvalue="8"/>
<!-- Vs0, i.e. stall speed with flaps and landing gear deployed - leave some safety margin -->
<field name="VerticalVelMax" units="m/s" type="float" elements="1" defaultvalue="10"/> <field name="VerticalVelMax" units="m/s" type="float" elements="1" defaultvalue="10"/>
<!-- maximum allowed climb or sink rate in guided flight--> <!-- maximum allowed climb or sink rate in guided flight-->
<field name="HeadingFeedForward" units="s" type="float" elements="1" defaultvalue="3.0"/> <field name="CourseFeedForward" units="s" type="float" elements="1" defaultvalue="3.0"/>
<!-- how many seconds to plan the flight vector ahead when initiating necessary heading changes - increase for planes with sluggish response --> <!-- how many seconds to plan the flight vector ahead when initiating necessary heading changes - increase for planes with sluggish response -->
<field name="HorizontalPosP" units="(m/s)/m" type="float" elements="1" defaultvalue="0.05"/> <field name="HorizontalPosP" units="(m/s)/m" type="float" elements="1" defaultvalue="0.05"/>
<!-- proportional coefficient for correction vector in path vector field to get back on course - reduce for fast planes to prevent course oscillations --> <!-- proportional coefficient for correction vector in path vector field to get back on course - reduce for fast planes to prevent course oscillations -->
<field name="VerticalPosP" units="(m/s)/m" type="float" elements="1" defaultvalue="0.05"/> <field name="VerticalPosP" units="(m/s)/m" type="float" elements="1" defaultvalue="0.2"/>
<!-- proportional coefficient for desired vertical speed in relation to altitude displacement--> <!-- proportional coefficient for desired vertical speed in relation to altitude displacement-->
<!-- these coefficients control actual control outputs --> <!-- these coefficients control actual control outputs -->
<field name="BearingPI" units="deg/deg" type="float" elements="3" elementnames="Kp,Ki,ILimit" defaultvalue="0.2, 0, 0"/> <field name="CoursePI" units="deg/deg" type="float" elements="3" elementnames="Kp,Ki,ILimit" defaultvalue="0.2, 0, 0"/>
<!-- coefficients for desired bank angle in relation to ground bearing error - this controls heading --> <!-- coefficients for desired bank angle in relation to ground bearing error - this controls heading -->
<field name="SpeedPI" units="deg / (m/s)" type="float" elements="3" elementnames="Kp,Ki,ILimit" defaultvalue="1.5, .15, 20"/> <field name="SpeedPI" units="deg / (m/s)" type="float" elements="3" elementnames="Kp,Ki,ILimit" defaultvalue="2.5, .25, 10"/>
<!-- coefficients for desired pitch <!-- coefficients for desired pitch
in relation to speed error IASerror --> in relation to speed error IASerror -->
<field name="VerticalToPitchCrossFeed" units="deg / (m/s)" type="float" elementnames="Kp,Max" defaultvalue="5, 10"/> <field name="VerticalToPitchCrossFeed" units="deg / (m/s)" type="float" elementnames="Kp,Max" defaultvalue="5, 10"/>
<!-- coefficients for adjusting desired pitch <!-- coefficients for adjusting desired pitch
in relation to "vertical speed error --> in relation to "vertical speed error -->
<field name="AirspeedToPowerCrossFeed" units="1 / (m/s)" type="float" elementnames="Kp,Max" defaultvalue="0.1, 1"/> <field name="AirspeedToPowerCrossFeed" units="1 / (m/s)" type="float" elementnames="Kp,Max" defaultvalue="0.2, 1"/>
<!-- proportional coefficient for adjusting vertical speed error for power calculation <!-- proportional coefficient for adjusting vertical speed error for power calculation
in relation to airspeed error IASerror --> in relation to airspeed error IASerror -->
<field name="PowerPI" units="1/(m/s)" type="float" elements="3" elementnames="Kp,Ki,ILimit" defaultvalue="0.01,0.01,0.8"/> <field name="PowerPI" units="1/(m/s)" type="float" elements="3" elementnames="Kp,Ki,ILimit" defaultvalue="0.01,0.05,0.5"/>
<!-- proportional coefficient for desired throttle <!-- proportional coefficient for desired throttle
in relation to vertical speed error (absolute but including crossfeed) --> in relation to vertical speed error (absolute but including crossfeed) -->
<!-- output limits --> <!-- output limits -->
<field name="RollLimit" units="deg" type="float" elements="3" elementnames="Min,Neutral,Max" defaultvalue="-35,0,35" /> <field name="RollLimit" units="deg" type="float" elements="3" elementnames="Min,Neutral,Max" defaultvalue="-35,0,35" />
<!-- maximum allowed bank angles in navigates flight --> <!-- maximum allowed bank angles in navigates flight -->
<field name="PitchLimit" units="deg" type="float" elements="3" elementnames="Min,Neutral,Max" defaultvalue="-10,5,10" /> <field name="PitchLimit" units="deg" type="float" elements="3" elementnames="Min,Neutral,Max" defaultvalue="-10,5,20" />
<!-- maximum allowed pitch angles and setpoint for neutral pitch --> <!-- maximum allowed pitch angles and setpoint for neutral pitch -->
<field name="ThrottleLimit" units="" type="float" elements="3" elementnames="Min,Neutral,Max" defaultvalue="0.1,0.5,0.9" /> <field name="ThrottleLimit" units="" type="float" elements="3" elementnames="Min,Neutral,Max" defaultvalue="0.1,0.5,0.9" />
<!-- minimum and maximum allowed throttle and setpoint for cruise speed --> <!-- minimum and maximum allowed throttle and setpoint for cruise speed -->

View File

@ -1,9 +1,9 @@
<xml> <xml>
<object name="FixedWingPathFollowerStatus" singleinstance="true" settings="false" category="Control"> <object name="FixedWingPathFollowerStatus" singleinstance="true" settings="false" category="Control">
<description>Object Storing Debugging Information on PID internals</description> <description>Object Storing Debugging Information on PID internals</description>
<field name="Error" units="" type="float" elementnames="Bearing,Speed,Power" /> <field name="Error" units="" type="float" elementnames="Course,Speed,Power" />
<field name="ErrorInt" units="" type="float" elementnames="Bearing,Speed,Power" /> <field name="ErrorInt" units="" type="float" elementnames="Course,Speed,Power" />
<field name="Command" units="" type="float" elementnames="Bearing,Speed,Power" /> <field name="Command" units="" type="float" elementnames="Course,Speed,Power" />
<field name="Errors" units="" type="uint8" elementnames="Wind,Stallspeed,Lowspeed,Highspeed,Overspeed,Lowpower,Highpower,Pitchcontrol" /> <field name="Errors" units="" type="uint8" elementnames="Wind,Stallspeed,Lowspeed,Highspeed,Overspeed,Lowpower,Highpower,Pitchcontrol" />
<access gcs="readwrite" flight="readwrite"/> <access gcs="readwrite" flight="readwrite"/>
<telemetrygcs acked="false" updatemode="manual" period="0"/> <telemetrygcs acked="false" updatemode="manual" period="0"/>

View File

@ -71,7 +71,8 @@
%0903NE:Autotune:AltitudeVario:AltitudeHold:VelocityControl:PositionHold:ReturnToBase:Land:PathPlanner:POI"/> %0903NE:Autotune:AltitudeVario:AltitudeHold:VelocityControl:PositionHold:ReturnToBase:Land:PathPlanner:POI"/>
<field name="ArmedTimeout" units="ms" type="uint16" elements="1" defaultvalue="30000"/> <field name="ArmedTimeout" units="ms" type="uint16" elements="1" defaultvalue="30000"/>
<field name="FailsafeBehavior" units="" type="enum" elements="1" options="None" defaultvalue="None"/> <field name="FailsafeBehavior" units="" type="enum" elements="1" options="None,ModePos1,ModePos2,ModePos3,ModePos4,ModePos5,ModePos6" defaultvalue="None"/>
<field name="ReturnToHomeAltitudeOffset" units="m" type="float" elements="1" defaultvalue="10"/>
<access gcs="readwrite" flight="readwrite"/> <access gcs="readwrite" flight="readwrite"/>
<telemetrygcs acked="true" updatemode="onchange" period="0"/> <telemetrygcs acked="true" updatemode="onchange" period="0"/>
<telemetryflight acked="true" updatemode="onchange" period="0"/> <telemetryflight acked="true" updatemode="onchange" period="0"/>

View File

@ -23,7 +23,7 @@
<field name="ErrorDestination" units="waypoint" type="int16" elements="1" default="0"/> <field name="ErrorDestination" units="waypoint" type="int16" elements="1" default="0"/>
<access gcs="readwrite" flight="readwrite"/> <access gcs="readwrite" flight="readwrite"/>
<telemetrygcs acked="false" updatemode="manual" period="0"/> <telemetrygcs acked="true" updatemode="manual" period="0"/>
<telemetryflight acked="false" updatemode="periodic" period="4000"/> <telemetryflight acked="false" updatemode="periodic" period="4000"/>
<logging updatemode="periodic" period="1000"/> <logging updatemode="periodic" period="1000"/>
</object> </object>

View File

@ -3,6 +3,12 @@
<description>Select airframe type. Currently used by @ref ActuatorModule to choose mixing from @ref ActuatorDesired to @ref ActuatorCommand</description> <description>Select airframe type. Currently used by @ref ActuatorModule to choose mixing from @ref ActuatorDesired to @ref ActuatorCommand</description>
<field name="AirframeType" units="" type="enum" elements="1" options="FixedWing,FixedWingElevon,FixedWingVtail,VTOL,HeliCP,QuadX,QuadP,Hexa,Octo,Custom,HexaX,OctoV,OctoCoaxP,OctoCoaxX,HexaCoax,Tri,GroundVehicleCar,GroundVehicleDifferential,GroundVehicleMotorcycle" defaultvalue="QuadX"/> <field name="AirframeType" units="" type="enum" elements="1" options="FixedWing,FixedWingElevon,FixedWingVtail,VTOL,HeliCP,QuadX,QuadP,Hexa,Octo,Custom,HexaX,OctoV,OctoCoaxP,OctoCoaxX,HexaCoax,Tri,GroundVehicleCar,GroundVehicleDifferential,GroundVehicleMotorcycle" defaultvalue="QuadX"/>
<field name="GUIConfigData" units="bits" type="uint32" elements="4" defaultvalue="0"/> <field name="GUIConfigData" units="bits" type="uint32" elements="4" defaultvalue="0"/>
<field name="AirSpeedMax" units="m/s" type="float" elements="1" defaultvalue="30"/>
<!-- Vne, i.e. maximum airspeed the airframe can handle - used by autopilot, actuator compensation. as well as possibly by INS for plausibility checks -->
<field name="AirSpeedMin" units="m/s" type="float" elements="1" defaultvalue="10"/>
<!-- Vs0, i.e stall speed - minimum speed the airframe will be able to fly - used by autopilot, actuator compensation, as well as possibly by INS for plausibility check
TODO: currently not used by vtols, needs its default changed to 0 as soon as its used by vtols-->
<access gcs="readwrite" flight="readwrite"/> <access gcs="readwrite" flight="readwrite"/>
<telemetrygcs acked="true" updatemode="onchange" period="0"/> <telemetrygcs acked="true" updatemode="onchange" period="0"/>
<telemetryflight acked="true" updatemode="onchange" period="0"/> <telemetryflight acked="true" updatemode="onchange" period="0"/>

View File

@ -5,7 +5,7 @@
<field name="Velocity" units="m/s" type="float" elements="1"/> <field name="Velocity" units="m/s" type="float" elements="1"/>
<field name="Action" units="" type="uint8" elements="1" /> <field name="Action" units="" type="uint8" elements="1" />
<access gcs="readwrite" flight="readwrite"/> <access gcs="readwrite" flight="readwrite"/>
<telemetrygcs acked="false" updatemode="manual" period="0"/> <telemetrygcs acked="true" updatemode="manual" period="0"/>
<telemetryflight acked="false" updatemode="periodic" period="4000"/> <telemetryflight acked="false" updatemode="periodic" period="4000"/>
<logging updatemode="periodic" period="1000"/> <logging updatemode="periodic" period="1000"/>
</object> </object>