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; } }