Răsfoiți Sursa

增加两星一地CSV文件定位

zoule 9 luni în urmă
părinte
comite
36bad77135

+ 302 - 1
Service/X2D1TaskServer/Service/TaskHistoryService.cs

@@ -87,7 +87,9 @@ namespace X2D1TaskServer54.Service
                     await StopTask(dto.ID, EnumTaskStopType.Error, $"执行异常,不支持的日期目录格式");
                     return;
                 }
-
+                HistoryFile mainFileTmp = null;
+                HistoryFile adjaFileTmp = null;
+                HistoryFile cdbFileTmp = null;
                 while (!cts.IsCancellationRequested && preTime <= dto.EndTime)
                 {
                     if (!dicCts.Values.Contains(cts)) return;
@@ -135,6 +137,12 @@ namespace X2D1TaskServer54.Service
                             List<Task> listTask = new List<Task>();
                             foreach (var item in splitXdgbInfos)//splitXdgbInfos中的数据并行处理
                             {
+                                if (mainFileTmp == null)
+                                    mainFileTmp = item[0].FirstOrDefault(m => m.SatId == dto.MainSatCode);
+                                if (adjaFileTmp == null)
+                                    adjaFileTmp = item[0].FirstOrDefault(m => m.SatId == dto.AdjaSatCode);
+                                if (cdbFileTmp == null)
+                                    cdbFileTmp = item[0].FirstOrDefault(m => m.SatId == dto.CDBSatCode);
                                 if (cts.IsCancellationRequested) return;
                                 var task = GetPosTask(dto, item, isLocal, cts);
                                 listTask.Add(task);
@@ -142,6 +150,7 @@ namespace X2D1TaskServer54.Service
                             await Task.WhenAll(listTask);
                             preTime = sameTimeFiles.First().CapTime;
                         }
+
                         ResetTime(formatFlag, ref preTime);
                         await XdCxRhDW.UI.Lib.LogHelper.Info($"【任务{dto.ID}】目录[{filesDir}]本次扫描的数据处理完成");
                     }
@@ -156,11 +165,303 @@ namespace X2D1TaskServer54.Service
                         ResetTime(formatFlag, ref preTime);
                     }
                 }
+#warning 历史数据文件太少,对105导出的csv结果重新定位
+                var csvFile = Directory.GetFiles(dto.CapDir, "*.csv").Where(p=>!p.Contains("副本")).FirstOrDefault();
+                if (csvFile != null && mainFileTmp != null && adjaFileTmp != null && cdbFileTmp != null)
+                {
+                    var lines = File.ReadAllLines(csvFile).Skip(1).ToList();
+                    for (int i = 0; i < lines.Count; i += 2)
+                    {
+                        var arr1 = lines[i].Split(',');
+                        var arr2 = lines[i + 1].Split(',');
+                        var capTime = DateTime.ParseExact(arr1[0], "yyyy-MM-dd HH:mm:ss.fff", null);
+                        var upFreqHz = (long)(Convert.ToDouble(arr1[1]) * 1e6);
+                        var dt1 = Convert.ToDouble(arr1[24])*1e6;//主邻1时差
+                        var df1 = Convert.ToDouble(arr1[25]);//Hz
+                        var snr1 = Convert.ToDouble(arr1[26]);
+
+                        var dt2 = Convert.ToDouble(arr2[24])*1e6;//主超短时差
+                        var df2 = Convert.ToDouble(arr2[25]);//Hz
+                        var snr2 = Convert.ToDouble(arr2[26]);
+
+                        var refDto1= Convert.ToDouble(arr1[37])*1e6;//样本主星时差
+                        var refDto2= Convert.ToDouble(arr1[39])*1e6;//样本邻星时差
+
+                        var mainX = Convert.ToDouble(arr1[27]);
+                        var mainY = Convert.ToDouble(arr1[28]);
+                        var mainZ = Convert.ToDouble(arr1[29]);
+                        var adjaX = Convert.ToDouble(arr1[30]);
+                        var adjaY = Convert.ToDouble(arr1[31]);
+                        var adjaZ = Convert.ToDouble(arr1[32]);
+                        double[] mainEph = new double[3] { mainX, mainY, mainZ };
+                        double[] adjaEph = new double[3] { adjaX, adjaY, adjaZ };
+
+
+                        var taskSig = dto.Sigs.FirstOrDefault(p => p.FreqUp == cdbFileTmp.UpFreqHz);
+                        if (taskSig == null)
+                        {
+                            continue;//跳过不是任务处理的频点
+                        }
+                        string mainFile = await HttpHelper.UploadFileAsync(mainFileTmp.FilePath, _config.baseUrl, token: cts.Token);//主星文件
+                        string adjaFile = await HttpHelper.UploadFileAsync(adjaFileTmp.FilePath, _config.baseUrl, token: cts.Token);//邻星文件
+                        string cdbFile = await HttpHelper.UploadFileAsync(cdbFileTmp.FilePath, _config.baseUrl, token: cts.Token);//超短文件
+                        var paramInfo = new BaseParamInfo(taskSig, cdbFileTmp, mainFileTmp, adjaFileTmp);
+                        (bool deret, List<DetectResDto> deteRes) = await DetectCalc(cdbFile, mainFile, paramInfo, cts);
+                        if (!deret) continue;
+                        deteRes = deteRes.Take(1).ToList();
+                        var smps = deteRes.Select(m => new SmpPosition(m.Start, m.Length)).ToList();//怎么补0?
+                        var cgDto = new CpuCgMultiDto()
+                        {
+                            dtCenter = -260000,
+                            dtRange = 60000,
+                            file1 = cdbFile,
+                            file2 = mainFile,
+                            samplingRate = mainFileTmp.FsHz,
+                            smpPositions = smps,
+                            snrThreshold = taskSig.Snr,
+                            BandHz = 0,
+                            dfRange = 16384,
+                        };
+                        if (_config.checkFileType != 0)
+                        {
+                            cgDto.file1 = mainFile;
+                            cgDto.file2 = cdbFile;
+                        }
+                        Stopwatch sw2 = new Stopwatch();
+                        sw2.Start();
+                        var result1 = await HttpHelper.PostRequestAsync<List<CpuCgResDto>>(_config.baseUrl + "DetectCg/CpuCgMultiCalc", cgDto, token: cts.Token);
+                        if (result1.code != 200)
+                        {
+                            if (result1.msg.Contains("超时"))
+                                await XdCxRhDW.UI.Lib.LogHelper.Error($"【任务{dto.ID}】信号[{taskSig.FreqUp / 1e6:f3}MHz],{capTime:yyyyMMddHHmmss.fff}时刻主星超短{result1.msg}");
+                            else
+                                await XdCxRhDW.UI.Lib.LogHelper.Error($"【任务{dto.ID}】信号[{taskSig.FreqUp / 1e6:f3}MHz],{capTime:yyyyMMddHHmmss.fff}时刻主星超短CPU参估出错.{result1.msg}");
+                            continue;
+                        }
+                        sw2.Stop();
+                        await XdCxRhDW.UI.Lib.LogHelper.Info($"【任务{dto.ID}】信号[{taskSig.FreqUp / 1e6:f3}MHz],{capTime:yyyyMMddHHmmss.fff}时刻主星超短CPU参估完成,耗时{sw2.ElapsedMilliseconds}ms");
+                        cgDto = new CpuCgMultiDto()
+                        {
+                            dtCenter = -260000,
+                            dtRange = 60000,
+                            file1 = cdbFile,
+                            file2 = adjaFile,
+                            samplingRate = mainFileTmp.FsHz,
+                            smpPositions = smps,
+                            snrThreshold = taskSig.Snr,
+                            BandHz = 0,
+                            dfRange = 16384,
+                        };
+                        if (_config.checkFileType != 0)
+                        {
+                            cgDto.file1 = mainFile;
+                            cgDto.file2 = adjaFile;
+                            cgDto.dtCenter = 0;
+                            cgDto.dtRange = 60000;
+                        }
+                        sw2.Restart();
+                        var result2 = await HttpHelper.PostRequestAsync<List<CpuCgResDto>>(_config.baseUrl + "DetectCg/CpuCgMultiCalc", cgDto, token: cts.Token);
+                        if (result2.code != 200)
+                        {
+                            if (_config.checkFileType == 0)
+                            {
+                                if (result2.msg.Contains("超时"))
+                                    await XdCxRhDW.UI.Lib.LogHelper.Error($"【任务{dto.ID}】信号[{taskSig.FreqUp / 1e6:f3}MHz],{capTime:yyyyMMddHHmmss}时刻邻星超短{result2.msg}");
+                                else
+                                    await XdCxRhDW.UI.Lib.LogHelper.Error($"【任务{dto.ID}】信号[{taskSig.FreqUp / 1e6:f3}MHz],{capTime:yyyyMMddHHmmss}时刻邻星超短CPU参估出错.{result2.msg}");
+                            }
+                            else
+                            {
+                                if (result2.msg.Contains("超时"))
+                                    await XdCxRhDW.UI.Lib.LogHelper.Error($"【任务{dto.ID}】信号[{taskSig.FreqUp / 1e6:f3}MHz],{capTime:yyyyMMddHHmmss}时刻主星邻星{result2.msg}");
+                                else
+                                    await XdCxRhDW.UI.Lib.LogHelper.Error($"【任务{dto.ID}】信号[{taskSig.FreqUp / 1e6:f3}MHz],{capTime:yyyyMMddHHmmss}时刻主星邻星CPU参估出错.{result2.msg}");
+                            }
+                            continue;
+                        }
+                        sw2.Stop();
+                        if (_config.checkFileType == 0)
+                            await XdCxRhDW.UI.Lib.LogHelper.Info($"【任务{dto.ID}】信号[{taskSig.FreqUp / 1e6:f3}MHz],{capTime:yyyyMMddHHmmss.fff}时刻邻星超短CPU参估完成,耗时{sw2.ElapsedMilliseconds}ms");
+                        else
+                            await XdCxRhDW.UI.Lib.LogHelper.Info($"【任务{dto.ID}】信号[{taskSig.FreqUp / 1e6:f3}MHz],{capTime:yyyyMMddHHmmss.fff}时刻主星邻星CPU参估完成,耗时{sw2.ElapsedMilliseconds}ms");
+                        await HttpHelper.DeleteFileAsync(_config.baseUrl, mainFile, adjaFile, cdbFile);
+                        var data1 = result1.data.Take(1).ToList();
+                        var data2 = result2.data.Take(1).ToList();
+                        data1[0].Dt = -dt2;
+                        data1[0].Df = df2;
+                        data1[0].Snr = snr2;
+                        data2[0].Dt = -dt1;
+                        data2[0].Df = df1;
+                        data2[0].Snr = snr1;
+                        if (data1.Count != data2.Count || data1.Count != deteRes.Count)
+                        {
+                            await XdCxRhDW.UI.Lib.LogHelper.Error($"【任务{dto.ID}】信号[{taskSig.FreqUp / 1e6:f3}MHz],{capTime:yyyyMMddHHmmss.fff}时刻参估结果个数和检测结果个数不匹配");
+                            continue;
+                        }
+                        string msg = $"【任务{dto.ID}】目标信号[{paramInfo.TaskSig.FreqUp / 1e6:f3}MHz]";
+                        await Pos(dto, paramInfo, deteRes, data1, data2, cts, msg, capTime, mainEph, adjaEph, refDto1, refDto2);
+                    }
+
+
+                }
                 await StopTask(dto.ID, EnumTaskStopType.Properly, "数据处理完成,任务结束");
             }, cts.Token);
         }
 
