ajustes no fluxo de deteccao de corredor

This commit is contained in:
Diego Freitas 2025-09-22 15:56:35 -03:00
parent 7d47630154
commit 963ce96429
192 changed files with 977 additions and 589 deletions

Binary file not shown.

View File

@ -73,7 +73,7 @@
this.label8 = new System.Windows.Forms.Label(); this.label8 = new System.Windows.Forms.Label();
this.txtGPS_Satelites = new System.Windows.Forms.TextBox(); this.txtGPS_Satelites = new System.Windows.Forms.TextBox();
this.label9 = new System.Windows.Forms.Label(); this.label9 = new System.Windows.Forms.Label();
this.txtGPS_Velocidade = new System.Windows.Forms.TextBox(); this.txtGPS_DistanciaBase = new System.Windows.Forms.TextBox();
this.label6 = new System.Windows.Forms.Label(); this.label6 = new System.Windows.Forms.Label();
this.txtGPS_Altitude = new System.Windows.Forms.TextBox(); this.txtGPS_Altitude = new System.Windows.Forms.TextBox();
this.label7 = new System.Windows.Forms.Label(); this.label7 = new System.Windows.Forms.Label();
@ -598,7 +598,7 @@
this.panel1.Controls.Add(this.label8); this.panel1.Controls.Add(this.label8);
this.panel1.Controls.Add(this.txtGPS_Satelites); this.panel1.Controls.Add(this.txtGPS_Satelites);
this.panel1.Controls.Add(this.label9); this.panel1.Controls.Add(this.label9);
this.panel1.Controls.Add(this.txtGPS_Velocidade); this.panel1.Controls.Add(this.txtGPS_DistanciaBase);
this.panel1.Controls.Add(this.label6); this.panel1.Controls.Add(this.label6);
this.panel1.Controls.Add(this.txtGPS_Altitude); this.panel1.Controls.Add(this.txtGPS_Altitude);
this.panel1.Controls.Add(this.label7); this.panel1.Controls.Add(this.label7);
@ -803,15 +803,15 @@
this.label9.TabIndex = 33; this.label9.TabIndex = 33;
this.label9.Text = "Satélites"; this.label9.Text = "Satélites";
// //
// txtGPS_Velocidade // txtGPS_DistanciaBase
// //
this.txtGPS_Velocidade.Location = new System.Drawing.Point(106, 524); this.txtGPS_DistanciaBase.Location = new System.Drawing.Point(106, 524);
this.txtGPS_Velocidade.Margin = new System.Windows.Forms.Padding(2); this.txtGPS_DistanciaBase.Margin = new System.Windows.Forms.Padding(2);
this.txtGPS_Velocidade.Name = "txtGPS_Velocidade"; this.txtGPS_DistanciaBase.Name = "txtGPS_DistanciaBase";
this.txtGPS_Velocidade.ReadOnly = true; this.txtGPS_DistanciaBase.ReadOnly = true;
this.txtGPS_Velocidade.Size = new System.Drawing.Size(99, 20); this.txtGPS_DistanciaBase.Size = new System.Drawing.Size(99, 20);
this.txtGPS_Velocidade.TabIndex = 32; this.txtGPS_DistanciaBase.TabIndex = 32;
this.txtGPS_Velocidade.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; this.txtGPS_DistanciaBase.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
// //
// label6 // label6
// //
@ -819,9 +819,9 @@
this.label6.Location = new System.Drawing.Point(104, 509); this.label6.Location = new System.Drawing.Point(104, 509);
this.label6.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.label6.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label6.Name = "label6"; this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(60, 13); this.label6.Size = new System.Drawing.Size(92, 13);
this.label6.TabIndex = 31; this.label6.TabIndex = 31;
this.label6.Text = "Velocidade"; this.label6.Text = "Distancia da base";
// //
// txtGPS_Altitude // txtGPS_Altitude
// //
@ -5680,7 +5680,7 @@
private System.Windows.Forms.Label lblGPS; private System.Windows.Forms.Label lblGPS;
private System.Windows.Forms.Panel pnlOrientacaoMagnetometro; private System.Windows.Forms.Panel pnlOrientacaoMagnetometro;
private System.Windows.Forms.Panel pnlOrientacaoGPS; private System.Windows.Forms.Panel pnlOrientacaoGPS;
private System.Windows.Forms.TextBox txtGPS_Velocidade; private System.Windows.Forms.TextBox txtGPS_DistanciaBase;
private System.Windows.Forms.Label label6; private System.Windows.Forms.Label label6;
private System.Windows.Forms.TextBox txtGPS_Altitude; private System.Windows.Forms.TextBox txtGPS_Altitude;
private System.Windows.Forms.Label label7; private System.Windows.Forms.Label label7;

View File

@ -29,6 +29,7 @@ namespace AgroBase.Forms.Operacoes
List<PictureBox> picsCamSoloSeg = new List<PictureBox>(); List<PictureBox> picsCamSoloSeg = new List<PictureBox>();
List<PictureBox> picsCamSoloOverlay = new List<PictureBox>(); List<PictureBox> picsCamSoloOverlay = new List<PictureBox>();
List<CameraWorkerItemModel> LogsCam_Caminho = new List<CameraWorkerItemModel>(); List<CameraWorkerItemModel> LogsCam_Caminho = new List<CameraWorkerItemModel>();
OperacaoModel operacaoSelecionada = new OperacaoModel(Enums.ModoOperacao.NaoDefinido);
string pathImagensCaminho = ""; string pathImagensCaminho = "";
DateTime MomentoAtual = DateTime.Now; DateTime MomentoAtual = DateTime.Now;
@ -124,6 +125,17 @@ namespace AgroBase.Forms.Operacoes
OperacaoDadosModel data = JsonConvert.DeserializeObject<OperacaoDadosModel>(File.ReadAllText(ofd.FileName)); OperacaoDadosModel data = JsonConvert.DeserializeObject<OperacaoDadosModel>(File.ReadAllText(ofd.FileName));
LogsOperacao = JsonConvert.DeserializeObject<OperacaoSensoriamentoLogModel[]>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.operacao)).ToList(); LogsOperacao = JsonConvert.DeserializeObject<OperacaoSensoriamentoLogModel[]>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.operacao)).ToList();
Task.Run(async () =>
{
GPSModel pos = GPSService.UltimaLeitura.Clone();
GPSService.UltimaLeitura = LogsOperacao.FirstOrDefault().Gps;
(bool sucesso, List<string> ruas) = Variaveis.OperacaoEmAndamento.CarregarParametrizacaoOperacao(null, null, ofd.FileName.Replace("data.lgop", "operacao.opr"));
bool condicaoOperacaoCarregada() => Variaveis.OperacaoEmAndamento.Trajetoria?.CorredorAtual != null;
bool resultado = await FuncoesGlobais.AguardarCondicaoAsync(condicaoOperacaoCarregada, 15000, 200);
GPSService.UltimaLeitura = pos;
});
LogsDirecional = JsonConvert.DeserializeObject<DirSensoriamentoLogModel[]>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.dir ?? Enums.T_Code.Dir.ToString())).ToList(); LogsDirecional = JsonConvert.DeserializeObject<DirSensoriamentoLogModel[]>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.dir ?? Enums.T_Code.Dir.ToString())).ToList();
LogsMovimentacao = JsonConvert.DeserializeObject<MovSensoriamentoLogModel[]>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.mov ?? Enums.T_Code.Mov.ToString())).ToList(); LogsMovimentacao = JsonConvert.DeserializeObject<MovSensoriamentoLogModel[]>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.mov ?? Enums.T_Code.Mov.ToString())).ToList();
LogsAtuador = JsonConvert.DeserializeObject<AtuSensoriamentoLogModel[]>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.atu ?? Enums.T_Code.Atu.ToString())).ToList(); LogsAtuador = JsonConvert.DeserializeObject<AtuSensoriamentoLogModel[]>(OperacaoModel.DeserializarDadosOperacao(ofd.FileName, data.atu ?? Enums.T_Code.Atu.ToString())).ToList();
@ -1171,10 +1183,12 @@ namespace AgroBase.Forms.Operacoes
txtGPS_Correcao.Text = ((Log?.Ntrip_ativado ?? false) ? "N " : "B ") + (Log?.IdadeCorrecao ?? -1) + ": " + (Log?.QualidadeFix ?? Enums.TiposCorrecaoGPS.SemCorrecao).ToString(); txtGPS_Correcao.Text = ((Log?.Ntrip_ativado ?? false) ? "N " : "B ") + (Log?.IdadeCorrecao ?? -1) + ": " + (Log?.QualidadeFix ?? Enums.TiposCorrecaoGPS.SemCorrecao).ToString();
txtGPS_Precisao.Text = (Log?.PrecisaoCm ?? 0).ToString("0.00") + " cm"; txtGPS_Precisao.Text = (Log?.PrecisaoCm ?? 0).ToString("0.00") + " cm";
txtGPS_Satelites.Text = (Log?.NumeroSatelites ?? 0).ToString(); txtGPS_Satelites.Text = (Log?.NumeroSatelites ?? 0).ToString();
txtGPS_Velocidade.Text = (Log?.Velocidade ?? 0).ToString("0.00") + " (" + ((Log?.Velocidade ?? 0) * GPSUtils.ConversaoNosKmh).ToString("0.00") + " km/h)"; //txtGPS_DistanciaBase.Text = (Log?.Velocidade ?? 0).ToString("0.00") + " (" + ((Log?.Velocidade ?? 0) * GPSUtils.ConversaoNosKmh).ToString("0.00") + " km/h)";
var LogLra = LogsOperacao.FirstOrDefault(x => x.Momento == MomentoAtual).DadosLoRa; var LogLra = LogsOperacao.FirstOrDefault(x => x.Momento == MomentoAtual).DadosLoRa;
txtGPS_DistanciaBase.Text = ((LogLra?.PosicaoBase?.Latitude != 0 && LogLra?.PosicaoBase?.Longitude != 0) ? GPSUtils.DistanciaEntrePontos(LogLra?.PosicaoBase ?? new GPSModel(), Log ?? new GPSModel()) : 0).ToString("0.00") + " m";
GPSService.EnviarCoordenadasParaMapa(Log?.Latitude ?? 0, Log?.Longitude ?? 0, Log?.AnguloCarroDefinido ?? 0, true, LogLra?.EnderecoCarro ?? 0x00); GPSService.EnviarCoordenadasParaMapa(Log?.Latitude ?? 0, Log?.Longitude ?? 0, Log?.AnguloCarroDefinido ?? 0, true, LogLra?.EnderecoCarro ?? 0x00);
GPSService.EnviarCoordenadasParaMapa(LogLra?.PosicaoBase?.Latitude ?? 0, LogLra?.PosicaoBase?.Longitude ?? 0, LogLra?.PosicaoBase?.AnguloCarroDefinido ?? 0, false, LogLra?.EnderecoBase ?? 0x01); GPSService.EnviarCoordenadasParaMapa(LogLra?.PosicaoBase?.Latitude ?? 0, LogLra?.PosicaoBase?.Longitude ?? 0, LogLra?.PosicaoBase?.AnguloCarroDefinido ?? 0, false, LogLra?.EnderecoBase ?? 0x01);
@ -1200,9 +1214,9 @@ namespace AgroBase.Forms.Operacoes
(float)LogOpe.Gps.AnguloCarroDefinido, (float)LogOpe.Gps.AnguloCarroDefinido,
Log, Log,
_trajaetoria, _trajaetoria,
null, //Variaveis.OperacaoEmAndamento.Mapa.TrajetoriaProjetada.FirstOrDefault(), Variaveis.OperacaoEmAndamento.Trajetoria?._TrajetoriaFixa,
new List<GPSModel>(LogsGPS.Take(LogsGPS.IndexOf(Log) + 1)), new List<GPSModel>(LogsGPS.Take(LogsGPS.IndexOf(Log) + 1)),
new List<List<GPSModel>>(), Variaveis.OperacaoEmAndamento.Mapa.TrajetoriaMapa,
LogOpe.Controle.SimulacaoMPC LogOpe.Controle.SimulacaoMPC
); );
} }

View File

