3D model to respect rates
parent
53c4ee43d3
commit
86352b2a61
|
@ -8,9 +8,7 @@ var SUPEREXPO_FEATURE_BIT = 23;
|
||||||
|
|
||||||
TABS.pid_tuning.initialize = function (callback) {
|
TABS.pid_tuning.initialize = function (callback) {
|
||||||
var self = this;
|
var self = this;
|
||||||
if (GUI.active_tab != 'pid_tuning') {
|
if (GUI.active_tab != 'pid_tuning') { GUI.active_tab = 'pid_tuning'; }
|
||||||
GUI.active_tab = 'pid_tuning';
|
|
||||||
}
|
|
||||||
|
|
||||||
// requesting MSP_STATUS manually because it contains CONFIG.profile
|
// requesting MSP_STATUS manually because it contains CONFIG.profile
|
||||||
MSP.promise(MSP_codes.MSP_STATUS).then(function() {
|
MSP.promise(MSP_codes.MSP_STATUS).then(function() {
|
||||||
|
@ -383,6 +381,17 @@ TABS.pid_tuning.initialize = function (callback) {
|
||||||
// translate to user-selected language
|
// translate to user-selected language
|
||||||
localize();
|
localize();
|
||||||
|
|
||||||
|
// Local cache of current rates
|
||||||
|
self.currentRates = {
|
||||||
|
rateRoll: RC_tuning.roll_rate * 100,
|
||||||
|
ratePitch: RC_tuning.pitch_rate * 100,
|
||||||
|
rateYaw: RC_tuning.yaw_rate * 100,
|
||||||
|
rcRate: RC_tuning.RC_RATE * 100,
|
||||||
|
rcRateYaw: SPECIAL_PARAMETERS.RC_RATE_YAW * 100,
|
||||||
|
rcExpo: RC_tuning.RC_EXPO * 100,
|
||||||
|
rcExpoYaw: RC_tuning.RC_YAW_EXPO * 100
|
||||||
|
};
|
||||||
|
|
||||||
var showAllButton = $('#showAllPids');
|
var showAllButton = $('#showAllPids');
|
||||||
var showAllMsg = chrome.i18n.getMessage("pidTuningShowAllPids");
|
var showAllMsg = chrome.i18n.getMessage("pidTuningShowAllPids");
|
||||||
var hideUnusedMsg = chrome.i18n.getMessage("pidTuningHideUnusedPids");
|
var hideUnusedMsg = chrome.i18n.getMessage("pidTuningHideUnusedPids");
|
||||||
|
@ -502,7 +511,7 @@ TABS.pid_tuning.initialize = function (callback) {
|
||||||
useLegacyCurve = true;
|
useLegacyCurve = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
var rateCurve = new RateCurve(useLegacyCurve);
|
self.rateCurve = new RateCurve(useLegacyCurve);
|
||||||
|
|
||||||
// UI Hooks
|
// UI Hooks
|
||||||
// curves
|
// curves
|
||||||
|
@ -521,11 +530,19 @@ TABS.pid_tuning.initialize = function (callback) {
|
||||||
var rcExpo = checkInput(rcExpoElement);
|
var rcExpo = checkInput(rcExpoElement);
|
||||||
var rcExpoYaw = checkInput(rcExpoYawElement);
|
var rcExpoYaw = checkInput(rcExpoYawElement);
|
||||||
|
|
||||||
var maxAngularVelRoll = rateCurve.getMaxAngularVel(rateRoll, rcRate, rcExpo, useSuperExpo);
|
self.currentRates.rateRoll = rateRoll * 100;
|
||||||
|
self.currentRates.ratePitch = ratePitch * 100;
|
||||||
|
self.currentRates.rateYaw = rateYaw * 100;
|
||||||
|
self.currentRates.rcRate = rcRate * 100;
|
||||||
|
self.currentRates.rcRateYaw = rcRateYaw * 100;
|
||||||
|
self.currentRates.rcExpo = rcExpo * 100;
|
||||||
|
self.currentRates.rcExpoYaw = rcExpoYaw * 100;
|
||||||
|
|
||||||
|
var maxAngularVelRoll = self.rateCurve.getMaxAngularVel(rateRoll, rcRate, rcExpo, useSuperExpo);
|
||||||
maxAngularVelRollElement.text(maxAngularVelRoll);
|
maxAngularVelRollElement.text(maxAngularVelRoll);
|
||||||
var maxAngularVelPitch = rateCurve.getMaxAngularVel(ratePitch, rcRate, rcExpo, useSuperExpo);
|
var maxAngularVelPitch = self.rateCurve.getMaxAngularVel(ratePitch, rcRate, rcExpo, useSuperExpo);
|
||||||
maxAngularVelPitchElement.text(maxAngularVelPitch);
|
maxAngularVelPitchElement.text(maxAngularVelPitch);
|
||||||
var maxAngularVelYaw = rateCurve.getMaxAngularVel(rateYaw, rcRateYaw, rcExpoYaw, useSuperExpo);
|
var maxAngularVelYaw = self.rateCurve.getMaxAngularVel(rateYaw, rcRateYaw, rcExpoYaw, useSuperExpo);
|
||||||
maxAngularVelYawElement.text(maxAngularVelYaw);
|
maxAngularVelYawElement.text(maxAngularVelYaw);
|
||||||
var maxAngularVel = Math.max(maxAngularVelRoll, maxAngularVelPitch, maxAngularVelYaw);
|
var maxAngularVel = Math.max(maxAngularVelRoll, maxAngularVelPitch, maxAngularVelYaw);
|
||||||
|
|
||||||
|
@ -539,19 +556,19 @@ TABS.pid_tuning.initialize = function (callback) {
|
||||||
|
|
||||||
curveContext.save();
|
curveContext.save();
|
||||||
curveContext.strokeStyle = '#ff0000';
|
curveContext.strokeStyle = '#ff0000';
|
||||||
rateCurve.draw(rateRoll, rcRate, rcExpo, useSuperExpo, maxAngularVel, curveContext);
|
self.rateCurve.draw(rateRoll, rcRate, rcExpo, useSuperExpo, maxAngularVel, curveContext);
|
||||||
curveContext.restore();
|
curveContext.restore();
|
||||||
|
|
||||||
curveContext.save();
|
curveContext.save();
|
||||||
curveContext.translate(0, -4);
|
curveContext.translate(0, -4);
|
||||||
curveContext.strokeStyle = '#00ff00';
|
curveContext.strokeStyle = '#00ff00';
|
||||||
rateCurve.draw(ratePitch, rcRate, rcExpo, useSuperExpo, maxAngularVel, curveContext);
|
self.rateCurve.draw(ratePitch, rcRate, rcExpo, useSuperExpo, maxAngularVel, curveContext);
|
||||||
curveContext.restore();
|
curveContext.restore();
|
||||||
|
|
||||||
curveContext.save();
|
curveContext.save();
|
||||||
curveContext.strokeStyle = '#0000ff';
|
curveContext.strokeStyle = '#0000ff';
|
||||||
curveContext.translate(0, 4);
|
curveContext.translate(0, 4);
|
||||||
rateCurve.draw(rateYaw, rcRateYaw, rcExpoYaw, useSuperExpo, maxAngularVel, curveContext);
|
self.rateCurve.draw(rateYaw, rcRateYaw, rcExpoYaw, useSuperExpo, maxAngularVel, curveContext);
|
||||||
curveContext.restore();
|
curveContext.restore();
|
||||||
}, 0);
|
}, 0);
|
||||||
};
|
};
|
||||||
|
@ -701,11 +718,8 @@ TABS.pid_tuning.initRatesPreview = function () {
|
||||||
this.keepRendering = true;
|
this.keepRendering = true;
|
||||||
this.model = new Model($('.rates_preview'), $('.rates_preview canvas'));
|
this.model = new Model($('.rates_preview'), $('.rates_preview canvas'));
|
||||||
|
|
||||||
var scale = d3.scale.linear().domain([900, 2100]);
|
this.$superExpo = $('.pid_tuning input[name="show_superexpo_rates"]');
|
||||||
|
this.degreeToRadianRatio = Math.PI / 180;
|
||||||
this.rollScale = scale.range([Math.PI * 2, -Math.PI * 2]);
|
|
||||||
this.pitchScale = scale.range([Math.PI * 2, -Math.PI * 2]);
|
|
||||||
this.yawScale = scale.range([Math.PI * 2, -Math.PI * 2]);
|
|
||||||
|
|
||||||
$(window).on('resize', $.proxy(this.model.resize, this.model));
|
$(window).on('resize', $.proxy(this.model.resize, this.model));
|
||||||
};
|
};
|
||||||
|
@ -717,11 +731,13 @@ TABS.pid_tuning.renderModel = function () {
|
||||||
|
|
||||||
if (RC.channels[0] && RC.channels[1] && RC.channels[2]) {
|
if (RC.channels[0] && RC.channels[1] && RC.channels[2]) {
|
||||||
var delta = this.clock.getDelta(),
|
var delta = this.clock.getDelta(),
|
||||||
roll = delta * this.rollScale(RC.channels[0]),
|
useSuperExpo = this.$superExpo.is(':checked');
|
||||||
pitch = delta * this.pitchScale(RC.channels[1]),
|
|
||||||
yaw = delta * this.yawScale(RC.channels[2]);
|
|
||||||
|
|
||||||
this.model.rotateBy(pitch, yaw, roll);
|
var roll = delta * this.rateCurve.rcCommandRawToDegreesPerSecond(RC.channels[0], this.currentRates.rateRoll, this.currentRates.rcRate, this.currentRates.rcExpo, useSuperExpo),
|
||||||
|
pitch = delta * this.rateCurve.rcCommandRawToDegreesPerSecond(RC.channels[1], this.currentRates.ratePitch, this.currentRates.rcRate, this.currentRates.rcExpo, useSuperExpo),
|
||||||
|
yaw = delta * this.rateCurve.rcCommandRawToDegreesPerSecond(RC.channels[2], this.currentRates.rateYaw, this.currentRates.rcRateYaw, this.currentRates.rcExpoYaw, useSuperExpo);
|
||||||
|
|
||||||
|
this.model.rotateBy(-pitch * this.degreeToRadianRatio, -yaw * this.degreeToRadianRatio, -roll * this.degreeToRadianRatio);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,15 @@ TABS.receiver.initialize = function (callback) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function get_rc_data() {
|
function get_rc_data() {
|
||||||
MSP.send_message(MSP_codes.MSP_RC, false, false, get_rc_map);
|
MSP.send_message(MSP_codes.MSP_RC, false, false, get_rc_tuning_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_rc_tuning_data() {
|
||||||
|
MSP.send_message(MSP_codes.MSP_RC_TUNING, false, false, get_bt_config_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_bt_config_data() {
|
||||||
|
MSP.send_message(MSP_codes.MSP_BF_CONFIG, false, false, get_rc_map);
|
||||||
}
|
}
|
||||||
|
|
||||||
function get_rc_map() {
|
function get_rc_map() {
|
||||||
|
@ -391,11 +399,13 @@ TABS.receiver.initModelPreview = function () {
|
||||||
this.keepRendering = true;
|
this.keepRendering = true;
|
||||||
this.model = new Model($('.model_preview'), $('.model_preview canvas'));
|
this.model = new Model($('.model_preview'), $('.model_preview canvas'));
|
||||||
|
|
||||||
var scale = d3.scale.linear().domain([900, 2100]);
|
this.useSuperExpo = false;
|
||||||
|
if (CONFIG.flightControllerIdentifier === 'BTFL' && semver.gte(CONFIG.flightControllerVersion, '2.8.0')) {
|
||||||
|
this.useSuperExpo = bit_check(BF_CONFIG.features, SUPEREXPO_FEATURE_BIT);
|
||||||
|
}
|
||||||
|
|
||||||
this.rollScale = scale.range([Math.PI * 2, -Math.PI * 2]);
|
this.rateCurve = new RateCurve(CONFIG.flightControllerIdentifier !== 'BTFL' || semver.lt(CONFIG.flightControllerVersion, '2.8.0'));
|
||||||
this.pitchScale = scale.range([Math.PI * 2, -Math.PI * 2]);
|
this.degreeToRadianRatio = Math.PI / 180;
|
||||||
this.yawScale = scale.range([Math.PI * 2, -Math.PI * 2]);
|
|
||||||
|
|
||||||
$(window).on('resize', $.proxy(this.model.resize, this.model));
|
$(window).on('resize', $.proxy(this.model.resize, this.model));
|
||||||
};
|
};
|
||||||
|
@ -406,12 +416,13 @@ TABS.receiver.renderModel = function () {
|
||||||
if (!this.clock) { this.clock = new THREE.Clock(); }
|
if (!this.clock) { this.clock = new THREE.Clock(); }
|
||||||
|
|
||||||
if (RC.channels[0] && RC.channels[1] && RC.channels[2]) {
|
if (RC.channels[0] && RC.channels[1] && RC.channels[2]) {
|
||||||
var delta = this.clock.getDelta(),
|
var delta = this.clock.getDelta();
|
||||||
roll = delta * this.rollScale(RC.channels[0]),
|
|
||||||
pitch = delta * this.pitchScale(RC.channels[1]),
|
|
||||||
yaw = delta * this.yawScale(RC.channels[2]);
|
|
||||||
|
|
||||||
this.model.rotateBy(pitch, yaw, roll);
|
var roll = delta * this.rateCurve.rcCommandRawToDegreesPerSecond(RC.channels[0], RC_tuning.roll_rate * 100, RC_tuning.RC_RATE * 100, RC_tuning.RC_EXPO * 100, this.useSuperExpo),
|
||||||
|
pitch = delta * this.rateCurve.rcCommandRawToDegreesPerSecond(RC.channels[1], RC_tuning.pitch_rate * 100, RC_tuning.RC_RATE * 100, RC_tuning.RC_EXPO * 100, this.useSuperExpo),
|
||||||
|
yaw = delta * this.rateCurve.rcCommandRawToDegreesPerSecond(RC.channels[2], RC_tuning.yaw_rate * 100, SPECIAL_PARAMETERS.RC_RATE_YAW * 100, RC_tuning.RC_YAW_EXPO * 100, this.useSuperExpo);
|
||||||
|
|
||||||
|
this.model.rotateBy(-pitch * this.degreeToRadianRatio, -yaw * this.degreeToRadianRatio, -roll * this.degreeToRadianRatio);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue