protected override void ExecuteCore(CarSignalInfo signalInfo) { ///停车不检测角度 if (signalInfo.CarState == CarState.Stop) { return; } //过滤10m if (!isOverPrepareDistance) { if (signalInfo.Distance - StartChangeLanesDistance < Settings.ChangeLanesPrepareDistance) { return; } else { isOverPrepareDistance = true; StartChangeLanesAngle = signalInfo.BearingAngle; return; } } //变更车道超时 if (IsTimeOut()) { if (!IsSuccess) { BreakRule(DeductionRuleCodes.RC40503); } StopCore(); return; } //变更车道超距 if (IsOverDistance(signalInfo)) { if (!IsSuccess) { BreakRule(DeductionRuleCodes.RC40503); } StopCore(); return; } if (IsLightChecked == false && IsSuccess == false) { if (signalInfo.Sensor.RightIndicatorLight) { IsLightChecked = true; CheckRule(true, DeductionRuleCodes.RC30205, DeductionRuleCodes.SRC3020503); } } Logger.InfoFormat("变道流程状态: {0}", StepState.ToString()); if (Settings.ChangeLanesAngle > 0) { if (StepState == ChangeLanesStep.None) { //判断车辆是否在进行变道 if (signalInfo.BearingAngle.IsValidAngle() && StartChangeLanesAngle.IsValidAngle() && !GeoHelper.IsBetweenDiffAngle(signalInfo.BearingAngle, StartChangeLanesAngle, Settings.ChangeLanesAngle)) { StepState = ChangeLanesStep.StartChangeLanes; ChangeLanesStartTime = DateTime.Now; } } else if (StepState == ChangeLanesStep.StartChangeLanes) { StepState = ChangeLanesStep.EndChangeLanes; if (Settings.ChangeLanesLightCheck && IsLightChecked == false) { IsLightChecked = true; //是否打转向灯 var hasTurnLight = CarSignalSet.Query(StartChangeLanesTime).Any(d => d.Sensor.LeftIndicatorLight); if (!hasTurnLight) { CheckRule(true, DeductionRuleCodes.RC30205, DeductionRuleCodes.SRC3020503); } else { //转向灯是否超过3秒 var hasIndicatorLight = AdvancedSignal.CheckOperationAheadSeconds(x => x.Sensor.LeftIndicatorLight, StartTime, Settings.TurnLightAheadOfTime); if (hasIndicatorLight) { return; } BreakRule(DeductionRuleCodes.RC30206, DeductionRuleCodes.SRC3020603); } } } else { IsSuccess = true; //完成变道,结束该项目 return; //StopCore(); } } else if (Settings.ChangeLanesAngle == 0) { IsSuccess = true; } base.ExecuteCore(signalInfo); }
protected void ChangeLineAngleCheck(CarSignalInfo signalInfo) { //由于停车和起步的时候会报触发规则,所以过滤 //全程变道最低速度 if (signalInfo.SpeedInKmh < 10) { return; } //过滤掉变更车道和会车,超车,掉头,左转,右转,起步,靠边停车 if (tempExamitemSkip) { return; } //因为掉头,变道,角度达到就结束了,太快,所以延迟15s if (tempExamItem && finishTime.HasValue) { if ((DateTime.Now - finishTime.Value).TotalSeconds > 15) { finishTime = null; tempExamItem = false; StartChangeLanesAngle = signalInfo.BearingAngle; } else { return; } } //播报后进行延时 if (IsChangeLineSpeak) { if ((DateTime.Now - delayDateTime).TotalSeconds > 12) { IsChangeLineSpeak = false; //重置角度 RecordSignalCount = 0; RecordSignalTime = DateTime.Now; StartChangeLanesAngle = signalInfo.BearingAngle; } else { //重置角度 RecordSignalCount = 0; RecordSignalTime = DateTime.Now; StartChangeLanesAngle = signalInfo.BearingAngle; return; } } RecordSignalCount++; if (!RecordSignalTime.HasValue) { RecordSignalTime = DateTime.Now; } //过滤掉大于30度的跳动 if (GeoHelper.GetDiffAngle(StartChangeLanesAngle, signalInfo.BearingAngle) > 30) { StartChangeLanesAngle = signalInfo.BearingAngle; return; } //判断车辆是否在进行变道 if ((DateTime.Now - RecordSignalTime.Value).TotalSeconds >= Settings.CommonExamItemsChangeLanesTimeOut && IsChangeLineSpeak == false && signalInfo.BearingAngle.IsValidAngle() && StartChangeLanesAngle.IsValidAngle() && !GeoHelper.IsBetweenDiffAngle(signalInfo.BearingAngle, StartChangeLanesAngle, Settings.CommonExamItemsChangeLanesAngle)) { //if (!signalInfo.Sensor.LeftIndicatorLight || !signalInfo.Sensor.RightIndicatorLight) if (!CarSignalSet.Query(DateTime.Now - TimeSpan.FromSeconds(12)).Any(d => d.Sensor.LeftIndicatorLight || d.Sensor.RightIndicatorLight)) { delayDateTime = DateTime.Now; IsChangeLineSpeak = true; RecordSignalCount = 0; RecordSignalTime = null; StartChangeLanesAngle = signalInfo.BearingAngle; BreakRule(DeductionRuleCodes.RC30205, DeductionRuleCodes.SRC3020503); } else { delayDateTime = DateTime.Now; IsChangeLineSpeak = true; //转向灯是否超过3秒,检测12秒前 var leftLight = AdvancedSignal.CheckOperationAheadSeconds(x => x.Sensor.LeftIndicatorLight, DateTime.Now - TimeSpan.FromSeconds(12), Settings.TurnLightAheadOfTime);; if (leftLight) { return; } var rightLight = AdvancedSignal.CheckOperationAheadSeconds(x => x.Sensor.RightIndicatorLight, DateTime.Now - TimeSpan.FromSeconds(12), Settings.TurnLightAheadOfTime);; if (rightLight) { return; } BreakRule(DeductionRuleCodes.RC30206, DeductionRuleCodes.SRC3020603); } } if (RecordSignalTime != null && (DateTime.Now - RecordSignalTime.Value).TotalSeconds > Settings.CommonExamItemsChangeLanesTimeOut) { //重置角度 RecordSignalTime = null; StartChangeLanesAngle = signalInfo.BearingAngle; } }
protected override void ExecuteCore(CarSignalInfo signalInfo) { if (Constants.ChangeLaneDistance == 0) { Constants.ChangeLaneDistance = signalInfo.Distance; } if (stopDelayDistance.HasValue) { if ((signalInfo.Distance - stopDelayDistance.Value) > 10) { StopCore(); } } if (signalInfo.CarState == CarState.Stop) { return; } //播报第2次语音 if (IsSecondVoice == false && !string.IsNullOrEmpty(Settings.ChangeLanesSecondVoice) && Settings.ChangeLanesPrepareDistance > 1) { IsSecondVoice = true; Speaker.PlayAudioAsync(Settings.ChangeLanesSecondVoice, SpeechPriority.Normal); } //过滤10m if (!isOverPrepareDistance) { if (signalInfo.Distance - StartChangeLanesDistance < Settings.ChangeLanesPrepareDistance) { return; } else { isOverPrepareDistance = true; StartChangeLanesAngle = signalInfo.BearingAngle; return; } } //不要超时避免误判 //不要吵 //if (IsTimeOut()) //{ // if (!IsSuccess) // { // BreakRule(DeductionRuleCodes.RC40503); // } // StopCore(); // return; //} //变更车道超距 if (IsOverDistance(signalInfo)) { if (!IsSuccess) { BreakRule(DeductionRuleCodes.RC40503); } StopCore(); return; } Logger.InfoFormat("变道流程状态: {0}", StepState.ToString()); //Logger.Error("变道流程状态"+StepState.ToString()+"ChangeLanes" + signalInfo.BearingAngle.ToString()+ "StartChangeLanesAngle:"+ StartChangeLanesAngle.ToString()+ "Settings.ChangeLanesAngle:" + Settings.ChangeLanesAngle.ToString()); if (Settings.ChangeLanesAngle > 0) { if (StepState == ChangeLanesStep.None) { //变道摆正10米后才进行下面的检测(转向灯评判太快,车还没摆正) if (ChangeStartDistance.HasValue) { if (signalInfo.Distance - ChangeStartDistance.Value > Settings.ChangeLanesPrepareDistance) { StepState = ChangeLanesStep.StartChangeLanes; } } //判断车辆是否在进行变道 if (signalInfo.BearingAngle.IsValidAngle() && StartChangeLanesAngle.IsValidAngle() && !GeoHelper.IsBetweenDiffAngle(signalInfo.BearingAngle, StartChangeLanesAngle, Settings.ChangeLanesAngle)) { StepState = ChangeLanesStep.StartChangeLanes; ChangeStartDistance = signalInfo.Distance; ChangeLanesStartTime = DateTime.Now; } } else if (StepState == ChangeLanesStep.StartChangeLanes) { StepState = ChangeLanesStep.EndChangeLanes; if (Settings.ChangeLanesLightCheck) { //只能左转 if (Settings.ChangelineDirect.Equals(1)) { //是否打转向灯 var hasTurnLight = CarSignalSet.Query(StartChangeLanesTime).Any(d => d.Sensor.LeftIndicatorLight); var hasErrorLight = CarSignalSet.Query(StartChangeLanesTime).Any(d => d.Sensor.RightIndicatorLight); if (!hasTurnLight || hasErrorLight) { BreakRule(DeductionRuleCodes.RC30205, DeductionRuleCodes.SRC3020503); } else { //转向灯是否超过3秒 var hasIndicatorLight = AdvancedSignal.CheckOperationAheadSeconds(x => x.Sensor.LeftIndicatorLight, StartTime, Settings.TurnLightAheadOfTime); if (hasIndicatorLight) { return; } BreakRule(DeductionRuleCodes.RC30206, DeductionRuleCodes.SRC3020603); } }//只能右转 else if (Settings.ChangelineDirect.Equals(2)) { //是否打转向灯 var hasTurnLight = CarSignalSet.Query(StartChangeLanesTime).Any(d => d.Sensor.RightIndicatorLight); var hasErrorLight = CarSignalSet.Query(StartChangeLanesTime).Any(d => d.Sensor.LeftIndicatorLight); if (!hasTurnLight || hasErrorLight) { BreakRule(DeductionRuleCodes.RC30205, DeductionRuleCodes.SRC3020503); } else { //转向灯是否超过3秒 var hasIndicatorLight = AdvancedSignal.CheckOperationAheadSeconds(x => x.Sensor.RightIndicatorLight, StartTime, Settings.TurnLightAheadOfTime); if (hasIndicatorLight) { return; } BreakRule(DeductionRuleCodes.RC30206, DeductionRuleCodes.SRC3020603); } } else { //是否打转向灯 var hasTurnLight = CarSignalSet.Query(StartChangeLanesTime).Any(d => d.Sensor.LeftIndicatorLight || d.Sensor.RightIndicatorLight); if (!hasTurnLight) { BreakRule(DeductionRuleCodes.RC30205, DeductionRuleCodes.SRC3020503); } else { //转向灯是否超过3秒 var hasIndicatorLight = AdvancedSignal.CheckOperationAheadSeconds(x => x.Sensor.LeftIndicatorLight || x.Sensor.RightIndicatorLight, StartTime, Settings.TurnLightAheadOfTime); if (hasIndicatorLight) { return; } BreakRule(DeductionRuleCodes.RC30206, DeductionRuleCodes.SRC3020603); } } } } else { IsSuccess = true; //完成变道,结束该项目 if (Settings.ChkChangeLanesEndFlag && !stopDelayDistance.HasValue) { stopDelayDistance = signalInfo.Distance; } return; } } else if (Settings.ChangeLanesAngle == 0) { IsSuccess = true; } base.ExecuteCore(signalInfo); }