@ -426,7 +426,7 @@ namespace AgroBase.Forms
{ {
//double angulo = Variaveis.OperacaoEmAndamento.Trajetoria.AnguloCaminho; //double angulo = Variaveis.OperacaoEmAndamento.Trajetoria.AnguloCaminho;
//double anguloCorredor = Variaveis.OperacaoEmAndamento.Trajetoria.AnguloMedioCorredor; //double anguloCorredor = Variaveis.OperacaoEmAndamento.Trajetoria.AnguloMedioCorredor;
double angulo = Variaveis.OperacaoEmAndamento.Trajetoria.ProximoPonto.Orientacao; double angulo = Variaveis.OperacaoEmAndamento.Trajetoria.ProximoPonto?.Orientacao ?? 0;
double anguloCorredor = Variaveis.OperacaoEmAndamento.Trajetoria.AnguloCaminho; double anguloCorredor = Variaveis.OperacaoEmAndamento.Trajetoria.AnguloCaminho;
FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)angulo, 90, (float)anguloCorredor); FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)angulo, 90, (float)anguloCorredor);
} }

View File

@ -174,7 +174,10 @@ namespace AgroBase.Forms
GPSModel ultimoPonto = new GPSModel(); GPSModel ultimoPonto = new GPSModel();
if (add) if (add)
{ {
ultimoPonto = Pontos[Pontos.Count - 1][Pontos[Pontos.Count - 1].Count - 1]; if (Pontos[Pontos.Count - 1].Count > 0)
ultimoPonto = Pontos[Pontos.Count - 1][Pontos[Pontos.Count - 1].Count - 1];
else
ultimoPonto = Pontos[Pontos.Count - 2][Pontos[Pontos.Count - 2].Count - 1];
} }
var Gps = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps; var Gps = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps;

View File

@ -124,7 +124,7 @@ namespace AgroBase.Models
} }
// Processo finalizado ou não associado // Processo finalizado ou não associado
pnlMapa.Controls.Remove(picLoading); pnlMapa?.Controls?.Remove(picLoading);
picLoading.Visible = false; picLoading.Visible = false;
mapaService.Carregado = true; mapaService.Carregado = true;
@ -226,7 +226,7 @@ namespace AgroBase.Models
browser = new WebView2(); browser = new WebView2();
browser.Source = new Uri(mapaService.MapaUrl); browser.Source = new Uri(mapaService.MapaUrl);
pnlMapa.Controls.Add(browser); pnlMapa?.Controls?.Add(browser);
browser.Dock = DockStyle.Fill; browser.Dock = DockStyle.Fill;
} }

View File

