mirror of
https://github.com/betaflight/betaflight-configurator.git
synced 2025-07-19 14:25:14 +03:00
Independent rates settings for roll and pitch
This commit is contained in:
parent
3a94d0056f
commit
68adc30de8
5 changed files with 58 additions and 11 deletions
|
@ -155,6 +155,8 @@ var FC = {
|
||||||
dynamic_THR_breakpoint: 0,
|
dynamic_THR_breakpoint: 0,
|
||||||
RC_YAW_EXPO: 0,
|
RC_YAW_EXPO: 0,
|
||||||
rcYawRate: 0,
|
rcYawRate: 0,
|
||||||
|
rcPitchRate: 0,
|
||||||
|
RC_PITCH_EXPO: 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
AUX_CONFIG = [];
|
AUX_CONFIG = [];
|
||||||
|
|
|
@ -313,6 +313,13 @@ MspHelper.prototype.process_data = function(dataHandler) {
|
||||||
} else {
|
} else {
|
||||||
RC_tuning.RC_YAW_EXPO = 0;
|
RC_tuning.RC_YAW_EXPO = 0;
|
||||||
}
|
}
|
||||||
|
if (semver.gte(CONFIG.apiVersion, "1.37.0")) {
|
||||||
|
RC_tuning.rcPitchRate = parseFloat((data.readU8() / 100).toFixed(2));
|
||||||
|
RC_tuning.RC_PITCH_EXPO = parseFloat((data.readU8() / 100).toFixed(2));
|
||||||
|
} else {
|
||||||
|
RC_tuning.rcPitchRate = 0;
|
||||||
|
RC_tuning.RC_PITCH_EXPO = 0;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case MSPCodes.MSP_PID:
|
case MSPCodes.MSP_PID:
|
||||||
// PID data arrived, we need to scale it and save to appropriate bank / array
|
// PID data arrived, we need to scale it and save to appropriate bank / array
|
||||||
|
@ -1325,6 +1332,10 @@ MspHelper.prototype.crunch = function(code) {
|
||||||
buffer.push8(Math.round(RC_tuning.rcYawRate * 100));
|
buffer.push8(Math.round(RC_tuning.rcYawRate * 100));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (semver.gte(CONFIG.apiVersion, "1.37.0")) {
|
||||||
|
buffer.push8(Math.round(RC_tuning.rcPitchRate * 100));
|
||||||
|
buffer.push8(Math.round(RC_tuning.RC_PITCH_EXPO * 100));
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case MSPCodes.MSP_SET_RX_MAP:
|
case MSPCodes.MSP_SET_RX_MAP:
|
||||||
for (var i = 0; i < RC_MAP.length; i++) {
|
for (var i = 0; i < RC_MAP.length; i++) {
|
||||||
|
|
|
@ -163,6 +163,11 @@ TABS.pid_tuning.initialize = function (callback) {
|
||||||
$('.antigravity').hide();
|
$('.antigravity').hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (semver.gte(CONFIG.apiVersion, "1.37.0")) {
|
||||||
|
$('.pid_tuning input[name="rc_rate_pitch"]').val(RC_tuning.rcPitchRate.toFixed(2));
|
||||||
|
$('.pid_tuning input[name="rc_pitch_expo"]').val(RC_tuning.RC_PITCH_EXPO.toFixed(2));
|
||||||
|
}
|
||||||
|
|
||||||
if (semver.gte(CONFIG.apiVersion, "1.39.0")) {
|
if (semver.gte(CONFIG.apiVersion, "1.39.0")) {
|
||||||
|
|
||||||
$('.pid_filter input[name="gyroLowpass2Frequency"]').val(FILTER_CONFIG.gyro_lowpass2_hz);
|
$('.pid_filter input[name="gyroLowpass2Frequency"]').val(FILTER_CONFIG.gyro_lowpass2_hz);
|
||||||
|
@ -437,6 +442,8 @@ TABS.pid_tuning.initialize = function (callback) {
|
||||||
RC_tuning.RC_EXPO = parseFloat($('.pid_tuning input[name="rc_expo"]').val());
|
RC_tuning.RC_EXPO = parseFloat($('.pid_tuning input[name="rc_expo"]').val());
|
||||||
RC_tuning.RC_YAW_EXPO = parseFloat($('.pid_tuning input[name="rc_yaw_expo"]').val());
|
RC_tuning.RC_YAW_EXPO = parseFloat($('.pid_tuning input[name="rc_yaw_expo"]').val());
|
||||||
RC_tuning.rcYawRate = parseFloat($('.pid_tuning input[name="rc_rate_yaw"]').val());
|
RC_tuning.rcYawRate = parseFloat($('.pid_tuning input[name="rc_rate_yaw"]').val());
|
||||||
|
RC_tuning.rcPitchRate = parseFloat($('.pid_tuning input[name="rc_rate_pitch"]').val());
|
||||||
|
RC_tuning.RC_PITCH_EXPO = parseFloat($('.pid_tuning input[name="rc_pitch_expo"]').val());
|
||||||
|
|
||||||
RC_tuning.throttle_MID = parseFloat($('.throttle input[name="mid"]').val());
|
RC_tuning.throttle_MID = parseFloat($('.throttle input[name="mid"]').val());
|
||||||
RC_tuning.throttle_EXPO = parseFloat($('.throttle input[name="expo"]').val());
|
RC_tuning.throttle_EXPO = parseFloat($('.throttle input[name="expo"]').val());
|
||||||
|
@ -642,6 +649,8 @@ TABS.pid_tuning.initialize = function (callback) {
|
||||||
rc_rate_yaw: RC_tuning.rcYawRate,
|
rc_rate_yaw: RC_tuning.rcYawRate,
|
||||||
rc_expo: RC_tuning.RC_EXPO,
|
rc_expo: RC_tuning.RC_EXPO,
|
||||||
rc_yaw_expo: RC_tuning.RC_YAW_EXPO,
|
rc_yaw_expo: RC_tuning.RC_YAW_EXPO,
|
||||||
|
rc_rate_pitch: RC_tuning.rcPitchRate,
|
||||||
|
rc_pitch_expo: RC_tuning.RC_PITCH_EXPO,
|
||||||
superexpo: FEATURE_CONFIG.features.isEnabled('SUPEREXPO_RATES'),
|
superexpo: FEATURE_CONFIG.features.isEnabled('SUPEREXPO_RATES'),
|
||||||
deadband: RC_DEADBAND_CONFIG.deadband,
|
deadband: RC_DEADBAND_CONFIG.deadband,
|
||||||
yawDeadband: RC_DEADBAND_CONFIG.yaw_deadband
|
yawDeadband: RC_DEADBAND_CONFIG.yaw_deadband
|
||||||
|
@ -665,6 +674,11 @@ TABS.pid_tuning.initialize = function (callback) {
|
||||||
$('.pid_tuning .levelSensitivityHeader').empty();
|
$('.pid_tuning .levelSensitivityHeader').empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (semver.lt(CONFIG.apiVersion, "1.37.0")) {
|
||||||
|
self.currentRates.rc_rate_pitch = self.currentRates.rc_rate;
|
||||||
|
self.currentRates.rc_expo_pitch = self.currentRates.rc_expo;
|
||||||
|
}
|
||||||
|
|
||||||
$('.tab-pid_tuning .tab_container .pid').on('click', function () {
|
$('.tab-pid_tuning .tab_container .pid').on('click', function () {
|
||||||
$('.tab-pid_tuning .subtab-pid').show();
|
$('.tab-pid_tuning .subtab-pid').show();
|
||||||
$('.tab-pid_tuning .subtab-filter').hide();
|
$('.tab-pid_tuning .subtab-filter').hide();
|
||||||
|
@ -950,6 +964,16 @@ TABS.pid_tuning.initialize = function (callback) {
|
||||||
$('.pid_tuning .roll_pitch_rate').hide();
|
$('.pid_tuning .roll_pitch_rate').hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (semver.gte(CONFIG.apiVersion, "1.37.0")) {
|
||||||
|
$('.pid_tuning .bracket').hide();
|
||||||
|
$('.pid_tuning input[name=rc_rate]').parent().css('background-color', '')
|
||||||
|
$('.pid_tuning input[name=rc_rate]').parent().attr('rowspan', 1)
|
||||||
|
$('.pid_tuning input[name=rc_expo]').parent().attr('rowspan', 1)
|
||||||
|
} else {
|
||||||
|
$('.pid_tuning input[name=rc_rate_pitch]').parent().hide()
|
||||||
|
$('.pid_tuning input[name=rc_pitch_expo]').parent().hide()
|
||||||
|
}
|
||||||
|
|
||||||
if (useLegacyCurve) {
|
if (useLegacyCurve) {
|
||||||
$('.new_rates').hide();
|
$('.new_rates').hide();
|
||||||
}
|
}
|
||||||
|
@ -996,6 +1020,14 @@ TABS.pid_tuning.initialize = function (callback) {
|
||||||
|
|
||||||
updateNeeded = true;
|
updateNeeded = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (targetElement.attr('name') === 'rc_rate' && semver.lt(CONFIG.apiVersion, "1.37.0")) {
|
||||||
|
self.currentRates.rc_rate_pitch = targetValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (targetElement.attr('name') === 'rc_expo' && semver.lt(CONFIG.apiVersion, "1.37.0")) {
|
||||||
|
self.currentRates.rc_pitch_expo = targetValue;
|
||||||
|
}
|
||||||
} else { // no event was passed, just force a graph update
|
} else { // no event was passed, just force a graph update
|
||||||
updateNeeded = true;
|
updateNeeded = true;
|
||||||
}
|
}
|
||||||
|
@ -1009,7 +1041,7 @@ TABS.pid_tuning.initialize = function (callback) {
|
||||||
if (!useLegacyCurve) {
|
if (!useLegacyCurve) {
|
||||||
maxAngularVel = Math.max(
|
maxAngularVel = Math.max(
|
||||||
printMaxAngularVel(self.currentRates.roll_rate, self.currentRates.rc_rate, self.currentRates.rc_expo, self.currentRates.superexpo, self.currentRates.deadband, self.maxAngularVelRollElement),
|
printMaxAngularVel(self.currentRates.roll_rate, self.currentRates.rc_rate, self.currentRates.rc_expo, self.currentRates.superexpo, self.currentRates.deadband, self.maxAngularVelRollElement),
|
||||||
printMaxAngularVel(self.currentRates.pitch_rate, self.currentRates.rc_rate, self.currentRates.rc_expo, self.currentRates.superexpo, self.currentRates.deadband, self.maxAngularVelPitchElement),
|
printMaxAngularVel(self.currentRates.pitch_rate, self.currentRates.rc_rate_pitch, self.currentRates.rc_pitch_expo, self.currentRates.superexpo, self.currentRates.deadband, self.maxAngularVelPitchElement),
|
||||||
printMaxAngularVel(self.currentRates.yaw_rate, self.currentRates.rc_rate_yaw, self.currentRates.rc_yaw_expo, self.currentRates.superexpo, self.currentRates.yawDeadband, self.maxAngularVelYawElement));
|
printMaxAngularVel(self.currentRates.yaw_rate, self.currentRates.rc_rate_yaw, self.currentRates.rc_yaw_expo, self.currentRates.superexpo, self.currentRates.yawDeadband, self.maxAngularVelYawElement));
|
||||||
|
|
||||||
// make maxAngularVel multiple of 200deg/s so that the auto-scale doesn't keep changing for small changes of the maximum curve
|
// make maxAngularVel multiple of 200deg/s so that the auto-scale doesn't keep changing for small changes of the maximum curve
|
||||||
|
@ -1023,7 +1055,7 @@ TABS.pid_tuning.initialize = function (callback) {
|
||||||
|
|
||||||
curveContext.lineWidth = 2 * lineScale;
|
curveContext.lineWidth = 2 * lineScale;
|
||||||
drawCurve(self.currentRates.roll_rate, self.currentRates.rc_rate, self.currentRates.rc_expo, self.currentRates.superexpo, self.currentRates.deadband, maxAngularVel, '#ff0000', 0, curveContext);
|
drawCurve(self.currentRates.roll_rate, self.currentRates.rc_rate, self.currentRates.rc_expo, self.currentRates.superexpo, self.currentRates.deadband, maxAngularVel, '#ff0000', 0, curveContext);
|
||||||
drawCurve(self.currentRates.pitch_rate, self.currentRates.rc_rate, self.currentRates.rc_expo, self.currentRates.superexpo, self.currentRates.deadband, maxAngularVel, '#00ff00', -4, curveContext);
|
drawCurve(self.currentRates.pitch_rate, self.currentRates.rc_rate_pitch, self.currentRates.rc_pitch_expo, self.currentRates.superexpo, self.currentRates.deadband, maxAngularVel, '#00ff00', -4, curveContext);
|
||||||
drawCurve(self.currentRates.yaw_rate, self.currentRates.rc_rate_yaw, self.currentRates.rc_yaw_expo, self.currentRates.superexpo, self.currentRates.yawDeadband, maxAngularVel, '#0000ff', 4, curveContext);
|
drawCurve(self.currentRates.yaw_rate, self.currentRates.rc_rate_yaw, self.currentRates.rc_yaw_expo, self.currentRates.superexpo, self.currentRates.yawDeadband, maxAngularVel, '#0000ff', 4, curveContext);
|
||||||
|
|
||||||
self.updateRatesLabels();
|
self.updateRatesLabels();
|
||||||
|
@ -1532,7 +1564,7 @@ TABS.pid_tuning.updateRatesLabels = function() {
|
||||||
|
|
||||||
if(RC.channels[0] && RC.channels[1] && RC.channels[2]) {
|
if(RC.channels[0] && RC.channels[1] && RC.channels[2]) {
|
||||||
currentValues.push(self.rateCurve.drawStickPosition(RC.channels[0], self.currentRates.roll_rate, self.currentRates.rc_rate, self.currentRates.rc_expo, self.currentRates.superexpo, self.currentRates.deadband, maxAngularVel, stickContext, '#FF8080') + ' deg/s');
|
currentValues.push(self.rateCurve.drawStickPosition(RC.channels[0], self.currentRates.roll_rate, self.currentRates.rc_rate, self.currentRates.rc_expo, self.currentRates.superexpo, self.currentRates.deadband, maxAngularVel, stickContext, '#FF8080') + ' deg/s');
|
||||||
currentValues.push(self.rateCurve.drawStickPosition(RC.channels[1], self.currentRates.pitch_rate, self.currentRates.rc_rate, self.currentRates.rc_expo, self.currentRates.superexpo, self.currentRates.deadband, maxAngularVel, stickContext, '#80FF80') + ' deg/s');
|
currentValues.push(self.rateCurve.drawStickPosition(RC.channels[1], self.currentRates.pitch_rate, self.currentRates.rc_rate_pitch, self.currentRates.rc_pitch_expo, self.currentRates.superexpo, self.currentRates.deadband, maxAngularVel, stickContext, '#80FF80') + ' deg/s');
|
||||||
currentValues.push(self.rateCurve.drawStickPosition(RC.channels[2], self.currentRates.yaw_rate, self.currentRates.rc_rate_yaw, self.currentRates.rc_yaw_expo, self.currentRates.superexpo, self.currentRates.yawDeadband, maxAngularVel, stickContext, '#8080FF') + ' deg/s');
|
currentValues.push(self.rateCurve.drawStickPosition(RC.channels[2], self.currentRates.yaw_rate, self.currentRates.rc_rate_yaw, self.currentRates.rc_yaw_expo, self.currentRates.superexpo, self.currentRates.yawDeadband, maxAngularVel, stickContext, '#8080FF') + ' deg/s');
|
||||||
} else {
|
} else {
|
||||||
currentValues = [];
|
currentValues = [];
|
||||||
|
|
|
@ -575,7 +575,7 @@ TABS.receiver.renderModel = function () {
|
||||||
var delta = this.clock.getDelta();
|
var delta = this.clock.getDelta();
|
||||||
|
|
||||||
var roll = delta * this.rateCurve.rcCommandRawToDegreesPerSecond(RC.channels[0], RC_tuning.roll_rate, RC_tuning.RC_RATE, RC_tuning.RC_EXPO, this.useSuperExpo, this.deadband),
|
var roll = delta * this.rateCurve.rcCommandRawToDegreesPerSecond(RC.channels[0], RC_tuning.roll_rate, RC_tuning.RC_RATE, RC_tuning.RC_EXPO, this.useSuperExpo, this.deadband),
|
||||||
pitch = delta * this.rateCurve.rcCommandRawToDegreesPerSecond(RC.channels[1], RC_tuning.pitch_rate, RC_tuning.RC_RATE, RC_tuning.RC_EXPO, this.useSuperExpo, this.deadband),
|
pitch = delta * this.rateCurve.rcCommandRawToDegreesPerSecond(RC.channels[1], RC_tuning.pitch_rate, RC_tuning.rcPitchRate, RC_tuning.RC_PITCH_EXPO, this.useSuperExpo, this.deadband),
|
||||||
yaw = delta * this.rateCurve.rcCommandRawToDegreesPerSecond(RC.channels[2], RC_tuning.yaw_rate, RC_tuning.rcYawRate, RC_tuning.RC_YAW_EXPO, this.useSuperExpo, this.yawDeadband);
|
yaw = delta * this.rateCurve.rcCommandRawToDegreesPerSecond(RC.channels[2], RC_tuning.yaw_rate, RC_tuning.rcYawRate, RC_tuning.RC_YAW_EXPO, this.useSuperExpo, this.yawDeadband);
|
||||||
|
|
||||||
this.model.rotateBy(-degToRad(pitch), -degToRad(yaw), -degToRad(roll));
|
this.model.rotateBy(-degToRad(pitch), -degToRad(yaw), -degToRad(roll));
|
||||||
|
|
|
@ -113,8 +113,10 @@
|
||||||
<td class="pid_data"><input type="number" name="i" step="1" min="0" max="200" /></td>
|
<td class="pid_data"><input type="number" name="i" step="1" min="0" max="200" /></td>
|
||||||
<td class="pid_data"><input type="number" name="d" step="1" min="0" max="200" /></td>
|
<td class="pid_data"><input type="number" name="d" step="1" min="0" max="200" /></td>
|
||||||
<td class="pid_data"><input type="number" name="f" step="1" min="0" max="2000" /></td>
|
<td class="pid_data"><input type="number" name="f" step="1" min="0" max="2000" /></td>
|
||||||
|
<td><input type="number" name="rc_rate_pitch" step="0.01" min="0" max="2.55" /></td>
|
||||||
<td class="pitch_rate"><input type="number" name="pitch_rate" step="0.01" min="0" max="1.00" /></td>
|
<td class="pitch_rate"><input type="number" name="pitch_rate" step="0.01" min="0" max="1.00" /></td>
|
||||||
<td class="new_rates maxAngularVelPitch"></td>
|
<td class="new_rates maxAngularVelPitch"></td>
|
||||||
|
<td><input type="number" name="rc_pitch_expo" step="0.01" min="0" max="1" /></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="YAW">
|
<tr class="YAW">
|
||||||
<!-- 2 -->
|
<!-- 2 -->
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue