|
@@ -0,0 +1,375 @@
|
|
|
+/**
|
|
|
+ * 跳判断相关脚本代码
|
|
|
+ */
|
|
|
+
|
|
|
+function Event() {
|
|
|
+ this.events = {};
|
|
|
+}
|
|
|
+Event.prototype.addEventListener = function (type, listener) {
|
|
|
+ this.events[type] = this.events[type] || [];
|
|
|
+ this.events[type].push(listener);
|
|
|
+};
|
|
|
+Event.prototype.trigger = function () {
|
|
|
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
|
|
+ args[_key] = arguments[_key];
|
|
|
+ }
|
|
|
+
|
|
|
+ var type = args[0];
|
|
|
+ var params = args.slice(1);
|
|
|
+ if (!!this.events[type]) {
|
|
|
+ // console.log("type:",type);
|
|
|
+ this.events[type].forEach(function (listener) {
|
|
|
+ try {
|
|
|
+ listener.apply(null, params);
|
|
|
+ } catch (e) {
|
|
|
+ console.error(e);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+};
|
|
|
+var jumpOpts = {
|
|
|
+ //是否上升的标志位
|
|
|
+ isDirectionUp: false,
|
|
|
+ //持续上升次数
|
|
|
+ continueUpCount: 0,
|
|
|
+ //上一点的持续上升的次数,为了记录波峰的上升次数
|
|
|
+ continueUpFormerCount: 0,
|
|
|
+
|
|
|
+ continueDownCount: 0,
|
|
|
+ continueDownFormerCount: 0,
|
|
|
+
|
|
|
+ //上一点的状态,上升还是下降
|
|
|
+ lastStatus: false,
|
|
|
+ //波峰值
|
|
|
+ peakOfWave: 0,
|
|
|
+ //波谷值
|
|
|
+ valleyOfWave: 0,
|
|
|
+ //检测到极快的波动的次数
|
|
|
+ timeOfPeakCount: 0,
|
|
|
+ //开始添加
|
|
|
+ bUpdateTimeOfPeakCount: false,
|
|
|
+ //开始更新的次数
|
|
|
+ startCount: 0,
|
|
|
+ //停止跳
|
|
|
+ bStopJump: false,
|
|
|
+ //上次传感器的值
|
|
|
+ gravityOld: 0,
|
|
|
+
|
|
|
+ bUpState: false,
|
|
|
+}
|
|
|
+var ActionJump = function ActionJump() {
|
|
|
+
|
|
|
+ this.jumpOpts = jumpOpts;
|
|
|
+ //其他波峰波谷参数相关数组记录
|
|
|
+ this.peakOfWaveArray = [];
|
|
|
+ this.peakOfWaveMaxValue = 0;
|
|
|
+ this.valleyOfWaveArray = [];
|
|
|
+ this.valleyOfWaveMinValue = 0;
|
|
|
+
|
|
|
+ this.peakOfWaveArrayValue = [];
|
|
|
+ this.valleyOfWaveArrayValue = [];
|
|
|
+
|
|
|
+ this.peakOfWaveArrayValueLinear = [];
|
|
|
+ this.valleyOfWaveArrayValueLinear = [];
|
|
|
+
|
|
|
+
|
|
|
+ this.highestCount = 0;
|
|
|
+ //陀螺仪
|
|
|
+ this.oriGyroYArray = [];
|
|
|
+
|
|
|
+ this.isJumpTop = false;
|
|
|
+
|
|
|
+ this.event = new Event();
|
|
|
+
|
|
|
+
|
|
|
+ this.frameCapacity = 6;
|
|
|
+ this.frame = [];
|
|
|
+ this.frameLength = 5;
|
|
|
+ this.frameOffset = 0;
|
|
|
+
|
|
|
+ this.frameHitCapacity = 11;
|
|
|
+ this.frameHit = [];//打击后的n帧
|
|
|
+
|
|
|
+ for (var i = 0; i < this.frameCapacity; ++i) {
|
|
|
+ var o = new Object();
|
|
|
+ // o.acc = [0, 0, 0];
|
|
|
+ // o.gyr = [0, 0, 0];
|
|
|
+ o.resultant = 0;
|
|
|
+ this.frame.push(o);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
+ActionJump.prototype.addEventListener = function (type, listener) {
|
|
|
+ this.event.addEventListener(type, listener);
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+ActionJump.prototype.updateJump = function () {
|
|
|
+ let data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
|
+ //使用三个轴的数据,计算重力轴的加速度。最后减去重力的加速度值
|
|
|
+ //********加速计********
|
|
|
+ let {
|
|
|
+ lAccX,
|
|
|
+ lAccY,
|
|
|
+ lAccZ
|
|
|
+ } = data.linearAcc;
|
|
|
+ let {
|
|
|
+ oAccX,
|
|
|
+ oAccY,
|
|
|
+ oAccZ
|
|
|
+ } = data.oriAcc;
|
|
|
+ let {
|
|
|
+ oGyroX,
|
|
|
+ oGyroY,
|
|
|
+ oGyroZ
|
|
|
+ } = data.oriGyro;
|
|
|
+ let {
|
|
|
+ bYAxis
|
|
|
+ } = data;
|
|
|
+ let _tempAxisData = bYAxis ? oGyroY : oGyroX;
|
|
|
+ this.detectorNewStep(data.resultant, lAccX, lAccY, lAccZ, oAccX, oAccY, oAccZ, data.runIndex, _tempAxisData);
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+/*
|
|
|
+ * 检测步子,并开始计步
|
|
|
+ * 1.传入数据
|
|
|
+ * 2.如果检测到了波峰,并且符合时间差以及阈值的条件,则判定为1步
|
|
|
+ * 3.符合时间差条件,波峰波谷差值大于initialValue,则将该差值纳入阈值的计算中
|
|
|
+ * */
|
|
|
+ActionJump.prototype.detectorNewStep = function (resultant, linearX, linearY, linearZ, oriX, oriY, oriZ, _runIndex,
|
|
|
+ _oGyroY) {
|
|
|
+ let _judgmentValue = oriZ;
|
|
|
+ // if (this.jumpOpts.gravityOld == 0) {
|
|
|
+ // this.jumpOpts.gravityOld = _judgmentValue;
|
|
|
+ // } else {
|
|
|
+ if (!this.jumpOpts.bStopJump) {
|
|
|
+ // let {
|
|
|
+ // bState,
|
|
|
+ // bType,
|
|
|
+ // value
|
|
|
+ // } = this.detectorPeakOfWaveAndValleyOfWave(_judgmentValue, this.jumpOpts.gravityOld);
|
|
|
+ // let lastFrame = this.frame[(this.frameOffset + this.frameLength - 1) % this.frameCapacity];
|
|
|
+ // let last2Frame = this.frame[(this.frameOffset + this.frameLength - 2) % this.frameCapacity];
|
|
|
+ // let last3Frame = this.frame[(this.frameOffset + this.frameLength - 3) % this.frameCapacity];
|
|
|
+ // let last4Frame = this.frame[(this.frameOffset + this.frameLength - 4) % this.frameCapacity];
|
|
|
+ // let last5Frame = this.frame[(this.frameOffset + this.frameLength - 5) % this.frameCapacity];
|
|
|
+ let newFrame = this.frame[(this.frameOffset + this.frameLength) % this.frameCapacity];
|
|
|
+ newFrame.resultant = resultant;
|
|
|
+
|
|
|
+ if (resultant > 20 && !this.jumpOpts.bUpState) {
|
|
|
+ this.jumpOpts.bUpState = true;
|
|
|
+ this.isJumpTop = false;
|
|
|
+ this.highestCount = 0;
|
|
|
+ //陀螺仪部分
|
|
|
+ this.oriGyroYArray = [];
|
|
|
+ this.peakOfWaveArrayValue = [];
|
|
|
+ this.valleyOfWaveArrayValue = [];
|
|
|
+ this.peakOfWaveArrayValueLinear = [];
|
|
|
+ this.valleyOfWaveArrayValueLinear = [];
|
|
|
+
|
|
|
+ this.jumpOpts.startCount = 0;
|
|
|
+
|
|
|
+ console.log("开始:", JSON.stringify(this.frame), '当前:', resultant);
|
|
|
+
|
|
|
+ }
|
|
|
+ if (this.jumpOpts.bUpState) {
|
|
|
+
|
|
|
+ if (_judgmentValue > 2) {
|
|
|
+ if (_judgmentValue > this.peakOfWaveMaxValue)
|
|
|
+ this.peakOfWaveMaxValue += _judgmentValue;
|
|
|
+ this.peakOfWaveArrayValue.push(_judgmentValue);
|
|
|
+
|
|
|
+ }
|
|
|
+ else if (_judgmentValue < -2) {
|
|
|
+ if (_judgmentValue < this.valleyOfWaveMinValue)
|
|
|
+ this.valleyOfWaveMinValue += _judgmentValue;
|
|
|
+ this.valleyOfWaveArrayValue.push(_judgmentValue);
|
|
|
+
|
|
|
+ }
|
|
|
+ if (linearZ > 2)
|
|
|
+ this.peakOfWaveArrayValueLinear.push(linearZ);
|
|
|
+ else if (linearZ < -2)
|
|
|
+ this.valleyOfWaveArrayValueLinear.push(linearZ);
|
|
|
+
|
|
|
+ if (Math.abs(_oGyroY) > 10)
|
|
|
+ this.oriGyroYArray.push(_oGyroY);
|
|
|
+ //出现极值后
|
|
|
+ // Math.abs(linearZ) < 7 &&
|
|
|
+ if (Math.abs(resultant) < 9.8) {
|
|
|
+ console.log('出现极值后:', linearZ, resultant);
|
|
|
+ // this.isJumpTop = true;
|
|
|
+ this.highestCount++;
|
|
|
+ if (this.highestCount >= 1) {
|
|
|
+ //达到最高点,
|
|
|
+ this.jumpOpts.bStopJump = true;
|
|
|
+ this.jumpOpts.bUpdateTimeOfPeakCount = true;
|
|
|
+ // this.isJumpTop = false;
|
|
|
+
|
|
|
+ let _currentMaxValue = 0;
|
|
|
+ // console.log("highestCount peakOfWaveArray", JSON.stringify(this.peakOfWaveArray));
|
|
|
+ // console.log("highestCount valleyOfWaveArray", JSON.stringify(this.valleyOfWaveArray));
|
|
|
+
|
|
|
+ let allPeakOfWave = 0;
|
|
|
+ for (let i = 0; i < this.peakOfWaveArrayValue.length; i++) {
|
|
|
+ allPeakOfWave += this.peakOfWaveArrayValue[i];
|
|
|
+ }
|
|
|
+
|
|
|
+ let allValleyOfWave = 0;
|
|
|
+ for (let i = 0; i < this.valleyOfWaveArrayValue.length; i++) {
|
|
|
+ allValleyOfWave += this.valleyOfWaveArrayValue[i];
|
|
|
+ }
|
|
|
+
|
|
|
+ let allPeakOfWaveLinear = 0;
|
|
|
+ for (let i = 0; i < this.peakOfWaveArrayValueLinear.length; i++) {
|
|
|
+ allPeakOfWaveLinear += this.peakOfWaveArrayValueLinear[i];
|
|
|
+ }
|
|
|
+
|
|
|
+ let allValleyOfWaveLinear = 0;
|
|
|
+ for (let i = 0; i < this.valleyOfWaveArrayValueLinear.length; i++) {
|
|
|
+ allValleyOfWaveLinear += this.valleyOfWaveArrayValueLinear[i];
|
|
|
+ }
|
|
|
+
|
|
|
+ // console.log("highestCount peakOfWaveArrayValue", JSON.stringify(this.peakOfWaveArrayValue));
|
|
|
+ // console.log("highestCount valleyOfWaveArrayValue", JSON.stringify(this.valleyOfWaveArrayValue));
|
|
|
+ console.log("ori总值 peak:", allPeakOfWave, " valley:", allValleyOfWave);
|
|
|
+ console.log("linear总值 peak:", allPeakOfWaveLinear, " valley:", allValleyOfWaveLinear);
|
|
|
+ // console.log("达到最高点时候数值 Max:", this.peakOfWaveMaxValue, " min:", this.valleyOfWaveMinValue);
|
|
|
+ //(Math.abs(this.peakOfWaveMaxValue) > 5 && Math.abs(this.valleyOfWaveMinValue) - Math
|
|
|
+ // .abs(this.peakOfWaveMaxValue) < 10) ||
|
|
|
+ if (Math.abs(this.peakOfWaveMaxValue) > Math.abs(this.valleyOfWaveMinValue)) {
|
|
|
+ _currentMaxValue = this.peakOfWaveMaxValue;
|
|
|
+ } else {
|
|
|
+ _currentMaxValue = this.valleyOfWaveMinValue;
|
|
|
+ }
|
|
|
+
|
|
|
+ let allOGyroValue = 0;
|
|
|
+ for (let i = 0; i < this.oriGyroYArray.length; i++) {
|
|
|
+ allOGyroValue += this.oriGyroYArray[i];
|
|
|
+ }
|
|
|
+ allOGyroValue /= this.oriGyroYArray.length;
|
|
|
+
|
|
|
+ this.event.trigger('resultant', {
|
|
|
+ type: "jump",
|
|
|
+ acc: _currentMaxValue,
|
|
|
+ value: resultant
|
|
|
+ });
|
|
|
+
|
|
|
+ this.event.trigger('resultant', {
|
|
|
+ type: "curAngle",
|
|
|
+ value: _currentMaxValue,
|
|
|
+ resultant: resultant
|
|
|
+ });
|
|
|
+
|
|
|
+ this.event.trigger('resultant', {
|
|
|
+ type: "rotate",
|
|
|
+ value: allOGyroValue,
|
|
|
+ resultant: resultant
|
|
|
+ });
|
|
|
+ //后面通用使用这个类型传输数据
|
|
|
+ this.event.trigger('resultant', {
|
|
|
+ type: "stateDataOfJump",
|
|
|
+ currentMaxValue: _currentMaxValue,
|
|
|
+ peakOfWaveMaxValue: this.peakOfWaveMaxValue,
|
|
|
+ valleyOfWaveMinValue: this.valleyOfWaveMinValue,
|
|
|
+ oGyroValue: allOGyroValue,
|
|
|
+ resultant: resultant,
|
|
|
+ name: "highestCountEnd"
|
|
|
+ });
|
|
|
+ this.jumpOpts.bUpState = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if ((this.frameOffset += 1) >= this.frameCapacity) {
|
|
|
+ this.frameOffset -= this.frameCapacity;
|
|
|
+ }
|
|
|
+ } else if (this.jumpOpts.bUpdateTimeOfPeakCount) {
|
|
|
+ this.jumpOpts.timeOfPeakCount++;
|
|
|
+ //todo 如果直跳,可以调节更小的 limitTimeOfPeakCount
|
|
|
+ let limitTimeOfPeakCount = 40;
|
|
|
+ if (this.jumpOpts.timeOfPeakCount >= limitTimeOfPeakCount) {
|
|
|
+ this.jumpOpts.timeOfPeakCount = 0;
|
|
|
+ this.jumpOpts.bStopJump = false;
|
|
|
+ this.event.trigger('resultant', {
|
|
|
+ type: "stop"
|
|
|
+ });
|
|
|
+ console.log("timeOfPeakCount >= " + limitTimeOfPeakCount);
|
|
|
+ this.resetAll();
|
|
|
+ this.jumpOpts.bUpdateTimeOfPeakCount = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ this.event.trigger('resultant', {
|
|
|
+ type: "bUpdateDraw",
|
|
|
+ linearX: linearX,
|
|
|
+ linearZ: linearZ,
|
|
|
+ linearY: linearY,
|
|
|
+ oriX: oriX,
|
|
|
+ oriY: oriY,
|
|
|
+ oriZ: oriZ
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+ActionJump.prototype.detectorPeakOfWaveAndValleyOfWave = function (newValue, oldValue) {
|
|
|
+ this.jumpOpts.lastStatus = this.jumpOpts.isDirectionUp;
|
|
|
+ if (newValue >= oldValue) {
|
|
|
+ this.jumpOpts.continueDownFormerCount = this.jumpOpts.continueDownCount;
|
|
|
+ this.jumpOpts.continueDownCount = 0;
|
|
|
+ this.jumpOpts.isDirectionUp = true;
|
|
|
+ this.jumpOpts.continueUpCount++;
|
|
|
+ } else {
|
|
|
+ this.jumpOpts.continueUpFormerCount = this.jumpOpts.continueUpCount;
|
|
|
+ this.jumpOpts.continueUpCount = 0;
|
|
|
+ this.jumpOpts.isDirectionUp = false;
|
|
|
+ this.jumpOpts.continueDownCount++;
|
|
|
+ }
|
|
|
+ if (!this.jumpOpts.isDirectionUp && this.jumpOpts.lastStatus && this.jumpOpts.continueUpFormerCount >= 2 && Math
|
|
|
+ .abs(oldValue) > 4) {
|
|
|
+ this.jumpOpts.peakOfWave = oldValue;
|
|
|
+ return {
|
|
|
+ value: oldValue,
|
|
|
+ bType: 'peakOfWave',
|
|
|
+ bState: true
|
|
|
+ };
|
|
|
+ } else if (!this.jumpOpts.lastStatus && this.jumpOpts.isDirectionUp && this.jumpOpts.continueDownFormerCount >=
|
|
|
+ 2 && Math.abs(oldValue) > 4) {
|
|
|
+ this.jumpOpts.valleyOfWave = oldValue;
|
|
|
+ return {
|
|
|
+ value: oldValue,
|
|
|
+ bType: 'valleyOfWave',
|
|
|
+ bState: true
|
|
|
+ };
|
|
|
+ } else {
|
|
|
+ return {
|
|
|
+ value: oldValue,
|
|
|
+ bType: 'None',
|
|
|
+ bState: false
|
|
|
+ };
|
|
|
+ }
|
|
|
+}
|
|
|
+//重置对应的参数
|
|
|
+ActionJump.prototype.resetAll = function () {
|
|
|
+ // console.log('******************* resetAll ******************');
|
|
|
+ this.peakOfWaveArray = [];
|
|
|
+ this.peakOfWaveMaxValue = 0;
|
|
|
+ this.valleyOfWaveArray = [];
|
|
|
+ this.valleyOfWaveMinValue = 0;
|
|
|
+ this.highestCount = 0;
|
|
|
+
|
|
|
+
|
|
|
+ this.jumpOpts.continueDownFormerCount = 0;
|
|
|
+ this.jumpOpts.continueDownCount = 0;
|
|
|
+ this.jumpOpts.continueUpFormerCount = 0;
|
|
|
+ this.jumpOpts.continueUpCount = 0;
|
|
|
+
|
|
|
+ // this.jumpOpts.gravityOld = 0;
|
|
|
+}
|
|
|
+
|
|
|
+if (typeof module === "object" && typeof module.exports === "object") {
|
|
|
+ module.exports = ActionJump;
|
|
|
+}
|