@ -2924,7 +2924,7 @@ namespace AgroBase.Models.Modules
default: default:
{ {
DadosLoRaParse tipoDado = (DadosLoRaParse)posicao; DadosLoRaParse tipoDado = (DadosLoRaParse)posicao;
Console.WriteLine($"[LRA] Dados recebidos ({tipoDado.ToString()}). " + string.Join(" ", data)); //Console.WriteLine($"[LRA] Dados recebidos ({tipoDado.ToString()}). " + string.Join(" ", data));
switch (tipoDado) switch (tipoDado)
{ {
case DadosLoRaParse.ComandoControle: case DadosLoRaParse.ComandoControle:

View File

@ -41,6 +41,7 @@ namespace AgroBase.Models
public ModoOperacao Modo { get; set; } public ModoOperacao Modo { get; set; }
public string Descricao { get; set; } public string Descricao { get; set; }
public string OprPath { get; set; }
public OperacaoControleModel Controle { get; set; } = new OperacaoControleModel(); public OperacaoControleModel Controle { get; set; } = new OperacaoControleModel();
public OperacaoControleModel ControleAnterior { get; set; } = new OperacaoControleModel(); public OperacaoControleModel ControleAnterior { get; set; } = new OperacaoControleModel();
public DispositivosService<MovimentacaoUnificadaModel> DispMvd { get; set; } public DispositivosService<MovimentacaoUnificadaModel> DispMvd { get; set; }
@ -84,7 +85,7 @@ namespace AgroBase.Models
Variaveis.OperacaoEmAndamento.TempoAguardando = DateTimeOffset.FromUnixTimeSeconds(tempoAguardando).UtcDateTime.AddSeconds(tempoAguardando % 1).ToLocalTime(); Variaveis.OperacaoEmAndamento.TempoAguardando = DateTimeOffset.FromUnixTimeSeconds(tempoAguardando).UtcDateTime.AddSeconds(tempoAguardando % 1).ToLocalTime();
HealthWorkerService.ModulosSaude = RedisService.GetField<ManagerWorkerMessageResponseModulosPendentesModel[]>(CtxKey.DadosOperacao, "status_modulos").ToList(); HealthWorkerService.ModulosSaude = RedisService.GetField<ManagerWorkerMessageResponseModulosPendentesModel[]>(CtxKey.DadosOperacao, "status_modulos").ToList();
Variaveis.OperacaoEmAndamento.ErroOperacaoLiberada = RedisService.GetField<string>(CtxKey.DadosOperacao, "motivo_nao_liberado"); Variaveis.OperacaoEmAndamento.ErroOperacaoLiberada = RedisService.GetField<string>(CtxKey.DadosOperacao, "motivo_nao_liberado");
//GPSService.CorrecaoRTK_Ntrip = RedisService.GetField<bool>(RedisService.ModKey(T_Code.Gps), "correcao_ntrip", false); GPSService.CorrecaoRTK_Ntrip = RedisService.GetField<bool>(RedisService.ModKey(T_Code.Gps), "correcao_ntrip", false);
} }
@ -207,9 +208,9 @@ namespace AgroBase.Models
openFileDialog.InitialDirectory = Variaveis.CaminhoSistema + Variaveis.CaminhoOperacoes; openFileDialog.InitialDirectory = Variaveis.CaminhoSistema + Variaveis.CaminhoOperacoes;
if (!string.IsNullOrEmpty(opPath) || openFileDialog.ShowDialog() == DialogResult.OK) if (!string.IsNullOrEmpty(opPath) || openFileDialog.ShowDialog() == DialogResult.OK)
{ {
string filePath = !string.IsNullOrEmpty(opPath) ? opPath : openFileDialog.FileName; string opr_path = !string.IsNullOrEmpty(opPath) ? opPath : openFileDialog.FileName;
string ParametrosJson = File.ReadAllText(filePath, Encoding.UTF8); string ParametrosJson = File.ReadAllText(opr_path, Encoding.UTF8);
var Parametros = JsonConvert.DeserializeObject<OperacaoParametrosModel>(ParametrosJson); var Parametros = JsonConvert.DeserializeObject<OperacaoParametrosModel>(ParametrosJson);
@ -242,6 +243,7 @@ namespace AgroBase.Models
}; };
Variaveis.OperacaoEmAndamento.Descricao = Parametros.Descricao; Variaveis.OperacaoEmAndamento.Descricao = Parametros.Descricao;
Variaveis.OperacaoEmAndamento.OprPath = opr_path;
Variaveis.OperacaoEmAndamento.QuantidadeCamerasSolo = Parametros.QtdCamerasSolo; Variaveis.OperacaoEmAndamento.QuantidadeCamerasSolo = Parametros.QtdCamerasSolo;
Variaveis.OperacaoEmAndamento.ModulosMandatorios = new List<OperacaoModulosMandatoriosModel>(Parametros.ModulosMandatorios ?? new List<OperacaoModulosMandatoriosModel>()); Variaveis.OperacaoEmAndamento.ModulosMandatorios = new List<OperacaoModulosMandatoriosModel>(Parametros.ModulosMandatorios ?? new List<OperacaoModulosMandatoriosModel>());
Variaveis.OperacaoEmAndamento.ParametrosMandatorios = new List<OperacaoParametrosMandatoriosModel>(Parametros.ParametrosMandatorios ?? new List<OperacaoParametrosMandatoriosModel>()); Variaveis.OperacaoEmAndamento.ParametrosMandatorios = new List<OperacaoParametrosMandatoriosModel>(Parametros.ParametrosMandatorios ?? new List<OperacaoParametrosMandatoriosModel>());
@ -693,6 +695,8 @@ namespace AgroBase.Models
ID = DataInicio.ToString("dd_MM_yyyy_HH_mm_ss") + "_" + Modo.ToString(); ID = DataInicio.ToString("dd_MM_yyyy_HH_mm_ss") + "_" + Modo.ToString();
Directory.CreateDirectory(Variaveis.CaminhoOperacoes + ID + "/"); Directory.CreateDirectory(Variaveis.CaminhoOperacoes + ID + "/");
SalvarOperacao();
Sensoriamento.AtualizarDados(); Sensoriamento.AtualizarDados();
DispMvd?.Dados?.ReiniciarLeituras(DispMvd?.Dados); DispMvd?.Dados?.ReiniciarLeituras(DispMvd?.Dados);
@ -897,6 +901,20 @@ namespace AgroBase.Models
return opStr; return opStr;
} }
private void SalvarOperacao()
{
if (string.IsNullOrEmpty(Variaveis.OperacaoEmAndamento.OprPath)) return;
var Caminho = Variaveis.CaminhoOperacoes + Variaveis.OperacaoEmAndamento.ID;
if (!Directory.Exists(Caminho))
{
Directory.CreateDirectory(Caminho);
}
Caminho += "/operacao.opr";
File.Copy(Variaveis.OperacaoEmAndamento.OprPath, Caminho);
}
#endregion #endregion
@ -1088,7 +1106,7 @@ namespace AgroBase.Models
} }
Variaveis.OperacaoEmAndamento.Sensoriamento.AtualizarDados(); Variaveis.OperacaoEmAndamento.Sensoriamento.AtualizarDados();
Variaveis.LoraService.EnviarDadosParaBase(); Variaveis.LoraService?.EnviarDadosParaBase();
if (!Variaveis.OperacaoEmAndamento.Iniciado) if (!Variaveis.OperacaoEmAndamento.Iniciado)
{ {
@ -1114,10 +1132,9 @@ namespace AgroBase.Models
{ {
Emergencia = controleBase.Emergencia; Emergencia = controleBase.Emergencia;
if (Emergencia) if (Emergencia) return;
{
return; if (Variaveis.OperacaoEmAndamento.Controle.MovimentoAutomatico) return;
}
var _Controle = Variaveis.OperacaoEmAndamento.Controle; var _Controle = Variaveis.OperacaoEmAndamento.Controle;

View File

@ -18,7 +18,7 @@ namespace AgroBase.Models
#region PARAMETROS #region PARAMETROS
public double DistanciaProjecaoRua { get; set; } = 0.8; // Distancia para projetar o primeiro ponto para fora do corredor public double DistanciaProjecaoRua { get; set; } = 1.5; // Distancia para projetar o primeiro ponto para fora do corredor
public static double DistanciaEntrePontos { get; set; } = 0.8; // Distancia entre os pontos dentro do corredor public static double DistanciaEntrePontos { get; set; } = 0.8; // Distancia entre os pontos dentro do corredor
public static double DistanciaEntrePontosCurva { get; set; } = 0.25; // Distancia entre os pontos durante a curva entre corredores public static double DistanciaEntrePontosCurva { get; set; } = 0.25; // Distancia entre os pontos durante a curva entre corredores
private double DistanciaManobraEntreRuas { get; set; } = 3.0; // Distancia máxima para gerar a curva de conexão entre os corredores private double DistanciaManobraEntreRuas { get; set; } = 3.0; // Distancia máxima para gerar a curva de conexão entre os corredores
@ -110,7 +110,7 @@ namespace AgroBase.Models
} }
} }
public List<CorredorTrajetoriaModel> _Corredores { get; set; } public List<CorredorTrajetoriaModel> _Corredores { get; set; }
public List<GPSModel> TrajetoriaFixa => _TrajetoriaFixa.ConvertAll(x => x.Posicao); public List<GPSModel> TrajetoriaFixa => _TrajetoriaFixa?.ConvertAll(x => x.Posicao);
public List<PontoTrajetoriaModel> _TrajetoriaDinamica { get; private set; } public List<PontoTrajetoriaModel> _TrajetoriaDinamica { get; private set; }
public List<GPSModel> TrajetoriaDinamica => _TrajetoriaDinamica.ConvertAll(x => x.Posicao); public List<GPSModel> TrajetoriaDinamica => _TrajetoriaDinamica.ConvertAll(x => x.Posicao);
public void AtualizarTrajetoriaDinamica() public void AtualizarTrajetoriaDinamica()
@ -332,8 +332,7 @@ namespace AgroBase.Models
} }
else else
{ {
int idx = (_TrajetoriaJanela.IndexOf(PontoAtual) + 1); ProximoPonto = _TrajetoriaFixa[PontoAtual.idxPonto + 1];
ProximoPonto = _TrajetoriaJanela[idx];
} }
/*// Busca eficiente: percorre do começo ao fim para achar o primeiro não visitado /*// Busca eficiente: percorre do começo ao fim para achar o primeiro não visitado
@ -602,7 +601,7 @@ namespace AgroBase.Models
AtualizarIndicesJanela(); AtualizarIndicesJanela();
AtualizarTrajetoriaJanela(); AtualizarTrajetoriaJanela();
//VerificaFimCorredorSegmentacao(); VerificaFimCorredorSegmentacao();
DefinirPontoAtual(); DefinirPontoAtual();
AtualizarCorredorAtual(); AtualizarCorredorAtual();
@ -627,38 +626,61 @@ namespace AgroBase.Models
private void VerificaFimCorredorSegmentacao() private void VerificaFimCorredorSegmentacao()
{ {
double limiarDistanciaMargem = 4.0; if (CorredorAtual == null) return;
if (CorredorAtual != null)
double limiarDistanciaMargem = 20.0;
double distanciaRestanteCorredor = CorredorAtual.DistanciaRestante;
double distanciaUltimoPontoCorredor = GPSUtils.DistanciaEntrePontos(Variaveis.OperacaoEmAndamento.Sensoriamento.Gps, CorredorAtual.Pontos.LastOrDefault().Posicao);
var OpVisual = Variaveis.OperacaoEmAndamento.Sensoriamento?.OperadorVisual ?? new VisualWorkerModel();
StatusModulo OpVisualStatus = Variaveis.OperacaoEmAndamento.Sensoriamento.ModulosSaude.FirstOrDefault(x => x.modulo == T_Code.Snr)?.status ?? StatusModulo.Desconectado;
var DadosSegmentacao = OpVisual.Analises?.segmentacao ?? new VisualWorkerMessageSegmentacaoSemanticaModel();
if (OpVisualStatus == StatusModulo.Operante) //OpVisual.Iniciado &&
{ {
double distanciaRestanteCorredor = CorredorAtual.DistanciaRestante; // Contagem de tempo por status em segundos
double distanciaUltimoPontoCorredor = GPSUtils.DistanciaEntrePontos(Variaveis.OperacaoEmAndamento.Sensoriamento.Gps, CorredorAtual.Pontos.LastOrDefault().Posicao); StatusCarroMapa statusCarro = DadosSegmentacao.status_corredor;
if (distanciaRestanteCorredor < limiarDistanciaMargem && distanciaUltimoPontoCorredor < limiarDistanciaMargem) if (!CorredorAtual.TempoPorStatus.TryGetValue(statusCarro, out var status))
{ {
var OpVisual = Variaveis.OperacaoEmAndamento.Sensoriamento?.OperadorVisual ?? new VisualWorkerModel(); CorredorAtual.TempoPorStatus.Add(statusCarro, 0);
StatusModulo OpVisualStatus = Variaveis.OperacaoEmAndamento.Sensoriamento.ModulosSaude.FirstOrDefault(x => x.modulo == T_Code.Snr)?.status ?? StatusModulo.Desconectado; }
var DadosSegmentacao = OpVisual.Analises?.segmentacao ?? new VisualWorkerMessageSegmentacaoSemanticaModel(); if (CorredorAtual.UltimoTempoStatus > DateTime.MinValue)
if (OpVisual.Iniciado && OpVisualStatus == StatusModulo.Operante && DadosSegmentacao.status_corredor == StatusCarroMapa.Direcionando) {
CorredorAtual.TempoPorStatus[statusCarro] += (DateTime.Now - CorredorAtual.UltimoTempoStatus).TotalSeconds;
}
CorredorAtual.UltimoTempoStatus = DateTime.Now;
double TempoTotalContagem = CorredorAtual.TempoPorStatus.Sum(x => x.Value);
CorredorAtual.TempoPorStatus.TryGetValue(StatusCarroMapa.CaminhandoRua, out double TempoCaminhandoRua);
CorredorAtual.TempoPorStatus.TryGetValue(StatusCarroMapa.CaminhandoRua, out double TempoDirecionando);
double PercentualTempoCaminhandoRua = TempoCaminhandoRua / TempoTotalContagem;
double PercentualTempoDirecionando = TempoDirecionando / TempoTotalContagem;
if (
distanciaRestanteCorredor < limiarDistanciaMargem && // Esta a pelo menos x metros do final do corredor
distanciaUltimoPontoCorredor < limiarDistanciaMargem && // Esta a pelo menos x metros do ultimo ponto do corredor
PercentualTempoCaminhandoRua > 0.4 && // Esteve a pelo menos 60% do tempo do corredor com cana dos dois lados
PercentualTempoDirecionando < 0.5 && // Esteve ate no maximo 50% do tempo fora do corredor
statusCarro == StatusCarroMapa.Direcionando // Carro esta fora do corredor
)
{
int pontosMarcar = 0;
foreach (var Ponto in CorredorAtual.Pontos.Where(x => !x.Visitado))
{ {
int pontosMarcar = 0; Ponto.Visitado = true;
foreach (var Ponto in CorredorAtual.Pontos.Where(x => !x.Visitado)) pontosMarcar++;
}
if (!CorredorAtual.Ultimo)
{
_TrajetoriaFixa[CorredorAtual.Pontos[CorredorAtual.QtdPontos - 1].idxPonto + 1].Visitado = true;
AtualizarIndicesJanela();
AtualizarTrajetoriaJanela();
DefinirPontoAtual();
AtualizarCorredorAtual();
for (int i = 0; i < pontosMarcar; i++)
{ {
Ponto.Visitado = true; CorredorAtual.Pontos[i].Visitado = true;
pontosMarcar++;
}
if (!CorredorAtual.Ultimo)
{
_TrajetoriaFixa[CorredorAtual.Pontos[CorredorAtual.QtdPontos - 1].idxPonto + 1].Visitado = true;
AtualizarIndicesJanela();
AtualizarTrajetoriaJanela();
DefinirPontoAtual();
AtualizarCorredorAtual();
for (int i = 0; i < pontosMarcar; i++)
{
CorredorAtual.Pontos[i].Visitado = true;
}
AtualizarIndicesJanela();
AtualizarTrajetoriaJanela();
} }
AtualizarIndicesJanela();
AtualizarTrajetoriaJanela();
} }
} }
} }
@ -992,7 +1014,7 @@ namespace AgroBase.Models
return totalPontos > 0 ? somaDistancias / totalPontos : 0; return totalPontos > 0 ? somaDistancias / totalPontos : 0;
} }
public void ProjetarTrajetoriaFixa() public void ProjetarTrajetoriaFixa(GPSModel posicaoRobo = null)
{ {
List<PontoTrajetoriaModel> _trajetoriaFixa = new List<PontoTrajetoriaModel>(); List<PontoTrajetoriaModel> _trajetoriaFixa = new List<PontoTrajetoriaModel>();
(List<List<GPSModel>> corredores, List<double> CorredoresLarguras) = ProjetarCorredores(); (List<List<GPSModel>> corredores, List<double> CorredoresLarguras) = ProjetarCorredores();
@ -1008,7 +1030,7 @@ namespace AgroBase.Models
idxCorredor = 0, idxCorredor = 0,
idxPonto = 0, idxPonto = 0,
idxPontoCorredor = 0, idxPontoCorredor = 0,
Posicao = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps, Posicao = posicaoRobo ?? Variaveis.OperacaoEmAndamento.Sensoriamento.Gps,
Direcao = direcaoAtual, Direcao = direcaoAtual,
Orientacao = 0, Orientacao = 0,
Visitado = true, Visitado = true,
@ -1155,7 +1177,7 @@ namespace AgroBase.Models
anguloProjetar2 += anguloAcrescentar; anguloProjetar2 += anguloAcrescentar;
anguloAcrescentar *= -1; anguloAcrescentar *= -1;
} }
double percentualAcrescimoPontoAberturaCurva = 1.5; double percentualAcrescimoPontoAberturaCurva = 1.1;
GPSModel UltimoPonto = GPSUtils.ProjetarPontoDeslocado(CorredorAtual.Last(), !ultimoCorredor ? (DistanciaProjecaoRua * percentualAcrescimoPontoAberturaCurva) : (DistanciaProjecaoRua * 2.0), anguloProjetar2); GPSModel UltimoPonto = GPSUtils.ProjetarPontoDeslocado(CorredorAtual.Last(), !ultimoCorredor ? (DistanciaProjecaoRua * percentualAcrescimoPontoAberturaCurva) : (DistanciaProjecaoRua * 2.0), anguloProjetar2);
PontoTrajetoriaModel PontoFinal = new PontoTrajetoriaModel(TipoPontoRua.LigacaoSaida) PontoTrajetoriaModel PontoFinal = new PontoTrajetoriaModel(TipoPontoRua.LigacaoSaida)
@ -1397,6 +1419,8 @@ namespace AgroBase.Models
public int idxRuaEsquerda { get; set; } public int idxRuaEsquerda { get; set; }
public int idxRuaDireita { get; set; } public int idxRuaDireita { get; set; }
public double FatorLarguraCorredor { get; set; } public double FatorLarguraCorredor { get; set; }
public DateTime UltimoTempoStatus { get; set; } = DateTime.MinValue;
public Dictionary<StatusCarroMapa, double> TempoPorStatus { get; set; }
public void AtualizarDados() public void AtualizarDados()
{ {
@ -1445,6 +1469,8 @@ namespace AgroBase.Models
Pontos = new List<PontoTrajetoriaModel>(), Pontos = new List<PontoTrajetoriaModel>(),
Ultimo = Ultimo, Ultimo = Ultimo,
FatorLarguraCorredor = FatorLarguraCorredor, FatorLarguraCorredor = FatorLarguraCorredor,
UltimoTempoStatus = UltimoTempoStatus,
TempoPorStatus = new Dictionary<StatusCarroMapa, double>(TempoPorStatus)
}; };
if (clonarPontos) if (clonarPontos)
{ {

View File

@ -186,8 +186,8 @@ namespace AgroBase.Models
{ TipoMovimentoDirecional.MovimentoLateral, 90 }, { TipoMovimentoDirecional.MovimentoLateral, 90 },
{ TipoMovimentoDirecional.Diagnostico, 25 }, { TipoMovimentoDirecional.Diagnostico, 25 },
}; };
public static double AnguloInclinacaoRollMax { get; set; } = 15.0; public static double AnguloInclinacaoRollMax { get; set; } = 30.0;
public static double AnguloInclinacaoPitchMax { get; set; } = 30.0; public static double AnguloInclinacaoPitchMax { get; set; } = 45.0;
public static SensorSinaleiroComportamentoModel ComportamentoPorStatus(StatusOperacao? _status = null) public static SensorSinaleiroComportamentoModel ComportamentoPorStatus(StatusOperacao? _status = null)
{ {

View File

@ -44,11 +44,14 @@ namespace AgroBase.Services
public static int TaxaAmostragemHz { get; set; } = 5; public static int TaxaAmostragemHz { get; set; } = 5;
private static bool InverterHeading = true;
private static int rtk_timeout = 60; private static int rtk_timeout = 60;
private static int TempoMin_Ntrip = 10; private static int TempoMin_Ntrip = 10;
private static bool LoopRTK_Ntrip = false; private static bool LoopRTK_Ntrip = false;
public static bool CorrecaoRTK_Ntrip = false; public static bool CorrecaoRTK_Ntrip = false;
public static DateTime UltimoEnvioCorrecaoRTK = DateTime.MinValue; public static DateTime UltimoEnvioCorrecaoRTK = DateTime.MinValue;
private static double HeadingOffsetCorrecao = 5.0;
private static double HeadingOffsetSimulador => Variaveis.OperacaoEmAndamento.Simulando ? -HeadingOffsetCorrecao : 0.0;
public static void AtualizarPortaCOM(SerialPort Porta) public static void AtualizarPortaCOM(SerialPort Porta)
{ {
@ -622,7 +625,7 @@ namespace AgroBase.Services
UltimaLeitura.TimestampOri.valor = Stopwatch.GetTimestamp() / (double)Stopwatch.Frequency; UltimaLeitura.TimestampOri.valor = Stopwatch.GetTimestamp() / (double)Stopwatch.Frequency;
UltimaLeitura.Momento = DateTime.Now; UltimaLeitura.Momento = DateTime.Now;
UltimaLeitura.OrientacaoReal = headingTrue; UltimaLeitura.OrientacaoReal = InverterHeading ? GPSUtils.NormalizarAngulo(headingTrue + 180.0) : headingTrue;
UltimaLeitura.TipoOrientacao = status; UltimaLeitura.TipoOrientacao = status;
// ✅ Atualiza o ângulo unificado no GPSService // ✅ Atualiza o ângulo unificado no GPSService
@ -991,7 +994,7 @@ namespace AgroBase.Services
int EnderecoEquipamento = Convert.ToInt32(Variaveis.LoraService?.ParametrosGet?.address ?? Variaveis.LoraService?.ParametrosSet?.address ?? 0x00); int EnderecoEquipamento = Convert.ToInt32(Variaveis.LoraService?.ParametrosGet?.address ?? Variaveis.LoraService?.ParametrosSet?.address ?? 0x00);
EnviarCoordenadasParaMapa(UltimaLeitura.Latitude, UltimaLeitura.Longitude, UltimaLeitura.AnguloCarroDefinido, Variaveis.OperacaoEmAndamento.Iniciado, EnderecoEquipamento); EnviarCoordenadasParaMapa(UltimaLeitura.Latitude, UltimaLeitura.Longitude, UltimaLeitura.AnguloCarroDefinido, Variaveis.OperacaoEmAndamento.Iniciado, EnderecoEquipamento);
if (Variaveis.LoraService.Iniciado && Variaveis.LoraService._ultimoRxDados > DateTime.UtcNow.AddSeconds(-60)) if (Variaveis.LoraService?.Iniciado ?? false && (Variaveis.LoraService?._ultimoRxDados ?? DateTime.MinValue) > DateTime.UtcNow.AddSeconds(-60))
{ {
byte EnderecoBase = Variaveis.LoraBaseParametros.address; byte EnderecoBase = Variaveis.LoraBaseParametros.address;
EnviarCoordenadasParaMapa(VariaveisOperacao.PosicaoBase.Latitude, VariaveisOperacao.PosicaoBase.Longitude, VariaveisOperacao.PosicaoBase.OrientacaoReal, false, EnderecoBase); EnviarCoordenadasParaMapa(VariaveisOperacao.PosicaoBase.Latitude, VariaveisOperacao.PosicaoBase.Longitude, VariaveisOperacao.PosicaoBase.OrientacaoReal, false, EnderecoBase);
@ -1169,7 +1172,7 @@ namespace AgroBase.Services
} }
// Atualiza o ângulo final // Atualiza o ângulo final
UltimaLeitura.AnguloCarroDefinido = anguloFinal; UltimaLeitura.AnguloCarroDefinido = GPSUtils.NormalizarAngulo(anguloFinal + HeadingOffsetSimulador + HeadingOffsetCorrecao);
} }
public static double CalcularAnguloUnificado(double orientacaoReal, TiposCorrecaoGPS precisaoGPS, double anguloMovimento, double distanciaMovimento, double? anguloWT901C = null) public static double CalcularAnguloUnificado(double orientacaoReal, TiposCorrecaoGPS precisaoGPS, double anguloMovimento, double distanciaMovimento, double? anguloWT901C = null)

View File

@ -102,6 +102,7 @@ namespace AgroBase.Services
feature.geometry.id = i.ToString(); feature.geometry.id = i.ToString();
i++; i++;
}); });
} }
public static void CriarArquivoMapa(List<List<GPSModel>> Trajetoria, int id = 1517, string name = "Projeto", double dist1 = 0.0, double dist2 = 0.0) public static void CriarArquivoMapa(List<List<GPSModel>> Trajetoria, int id = 1517, string name = "Projeto", double dist1 = 0.0, double dist2 = 0.0)

