diff --git a/WHATSNEW.txt b/WHATSNEW.txt index 50222ec90..79c46fdae 100644 --- a/WHATSNEW.txt +++ b/WHATSNEW.txt @@ -1,3 +1,27 @@ +--- RELEASE-15.02.02-RC3 --- +This release fixes a bug that prevents revo onboard mag to work correctly. + +Release Notes - OpenPilot - Version RELEASE-15.02.02 + +The full list of bugfixes in this release is accessible here: +https://progress.openpilot.org/issues/?filter=12262 + +** Bug + * [OP-1820] - fix onboard mag orientation + * [OP-1821] - Tricopter tail servo wrong speed on wizard + * [OP-1827] - Version ID wrong in Windows uninstaller + * [OP-1857] - PPM on Flexi does not work on CC/CC3D + * [OP-1872] - Vehicle Wiz Tricopter tail servo settings don't save + +** Improvement + * [OP-1835] - Add motor constraints in place of overhead throttle buffer for enhanced stability and power. Add swash constraints for helis. + + +** Task + * [OP-1831] - due to oneshot higher pid values ki now shows "red" warning in stabilization page + + + --- RELEASE-15.02.01 --- This release fixes an in important bug that may prevent failsafe to work correctly using CC3D/CC with a PWM receiver. diff --git a/flight/modules/Actuator/actuator.c b/flight/modules/Actuator/actuator.c index 881fd69c4..87f46c150 100644 --- a/flight/modules/Actuator/actuator.c +++ b/flight/modules/Actuator/actuator.c @@ -40,6 +40,7 @@ #include "actuatordesired.h" #include "actuatorcommand.h" #include "flightstatus.h" +#include #include "mixersettings.h" #include "mixerstatus.h" #include "cameradesired.h" @@ -98,9 +99,10 @@ static int mixer_settings_count = 2; // Private functions static void actuatorTask(void *parameters); static int16_t scaleChannel(float value, int16_t max, int16_t min, int16_t neutral); +static int16_t scaleMotor(float value, int16_t max, int16_t min, int16_t neutral, float maxMotor, float minMotor, bool armed, bool AlwaysStabilizeWhenArmed, float throttleDesired); static void setFailsafe(); -static float MixerCurveFullRangeProportional(const float input, const float *curve, uint8_t elements); -static float MixerCurveFullRangeAbsolute(const float input, const float *curve, uint8_t elements); +static float MixerCurveFullRangeProportional(const float input, const float *curve, uint8_t elements, bool multirotor); +static float MixerCurveFullRangeAbsolute(const float input, const float *curve, uint8_t elements, bool multirotor); static bool set_channel(uint8_t mixer_channel, uint16_t value); static void actuator_update_rate_if_changed(bool force_update); static void MixerSettingsUpdatedCb(UAVObjEvent *ev); @@ -108,7 +110,7 @@ static void ActuatorSettingsUpdatedCb(UAVObjEvent *ev); static void SettingsUpdatedCb(UAVObjEvent *ev); float ProcessMixer(const int index, const float curve1, const float curve2, ActuatorDesiredData *desired, - const float period); + const float period, bool multirotor); // this structure is equivalent to the UAVObjects for one mixer. typedef struct { @@ -199,6 +201,7 @@ static void actuatorTask(__attribute__((unused)) void *parameters) ActuatorCommandData command; ActuatorDesiredData desired; MixerStatusData mixerStatus; + FlightModeSettingsData settings; FlightStatusData flightStatus; float throttleDesired; float collectiveDesired; @@ -245,6 +248,7 @@ static void actuatorTask(__attribute__((unused)) void *parameters) dTSeconds = dTMilliseconds * 0.001f; FlightStatusGet(&flightStatus); + FlightModeSettingsGet(&settings); ActuatorDesiredGet(&desired); ActuatorCommandGet(&command); @@ -266,22 +270,32 @@ static void actuatorTask(__attribute__((unused)) void *parameters) bool armed = flightStatus.Armed == FLIGHTSTATUS_ARMED_ARMED; bool activeThrottle = (throttleDesired < -0.001f || throttleDesired > 0.001f); // for ground and reversible motors bool positiveThrottle = (throttleDesired > 0.00f); + bool multirotor = (GetCurrentFrameType() == FRAME_TYPE_MULTIROTOR); // check if frame is a multirotor. + bool alwaysArmed = settings.Arming == FLIGHTMODESETTINGS_ARMING_ALWAYSARMED; + bool AlwaysStabilizeWhenArmed = settings.AlwaysStabilizeWhenArmed == FLIGHTMODESETTINGS_ALWAYSSTABILIZEWHENARMED_TRUE; + if (alwaysArmed) { + AlwaysStabilizeWhenArmed = false; // Do not allow always stabilize when alwaysArmed is active. This is dangerous. + } // safety settings if (!armed) { - throttleDesired = 0; + throttleDesired = 0.00f; // this also happens in scaleMotors as a per axis check } if ((frameType == FRAME_TYPE_GROUND && !activeThrottle) || (frameType != FRAME_TYPE_GROUND && throttleDesired <= 0.00f) || !armed) { + // throttleDesired should never be 0 or go below 0. // force set all other controls to zero if throttle is cut (previously set in Stabilization) - if (actuatorSettings.LowThrottleZeroAxis.Roll == ACTUATORSETTINGS_LOWTHROTTLEZEROAXIS_TRUE) { - desired.Roll = 0; - } - if (actuatorSettings.LowThrottleZeroAxis.Pitch == ACTUATORSETTINGS_LOWTHROTTLEZEROAXIS_TRUE) { - desired.Pitch = 0; - } - if (actuatorSettings.LowThrottleZeroAxis.Yaw == ACTUATORSETTINGS_LOWTHROTTLEZEROAXIS_TRUE) { - desired.Yaw = 0; + // todo: can probably remove this + if (!(multirotor && AlwaysStabilizeWhenArmed && armed)) { // we don't do this if this is a multirotor AND AlwaysStabilizeWhenArmed is true and the model is armed + if (actuatorSettings.LowThrottleZeroAxis.Roll == ACTUATORSETTINGS_LOWTHROTTLEZEROAXIS_TRUE) { + desired.Roll = 0.00f; + } + if (actuatorSettings.LowThrottleZeroAxis.Pitch == ACTUATORSETTINGS_LOWTHROTTLEZEROAXIS_TRUE) { + desired.Pitch = 0.00f; + } + if (actuatorSettings.LowThrottleZeroAxis.Yaw == ACTUATORSETTINGS_LOWTHROTTLEZEROAXIS_TRUE) { + desired.Yaw = 0.00f; + } } } @@ -296,13 +310,13 @@ static void actuatorTask(__attribute__((unused)) void *parameters) AlarmsClear(SYSTEMALARMS_ALARM_ACTUATOR); - float curve1 = 0.0f; + float curve1 = 0.0f; // curve 1 is the throttle curve applied to all motors. float curve2 = 0.0f; // Interpolate curve 1 from throttleDesired as input. // assume reversible motor/mixer initially. We can later reverse this. The difference is simply that -ve throttleDesired values // map differently - curve1 = MixerCurveFullRangeProportional(throttleDesired, mixerSettings.ThrottleCurve1, MIXERSETTINGS_THROTTLECURVE1_NUMELEM); + curve1 = MixerCurveFullRangeProportional(throttleDesired, mixerSettings.ThrottleCurve1, MIXERSETTINGS_THROTTLECURVE1_NUMELEM, multirotor); // The source for the secondary curve is selectable AccessoryDesiredData accessory; @@ -310,25 +324,38 @@ static void actuatorTask(__attribute__((unused)) void *parameters) switch (curve2Source) { case MIXERSETTINGS_CURVE2SOURCE_THROTTLE: // assume reversible motor/mixer initially - curve2 = MixerCurveFullRangeProportional(throttleDesired, mixerSettings.ThrottleCurve2, MIXERSETTINGS_THROTTLECURVE2_NUMELEM); + curve2 = MixerCurveFullRangeProportional(throttleDesired, mixerSettings.ThrottleCurve2, MIXERSETTINGS_THROTTLECURVE2_NUMELEM, multirotor); break; case MIXERSETTINGS_CURVE2SOURCE_ROLL: // Throttle curve contribution the same for +ve vs -ve roll - curve2 = MixerCurveFullRangeAbsolute(desired.Roll, mixerSettings.ThrottleCurve2, MIXERSETTINGS_THROTTLECURVE2_NUMELEM); + if (multirotor) { + curve2 = MixerCurveFullRangeProportional(desired.Roll, mixerSettings.ThrottleCurve2, MIXERSETTINGS_THROTTLECURVE2_NUMELEM, multirotor); + } else { + curve2 = MixerCurveFullRangeAbsolute(desired.Roll, mixerSettings.ThrottleCurve2, MIXERSETTINGS_THROTTLECURVE2_NUMELEM, multirotor); + } break; case MIXERSETTINGS_CURVE2SOURCE_PITCH: // Throttle curve contribution the same for +ve vs -ve pitch - curve2 = MixerCurveFullRangeAbsolute(desired.Pitch, mixerSettings.ThrottleCurve2, - MIXERSETTINGS_THROTTLECURVE2_NUMELEM); + if (multirotor) { + curve2 = MixerCurveFullRangeProportional(desired.Pitch, mixerSettings.ThrottleCurve2, + MIXERSETTINGS_THROTTLECURVE2_NUMELEM, multirotor); + } else { + curve2 = MixerCurveFullRangeAbsolute(desired.Pitch, mixerSettings.ThrottleCurve2, + MIXERSETTINGS_THROTTLECURVE2_NUMELEM, multirotor); + } break; case MIXERSETTINGS_CURVE2SOURCE_YAW: // Throttle curve contribution the same for +ve vs -ve yaw - curve2 = MixerCurveFullRangeAbsolute(desired.Yaw, mixerSettings.ThrottleCurve2, MIXERSETTINGS_THROTTLECURVE2_NUMELEM); + if (multirotor) { + curve2 = MixerCurveFullRangeProportional(desired.Yaw, mixerSettings.ThrottleCurve2, MIXERSETTINGS_THROTTLECURVE2_NUMELEM, multirotor); + } else { + curve2 = MixerCurveFullRangeAbsolute(desired.Yaw, mixerSettings.ThrottleCurve2, MIXERSETTINGS_THROTTLECURVE2_NUMELEM, multirotor); + } break; case MIXERSETTINGS_CURVE2SOURCE_COLLECTIVE: // assume reversible motor/mixer initially curve2 = MixerCurveFullRangeProportional(collectiveDesired, mixerSettings.ThrottleCurve2, - MIXERSETTINGS_THROTTLECURVE2_NUMELEM); + MIXERSETTINGS_THROTTLECURVE2_NUMELEM, multirotor); break; case MIXERSETTINGS_CURVE2SOURCE_ACCESSORY0: case MIXERSETTINGS_CURVE2SOURCE_ACCESSORY1: @@ -338,7 +365,7 @@ static void actuatorTask(__attribute__((unused)) void *parameters) case MIXERSETTINGS_CURVE2SOURCE_ACCESSORY5: if (AccessoryDesiredInstGet(mixerSettings.Curve2Source - MIXERSETTINGS_CURVE2SOURCE_ACCESSORY0, &accessory) == 0) { // Throttle curve contribution the same for +ve vs -ve accessory....maybe not want we want. - curve2 = MixerCurveFullRangeAbsolute(accessory.AccessoryVal, mixerSettings.ThrottleCurve2, MIXERSETTINGS_THROTTLECURVE2_NUMELEM); + curve2 = MixerCurveFullRangeAbsolute(accessory.AccessoryVal, mixerSettings.ThrottleCurve2, MIXERSETTINGS_THROTTLECURVE2_NUMELEM, multirotor); } else { curve2 = 0.0f; } @@ -350,6 +377,8 @@ static void actuatorTask(__attribute__((unused)) void *parameters) float *status = (float *)&mixerStatus; // access status objects as an array of floats Mixer_t *mixers = (Mixer_t *)&mixerSettings.Mixer1Type; + float maxMotor = -1.0f; // highest motor value. Addition method needs this to be -1.0f, division method needs this to be 1.0f + float minMotor = 1.0f; // lowest motor value Addition method needs this to be 1.0f, division method needs this to be -1.0f for (int ct = 0; ct < MAX_MIX_ACTUATORS; ct++) { // During boot all camera actuators should be completely disabled (PWM pulse = 0). @@ -373,9 +402,11 @@ static void actuatorTask(__attribute__((unused)) void *parameters) nonreversible_curve1 = 0.0f; } if (nonreversible_curve2 < 0.0f) { - nonreversible_curve2 = 0.0f; + if (!multirotor) { // allow negative throttle if multirotor. function scaleMotors handles the sanity checks. + nonreversible_curve2 = 0.0f; + } } - status[ct] = ProcessMixer(ct, nonreversible_curve1, nonreversible_curve2, &desired, dTSeconds); + status[ct] = ProcessMixer(ct, nonreversible_curve1, nonreversible_curve2, &desired, dTSeconds, multirotor); // If not armed or motors aren't meant to spin all the time if (!armed || (!spinWhileArmed && !positiveThrottle)) { @@ -386,10 +417,14 @@ static void actuatorTask(__attribute__((unused)) void *parameters) // If armed meant to keep spinning, else if ((spinWhileArmed && !positiveThrottle) || (status[ct] < 0)) { - status[ct] = 0; + if (!multirotor) { + status[ct] = 0; + // allow throttle values lower than 0 if multirotor. + // Values will be scaled to 0 if they need to be in the scaleMotor function + } } } else if (mixer_type == MIXERSETTINGS_MIXER1TYPE_REVERSABLEMOTOR) { - status[ct] = ProcessMixer(ct, curve1, curve2, &desired, dTSeconds); + status[ct] = ProcessMixer(ct, curve1, curve2, &desired, dTSeconds, multirotor); // Reversable Motors are like Motors but go to neutral instead of minimum // If not armed or motor is inactive - no "spinwhilearmed" for this engine type if (!armed || !activeThrottle) { @@ -398,7 +433,7 @@ static void actuatorTask(__attribute__((unused)) void *parameters) status[ct] = 0; // force neutral throttle } } else if (mixer_type == MIXERSETTINGS_MIXER1TYPE_SERVO) { - status[ct] = ProcessMixer(ct, curve1, curve2, &desired, dTSeconds); + status[ct] = ProcessMixer(ct, curve1, curve2, &desired, dTSeconds, multirotor); } else { status[ct] = -1; @@ -444,16 +479,39 @@ static void actuatorTask(__attribute__((unused)) void *parameters) } } } + + // If mixer type is motor we need to find which motor has the highest value and which motor has the lowest value. + // For use in function scaleMotor + if (mixers[ct].type == MIXERSETTINGS_MIXER1TYPE_MOTOR) { + if (maxMotor < status[ct]) { + maxMotor = status[ct]; + } + if (minMotor > status[ct]) { + minMotor = status[ct]; + } + } } // Set real actuator output values scaling them from mixers. All channels // will be set except explicitly disabled (which will have PWM pulse = 0). for (int i = 0; i < MAX_MIX_ACTUATORS; i++) { if (command.Channel[i]) { - command.Channel[i] = scaleChannel(status[i], - actuatorSettings.ChannelMax[i], - actuatorSettings.ChannelMin[i], - actuatorSettings.ChannelNeutral[i]); + if (mixers[i].type == MIXERSETTINGS_MIXER1TYPE_MOTOR) { // If mixer is for a motor we need to find the highest value of all motors + command.Channel[i] = scaleMotor(status[i], + actuatorSettings.ChannelMax[i], + actuatorSettings.ChannelMin[i], + actuatorSettings.ChannelNeutral[i], + maxMotor, + minMotor, + armed, + AlwaysStabilizeWhenArmed, + throttleDesired); + } else { // else we scale the channel + command.Channel[i] = scaleChannel(status[i], + actuatorSettings.ChannelMax[i], + actuatorSettings.ChannelMin[i], + actuatorSettings.ChannelNeutral[i]); + } } } @@ -497,7 +555,7 @@ static void actuatorTask(__attribute__((unused)) void *parameters) * Process mixing for one actuator */ float ProcessMixer(const int index, const float curve1, const float curve2, - ActuatorDesiredData *desired, const float period) + ActuatorDesiredData *desired, const float period, bool multirotor) { static float lastFilteredResult[MAX_MIX_ACTUATORS]; const Mixer_t *mixers = (Mixer_t *)&mixerSettings.Mixer1Type; // pointer to array of mixers in UAVObjects @@ -511,8 +569,10 @@ float ProcessMixer(const int index, const float curve1, const float curve2, // note: no feedforward for reversable motors yet for safety reasons if (mixer->type == MIXERSETTINGS_MIXER1TYPE_MOTOR) { - if (result < 0.0f) { // idle throttle - result = 0.0f; + if (!multirotor) { // we allow negative throttle with a multirotor + if (result < 0.0f) { // zero throttle + result = 0.0f; + } } // feed forward @@ -560,9 +620,9 @@ float ProcessMixer(const int index, const float curve1, const float curve2, * Input of 0 -> lookup(0) * Input of 1 -> lookup(1) */ -static float MixerCurveFullRangeProportional(const float input, const float *curve, uint8_t elements) +static float MixerCurveFullRangeProportional(const float input, const float *curve, uint8_t elements, bool multirotor) { - float unsigned_value = MixerCurveFullRangeAbsolute(input, curve, elements); + float unsigned_value = MixerCurveFullRangeAbsolute(input, curve, elements, multirotor); if (input < 0.0f) { return -unsigned_value; @@ -580,7 +640,7 @@ static float MixerCurveFullRangeProportional(const float input, const float *cur * Input of 0 -> lookup(0) * Input of 1 -> lookup(1) */ -static float MixerCurveFullRangeAbsolute(const float input, const float *curve, uint8_t elements) +static float MixerCurveFullRangeAbsolute(const float input, const float *curve, uint8_t elements, bool multirotor) { float abs_input = fabsf(input); float scale = abs_input * (float)(elements - 1); @@ -594,6 +654,16 @@ static float MixerCurveFullRangeAbsolute(const float input, const float *curve, if (idx2 >= elements) { idx2 = elements - 1; // clamp to highest entry in table if (idx1 >= elements) { + if (multirotor) { + // if multirotor frame we can return throttle values higher than 100%. + // Since the we don't have elements in the curve higher than 100% we return + // the last element multiplied by the throttle float + if (input < 2.0f) { // this limits positive throttle to 200% of max value in table (Maybe this is too much allowance) + return curve[idx2] * input; + } else { + return curve[idx2] * 2.0f; // return 200% of max value in table + } + } idx1 = elements - 1; } } @@ -636,6 +706,73 @@ static int16_t scaleChannel(float value, int16_t max, int16_t min, int16_t neutr return valueScaled; } +/** + * Constrain motor values to keep any one motor value from going too far out of range of another motor + */ +static int16_t scaleMotor(float value, int16_t max, int16_t min, int16_t neutral, float maxMotor, float minMotor, bool armed, bool AlwaysStabilizeWhenArmed, float throttleDesired) +{ + int16_t valueScaled; + int16_t maxMotorScaled; + int16_t minMotorScaled; + int16_t diff; + + // Scale + valueScaled = (int16_t)(value * ((float)(max - neutral))) + neutral; + maxMotorScaled = (int16_t)(maxMotor * ((float)(max - neutral))) + neutral; + minMotorScaled = (int16_t)(minMotor * ((float)(max - neutral))) + neutral; + + + if (max > min) { + diff = max - maxMotorScaled; // difference between max allowed and actual max motor + if (diff < 0) { // if the difference is smaller than 0 we add it to the scaled value + valueScaled += diff; + } + diff = neutral - minMotorScaled; // difference between min allowed and actual min motor + if (diff > 0) { // if the difference is larger than 0 we add it to the scaled value + valueScaled += diff; + } + // todo: make this flow easier to understand + if (valueScaled > max) { + valueScaled = max; // clamp to max value only after scaling is done. + } + + if ((valueScaled < neutral) && (spinWhileArmed) && AlwaysStabilizeWhenArmed) { + valueScaled = neutral; // clamp to neutral value only after scaling is done. + } else if ((valueScaled < neutral) && (!spinWhileArmed) && AlwaysStabilizeWhenArmed) { + valueScaled = neutral; // clamp to neutral value only after scaling is done. //throttle goes to min if throttledesired is equal to or less than 0 below + } else if (valueScaled < neutral) { + valueScaled = min; // clamp to min value only after scaling is done. + } + } else { + // not sure what to do about reversed polarity right now. Why would anyone do this? + if (valueScaled < max) { + valueScaled = max; // clamp to max value only after scaling is done. + } + if (valueScaled > min) { + valueScaled = min; // clamp to min value only after scaling is done. + } + } + + // I've added the bool AlwaysStabilizeWhenArmed to this function. Right now we command the motors at min or a range between neutral and max. + // NEVER should a motor be command at between min and neutral. I don't like the idea of stabilization ever commanding a motor to min, but we give people the option + // This prevents motors startup sync issues causing possible ESC failures. + + // safety checks + if (!armed) { + // if not armed return min EVERYTIME! + valueScaled = min; + } else if (!AlwaysStabilizeWhenArmed && (throttleDesired <= 0.0f) && spinWhileArmed) { + // all motors idle is AlwaysStabilizeWhenArmed is false, throttle is less than or equal to neutral and spin while armed + // stabilize when armed? + valueScaled = neutral; + } else if (!spinWhileArmed && (throttleDesired <= 0.0f)) { + // soft disarm + valueScaled = min; + } + + return valueScaled; +} + /** * Set actuator output to the neutral values (failsafe) */ diff --git a/flight/modules/Stabilization/innerloop.c b/flight/modules/Stabilization/innerloop.c index 0ebfd969c..85e0377f6 100644 --- a/flight/modules/Stabilization/innerloop.c +++ b/flight/modules/Stabilization/innerloop.c @@ -242,6 +242,7 @@ static void stabilizationInnerloopTask() float *actuatorDesiredAxis = &actuator.Roll; int t; float dT; + bool multirotor = (GetCurrentFrameType() == FRAME_TYPE_MULTIROTOR); // check if frame is a multirotor dT = PIOS_DELTATIME_GetAverageSeconds(&timeval); StabilizationStatusOuterLoopData outerLoop; @@ -324,7 +325,12 @@ static void stabilizationInnerloopTask() } } - actuatorDesiredAxis[t] = boundf(actuatorDesiredAxis[t], -1.0f, 1.0f); + if (!multirotor) { + // we only need to clamp the desired axis to a sane range if the frame is not a multirotor type + // we don't want to do any clamping until after the motors are calculated and scaled. + // need to figure out what to do with a tricopter tail servo. + actuatorDesiredAxis[t] = boundf(actuatorDesiredAxis[t], -1.0f, 1.0f); + } } actuator.UpdateTime = dT * 1000; diff --git a/flight/targets/boards/coptercontrol/firmware/inc/pios_config.h b/flight/targets/boards/coptercontrol/firmware/inc/pios_config.h index 4dfec4883..a371b908f 100644 --- a/flight/targets/boards/coptercontrol/firmware/inc/pios_config.h +++ b/flight/targets/boards/coptercontrol/firmware/inc/pios_config.h @@ -97,7 +97,7 @@ /* PIOS receiver drivers */ #define PIOS_INCLUDE_PWM #define PIOS_INCLUDE_PPM -/* #define PIOS_INCLUDE_PPM_FLEXI */ +#define PIOS_INCLUDE_PPM_FLEXI #define PIOS_INCLUDE_DSM #define PIOS_INCLUDE_SBUS /* #define PIOS_INCLUDE_GCSRCVR */ diff --git a/ground/openpilotgcs/share/openpilotgcs/translations/openpilotgcs_zh_CN.ts b/ground/openpilotgcs/share/openpilotgcs/translations/openpilotgcs_zh_CN.ts index 4c92e4774..cc5b77e75 100644 --- a/ground/openpilotgcs/share/openpilotgcs/translations/openpilotgcs_zh_CN.ts +++ b/ground/openpilotgcs/share/openpilotgcs/translations/openpilotgcs_zh_CN.ts @@ -5621,13 +5621,16 @@ Beware of not locking yourself out! If enabled, a fast recalibration of gyro zero point will be done whenever the frame is armed. Do not move the airframe while arming it in that case! - 每次解锁航模时,控制器以解锁时摆放状态做一次快速水平校准。 -打开此项设置后,请务必保证每次解锁时候航模静止放置! + 每次解锁航模时,为陀螺仪传感器零点位置做一次快速调整。 +打开此项设置后,请务必保证每次解锁时候航模静止放置! +陀螺仪传感器的作用是测量旋转量,不是用来确保飞行器维持 +对地水平的。加速度传感器Z轴读取到的重力加速度才是用来维持 +水平飞行稳定的参考值! Zero gyros while arming aircraft - 每次解锁时,重置陀螺仪读取数值 + 除非你对自己智商足够自信,且透彻明白陀螺仪传感器和加速度传感器的作用和区别,否则请勿自作聪明取消此项设置 @@ -9244,32 +9247,32 @@ Please select the type of multirotor you want to create a configuration for belo - - + + Start 开始 - + - - + + Output value : <b>%1</b> µs 输出值:<b>%1</b>µs - + <html><head/><body><p><span style=" font-size:10pt;">To find </span><span style=" font-size:10pt; font-weight:600;">the neutral rate for this reversable motor</span><span style=" font-size:10pt;">, press the Start button below and slide the slider to the right or left until you find the value where the motor doesn't start. <br/><br/>When done press button again to stop.</span></p></body></html> - - + + Stop 停止 - + The actuator module is in an error state. Please make sure the correct firmware version is used then restart the wizard and try again. If the problem persists please consult the openpilot.org support forum. @@ -9277,6 +9280,16 @@ Please make sure the correct firmware version is used then restart the wizard an 请确认设备上固件版本是否正确,然后重新启动设置向导。如果问题继续存在,请到openpilot.org官网论坛寻求进一步技术支持。 + + + Output value : <b>%1</b> µs (Min) + 输出值:<b>%1</b>µs (最小) + + + + Output value : <b>%1</b> µs (Max) + 输出值:<b>%1</b>µs (最大) + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> @@ -9370,6 +9383,11 @@ p, li { white-space: pre-wrap; } Output value: 1000µs 输出值:1000µs + + + Calibrate all motor outputs at the same time + 一次性给所有电机设置相同怠速点 + SavePage @@ -10268,7 +10286,7 @@ Do you still want to proceed? 在设置向导结束以后会停留在“解锁设置”选项页,请务必修改遥控器解锁方式。 - + Next 下一步 @@ -10348,6 +10366,16 @@ You can press 'back' at any time to return to the previous screen or p For a Quad: Elevator is Pitch, Ailerons are Roll, and Rudder is Yaw. 对于多旋翼飞行器,升降舵(ELEV)控制俯仰,副翼(AILE)控制横滚,方向舵(RUDD)控制方向。 + + + Warning + 警告 + + + + <p>There is something wrong with Throttle range. Please redo calibration and move <b>ALL sticks</b>, Throttle stick included.</p> + <p>油门行程识别出错。请重新拨动<b>所有操纵杆</b>再次进行校准,切记不要忽略油门摇杆。</p> + Please center all controls and trims and press Next when ready. @@ -10377,7 +10405,7 @@ IMPORTANT: These new settings have not been saved to the board yet. After pressi 注意:遥控器校准结果尚未保存,请点击“下一步”进入“解锁设置”页,将解锁动作设置好以后,再点击”保存“按钮将所有遥控器输入设置信息保存。 - + Please enable throttle hold mode. Move the Collective Pitch stick. @@ -10419,7 +10447,7 @@ Move the %1 stick. 结束手动校准 - + <p>Arming Settings are now set to 'Always Disarmed' for your safety.</p><p>Be sure your receiver is powered with an external source and Transmitter is on.</p><p align='center'><b>Stop Manual Calibration</b> when done</p> <p>安全起见,在后续操作开始之前,强制遥控器进入永久锁定状态。</p><p>请确认遥控器发射机和接收器已经打开。</p><p align='center'>完成手动校准后,请点击<b>结束手动校准</b></p> @@ -10429,12 +10457,12 @@ Move the %1 stick. 手动校准结束后,请打开“解锁设置”选项页设置飞行器解锁动作。 - + Start Manual Calibration 开始手动校准 - + Alternatively, click Next to skip this channel. 你也可以点击“下一步/跳过”忽略该项。 @@ -10762,14 +10790,14 @@ Move the %1 stick. - + Unknown 未知设备 - + Vehicle type: 航模类型: @@ -10927,6 +10955,11 @@ Move the %1 stick. + Synched ESC + Synched电调 + + + Oneshot ESC Oneshot电调 @@ -11040,7 +11073,7 @@ Move the %1 stick. - + Writing actuator settings @@ -11073,7 +11106,7 @@ Move the %1 stick. - + Writing mixer settings @@ -13400,7 +13433,7 @@ p, li { white-space: pre-wrap; } - + @@ -14305,7 +14338,7 @@ Please first select the area of the map to rip with <CTRL>+Left mouse clic %1 Hz - + @@ -14329,8 +14362,12 @@ Please first select the area of the map to rip with <CTRL>+Left mouse clic + OneShot and PWMSync output only works with Receiver Port settings marked with '+OneShot'<br>When using Receiver Port setting 'PPM_PIN8+OneShot' <b><font color='%1'>Bank %2</font></b> must be set to PWM + 要打开OneShot以及PWMSync输出,请确保遥控接收器端口设置为“+OneShot”<br>当接收器端口设置为“PPM_PIN8+OneShot”时,<b><font color='#C3A8FF'>输出集%2</font></b>必须设置为PWM + + OneShot only works with Receiver Port settings marked with '+OneShot'<br>When using Receiver Port setting 'PPM_PIN8+OneShot' <b><font color='%1'>Bank %2</font></b> must be set to PWM - 遥控接收器端口设置为“+OneShot”后才能<br>正常工作。假设设置为“PPM_PIN6+OneShot”,则<b><font color='%1'>输出集%2</font></b>必须设置为PWM + 遥控接收器端口设置为“+OneShot”后才能<br>正常工作。假设设置为“PPM_PIN6+OneShot”,则<b><font color='%1'>输出集%2</font></b>必须设置为PWM OneShot only works with Receiver Port settings marked with '+OneShot'<br>When using Receiver Port setting 'PPM_PIN6+OneShot' <b><font color='#C3A8FF'>Bank 4 (output 6,9-10)</font></b> must be set to PWM diff --git a/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configmultirotorwidget.cpp b/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configmultirotorwidget.cpp index a9e0b156f..5570da97e 100644 --- a/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configmultirotorwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configmultirotorwidget.cpp @@ -420,7 +420,7 @@ void ConfigMultiRotorWidget::refreshWidgetsValues(QString frameType) m_aircraft->multiThrottleCurve->initCurve(&curveValues); } else { // no, init a straight curve - m_aircraft->multiThrottleCurve->initLinearCurve(curveValues.count(), 0.9); + m_aircraft->multiThrottleCurve->initLinearCurve(curveValues.count(), 1.0); } GUIConfigDataUnion config = getConfigData(); diff --git a/ground/openpilotgcs/src/plugins/config/input.ui b/ground/openpilotgcs/src/plugins/config/input.ui index 5eb3285f6..ed0be6807 100644 --- a/ground/openpilotgcs/src/plugins/config/input.ui +++ b/ground/openpilotgcs/src/plugins/config/input.ui @@ -1801,7 +1801,7 @@ channel value for each flight mode. - <html><head/><body><p>Avoid &quot;Manual&quot; for multirotors! Never select &quot;Altitude&quot;, &quot;VelocityControl&quot; or &quot;CruiseControl&quot; on a fixed wing!</p></body></html> + <html><head/><body><p>Never select &quot;Manual&quot; as Flight Mode when flying a multitrotor! Never select &quot;Altitude&quot; or &quot;CruiseControl&quot; in Stabilization Modes when using a fixed wing!</p></body></html> Qt::AlignCenter diff --git a/ground/openpilotgcs/src/plugins/coreplugin/coreplugin.pro.user b/ground/openpilotgcs/src/plugins/coreplugin/coreplugin.pro.user deleted file mode 100644 index 0bdc53354..000000000 --- a/ground/openpilotgcs/src/plugins/coreplugin/coreplugin.pro.user +++ /dev/null @@ -1,564 +0,0 @@ - - - - - - ProjectExplorer.Project.ActiveTarget - 0 - - - ProjectExplorer.Project.EditorSettings - - true - false - - Cpp - - CppGlobal - - - - QmlJS - - QmlJSGlobal - - - 2 - System - false - 4 - true - 1 - true - 0 - true - 0 - 8 - true - 1 - true - true - true - false - - - - ProjectExplorer.Project.PluginSettings - - - - ProjectExplorer.Project.Target.0 - - Desktop - Desktop - Qt4ProjectManager.Target.DesktopTarget - 0 - 0 - 0 - - ProjectExplorer.ToolChain.Gcc:/usr/bin/g++.x86-macos-generic-mach_o-64bit./usr/bin/gdb - - - qmake - - QtProjectManager.QMakeBuildStep - false - true - - false - - - Make - - Qt4ProjectManager.MakeStep - false - - - - 2 - Build - - ProjectExplorer.BuildSteps.Build - - - - Make - - Qt4ProjectManager.MakeStep - true - clean - - - 1 - Clean - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Qt 4.8.3 in PATH (System) Debug - - Qt4ProjectManager.Qt4BuildConfiguration - 2 - /Users/kevin/Documents/Source/OpenPilot-Private/ground/openpilotgcs/src/plugins/coreplugin-build-desktop-Qt_4_8_3_in_PATH__System__Debug - 7 - true - - - ProjectExplorer.ToolChain.Gcc:/usr/bin/g++.x86-macos-generic-mach_o-64bit./usr/bin/gdb - - - qmake - - QtProjectManager.QMakeBuildStep - false - true - - false - - - Make - - Qt4ProjectManager.MakeStep - false - - - - 2 - Build - - ProjectExplorer.BuildSteps.Build - - - - Make - - Qt4ProjectManager.MakeStep - true - clean - - - 1 - Clean - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Qt 4.8.3 in PATH (System) Release - - Qt4ProjectManager.Qt4BuildConfiguration - 0 - /Users/kevin/Documents/Source/OpenPilot-Private/ground/openpilotgcs/src/plugins/coreplugin-build-desktop-Qt_4_8_3_in_PATH__System__Release - 7 - true - - - ProjectExplorer.ToolChain.Gcc:/usr/bin/g++.x86-macos-generic-mach_o-64bit./usr/bin/gdb - - - qmake - - QtProjectManager.QMakeBuildStep - false - true - - false - - - Make - - Qt4ProjectManager.MakeStep - false - - - - 2 - Build - - ProjectExplorer.BuildSteps.Build - - - - Make - - Qt4ProjectManager.MakeStep - true - clean - - - 1 - Clean - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Desktop Qt 4.8.1 for GCC (Qt SDK) Debug - - Qt4ProjectManager.Qt4BuildConfiguration - 2 - /Users/kevin/Documents/Source/OpenPilot-Private/ground/openpilotgcs/src/plugins/coreplugin-build-desktop-Desktop_Qt_4_8_1_for_GCC__Qt_SDK__Debug - 6 - true - - - ProjectExplorer.ToolChain.Gcc:/usr/bin/g++.x86-macos-generic-mach_o-64bit./usr/bin/gdb - - - qmake - - QtProjectManager.QMakeBuildStep - false - true - - false - - - Make - - Qt4ProjectManager.MakeStep - false - - - - 2 - Build - - ProjectExplorer.BuildSteps.Build - - - - Make - - Qt4ProjectManager.MakeStep - true - clean - - - 1 - Clean - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Desktop Qt 4.8.1 for GCC (Qt SDK) Release - - Qt4ProjectManager.Qt4BuildConfiguration - 0 - /Users/kevin/Documents/Source/OpenPilot-Private/ground/openpilotgcs/src/plugins/coreplugin-build-desktop-Desktop_Qt_4_8_1_for_GCC__Qt_SDK__Release - 6 - true - - - ProjectExplorer.ToolChain.Gcc:/usr/bin/g++.x86-macos-generic-mach_o-64bit./usr/bin/gdb - - - qmake - - QtProjectManager.QMakeBuildStep - false - true - - false - - - Make - - Qt4ProjectManager.MakeStep - false - - - - 2 - Build - - ProjectExplorer.BuildSteps.Build - - - - Make - - Qt4ProjectManager.MakeStep - true - clean - - - 1 - Clean - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Desktop Qt 4.8.0 for GCC (Qt SDK) Debug - - Qt4ProjectManager.Qt4BuildConfiguration - 2 - /Users/kevin/Documents/Source/OpenPilot-Private/ground/openpilotgcs/src/plugins/coreplugin-build-desktop-Desktop_Qt_4_8_0_for_GCC__Qt_SDK__Debug - 5 - true - - - ProjectExplorer.ToolChain.Gcc:/usr/bin/g++.x86-macos-generic-mach_o-64bit./usr/bin/gdb - - - qmake - - QtProjectManager.QMakeBuildStep - false - true - - false - - - Make - - Qt4ProjectManager.MakeStep - false - - - - 2 - Build - - ProjectExplorer.BuildSteps.Build - - - - Make - - Qt4ProjectManager.MakeStep - true - clean - - - 1 - Clean - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Desktop Qt 4.8.0 for GCC (Qt SDK) Release - - Qt4ProjectManager.Qt4BuildConfiguration - 0 - /Users/kevin/Documents/Source/OpenPilot-Private/ground/openpilotgcs/src/plugins/coreplugin-build-desktop-Desktop_Qt_4_8_0_for_GCC__Qt_SDK__Release - 5 - true - - - ProjectExplorer.ToolChain.Gcc:/usr/bin/g++.x86-macos-generic-mach_o-64bit./usr/bin/gdb - - - qmake - - QtProjectManager.QMakeBuildStep - false - true - - false - - - Make - - Qt4ProjectManager.MakeStep - false - - - - 2 - Build - - ProjectExplorer.BuildSteps.Build - - - - Make - - Qt4ProjectManager.MakeStep - true - clean - - - 1 - Clean - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Desktop Qt 4.7.4 for GCC (Qt SDK) Debug - - Qt4ProjectManager.Qt4BuildConfiguration - 2 - /Users/kevin/Documents/Source/OpenPilot-Private/ground/openpilotgcs/src/plugins/coreplugin-build-desktop-Desktop_Qt_4_7_4_for_GCC__Qt_SDK__Debug - 3 - true - - - ProjectExplorer.ToolChain.Gcc:/usr/bin/g++.x86-macos-generic-mach_o-64bit./usr/bin/gdb - - - qmake - - QtProjectManager.QMakeBuildStep - false - true - - false - - - Make - - Qt4ProjectManager.MakeStep - false - - - - 2 - Build - - ProjectExplorer.BuildSteps.Build - - - - Make - - Qt4ProjectManager.MakeStep - true - clean - - - 1 - Clean - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Desktop Qt 4.7.4 for GCC (Qt SDK) Release - - Qt4ProjectManager.Qt4BuildConfiguration - 0 - /Users/kevin/Documents/Source/OpenPilot-Private/ground/openpilotgcs/src/plugins/coreplugin-build-desktop-Desktop_Qt_4_7_4_for_GCC__Qt_SDK__Release - 3 - true - - 8 - - - 0 - Deploy - - ProjectExplorer.BuildSteps.Deploy - - 1 - No deployment - - ProjectExplorer.DefaultDeployConfiguration - - 1 - - true - true - - - false - false - false - false - false - false - false - false - true - true - 0.01 - 0.01 - 10 - 10 - true - true - 25 - 25 - - - true - true - valgrind - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - - 2 - - false - - %{buildDir} - Custom Executable - - ProjectExplorer.CustomExecutableRunConfiguration - 3768 - true - false - false - - 1 - - - - ProjectExplorer.Project.TargetCount - 1 - - - ProjectExplorer.Project.Updater.EnvironmentId - {51e7adba-6ef9-490c-b046-228d3817bea8} - - - ProjectExplorer.Project.Updater.FileVersion - 10 - - diff --git a/ground/openpilotgcs/src/plugins/coreplugin/mainwindow.cpp b/ground/openpilotgcs/src/plugins/coreplugin/mainwindow.cpp index 81817c5d1..7fc46b3a3 100644 --- a/ground/openpilotgcs/src/plugins/coreplugin/mainwindow.cpp +++ b/ground/openpilotgcs/src/plugins/coreplugin/mainwindow.cpp @@ -65,6 +65,7 @@ #include #include #include +#include "version_info/version_info.h" #include #include @@ -133,7 +134,7 @@ MainWindow::MainWindow() : #endif m_toggleFullScreenAction(0) { - setWindowTitle(tr("OpenPilot GCS")); + setWindowTitle(tr("OpenPilot GCS ")+VersionInfo::label()); #ifndef Q_WS_MAC qApp->setWindowIcon(QIcon(":/core/images/openpilot_logo_128.png")); #endif diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp index 7b90c8d0c..a9272ef97 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp @@ -690,6 +690,8 @@ void OutputCalibrationPage::on_motorNeutralSlider_valueChanged(int value) void OutputCalibrationPage::on_servoButton_toggled(bool checked) { ui->servoButton->setText(checked ? tr("Stop") : tr("Start")); + // Now we set servos, motors are done (Tricopter fix) + ui->calibrateAllMotors->setChecked(false); QList currentChannels; getCurrentChannels(currentChannels); diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp index f87689b32..a14970afe 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp @@ -433,7 +433,6 @@ void VehicleConfigurationHelper::applyActuatorConfiguration() if (m_configSource->getControllerType() == VehicleConfigurationSource::CONTROLLER_CC || m_configSource->getControllerType() == VehicleConfigurationSource::CONTROLLER_CC3D) { data.BankUpdateFreq[1] = servoFrequence; - data.BankMode[1] = bankMode; } else if (m_configSource->getControllerType() == VehicleConfigurationSource::CONTROLLER_REVO) { data.BankUpdateFreq[1] = escFrequence; data.BankMode[1] = bankMode; @@ -711,7 +710,7 @@ void VehicleConfigurationHelper::applyMixerConfiguration(mixerChannelSettings ch } // Default maxThrottle and minThrottle - float maxThrottle = 0.9; + float maxThrottle = 1; float minThrottle = 0; @@ -1011,7 +1010,7 @@ void VehicleConfigurationHelper::resetVehicleConfig() Q_ASSERT(field); // Set default curve at 90% max for Multirotors for (quint32 i = 0; i < field->getNumElements(); i++) { - field->setValue(i * (0.9f / (field->getNumElements() - 1)), i); + field->setValue(i * (1.0f / (field->getNumElements() - 1)), i); } } diff --git a/make/scripts/version-info.py b/make/scripts/version-info.py index 38b8401db..35edf09de 100644 --- a/make/scripts/version-info.py +++ b/make/scripts/version-info.py @@ -235,7 +235,16 @@ class Repo: with open(json_path, 'w') as json_file: json.dump(json_data, json_file) -def file_from_template(tpl_name, out_name, dict): +def escape_dict(dictionary): + """Escapes dictionary values for C""" + + # We need to escape the strings for C + for key in dictionary: + # Using json.dumps and removing the surounding quotes escapes for C + dictionary[key] = json.dumps(dictionary[key])[1:-1] + + +def file_from_template(tpl_name, out_name, dictionary): """Create or update file from template using dictionary This function reads the template, performs placeholder replacement @@ -269,7 +278,7 @@ def file_from_template(tpl_name, out_name, dict): tf.close() # Replace placeholders using dictionary - out = Template(tpl).substitute(dict) + out = Template(tpl).substitute(dictionary) # Check if output file already exists try: @@ -422,6 +431,10 @@ string given. help='name of template file'); parser.add_option('--outfile', help='name of output file'); + parser.add_option('--escape', action="store_true", + help='do escape strings for C (default based on file ext)'); + parser.add_option('--no-escape', action="store_false", dest="escape", + help='do not escape strings for C'); parser.add_option('--image', help='name of image file for sha1 calculation'); parser.add_option('--type', default="", @@ -477,6 +490,12 @@ string given. if args.info: r.info() + files_to_escape = ['.c', '.cpp'] + + if (args.escape == None and args.outfile != None and + os.path.splitext(args.outfile)[1] in files_to_escape) or args.escape: + escape_dict(dictionary) + if args.format != None: print Template(args.format).substitute(dictionary) diff --git a/package/winx86/openpilotgcs.nsi b/package/winx86/openpilotgcs.nsi index cab269c9c..9a57e63e3 100644 --- a/package/winx86/openpilotgcs.nsi +++ b/package/winx86/openpilotgcs.nsi @@ -296,7 +296,7 @@ Section ; create uninstall info WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenPilot" "UninstallString" '"$INSTDIR\Uninstall.exe"' WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenPilot" "DisplayIcon" '"$INSTDIR\bin\openpilotgcs.exe"' WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenPilot" "Publisher" "OpenPilot Team" - WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenPilot" "DisplayVersion" "Ragin Cajun" + WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenPilot" "DisplayVersion" "Ragin' Cajun" WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenPilot" "URLInfoAbout" "http://www.openpilot.org" WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenPilot" "HelpLink" "http://wiki.openpilot.org" WriteRegDWORD HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenPilot" "EstimatedSize" 100600 diff --git a/shared/uavobjectdefinition/flightmodesettings.xml b/shared/uavobjectdefinition/flightmodesettings.xml index 877e94a32..e5ed1d2eb 100644 --- a/shared/uavobjectdefinition/flightmodesettings.xml +++ b/shared/uavobjectdefinition/flightmodesettings.xml @@ -23,7 +23,7 @@ limits="%NE:AltitudeHold:AltitudeVario:CruiseControl; \ %NE:AltitudeHold:AltitudeVario:CruiseControl; \ %NE:AltitudeHold:AltitudeVario:CruiseControl:Attitude:Rattitude:Acro+:WeakLeveling:VirtualBar; \ - %NE:Rate:Attitude:AxisLock:WeakLeveling:VirtualBar:Acro+:Rattitude,\ + %NE:Rate:RateTrainer:Attitude:AxisLock:WeakLeveling:VirtualBar:Acro+:Rattitude,\ %0401NE:Rate:RateTrainer:Attitude:AxisLock:WeakLeveling:VirtualBar:Acro+:Rattitude:AltitudeHold:AltitudeVario,\ %0402NE:Rate:RateTrainer:Attitude:AxisLock:WeakLeveling:VirtualBar:Acro+:Rattitude:AltitudeHold:AltitudeVario;" /> @@ -34,7 +34,7 @@ limits="%NE:AltitudeHold:AltitudeVario:CruiseControl; \ %NE:AltitudeHold:AltitudeVario:CruiseControl; \ %NE:AltitudeHold:AltitudeVario:CruiseControl:Attitude:Rattitude:Acro+:WeakLeveling:VirtualBar; \ - %NE:Rate:Attitude:AxisLock:WeakLeveling:VirtualBar:Acro+:Rattitude,\ + %NE:Rate:RateTrainer:Attitude:AxisLock:WeakLeveling:VirtualBar:Acro+:Rattitude,\ %0401NE:Rate:RateTrainer:Attitude:AxisLock:WeakLeveling:VirtualBar:Acro+:Rattitude:AltitudeHold:AltitudeVario,\ %0402NE:Rate:RateTrainer:Attitude:AxisLock:WeakLeveling:VirtualBar:Acro+:Rattitude:AltitudeHold:AltitudeVario;" /> @@ -45,7 +45,7 @@ limits="%NE:AltitudeHold:AltitudeVario:CruiseControl; \ %NE:AltitudeHold:AltitudeVario:CruiseControl; \ %NE:AltitudeHold:AltitudeVario:CruiseControl:Attitude:Rattitude:Acro+:WeakLeveling:VirtualBar; \ - %NE:Rate:Attitude:AxisLock:WeakLeveling:VirtualBar:Acro+:Rattitude,\ + %NE:Rate:RateTrainer:Attitude:AxisLock:WeakLeveling:VirtualBar:Acro+:Rattitude,\ %0401NE:Rate:RateTrainer:Attitude:AxisLock:WeakLeveling:VirtualBar:Acro+:Rattitude:AltitudeHold:AltitudeVario,\ %0402NE:Rate:RateTrainer:Attitude:AxisLock:WeakLeveling:VirtualBar:Acro+:Rattitude:AltitudeHold:AltitudeVario;" /> @@ -56,7 +56,7 @@ limits="%NE:AltitudeHold:AltitudeVario:CruiseControl; \ %NE:AltitudeHold:AltitudeVario:CruiseControl; \ %NE:AltitudeHold:AltitudeVario:CruiseControl:Attitude:Rattitude:Acro+:WeakLeveling:VirtualBar; \ - %NE:Rate:Attitude:AxisLock:WeakLeveling:VirtualBar:Acro+:Rattitude,\ + %NE:Rate:RateTrainer:Attitude:AxisLock:WeakLeveling:VirtualBar:Acro+:Rattitude,\ %0401NE:Rate:RateTrainer:Attitude:AxisLock:WeakLeveling:VirtualBar:Acro+:Rattitude:AltitudeHold:AltitudeVario,\ %0402NE:Rate:RateTrainer:Attitude:AxisLock:WeakLeveling:VirtualBar:Acro+:Rattitude:AltitudeHold:AltitudeVario;" /> @@ -67,7 +67,7 @@ limits="%NE:AltitudeHold:AltitudeVario:CruiseControl; \ %NE:AltitudeHold:AltitudeVario:CruiseControl; \ %NE:AltitudeHold:AltitudeVario:CruiseControl:Attitude:Rattitude:Acro+:WeakLeveling:VirtualBar; \ - %NE:Rate:Attitude:AxisLock:WeakLeveling:VirtualBar:Acro+:Rattitude,\ + %NE:Rate:RateTrainer:Attitude:AxisLock:WeakLeveling:VirtualBar:Acro+:Rattitude,\ %0401NE:Rate:RateTrainer:Attitude:AxisLock:WeakLeveling:VirtualBar:Acro+:Rattitude:AltitudeHold:AltitudeVario,\ %0402NE:Rate:RateTrainer:Attitude:AxisLock:WeakLeveling:VirtualBar:Acro+:Rattitude:AltitudeHold:AltitudeVario;" /> @@ -81,30 +81,31 @@ options="Manual,Stabilized1,Stabilized2,Stabilized3,Stabilized4,Stabilized5,Stabilized6,PositionHold,CourseLock,PositionRoam,HomeLeash,AbsolutePosition,ReturnToBase,Land,PathPlanner,POI,AutoCruise,AutoTakeoff" defaultvalue="Stabilized1,Stabilized2,Stabilized3,Stabilized4,Stabilized5,Stabilized6" limits="\ - %0401NE:PositionHold:CourseLock:PositionRoam:HomeLeash:AbsolutePosition:ReturnToBase:Land:PathPlanner:POI:AutoCruise,AutoTakeoff\ - %0402NE:PositionHold:CourseLock:PositionRoam:HomeLeash:AbsolutePosition:ReturnToBase:Land:PathPlanner:POI:AutoCruise,AutoTakeoff\ + %0401NE:PositionHold:CourseLock:PositionRoam:HomeLeash:AbsolutePosition:ReturnToBase:Land:PathPlanner:POI:AutoCruise:AutoTakeoff\ + %0402NE:PositionHold:CourseLock:PositionRoam:HomeLeash:AbsolutePosition:ReturnToBase:Land:PathPlanner:POI:AutoCruise:AutoTakeoff\ %0903NE:POI:PathPlanner:AutoCruise;\ \ - %0401NE:PositionHold:CourseLock:PositionRoam:HomeLeash:AbsolutePosition:ReturnToBase:Land:PathPlanner:POI:AutoCruise,AutoTakeoff\ - %0402NE:PositionHold:CourseLock:PositionRoam:HomeLeash:AbsolutePosition:ReturnToBase:Land:PathPlanner:POI:AutoCruise,AutoTakeoff\ + %0401NE:PositionHold:CourseLock:PositionRoam:HomeLeash:AbsolutePosition:ReturnToBase:Land:PathPlanner:POI:AutoCruise:AutoTakeoff\ + %0402NE:PositionHold:CourseLock:PositionRoam:HomeLeash:AbsolutePosition:ReturnToBase:Land:PathPlanner:POI:AutoCruise:AutoTakeoff\ %0903NE:POI:PathPlanner:AutoCruise;\ \ - %0401NE:PositionHold:CourseLock:PositionRoam:HomeLeash:AbsolutePosition:ReturnToBase:Land:PathPlanner:POI:AutoCruise,AutoTakeoff\ - %0402NE:PositionHold:CourseLock:PositionRoam:HomeLeash:AbsolutePosition:ReturnToBase:Land:PathPlanner:POI:AutoCruise,AutoTakeoff\ + %0401NE:PositionHold:CourseLock:PositionRoam:HomeLeash:AbsolutePosition:ReturnToBase:Land:PathPlanner:POI:AutoCruise:AutoTakeoff\ + %0402NE:PositionHold:CourseLock:PositionRoam:HomeLeash:AbsolutePosition:ReturnToBase:Land:PathPlanner:POI:AutoCruise:AutoTakeoff\ %0903NE:POI:PathPlanner:AutoCruise;\ \ - %0401NE:PositionHold:CourseLock:PositionRoam:HomeLeash:AbsolutePosition:ReturnToBase:Land:PathPlanner:POI:AutoCruise,AutoTakeoff\ - %0402NE:PositionHold:CourseLock:PositionRoam:HomeLeash:AbsolutePosition:ReturnToBase:Land:PathPlanner:POI:AutoCruise,AutoTakeoff\ + %0401NE:PositionHold:CourseLock:PositionRoam:HomeLeash:AbsolutePosition:ReturnToBase:Land:PathPlanner:POI:AutoCruise:AutoTakeoff\ + %0402NE:PositionHold:CourseLock:PositionRoam:HomeLeash:AbsolutePosition:ReturnToBase:Land:PathPlanner:POI:AutoCruise:AutoTakeoff\ %0903NE:POI:PathPlanner:AutoCruise;\ \ - %0401NE:PositionHold:CourseLock:PositionRoam:HomeLeash:AbsolutePosition:ReturnToBase:Land:PathPlanner:POI:AutoCruise,AutoTakeoff\ - %0402NE:PositionHold:CourseLock:PositionRoam:HomeLeash:AbsolutePosition:ReturnToBase:Land:PathPlanner:POI:AutoCruise,AutoTakeoff\ + %0401NE:PositionHold:CourseLock:PositionRoam:HomeLeash:AbsolutePosition:ReturnToBase:Land:PathPlanner:POI:AutoCruise:AutoTakeoff\ + %0402NE:PositionHold:CourseLock:PositionRoam:HomeLeash:AbsolutePosition:ReturnToBase:Land:PathPlanner:POI:AutoCruise:AutoTakeoff\ %0903NE:POI:PathPlanner:AutoCruise;\ \ - %0401NE:PositionHold:CourseLock:PositionRoam:HomeLeash:AbsolutePosition:ReturnToBase:Land:PathPlanner:POI:AutoCruise,AutoTakeoff\ - %0402NE:PositionHold:CourseLock:PositionRoam:HomeLeash:AbsolutePosition:ReturnToBase:Land:PathPlanner:POI:AutoCruise,AutoTakeoff\ + %0401NE:PositionHold:CourseLock:PositionRoam:HomeLeash:AbsolutePosition:ReturnToBase:Land:PathPlanner:POI:AutoCruise:AutoTakeoff\ + %0402NE:PositionHold:CourseLock:PositionRoam:HomeLeash:AbsolutePosition:ReturnToBase:Land:PathPlanner:POI:AutoCruise:AutoTakeoff\ %0903NE:POI:PathPlanner:AutoCruise;"/> +