+        public async Task Pos(X2D1TaskHandleDto dto, BaseParamInfo paramInfo, List<DetectResDto> deteRes, List<CpuCgResDto> data1, List<CpuCgResDto> data2, CancellationTokenSource cts, string msg, DateTime sigTime, double[] mainEph, double[] adjaEph, double refDto1, double refDto2)
+        {
 
+            for (int i = 0; i < data1.Count; i++)
+            {
+                try
+                {
+                    if (cts.IsCancellationRequested) break;
+                    var detect = deteRes.First(r => r.Start == data1[i].Smpstart && r.Length == data1[i].Smplen);
+                    X2D1PosDto x2D1 = new X2D1PosDto()
+                    {
+                        TaskID = dto.ID,
+                        SigTime = sigTime,
+                        MainCode = paramInfo.Minfo.SatId,
+                        AdjaCode = paramInfo.Ninfo.SatId,
+                        MainX = mainEph[0],
+                        MainY = mainEph[1],
+                        MainZ = mainEph[2],
+                        AdjaX = adjaEph[0],
+                        AdjaY = adjaEph[1],
+                        AdjaZ = adjaEph[2],
+                        XdDfo = data2[i].Df,
+                        XdSnr = data2[i].Snr,
+                        MSatTxLon = dto.MSatCapLon,
+                        MSatTxLat = dto.MSatCapLat,
+                        NSatTxLon = dto.NSatCapLon,
+                        NSatTxLat = dto.NSatCapLat,
+                        CdbTxLon = dto.CdbLon,
+                        CdbTxLat = dto.CdbLat,
+                        RefLon = dto.RefLon,
+                        RefLat = dto.RefLat,
+                        FreqDown = paramInfo.Minfo.DownFreqHz,
+                        FreqUp = paramInfo.Minfo.UpFreqHz,
+                        MainYbDto = refDto1,
+                        AdjaYbDto = refDto2,
+                        CheckRes = new CheckResDto()
+                        {
+                            FileName = Path.GetFileName(paramInfo.Dinfo.FilePath),
+                            ModRate = detect.ModRate,
+                            ModType = detect.ModType,
+                            SmpCount = detect.Length,
+                            SmpStart = detect.Start,
+                            UserName = detect.UserName,
+                            FfcHz = detect.FfcHz,
+                            PosCheckType = detect.DmcType.GetEnumByDisplayName<EnumPosCheckTypeDto>(),
+                        }
+
+
+                    };
+
+                    if (data1[i].Snr > 0 && data2[i].Snr > 0)
+                    {
+                        //卫星转发某些频点可能有时延,无参定位由于不能抵消需要减去这个时延
+                        if (_config.checkFileType == 0)
+                        {
+                            x2D1.SxDto = data1[i].Dt * _config.posDtoFactor - data2[i].Dt * _config.posDtoFactor - paramInfo.Delay1.Value + paramInfo.Delay2.Value;
+                            x2D1.SxDfo = data1[i].Df - data2[i].Df;
+                            x2D1.SxSnr = (data1[i].Snr + data2[i].Snr) / 2;
+                            x2D1.XdDto = data1[i].Dt * _config.posDtoFactor - paramInfo.Delay1.Value;
+                            x2D1.XdDfo = data1[i].Df;
+                            x2D1.XdSnr = data1[i].Snr;
+                        }
+                        else
+                        {
+                            x2D1.SxDto = data2[i].Dt * _config.posDtoFactor;
+                            x2D1.SxDfo = data2[i].Df;
+                            x2D1.SxSnr = data2[i].Snr;
+                            x2D1.XdDto = data1[i].Dt * _config.posDtoFactor;
+                            x2D1.XdDfo = data1[i].Df;
+                            x2D1.XdSnr = data1[i].Snr;
+                        }
+                    }
+                    var result = await HttpHelper.PostRequestAsync<PosResDto>(_config.baseUrl + "Pos/PosX2D1Async", x2D1);
+                    if (result.code != 200)
+                    {
+                        await XdCxRhDW.UI.Lib.LogHelper.Error($"{msg},{paramInfo.Minfo.CapTime:yyyyMMddHHmmss}时刻时隙位置{data1[i].Smpstart}定位异常.{result.msg}");
+                    }
+                    else
+                    {
+                        var posRes = result.data;
+                        double posLon = posRes.PosLon;
+                        double posLat = posRes.PosLat;
+                        if (x2D1.SxSnr == 0 || x2D1.XdSnr == 0)
+                        {
+                            posLon = 0;
+                            posLat = 0;
+                        }
+                        ErrEllipseResDto errRes = new ErrEllipseResDto();
+                        if (posLon != 0 && posLat != 0 && posLon != 999 && posLat != 999)
+                        {
+                            var errDto = new ErrEllipseX2D1Dto()
+                            {
+                                MainX = mainEph[0],
+                                MainY = mainEph[1],
+                                MainZ = mainEph[2],
+                                AdjaX = adjaEph[0],
+                                AdjaY = adjaEph[1],
+                                AdjaZ = adjaEph[2],
+                                CdbLon = dto.CdbLon,
+                                CdbLat = dto.CdbLat,
+                                PosLon = posLon,
+                                PosLat = posLat,
+                                RefLon = dto.RefLon,
+                                RefLat = dto.RefLat,
+                                OutputErrPoint = false,
+                                DtoErrus = _config.DtoErrus,
+                                EphErr = _config.EphErrm,
+
+                            };
+                            var errResRsp = await HttpHelper.PostRequestAsync<ErrEllipseResDto>(_config.baseUrl + "Ellipse/X2D1", errDto);
+                            if (errResRsp.code != 200)
+                            {
+                                await XdCxRhDW.UI.Lib.LogHelper.Error(errResRsp.msg);
+                            }
+                            else
+                            {
+                                errRes = errResRsp.data;
+                            }
+                        }
+                        PosResWriteDto wDto = new PosResWriteDto()
+                        {
+                            PosTypeDto = EnumPosTypeDto.X2D1,
+                            SigTime = x2D1.SigTime,
+                            SigTimeLenMs = x2D1.CheckRes.SmpCount / (long)paramInfo.Minfo.FsHz * 1000,
+                            FreqDownMHz = paramInfo.Minfo.DownFreqHz * 1e-6,
+                            FreqUpMHz = paramInfo.Minfo.UpFreqHz * 1e-6,
+                            SigModType = detect.ModType,
+                            PosLon = posLon,
+                            PosLat = posLat,
+                            Dto1 = x2D1.SxDto,
+                            Dfo1 = x2D1.SxDfo,
+                            Snr1 = x2D1.SxSnr,
+                            Dto2 = x2D1.XdDto,
+                            Dfo2 = x2D1.XdDfo,
+                            Snr2 = x2D1.XdSnr,
+                            LongRadius = errRes.LongRadius,
+                            ShortRadius = errRes.ShortRadius,
+                            DipAngle = errRes.DipAngle,
+                            TsCount = data1.Count,
+                            PosType = 3,
+                            ModRate = detect.ModRate.HasValue ? detect.ModRate.Value : 0,
+                            CdbLon = x2D1.CdbTxLon,
+                            CdbLat = x2D1.CdbTxLat,
+                        };
+                        await HttpHelper.PostRequestAsync(_config.baseUrl + "Result/WritePosResToFile", wDto);
+                    }
+                }
+                catch (Exception ex)
+                {
+                    await XdCxRhDW.UI.Lib.LogHelper.Error($"{msg},{paramInfo.Minfo.CapTime:yyyyMMddHHmmss}时刻时隙位置{data1[i].Smpstart}定位异常", ex);
+                }
+            }
+            await XdCxRhDW.UI.Lib.LogHelper.Info($"{msg},{paramInfo.Minfo.CapTime:yyyyMMddHHmmss}时刻定位完成");
+        }
         public bool Stop(int taskID)
         {
             if (!dicCts.ContainsKey(taskID)) return false;

+ 2 - 2
Service/X2D1TaskServer/Service/TaskService.cs

@@ -225,7 +225,7 @@ namespace X2D1TaskServer54.Service
             return true;
         }
 