View File

@ -1,12 +1,5 @@
{ {
"epochs": [ { "epochs": [ {
"calculation_time": "13400595140854297",
"config_version": 0,
"model_version": "0",
"padded_top_topics_start_index": 0,
"taxonomy_version": 0,
"top_topics_and_observing_domains": [ ]
}, {
"calculation_time": "13401214743883964", "calculation_time": "13401214743883964",
"config_version": 0, "config_version": 0,
"model_version": "0", "model_version": "0",
@ -27,7 +20,14 @@
"padded_top_topics_start_index": 0, "padded_top_topics_start_index": 0,
"taxonomy_version": 0, "taxonomy_version": 0,
"top_topics_and_observing_domains": [ ] "top_topics_and_observing_domains": [ ]
}, {
"calculation_time": "13403032020468903",
"config_version": 0,
"model_version": "0",
"padded_top_topics_start_index": 0,
"taxonomy_version": 0,
"top_topics_and_observing_domains": [ ]
} ], } ],
"hex_encoded_hmac_key": "40F346D3248C3AFDF2BEE1FE496DBD32F7CED6E5AE98B881ABC421AA7E7B5642", "hex_encoded_hmac_key": "40F346D3248C3AFDF2BEE1FE496DBD32F7CED6E5AE98B881ABC421AA7E7B5642",
"next_scheduled_calculation_time": "13403030306182881" "next_scheduled_calculation_time": "13403636820469100"
} }

View File

@ -1,3 +1,3 @@
2025/09/17-16:42:43.823 5848 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Local Storage\leveldb/MANIFEST-000001 2025/09/22-15:30:19.498 1b7c Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Local Storage\leveldb/MANIFEST-000001
2025/09/17-16:42:43.832 5848 Recovering log #3 2025/09/22-15:30:19.509 1b7c Recovering log #3
2025/09/17-16:42:43.835 5848 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Local Storage\leveldb/000003.log 2025/09/22-15:30:19.512 1b7c Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Local Storage\leveldb/000003.log

View File

@ -1,3 +1,3 @@
2025/09/17-16:20:23.484 57e4 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Local Storage\leveldb/MANIFEST-000001 2025/09/22-14:17:21.935 12a0 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Local Storage\leveldb/MANIFEST-000001
2025/09/17-16:20:23.493 57e4 Recovering log #3 2025/09/22-14:17:21.943 12a0 Recovering log #3
2025/09/17-16:20:23.496 57e4 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Local Storage\leveldb/000003.log 2025/09/22-14:17:21.946 12a0 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Local Storage\leveldb/000003.log

View File

@ -1 +1 @@
{"net":{"http_server_properties":{"servers":[{"alternative_service":[{"advertised_alpns":["h3"],"expiration":"13402698942753276","port":443,"protocol_str":"quic"}],"anonymization":["DAAAAAcAAABmaWxlOi8vAA==",false,0],"network_stats":{"srtt":65448},"server":"https://tile.openstreetmap.org","supports_spdy":true}],"supports_quic":{"address":"2804:d78:67d:1400:2446:e381:e2d0:7901","used_quic":true},"version":5},"network_qualities":{"CAASABiAgICA+P////8B":"4G","CAESABiAgICA+P////8B":"4G","CAISABiAgICA+P////8B":"4G","CAYSABiAgICA+P////8B":"Offline"}}} {"net":{"http_server_properties":{"servers":[{"alternative_service":[{"advertised_alpns":["h3"],"expiration":"13403124628748627","port":443,"protocol_str":"quic"}],"anonymization":["DAAAAAcAAABmaWxlOi8vAA==",false,0],"network_stats":{"srtt":14427},"server":"https://tile.openstreetmap.org","supports_spdy":true}],"supports_quic":{"address":"2804:d78:67d:1400:cd2a:9909:b778:feef","used_quic":true},"version":5},"network_qualities":{"CAASABiAgICA+P////8B":"4G","CAESABiAgICA+P////8B":"4G","CAISABiAgICA+P////8B":"4G","CAYSABiAgICA+P////8B":"Offline"}}}

View File

@ -1 +1 @@
{"sts":[{"expiry":1789674166.889444,"host":"bWGAftl61rqoc0YzqPncsLvQQh/iC2Bdp3ejUeGC83w=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1758138166.889448}],"version":2} {"sts":[{"expiry":1790097601.177978,"host":"bWGAftl61rqoc0YzqPncsLvQQh/iC2Bdp3ejUeGC83w=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1758561601.177983}],"version":2}

File diff suppressed because one or more lines are too long

View File

@ -1,3 +1,3 @@
2025/09/17-17:13:27.654 5848 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Session Storage/MANIFEST-000001 2025/09/22-15:32:03.868 1b7c Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Session Storage/MANIFEST-000001
2025/09/17-17:13:27.656 5848 Recovering log #3 2025/09/22-15:32:03.869 1b7c Recovering log #3
2025/09/17-17:13:27.659 5848 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Session Storage/000003.log 2025/09/22-15:32:03.872 1b7c Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Session Storage/000003.log

View File

@ -1,3 +1,3 @@
2025/09/17-16:23:13.740 57e4 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Session Storage/MANIFEST-000001 2025/09/22-15:11:23.486 12a0 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Session Storage/MANIFEST-000001
2025/09/17-16:23:13.742 57e4 Recovering log #3 2025/09/22-15:11:23.487 12a0 Recovering log #3
2025/09/17-16:23:13.745 57e4 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Session Storage/000003.log 2025/09/22-15:11:23.490 12a0 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Session Storage/000003.log

View File

@ -1,3 +1,3 @@
2025/09/17-16:42:43.748 5280 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Site Characteristics Database/MANIFEST-000001 2025/09/22-15:30:19.422 14dc Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Site Characteristics Database/MANIFEST-000001
2025/09/17-16:42:43.750 5280 Recovering log #7 2025/09/22-15:30:19.425 14dc Recovering log #7
2025/09/17-16:42:43.750 5280 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Site Characteristics Database/000007.log 2025/09/22-15:30:19.425 14dc Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Site Characteristics Database/000007.log

View File

@ -1,3 +1,3 @@
2025/09/17-16:20:23.401 23a8 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Site Characteristics Database/MANIFEST-000001 2025/09/22-14:17:21.861 5d88 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Site Characteristics Database/MANIFEST-000001
2025/09/17-16:20:23.404 23a8 Recovering log #7 2025/09/22-14:17:21.863 5d88 Recovering log #7
2025/09/17-16:20:23.404 23a8 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Site Characteristics Database/000007.log 2025/09/22-14:17:21.864 5d88 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Site Characteristics Database/000007.log

View File

@ -1 +1 @@
140.0.3485.66 140.0.3485.81

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -17,7 +17,7 @@
<meta name="viewport" content="width=device-width, <meta name="viewport" content="width=device-width,
initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<style> <style>
#map_e541659635fbe5ef795ffc63af53174e { #map_a930f18588199d9d6021d4c49b85c784 {
position: relative; position: relative;
width: 100.0%; width: 100.0%;
height: 100.0%; height: 100.0%;
@ -54,14 +54,14 @@
<body> <body>
<div class="folium-map" id="map_e541659635fbe5ef795ffc63af53174e" ></div> <div class="folium-map" id="map_a930f18588199d9d6021d4c49b85c784" ></div>
</body> </body>
<script> <script>
var map_e541659635fbe5ef795ffc63af53174e = L.map( var map_a930f18588199d9d6021d4c49b85c784 = L.map(
"map_e541659635fbe5ef795ffc63af53174e", "map_a930f18588199d9d6021d4c49b85c784",
{ {
center: [0.0, 0.0], center: [0.0, 0.0],
crs: L.CRS.EPSG3857, crs: L.CRS.EPSG3857,
@ -96,7 +96,7 @@
} }
trajeto_json_add({"features": []}); trajeto_json_add({"features": []});
trajeto_json.addTo(map_e541659635fbe5ef795ffc63af53174e); trajeto_json.addTo(map_a930f18588199d9d6021d4c49b85c784);
function adicionarGeometria(novaGeometria) { function adicionarGeometria(novaGeometria) {
trajeto_json.addData(novaGeometria); trajeto_json.addData(novaGeometria);
@ -159,9 +159,9 @@
var marcadorEquipamento = L.marker([0, 0], { var marcadorEquipamento = L.marker([0, 0], {
icon: customIcon icon: customIcon
}).addTo(map_e541659635fbe5ef795ffc63af53174e); }).addTo(map_a930f18588199d9d6021d4c49b85c784);
var marcadorBase = L.marker([0, 0], {}).addTo(map_e541659635fbe5ef795ffc63af53174e); var marcadorBase = L.marker([0, 0], {}).addTo(map_a930f18588199d9d6021d4c49b85c784);
var icon = L.AwesomeMarkers.icon( var icon = L.AwesomeMarkers.icon(
{"extraClasses": "fa-rotate-0", "icon": "info-sign", "iconColor": "white", "markerColor": "red", "prefix": "glyphicon"} {"extraClasses": "fa-rotate-0", "icon": "info-sign", "iconColor": "white", "markerColor": "red", "prefix": "glyphicon"}
); );
@ -226,7 +226,7 @@
} }
if (foco) { if (foco) {
map_e541659635fbe5ef795ffc63af53174e.setView(novaPosicao, map_e541659635fbe5ef795ffc63af53174e.getZoom()); map_a930f18588199d9d6021d4c49b85c784.setView(novaPosicao, map_a930f18588199d9d6021d4c49b85c784.getZoom());
} }
} }
@ -248,7 +248,7 @@
marcadorDinamico.setRotationAngle(angulo); marcadorDinamico.setRotationAngle(angulo);
adicionarCoordenada("Tj", [novaLongitude, novaLatitude]); adicionarCoordenada("Tj", [novaLongitude, novaLatitude]);
map_e541659635fbe5ef795ffc63af53174e.setView(novaPosicao, map_e541659635fbe5ef795ffc63af53174e.getZoom());*/ map_a930f18588199d9d6021d4c49b85c784.setView(novaPosicao, map_a930f18588199d9d6021d4c49b85c784.getZoom());*/
}); });
function calcularOrientacao(P1latitude, P1longitude, P2latitude, P2longitude) { function calcularOrientacao(P1latitude, P1longitude, P2latitude, P2longitude) {

File diff suppressed because one or more lines are too long

View File

@ -24,17 +24,17 @@ def definir_comando(parada_necessaria: bool, frear: bool, erro: bool, filtro_vel
mostrar_log(f"🟥 Movimento parado: operação não está em andamento ou finalizando: {status_operacao.name}") mostrar_log(f"🟥 Movimento parado: operação não está em andamento ou finalizando: {status_operacao.name}")
return _montar_comando_retorno(0.0, False) return _montar_comando_retorno(0.0, False)
_dados_vw = ContextoGlobalRedis.get(CtxKey.DadosWeedWorker, {}).get("analise", {}) _dados_vw = ContextoGlobalRedis.get(CtxKey.DadosVisualWorker, {})
_snr = ContextoGlobalRedis.get_modulo(T_Code.Snr) _snr = ContextoGlobalRedis.get_modulo(T_Code.Snr)
sonar_ativado = _operacao.get("Snr", {}).get("sonar_ativado", False) sonar_ativado = _operacao.get("Snr", {}).get("sonar_ativado", False)
visual_worker_operante = (_snr.get("saude", {}).get("status", StatusModulo.DESCONECTADO.value)) == StatusModulo.OPERANTE.value visual_worker_operante = (_snr.get("saude", {}).get("status", StatusModulo.DESCONECTADO.value)) == StatusModulo.OPERANTE.value
analise_deteccao_atualizada = (time.perf_counter() - _dados_vw.get("matriz_confianca", {}).get("ts", 10.0) <= 1.0) analise_deteccao_atualizada = (time.perf_counter() - _dados_vw.get("matriz_confianca", {}).get("ts", 10.0) <= 1.0)
obstaculo_detectado = _dados_vw.get("matriz_confianca", {}).get("block", {}).get("decision", {}).get("parar", False) if analise_deteccao_atualizada else False obstaculo_detectado = _dados_vw.get("matriz_confianca", {}).get("block", {}).get("decision", {}).get("parar", False) if analise_deteccao_atualizada else False
if (sonar_ativado and visual_worker_operante and obstaculo_detectado): if (sonar_ativado and visual_worker_operante and obstaculo_detectado):
mostrar_log(f"🟥 Movimento parado: obstaculo proximo detectado no sonar") mostrar_log(f"🟥 Movimento parado: obstaculo proximo detectado no sonar")
return _montar_comando_retorno(0.0, True) return _montar_comando_retorno(0.0, True)
op_modo = ModoOperacao(_operacao.get("modo", ModoOperacao.NaoDefinido.value)) op_modo = ModoOperacao(_operacao.get("modo", ModoOperacao.NaoDefinido.value))
_contexto = ContextoGlobalRedis.get_contexto() _contexto = ContextoGlobalRedis.get_contexto()
_controle = ContextoGlobalRedis.get_controle() _controle = ContextoGlobalRedis.get_controle()
@ -42,15 +42,15 @@ def definir_comando(parada_necessaria: bool, frear: bool, erro: bool, filtro_vel
#ervas_no_radar = _contexto.get("Gerais", {}).get("ervas_no_radar", False) #ervas_no_radar = _contexto.get("Gerais", {}).get("ervas_no_radar", False)
#percentual_ervas_no_radar = (_contexto.get("Gerais", {}).get("percentual_ervas_no_radar", 0)) * 100.0 #percentual_ervas_no_radar = (_contexto.get("Gerais", {}).get("percentual_ervas_no_radar", 0)) * 100.0
ervas_no_radar = _dados_vw.get("ervas_no_radar", False) _dados_ww = ContextoGlobalRedis.get(CtxKey.DadosWeedWorker, {}).get("analise", {})
percentual_ervas_no_radar = _dados_vw.get("estatisticas", {}).get("erva", {}).get("ema_global", 0.0) ervas_no_radar = _dados_ww.get("ervas_no_radar", False)
percentual_ervas_no_radar = (_dados_ww.get("estatisticas", {}).get("erva", {}) or {}).get("ema_global", 0.0)
vel_min = 15 vel_min = 15
ervas_min_percenet = 0.005 ervas_min_percenet = 0.005
vel_com_ervas = _operacao.get("Mov", {}).get("percent_vel_min", 0) vel_com_ervas = _operacao.get("Mov", {}).get("percent_vel_min", 0)
vel_sem_ervas = _operacao.get("Mov", {}).get("percent_vel_max", 100) vel_sem_ervas = _operacao.get("Mov", {}).get("percent_vel_max", 100)
ang_max = _operacao.get("Dir", {}).get("angulo_max", 30) ang_max = _operacao.get("Dir", {}).get("angulo_max", 30)
status_carro = StatusCarroMapa.Parado status_carro = StatusCarroMapa.Parado
erro = 0 erro = 0
@ -63,9 +63,8 @@ def definir_comando(parada_necessaria: bool, frear: bool, erro: bool, filtro_vel
erro = _trajetoria.get("erro_angular", 0) erro = _trajetoria.get("erro_angular", 0)
manobrando = _trajetoria.get("manobrando", False) manobrando = _trajetoria.get("manobrando", False)
elif op_modo == ModoOperacao.MapeamentoVisual: elif op_modo == ModoOperacao.MapeamentoVisual:
_dados_vw = ContextoGlobalRedis.get(CtxKey.DadosVisualWorker, {}).get("segmentacao", {}) status_carro = StatusCarroMapa(_dados_vw.get("segmentacao", {}).get("status_corredor", StatusCarroMapa.Parado.value))
status_carro = StatusCarroMapa(_dados_vw.get("status_corredor", StatusCarroMapa.Parado.value)) erro = _dados_vw.get("segmentacao", {}).get("erro_angular", 0)
erro = _dados_vw.get("erro_angular", 0)
velocidade_sp = vel_com_ervas velocidade_sp = vel_com_ervas
@ -84,7 +83,7 @@ def definir_comando(parada_necessaria: bool, frear: bool, erro: bool, filtro_vel
velocidade_sp = vel_com_ervas velocidade_sp = vel_com_ervas
else: else:
velocidade_sp = calcular_velocidade_relativa(vel_com_ervas, vel_sem_ervas, ang_max, erro) velocidade_sp = calcular_velocidade_relativa(vel_com_ervas, vel_sem_ervas, ang_max, erro)
# Aplica limites # Aplica limites
velocidade_sp = max(vel_com_ervas, min(vel_sem_ervas, velocidade_sp)) velocidade_sp = max(vel_com_ervas, min(vel_sem_ervas, velocidade_sp))

View File

@ -532,7 +532,7 @@ class ControladorMPC:
# 1) Bearing até o alvo # 1) Bearing até o alvo
orient = self.gps_handler.calcular_orientacao(ponto_alvo_xy, estado_atual) orient = self.gps_handler.calcular_orientacao(ponto_alvo_xy, estado_atual)
theta_ponto = (orient - estado_atual[2] + np.pi) % (2*np.pi) - np.pi theta_ponto = (orient - theta + np.pi) % (2*np.pi) - np.pi
# 2) Defina erro lateral a partir das distâncias # 2) Defina erro lateral a partir das distâncias
# Convenção: e_lat > 0 quando você está mais perto da ESQUERDA (dir > esq) # Convenção: e_lat > 0 quando você está mais perto da ESQUERDA (dir > esq)
@ -560,9 +560,9 @@ class ControladorMPC:
nudge = np.arctan2(k_e * e_lat, v + v0) # pequeno e estável nudge = np.arctan2(k_e * e_lat, v + v0) # pequeno e estável
# 7) Delta final + clamp # 7) Delta final + clamp
delta = self._wrap_pi(theta_ref - theta) + nudge delta = self._wrap_pi(theta - theta_ref) + nudge
ang_max = np.radians(angulo_max_graus) #ang_max = np.radians(angulo_max_graus)
delta = float(np.clip(delta, -ang_max, ang_max)) #delta = float(np.clip(delta, -ang_max, ang_max))
debug = { debug = {
"e_lat": e_lat, "half": half, "sigma": sigma, "w_rua": w_rua, "e_lat": e_lat, "half": half, "sigma": sigma, "w_rua": w_rua,
@ -1007,6 +1007,8 @@ class ControladorMPC:
"inicial": True "inicial": True
}] }]
#mostrar_log(f"idx_proximo_ponto_C#: {idx_proximo_ponto_real}, idx_ponto_alvo_C#: {idx_ponto_alvo}, idx_proximo_ponto_Python: {idx_alvo_correcao}")
# Loop de K comandos (receding); cada comando simula dt_pred com v_sim # Loop de K comandos (receding); cada comando simula dt_pred com v_sim
for passo in range(self.qtd_comandos_sucessivos): for passo in range(self.qtd_comandos_sucessivos):
if ms_left() <= 0: if ms_left() <= 0:
@ -1026,6 +1028,8 @@ class ControladorMPC:
} }
idx_alvo = self._corrigir_pontos_visitados(x_atual, y_atual, visitados, velocidade=v_sim, dt=dt_pred) idx_alvo = self._corrigir_pontos_visitados(x_atual, y_atual, visitados, velocidade=v_sim, dt=dt_pred)
#if passo == 0:
# print(f"idx_alvo: {idx_alvo}")
#if idx_alvo < len(self.pontos_info) - 1: idx_alvo += 1 #if idx_alvo < len(self.pontos_info) - 1: idx_alvo += 1
ponto_alvo = self.pontos_info[idx_alvo] ponto_alvo = self.pontos_info[idx_alvo]
@ -1251,7 +1255,7 @@ class ControladorMPC:
manobrando = CARRO.get("ManobrandoEntreRuas", False) manobrando = CARRO.get("ManobrandoEntreRuas", False)
if manobrando or status in [StatusCarroMapa.EntrandoRua, StatusCarroMapa.SaindoRua, StatusCarroMapa.Manobrando]: if manobrando or status in [StatusCarroMapa.EntrandoRua, StatusCarroMapa.SaindoRua, StatusCarroMapa.Manobrando]:
tipos_validos = [TipoMovimentoDirecional.MovimentoArco] tipos_validos = [TipoMovimentoDirecional.MovimentoArco]
elif abs(np.degrees(delta_theta)) > 10.0: elif abs(np.degrees(delta_theta)) > 15.0:
tipos_validos = [TipoMovimentoDirecional.RodasDianteiras, TipoMovimentoDirecional.MovimentoArco] tipos_validos = [TipoMovimentoDirecional.RodasDianteiras, TipoMovimentoDirecional.MovimentoArco]
else: else:
tipos_validos = [TipoMovimentoDirecional.RodasDianteiras] tipos_validos = [TipoMovimentoDirecional.RodasDianteiras]

View File

@ -205,6 +205,7 @@ class ContextoGlobalRedis:
# 🔹 Conjuntos de módulos # 🔹 Conjuntos de módulos
modulos_mandatorios = set(_operacao.get("modulos_mandatorios", [])) modulos_mandatorios = set(_operacao.get("modulos_mandatorios", []))
modulos_opcionais = set(_operacao.get("modulos_opcionais", [])) modulos_opcionais = set(_operacao.get("modulos_opcionais", []))
emergencia = _operacao.get("emergencia", False)
modulos_presentes = set() modulos_presentes = set()
status_modulos = [] status_modulos = []
@ -352,7 +353,12 @@ class ContextoGlobalRedis:
# Nem mandatório nem opcional configurado: por segurança, não libera # Nem mandatório nem opcional configurado: por segurança, não libera
motivos_dos_modulos_mandatorios.append("Nenhum módulo mandatório configurado e nenhum opcional definido — operação não pode iniciar.") motivos_dos_modulos_mandatorios.append("Nenhum módulo mandatório configurado e nenhum opcional definido — operação não pode iniciar.")
liberou = (base_ok and parametros_ok) or debug_mode emergencia_ok = True
if emergencia:
emergencia_ok = False
motivos_dos_modulos_mandatorios.append(f"Parada de emergencia solicitada pela base!")
liberou = (base_ok and parametros_ok and emergencia_ok) or debug_mode
cls.atualizar_ctx_dict( cls.atualizar_ctx_dict(
CtxKey.DadosOperacao, CtxKey.DadosOperacao,
@ -385,6 +391,7 @@ class ContextoGlobalRedis:
modo = ModoOperacao(_operacao.get("modo", ModoOperacao.NaoDefinido.value)) modo = ModoOperacao(_operacao.get("modo", ModoOperacao.NaoDefinido.value))
status_atual = StatusOperacao(_operacao.get("status", StatusOperacao.NaoIniciado.value)) status_atual = StatusOperacao(_operacao.get("status", StatusOperacao.NaoIniciado.value))
iniciado = _operacao.get("iniciado", False) iniciado = _operacao.get("iniciado", False)
emergencia = _operacao.get("emergencia", False)
configurado = _operacao.get("configurado", False) configurado = _operacao.get("configurado", False)
status_iniciado_anterior = _operacao.get("status_iniciado_anterior", False) status_iniciado_anterior = _operacao.get("status_iniciado_anterior", False)
finalizando = _operacao.get("finalizando", False) finalizando = _operacao.get("finalizando", False)
@ -407,6 +414,13 @@ class ContextoGlobalRedis:
cls.atualizar_ctx_dict(CtxKey.DadosOperacao, status=StatusOperacao.Parametrizando.value) cls.atualizar_ctx_dict(CtxKey.DadosOperacao, status=StatusOperacao.Parametrizando.value)
return return
# Comando de parada de emergencia da base
if emergencia:
novo_status = StatusOperacao.Parado
if status_atual != novo_status:
cls.atualizar_ctx_dict(CtxKey.DadosOperacao, status=novo_status.value)
return
# 🔸 Modo MANUAL # 🔸 Modo MANUAL
if modo == ModoOperacao.Manual: if modo == ModoOperacao.Manual:
novo_status = StatusOperacao.EmAndamento if op_liberada else StatusOperacao.Parado novo_status = StatusOperacao.EmAndamento if op_liberada else StatusOperacao.Parado

View File

@ -349,7 +349,7 @@ class CostmapFuser:
f"cobertura_central_max={central_cov_max:.2f}{extra_det_txt}." f"cobertura_central_max={central_cov_max:.2f}{extra_det_txt}."
) )
elif (global_cov <= rho_block_global) or (conf_mean < 0.45): elif (global_cov <= rho_block_global) and (conf_mean < 0.45):
blocked_raw = True blocked_raw = True
reason = "blackout" reason = "blackout"
extra = "" extra = ""

View File

@ -280,7 +280,7 @@ class SegmentacaoManager:
fracs = [0.98, 0.85, 0.70, 0.55, 0.40, 0.25, 0.10] fracs = [0.98, 0.85, 0.70, 0.55, 0.40, 0.25, 0.10]
return [min(H-1, max(0, int(H*f))) for f in fracs] return [min(H-1, max(0, int(H*f))) for f in fracs]
def _analisar_corredor_visual(self, predictions, grid_rows_y_px=None, near_is_bottom=True): def _analisar_corredor_visual_old(self, predictions, grid_rows_y_px=None, near_is_bottom=True):
self.predictions = predictions self.predictions = predictions
H, W = self.predictions.shape H, W = self.predictions.shape
cx_img = W // 2 cx_img = W // 2
@ -398,49 +398,297 @@ class SegmentacaoManager:
"has_bottom": bool(has_bot), "has_bottom": bool(has_bot),
} }
def _analisar_corredor_visual(self, predictions, grid_rows_y_px=None, near_is_bottom=True):
# --- inputs/base ---
self.predictions = predictions
H, W = self.predictions.shape
cx_img = W // 2
# máscara do "corredor principal" (telemetria/ângulo); pode vir vazia
mask_main = self._extrair_corredor_principal(self.predictions).astype(bool)
# opcional (se ainda usar em outros pontos)
# mask_cana = (self.predictions == ClassesSegmentacao.CANA.value)
# --- score de corredor por grid (robusto) ---
score, centers_col, left_col, right_col, valid_row = self._corridor_score_grid(self.predictions)
# tercis: perto/meio/longe (respeita near_is_bottom)
rows = int(len(valid_row))
k = max(1, rows // 3)
if near_is_bottom:
near_ok = float(valid_row[:k].mean()) # base
mid_ok = float(valid_row[k:2*k].mean())
far_ok = float(valid_row[2*k:].mean()) # topo
else:
# câmera invertida: "perto" está em cima
near_ok = float(valid_row[2*k:].mean())
mid_ok = float(valid_row[k:2*k].mean())
far_ok = float(valid_row[:k].mean())
# --- histerese espacial (liga/desliga) ---
TH_ON, TH_OFF = 0.60, 0.50
def _hyst(prev: bool, x: float, on: float, off: float) -> bool:
# liga em 'on', desliga em 'off' (off < on)
return (x >= off) if prev else (x >= on)
has_near_prev = getattr(self, "_h_near", False)
has_far_prev = getattr(self, "_h_far", False)
has_near = _hyst(has_near_prev, near_ok, TH_ON, TH_OFF)
has_far = _hyst(has_far_prev, far_ok, TH_ON, TH_OFF)
self._h_near, self._h_far = has_near, has_far
# --- status bruto (regra clara) ---
if not has_near and not has_far:
status_now = StatusCarroMapa.Direcionando
elif has_far and not has_near:
status_now = StatusCarroMapa.EntrandoRua # corredor aparece “longe” primeiro
elif has_near and not has_far:
status_now = StatusCarroMapa.SaindoRua # corredor some “longe” e só fica perto
else:
status_now = StatusCarroMapa.CaminhandoRua
# --- scanlines para centro/ângulo (telemetria) ---
ys = self._get_scanlines_y(H, grid_rows_y_px, near_is_bottom)
centros, larguras = [], []
if mask_main.any():
for y in ys:
row = mask_main[y]
idx = np.flatnonzero(row)
if idx.size == 0:
centros.append((None, y))
larguras.append(0)
else:
x0, x1 = int(idx[0]), int(idx[-1])
cx = (x0 + x1) // 2
w = (x1 - x0 + 1)
centros.append((cx, y))
larguras.append(int(w))
else:
# Fallback: usa o centro estimado do GRID (coluna centers_col)
# mapeia coluna -> pixel no centro da célula
cols = max(1, np.max(centers_col)+1)
col_w = max(1, W // max(cols, 1))
for i, y in enumerate(ys):
j = centers_col[min(i, len(centers_col)-1)]
cx = int((j + 0.5) * col_w)
centros.append((cx, y))
# tenta derivar largura a partir de left/right_col
lj = left_col[min(i, len(left_col)-1)]
rj = right_col[min(i, len(right_col)-1)]
if lj >= 0 and rj >= 0 and rj > lj:
larguras.append(int((rj - lj + 1) * col_w))
else:
larguras.append(int(0.4 * W)) # fallback razoável
# --- Ângulo do corredor (x = a*y + b) ponderado (perto pesa mais) ---
pts = [(x, y) for (x, y) in centros if x is not None]
ang_out = None
if len(pts) >= 2:
ys_fit = np.array([p[1] for p in pts], dtype=np.float32)
xs_fit = np.array([p[0] for p in pts], dtype=np.float32)
n = len(ys_fit)
# pesos: linhas "mais perto" pesam mais
if near_is_bottom:
wts = np.linspace(1.0, 2.0, n, dtype=np.float32) # crescente da base ao topo do vetor pts
else:
wts = np.linspace(2.0, 1.0, n, dtype=np.float32)
Wm = np.diag(wts)
Y = ys_fit.reshape(-1, 1)
X = np.hstack([Y, np.ones_like(Y)])
XtW = X.T @ Wm
beta = np.linalg.pinv(XtW @ X) @ (XtW @ xs_fit)
a = float(beta[0])
ang_rad = np.arctan(a)
# unwrap simples
ang_rad = (ang_rad + np.pi) % (2*np.pi) - np.pi
# EMA em graus
deg = float(np.degrees(ang_rad))
if getattr(self, "_ema_ang", None) is None:
self._ema_ang = deg
else:
alpha = self._ema_alpha_ang
delta = ((deg - self._ema_ang + 180.0) % 360.0) - 180.0
self._ema_ang = self._ema_ang + alpha * delta
ang_out = round(self._ema_ang, 3)
# --- Erro lateral (% da largura na base) + EMA ---
# pega a primeira scanline (mais perto, conforme near_is_bottom)
base_ix = 0
if not near_is_bottom:
base_ix = len(centros) - 1 if len(centros) else 0
erro_lateral_pct = 0.0
if centros and centros[base_ix][0] is not None:
x_base, _ = centros[base_ix]
w_base = max(1, larguras[base_ix])
err_px = cx_img - x_base
erro_lateral_pct = (err_px / w_base) * 100.0
if getattr(self, "_ema_lat", None) is None:
self._ema_lat = float(erro_lateral_pct)
else:
self._ema_lat = (1 - self._ema_alpha_lat) * self._ema_lat + self._ema_alpha_lat * float(erro_lateral_pct)
lat_out = round(float(self._ema_lat), 3)
# --- Persistência temporal (maioria em N frames) ---
# self._status_hist é um deque(maxlen=N) inicializado no __init__
self._status_hist.append(status_now)
# maioria absoluta simples
status_final = max(set(self._status_hist), key=self._status_hist.count)
self._last_status = status_final
return {
"height": H,
"width": W,
"erro_angular": ang_out,
"erro_lateral_pct": lat_out,
"status_corredor": status_final.value, # mantém teu contrato atual (enum -> int)
"centros_corredor": centros,
"larguras_px": larguras,
"confianca": round(float(score), 3), # agora a confiança é o score de corredor
# (se quiser debugar) "near_ok": near_ok, "far_ok": far_ok,
}
def display_segmentation_debug(self, frame, largura_robo_px): def display_segmentation_debug(self, frame, largura_robo_px):
original = cv2.resize(frame, self.resolucao) try:
original = cv2.resize(frame, self.resolucao)
seg_color = np.zeros_like(original) seg_color = np.zeros_like(original)
for class_id, color in enumerate(self.color_map): for class_id, color in enumerate(self.color_map):
seg_color[self.predictions == class_id] = color seg_color[self.predictions == class_id] = color
overlay = cv2.addWeighted(original, 0.5, seg_color, 0.5, 0) overlay = cv2.addWeighted(original, 0.5, seg_color, 0.5, 0)
centros_corredor = self.dados_visuais.get("centros_corredor") centros_corredor = self.dados_visuais.get("centros_corredor")
# 1. Linha do centro do corredor + largura do robô # 1. Linha do centro do corredor + largura do robô
if centros_corredor and len(centros_corredor) >= 2: if centros_corredor and len(centros_corredor) >= 2:
for ponto in centros_corredor: for ponto in centros_corredor:
cv2.circle(overlay, ponto, 4, (0, 255, 255), -1) x, y = ponto
for i in range(len(centros_corredor) - 1): if x is None or y is None: continue
cv2.line(overlay, centros_corredor[i], centros_corredor[i + 1], (0, 255, 255), 2) cv2.circle(overlay, ponto, 4, (0, 255, 255), -1)
for ponto in centros_corredor: for i in range(len(centros_corredor) - 1):
x, y = ponto cv2.line(overlay, centros_corredor[i], centros_corredor[i + 1], (0, 255, 255), 2)
cv2.line(overlay, (x - largura_robo_px // 2, y), (x + largura_robo_px // 2, y), (255, 0, 255), 1) for ponto in centros_corredor:
x, y = ponto
if x is None or y is None: continue
cv2.line(overlay, (x - largura_robo_px // 2, y), (x + largura_robo_px // 2, y), (255, 0, 255), 1)
# 4. Texto de métricas # 4. Texto de métricas
if self.dados_visuais: if self.dados_visuais:
erro_lateral_pct = self.dados_visuais["erro_lateral_pct"] erro_lateral_pct = self.dados_visuais["erro_lateral_pct"]
erro_angular = np.degrees(self.dados_visuais["erro_angular"]) if self.dados_visuais["erro_angular"] else 0 erro_angular = np.degrees(self.dados_visuais["erro_angular"]) if self.dados_visuais["erro_angular"] else 0
texto = [ texto = [
f"Erro angular: {erro_angular:.2f} graus", f"Erro angular: {erro_angular:.2f} graus",
f"Erro lateral: {erro_lateral_pct:.2f} %", f"Erro lateral: {erro_lateral_pct:.2f} %",
f"Status: {StatusCarroMapa(self.dados_visuais['status_corredor']).name}" f"Status: {StatusCarroMapa(self.dados_visuais['status_corredor']).name}"
] ]
for i, t in enumerate(texto): for i, t in enumerate(texto):
cv2.putText(overlay, t, (10, 25 + i * 25), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2) cv2.putText(overlay, t, (10, 25 + i * 25), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2)
# 5. Legenda das classes # 5. Legenda das classes
legenda_inicio_y = 140 legenda_inicio_y = 140
for i, cor in enumerate(self.color_map): for i, cor in enumerate(self.color_map):
nome = self.classes[i] nome = self.classes[i]
pos_y = legenda_inicio_y + i * 30 pos_y = legenda_inicio_y + i * 30
cv2.rectangle(overlay, (10, pos_y - 15), (30, pos_y + 5), cor, -1) cv2.rectangle(overlay, (10, pos_y - 15), (30, pos_y + 5), cor, -1)
cv2.putText(overlay, nome, (40, pos_y + 2), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255,255,255), 1, cv2.LINE_AA) cv2.putText(overlay, nome, (40, pos_y + 2), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255,255,255), 1, cv2.LINE_AA)
# Mostrar # Mostrar
cv2.imshow("Segmentacao - Overlay", overlay) cv2.imshow("Segmentacao - Overlay", overlay)
cv2.waitKey(1) cv2.waitKey(1)
#cv2.destroyAllWindows() #cv2.destroyAllWindows()
except Exception as e:
print(f"Erro ao gerar display_segmentation_debug: {e}")
def _corridor_score_grid(self, mask_classes, rows=6, cols=21):
CANA = ClassesSegmentacao.CANA.value
RUA = ClassesSegmentacao.RUA.value
H, W = mask_classes.shape
row_h = H // rows
col_w = W // cols
# fração de CANA por célula
frac = np.zeros((rows, cols), np.float32)
for i in range(rows):
y0, y1 = i*row_h, H if i==rows-1 else (i+1)*row_h
for j in range(cols):
x0, x1 = j*col_w, W if j==cols-1 else (j+1)*col_w
cell = mask_classes[y0:y1, x0:x1]
if cell.size:
frac[i, j] = np.mean(cell == CANA)
# limiares por faixa (modelo em “A”: mais chão embaixo, mais cana no topo)
near_lado_min, near_canal_max = 0.05, 0.70
far_lado_min, far_canal_max = 0.45, 0.15
idx = np.linspace(0, 1, rows) # 0=embaixo (perto), 1=topo (longe)
lado_min = near_lado_min + (far_lado_min - near_lado_min) * idx
canal_max = near_canal_max + (far_canal_max - near_canal_max) * idx
# centro do canal por DP (argmin com suavidade vertical)
def smooth1d(x):
if len(x) < 3: return x.copy()
y = x.copy()
y[1:-1] = (x[:-2] + x[1:-1] + x[2:]) / 3.0
return y
costs = np.full((rows, cols), np.inf, np.float32)
back = np.full((rows, cols), -1, np.int32)
cols_idx = np.arange(cols)
jump_penalty = 0.6
p = smooth1d(frac[0]); costs[0] = p
for i in range(1, rows):
p = smooth1d(frac[i])
for j in range(cols):
cand = costs[i-1] + jump_penalty * np.abs(cols_idx - j)
kprev = np.argmin(cand)
costs[i, j] = p[j] + cand[kprev]
back[i, j] = kprev
centers = np.zeros(rows, np.int32)
centers[-1] = int(np.argmin(costs[-1]))
for i in range(rows-2, -1, -1):
centers[i] = int(back[i+1, centers[i+1]])
# encontra primeiras paredes ao redor do canal
wall_win = 2
valid_row = np.zeros(rows, bool)
left_col = np.full(rows, -1, np.int32)
right_col = np.full(rows, -1, np.int32)
for i in range(rows):
c = centers[i]; p = frac[i]
# esquerda: primeira janela com cana suficiente
lf = None
for j in range(c-1, -1, -1):
l0 = max(0, j-wall_win); l1 = j
if p[l0:l1+1].mean() >= lado_min[i]:
lf = j; break
# direita: idem
rf = None
for j in range(c+1, cols):
r0 = j; r1 = min(cols-1, j+wall_win)
if p[r0:r1+1].mean() >= lado_min[i]:
rf = j; break
canal_ok = (p[c] <= canal_max[i])
ok = (lf is not None and rf is not None and canal_ok and rf > lf+2)
valid_row[i] = ok
if ok:
left_col[i], right_col[i] = lf, rf
score = valid_row.mean() # 0..1
return float(score), centers, left_col, right_col, valid_row

View File

@ -120,6 +120,8 @@ namespace AgroMonitor.Forms
} }
chbSonarAtivado.Checked = _Controle.SonarAtivado; chbSonarAtivado.Checked = _Controle.SonarAtivado;
chbFrenagemAutomatica.Checked = _Controle.FrenagemAutomatica; chbFrenagemAutomatica.Checked = _Controle.FrenagemAutomatica;
chbMovimentacaoAutomatica.Checked = _Controle.MovimentoAutomatico;
chbPulverizadorAutomatico.Checked = _Controle.PulverizadorAutomatico;
carregandoOperacao = false; carregandoOperacao = false;
} }
@ -173,12 +175,13 @@ namespace AgroMonitor.Forms
if (chbMapaDinamico.Checked) if (chbMapaDinamico.Checked)
{ {
var _Trajetoria = Variaveis.OperacaoEmAndamento.Trajetoria; var _Trajetoria = Variaveis.OperacaoEmAndamento.Trajetoria;
if (_Trajetoria == null) return;
GPSModel posicao = _Trajetoria.RuasPlantacao.Any() ? _Trajetoria.RuasPlantacao[0][_Trajetoria.ExtremoMaisProximoMapa == 0 ? 0 : _Trajetoria.RuasPlantacao[0].Count - 1] : GPSService.UltimaLeitura; GPSModel posicao = _Trajetoria.RuasPlantacao.Any() ? _Trajetoria.RuasPlantacao[0][_Trajetoria.ExtremoMaisProximoMapa == 0 ? 0 : _Trajetoria.RuasPlantacao[0].Count - 1] : GPSService.UltimaLeitura;
MapaDinamico.AtualizarDados( MapaDinamico.AtualizarDados(
null, null,
(float)0, 0f,
(float)0, 0f,
posicao, posicao,
_Trajetoria._TrajetoriaDinamica, _Trajetoria._TrajetoriaDinamica,
_Trajetoria.CorredorAtual.Pontos, _Trajetoria.CorredorAtual.Pontos,

View File

@ -183,6 +183,11 @@ namespace AgroMonitor.Forms
txtLongitude.Text = Equipamento.Coordenadas.Longitude.ToString(); txtLongitude.Text = Equipamento.Coordenadas.Longitude.ToString();
txtFix.Text = Equipamento.Coordenadas.Correcao.ToString(); txtFix.Text = Equipamento.Coordenadas.Correcao.ToString();
txtDistanciaEntreLeituras.Text = GPSUtils.DistanciaEntrePontos(new GPSModel() { Latitude = Equipamento.Coordenadas.Latitude, Longitude = Equipamento.Coordenadas.Longitude, OrientacaoReal = Equipamento.Coordenadas.Orientacao }, GPSService.UltimaLeitura).ToString("0.00") + " m";
txtNSatelites.Text = "";
txtPrecisao.Text = "";
txtStatusFix.Text = "";
txtCodigoFalha.Text = Equipamento.CodigoFalha.ToString(); txtCodigoFalha.Text = Equipamento.CodigoFalha.ToString();
txtStatusOperacao.Text = (Equipamento.Operacao?.statusOperacao ?? StatusOperacao.NaoIniciado).ToString(); txtStatusOperacao.Text = (Equipamento.Operacao?.statusOperacao ?? StatusOperacao.NaoIniciado).ToString();

View File

@ -56,3 +56,108 @@
0:00:00 Tab1 FinishNav2 0:00:00 Tab1 FinishNav2
0:00:00 Tab1 PageLoad 0:00:00 Tab1 PageLoad
0:00:33 Microsoft.Shutdown.TabStripModel.SendDetachWebContentsNotifications 0:00:33 Microsoft.Shutdown.TabStripModel.SendDetachWebContentsNotifications
0:00:00 Startup
0:00:00 Microsoft.DeleteProfileHelper.CleanUpEphemeralProfiles
0:00:00 Microsoft.DeleteProfileHelper.CleanUpDeletedProfiles
0:00:00 Microsoft.NewBrowser_Popup
0:00:00 Microsoft.BrowserList.AddBrowser
0:00:00 Browser1 Insert active Tab1 at 0
0:00:00 Tab1 StartNav1 #auto_toplevel
0:00:00 Tab1 StartNav2 #typed
0:00:00 Tab1 FinishNav1
0:00:00 Tab1 PageLoad
0:00:00 Tab1 FinishNav2
0:00:00 Tab1 PageLoad
0:00:09 Memory Pressure: Critical
0:00:18 Widget Closed: StatusBubble
0:00:20 Microsoft.NewBrowser_Popup
0:00:20 Microsoft.BrowserList.AddBrowser
0:00:20 Browser2 Insert active Tab2 at 0
0:00:20 Tab2 StartNav3 #auto_toplevel
0:00:20 Tab2 StartNav4 #typed
0:00:21 Tab2 FinishNav3
0:00:21 Tab2 PageLoad
0:00:21 Tab2 FinishNav4
0:00:21 Tab2 PageLoad
0:04:27 Widget Closed: StatusBubble
0:09:15 Widget Closed: StatusBubble
0:12:43 Memory Pressure: Critical
0:13:50 Microsoft.NewBrowser_Popup
0:13:50 Microsoft.BrowserList.AddBrowser
0:13:50 Browser3 Insert active Tab3 at 0
0:13:50 Tab3 StartNav5 #auto_toplevel
0:13:50 Tab3 StartNav6 #typed
0:13:50 Tab3 FinishNav5
0:13:50 Tab3 PageLoad
0:13:50 Tab3 FinishNav6
0:13:50 Tab3 PageLoad
0:14:02 Widget Closed: StatusBubble
0:17:18 Memory Pressure: Critical
0:17:23 Microsoft.UnloadController.IsUnclosableApp_IsNotWebApp
0:00:00 Startup
0:00:00 Microsoft.DeleteProfileHelper.CleanUpEphemeralProfiles
0:00:00 Microsoft.DeleteProfileHelper.CleanUpDeletedProfiles
0:00:00 Microsoft.NewBrowser_Popup
0:00:00 Microsoft.BrowserList.AddBrowser
0:00:00 Browser1 Insert active Tab1 at 0
0:00:00 Tab1 StartNav1 #auto_toplevel
0:00:00 Tab1 StartNav2 #typed
0:00:00 Tab1 FinishNav1
0:00:00 Tab1 PageLoad
0:00:00 Tab1 FinishNav2
0:00:00 Tab1 PageLoad
0:33:32 Memory Pressure: Critical
0:33:48 Microsoft.NewBrowser_Popup
0:33:48 Microsoft.BrowserList.AddBrowser
0:33:48 Browser2 Insert active Tab2 at 0
0:33:48 Tab2 StartNav3 #auto_toplevel
0:33:48 Tab2 StartNav4 #typed
0:33:48 Tab2 FinishNav3
0:33:48 Tab2 PageLoad
0:33:48 Tab2 FinishNav4
0:33:48 Tab2 PageLoad
0:37:27 Memory Pressure: Critical
0:38:23 Microsoft.Shutdown.TabStripModel.SendDetachWebContentsNotifications
0:00:00 Startup
0:00:00 Microsoft.DeleteProfileHelper.CleanUpEphemeralProfiles
0:00:00 Microsoft.DeleteProfileHelper.CleanUpDeletedProfiles
0:00:00 Microsoft.NewBrowser_Popup
0:00:00 Microsoft.BrowserList.AddBrowser
0:00:00 Browser1 Insert active Tab1 at 0
0:00:00 Tab1 StartNav1 #auto_toplevel
0:00:00 Tab1 StartNav2 #typed
0:00:00 Tab1 FinishNav1
0:00:00 Tab1 PageLoad
0:00:00 Tab1 FinishNav2
0:00:00 Tab1 PageLoad
0:00:34 Memory Pressure: Critical
0:01:19 Microsoft.NewBrowser_Popup
0:01:19 Microsoft.BrowserList.AddBrowser
0:01:19 Browser2 Insert active Tab2 at 0
0:01:19 Tab2 StartNav3 #auto_toplevel
0:01:19 Tab2 StartNav4 #typed
0:01:19 Tab2 FinishNav3
0:01:19 Tab2 PageLoad
0:01:19 Tab2 FinishNav4
0:01:19 Tab2 PageLoad
0:01:49 Memory Pressure: Critical
0:01:59 Microsoft.NewBrowser_Popup
0:01:59 Microsoft.BrowserList.AddBrowser
0:01:59 Browser3 Insert active Tab3 at 0
0:01:59 Tab3 StartNav5 #auto_toplevel
0:01:59 Tab3 StartNav6 #typed
0:01:59 Tab3 FinishNav5
0:01:59 Tab3 PageLoad
0:01:59 Tab3 FinishNav6
0:01:59 Tab3 PageLoad
0:02:06 Memory Pressure: Critical
0:02:19 Microsoft.NewBrowser_Popup
0:02:19 Microsoft.BrowserList.AddBrowser
0:02:19 Browser4 Insert active Tab4 at 0
0:02:19 Tab4 StartNav7 #auto_toplevel
0:02:19 Tab4 StartNav8 #typed
0:02:19 Tab4 FinishNav7
0:02:19 Tab4 PageLoad
0:02:19 Tab4 FinishNav8
0:02:19 Tab4 PageLoad
0:02:23 Microsoft.UnloadController.IsUnclosableApp_IsNotWebApp

View File

@ -15,5 +15,5 @@
"top_topics_and_observing_domains": [ ] "top_topics_and_observing_domains": [ ]
} ], } ],
"hex_encoded_hmac_key": "171DAE543B88106F5155169E0A8C7502CB2A0757E4948C32E2A04D196E23BE70", "hex_encoded_hmac_key": "171DAE543B88106F5155169E0A8C7502CB2A0757E4948C32E2A04D196E23BE70",
"next_scheduled_calculation_time": "13403098310652905" "next_scheduled_calculation_time": "13403098310652972"
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -1,3 +1,3 @@
2025/09/17-15:37:59.891 2ac8 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Extension State/MANIFEST-000001 2025/09/19-15:45:24.268 2ad8 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Extension State/MANIFEST-000001
2025/09/17-15:37:59.892 2ac8 Recovering log #3 2025/09/19-15:45:24.269 2ad8 Recovering log #3
2025/09/17-15:37:59.892 2ac8 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Extension State/000003.log 2025/09/19-15:45:24.269 2ad8 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Extension State/000003.log

