Exemple #1
0
        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);
        }
Exemple #2
0
        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;
            }
        }
Exemple #3
0
        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);
        }