-        private async Task<(bool, List<DetectResDto>)> DetectCalc(string cdbFile, string mainFile, BaseParamInfo paramInfo, CancellationTokenSource cts)
+        public async Task<(bool, List<DetectResDto>)> DetectCalc(string cdbFile, string mainFile, BaseParamInfo paramInfo, CancellationTokenSource cts)
         {
             List<DetectResDto> deteRes = new List<DetectResDto>();
 
@@ -469,7 +469,7 @@ namespace X2D1TaskServer54.Service
             return task;
         }
 
-        private async Task DoX2D1NoParPosAsync(X2D1TaskHandleDto dto, BaseParamInfo paramInfo, List<DetectResDto> deteRes, List<CpuCgResDto> data1, List<CpuCgResDto> data2, CancellationTokenSource cts, string msg)
+        public async Task DoX2D1NoParPosAsync(X2D1TaskHandleDto dto, BaseParamInfo paramInfo, List<DetectResDto> deteRes, List<CpuCgResDto> data1, List<CpuCgResDto> data2, CancellationTokenSource cts, string msg)
         {
 
             for (int i = 0; i < data1.Count; i++)

+ 1 - 1
XdCxRhDW.App/App.config

@@ -25,7 +25,7 @@
     <!--本机IP,没有则由程序自动获取-->
     <add key="LocalIP" value="" />
     <!--地图定位点聚合-->
-    <add key="UseMapCluster" value="1" />
+    <add key="UseMapCluster" value="0" />
     <!--GDOP使用最新的版本  1:使用-->
     <add key="UseNewGDOP" value="1" />
   </appSettings>

+ 4 - 2
XdCxRhDW.App/Controllers/PosController.cs

@@ -40,7 +40,7 @@ namespace XdCxRhDW.App.Controllers
                         if (runTask == null)
                         {
                             XdCxRhDW.Framework.LogHelper.Warning($"接收到两星一地带参定位(含星历)参数,由于找不到执行中的任务忽略本次定位");
-                            return Error<PosResDto>($"多模式融合定位平台没有启动两星一地定位任务");
+                            return Error<PosResDto>($"定位平台没有启动两星一地定位任务");
                         }
                     }
                     else
@@ -113,7 +113,9 @@ namespace XdCxRhDW.App.Controllers
                     });
 
                     var res = PosApi.X2D1_Pos(cgRes, StationRes, dto.CalcConfidence);
-
+                    if (res[0] != 999)
+                    {
+                    }
                     PosRes posRes = new PosRes()
                     {
                         FreqUpHz = (long)cgRes.TarFreqUp.Value,

+ 1 - 1
XdCxRhDw.Dto/PosDto/X2D1PosDto.cs

@@ -210,6 +210,6 @@ namespace XdCxRhDW.Dto
         /// 是否计算置信度
         /// </summary>
         public bool CalcConfidence { get; set; } = false;
-    }
 
+    }
 }