View File

@ -1,3 +1,3 @@
2025/09/16-08:02:37.400 684 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Extension State/MANIFEST-000001 2025/09/19-14:18:58.961 5008 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Extension State/MANIFEST-000001
2025/09/16-08:02:37.400 684 Recovering log #3 2025/09/19-14:18:58.961 5008 Recovering log #3
2025/09/16-08:02:37.401 684 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Extension State/000003.log 2025/09/19-14:18:58.962 5008 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Extension State/000003.log

View File

@ -1,3 +1,3 @@
2025/09/17-15:37:59.848 3584 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Local Storage\leveldb/MANIFEST-000001 2025/09/19-15:45:24.222 1e58 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Local Storage\leveldb/MANIFEST-000001
2025/09/17-15:37:59.857 3584 Recovering log #3 2025/09/19-15:45:24.232 1e58 Recovering log #3
2025/09/17-15:37:59.859 3584 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Local Storage\leveldb/000003.log 2025/09/19-15:45:24.235 1e58 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Local Storage\leveldb/000003.log

View File

@ -1,3 +1,3 @@
2025/09/16-08:02:37.356 5b70 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Local Storage\leveldb/MANIFEST-000001 2025/09/19-14:18:58.913 2cb0 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Local Storage\leveldb/MANIFEST-000001
2025/09/16-08:02:37.365 5b70 Recovering log #3 2025/09/19-14:18:58.923 2cb0 Recovering log #3
2025/09/16-08:02:37.368 5b70 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Local Storage\leveldb/000003.log 2025/09/19-14:18:58.926 2cb0 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Local Storage\leveldb/000003.log

View File

@ -1 +1 @@
{"net":{"http_server_properties":{"servers":[{"alternative_service":[{"advertised_alpns":["h3"],"expiration":"13402694309848645","port":443,"protocol_str":"quic"}],"anonymization":["DAAAAAcAAABmaWxlOi8vAA==",false,0],"network_stats":{"srtt":95983},"server":"https://tile.openstreetmap.org","supports_spdy":true}],"supports_quic":{"address":"2804:d78:67d:1400:5011:1759:4b8a:6d1a","used_quic":true},"version":5},"network_qualities":{"CAISABiAgICA+P////8B":"4G","CAYSABiAgICA+P////8B":"Offline"}}} {"net":{"http_server_properties":{"servers":[{"alternative_service":[{"advertised_alpns":["h3"],"expiration":"13402864371514197","port":443,"protocol_str":"quic"}],"anonymization":["DAAAAAcAAABmaWxlOi8vAA==",false,0],"network_stats":{"srtt":13272},"server":"https://tile.openstreetmap.org","supports_spdy":true}],"supports_quic":{"address":"2804:d78:67d:1400:9817:c8e3:b24c:4aeb","used_quic":true},"version":5},"network_qualities":{"CAISABiAgICA+P////8B":"4G","CAYSABiAgICA+P////8B":"Offline"}}}

View File

@ -1 +1 @@
{"sts":[{"expiry":1789670309.852613,"host":"bWGAftl61rqoc0YzqPncsLvQQh/iC2Bdp3ejUeGC83w=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1758134309.852614}],"version":2} {"sts":[{"expiry":1789840370.590231,"host":"bWGAftl61rqoc0YzqPncsLvQQh/iC2Bdp3ejUeGC83w=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1758304370.590235}],"version":2}

File diff suppressed because one or more lines are too long

View File

@ -1,3 +1,3 @@
2025/09/17-15:38:33.585 3584 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Session Storage/MANIFEST-000001 2025/09/19-15:47:47.262 1e58 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Session Storage/MANIFEST-000001
2025/09/17-15:38:33.587 3584 Recovering log #3 2025/09/19-15:47:47.264 1e58 Recovering log #3
2025/09/17-15:38:33.592 3584 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Session Storage/000003.log 2025/09/19-15:47:47.267 1e58 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Session Storage/000003.log

View File

@ -1,3 +1,3 @@
2025/09/16-08:07:53.499 5b70 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Session Storage/MANIFEST-000001 2025/09/19-14:57:22.064 2cb0 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Session Storage/MANIFEST-000001
2025/09/16-08:07:53.500 5b70 Recovering log #3 2025/09/19-14:57:22.065 2cb0 Recovering log #3
2025/09/16-08:07:53.503 5b70 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Session Storage/000003.log 2025/09/19-14:57:22.068 2cb0 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Session Storage/000003.log

View File

@ -1,3 +1,3 @@
2025/09/17-15:37:59.783 2ad4 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Site Characteristics Database/MANIFEST-000001 2025/09/19-15:45:24.153 1de4 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Site Characteristics Database/MANIFEST-000001
2025/09/17-15:37:59.786 2ad4 Recovering log #3 2025/09/19-15:45:24.156 1de4 Recovering log #3
2025/09/17-15:37:59.786 2ad4 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Site Characteristics Database/000003.log 2025/09/19-15:45:24.156 1de4 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Site Characteristics Database/000003.log

View File

@ -1,3 +1,3 @@
2025/09/16-08:02:37.280 1d9c Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Site Characteristics Database/MANIFEST-000001 2025/09/19-14:18:58.844 36bc Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Site Characteristics Database/MANIFEST-000001
2025/09/16-08:02:37.282 1d9c Recovering log #3 2025/09/19-14:18:58.847 36bc Recovering log #3
2025/09/16-08:02:37.282 1d9c Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Site Characteristics Database/000003.log 2025/09/19-14:18:58.848 36bc Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Site Characteristics Database/000003.log

View File

@ -1,3 +1,3 @@
2025/09/17-15:37:59.779 200c Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Sync Data\LevelDB/MANIFEST-000001 2025/09/19-15:45:24.153 2ad8 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Sync Data\LevelDB/MANIFEST-000001
2025/09/17-15:37:59.784 200c Recovering log #3 2025/09/19-15:45:24.156 2ad8 Recovering log #3
2025/09/17-15:37:59.785 200c Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Sync Data\LevelDB/000003.log 2025/09/19-15:45:24.157 2ad8 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Sync Data\LevelDB/000003.log

View File

@ -1,3 +1,3 @@
2025/09/16-08:02:37.279 3580 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Sync Data\LevelDB/MANIFEST-000001 2025/09/19-14:18:58.844 5008 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Sync Data\LevelDB/MANIFEST-000001
2025/09/16-08:02:37.282 3580 Recovering log #3 2025/09/19-14:18:58.847 5008 Recovering log #3
2025/09/16-08:02:37.282 3580 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Sync Data\LevelDB/000003.log 2025/09/19-14:18:58.848 5008 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Sync Data\LevelDB/000003.log

View File

@ -1,3 +1,3 @@
2025/09/17-15:37:59.822 200c Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\shared_proto_db/MANIFEST-000001 2025/09/19-15:45:24.186 5308 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\shared_proto_db/MANIFEST-000001
2025/09/17-15:37:59.822 200c Recovering log #3 2025/09/19-15:45:24.187 5308 Recovering log #3
2025/09/17-15:37:59.827 200c Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\shared_proto_db/000003.log 2025/09/19-15:45:24.188 5308 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\shared_proto_db/000003.log

Some files were not shown because too many files have changed in this diff Show More