ajustes no fluxo de deteccao de corredor

This commit is contained in:
Diego Freitas 2025-09-22 15:56:35 -03:00
parent 5db4a11b0f
commit a2bd8cc83f
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.txtGPS_Satelites = new System.Windows.Forms.TextBox();
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.txtGPS_Altitude = new System.Windows.Forms.TextBox();
this.label7 = new System.Windows.Forms.Label();
@ -598,7 +598,7 @@
this.panel1.Controls.Add(this.label8);
this.panel1.Controls.Add(this.txtGPS_Satelites);
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.txtGPS_Altitude);
this.panel1.Controls.Add(this.label7);
@ -803,15 +803,15 @@
this.label9.TabIndex = 33;
this.label9.Text = "Satélites";
//
// txtGPS_Velocidade
// txtGPS_DistanciaBase
//
this.txtGPS_Velocidade.Location = new System.Drawing.Point(106, 524);
this.txtGPS_Velocidade.Margin = new System.Windows.Forms.Padding(2);
this.txtGPS_Velocidade.Name = "txtGPS_Velocidade";
this.txtGPS_Velocidade.ReadOnly = true;
this.txtGPS_Velocidade.Size = new System.Drawing.Size(99, 20);
this.txtGPS_Velocidade.TabIndex = 32;
this.txtGPS_Velocidade.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
this.txtGPS_DistanciaBase.Location = new System.Drawing.Point(106, 524);
this.txtGPS_DistanciaBase.Margin = new System.Windows.Forms.Padding(2);
this.txtGPS_DistanciaBase.Name = "txtGPS_DistanciaBase";
this.txtGPS_DistanciaBase.ReadOnly = true;
this.txtGPS_DistanciaBase.Size = new System.Drawing.Size(99, 20);
this.txtGPS_DistanciaBase.TabIndex = 32;
this.txtGPS_DistanciaBase.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// label6
//
@ -819,9 +819,9 @@
this.label6.Location = new System.Drawing.Point(104, 509);
this.label6.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
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.Text = "Velocidade";
this.label6.Text = "Distancia da base";
//
// txtGPS_Altitude
//
@ -5680,7 +5680,7 @@
private System.Windows.Forms.Label lblGPS;
private System.Windows.Forms.Panel pnlOrientacaoMagnetometro;
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.TextBox txtGPS_Altitude;
private System.Windows.Forms.Label label7;

View File

@ -29,6 +29,7 @@ namespace AgroBase.Forms.Operacoes
List<PictureBox> picsCamSoloSeg = new List<PictureBox>();
List<PictureBox> picsCamSoloOverlay = new List<PictureBox>();
List<CameraWorkerItemModel> LogsCam_Caminho = new List<CameraWorkerItemModel>();
OperacaoModel operacaoSelecionada = new OperacaoModel(Enums.ModoOperacao.NaoDefinido);
string pathImagensCaminho = "";
DateTime MomentoAtual = DateTime.Now;
@ -124,6 +125,17 @@ namespace AgroBase.Forms.Operacoes
OperacaoDadosModel data = JsonConvert.DeserializeObject<OperacaoDadosModel>(File.ReadAllText(ofd.FileName));
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();
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();
@ -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_Precisao.Text = (Log?.PrecisaoCm ?? 0).ToString("0.00") + " cm";
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;
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(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,
Log,
_trajaetoria,
null, //Variaveis.OperacaoEmAndamento.Mapa.TrajetoriaProjetada.FirstOrDefault(),
Variaveis.OperacaoEmAndamento.Trajetoria?._TrajetoriaFixa,
new List<GPSModel>(LogsGPS.Take(LogsGPS.IndexOf(Log) + 1)),
new List<List<GPSModel>>(),
Variaveis.OperacaoEmAndamento.Mapa.TrajetoriaMapa,
LogOpe.Controle.SimulacaoMPC
);
}

View File

@ -426,7 +426,7 @@ namespace AgroBase.Forms
{
//double angulo = Variaveis.OperacaoEmAndamento.Trajetoria.AnguloCaminho;
//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;
FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)angulo, 90, (float)anguloCorredor);
}

View File

@ -174,7 +174,10 @@ namespace AgroBase.Forms
GPSModel ultimoPonto = new GPSModel();
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;

View File

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

View File

@ -2924,7 +2924,7 @@ namespace AgroBase.Models.Modules
default:
{
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)
{
case DadosLoRaParse.ComandoControle:

View File

@ -41,6 +41,7 @@ namespace AgroBase.Models
public ModoOperacao Modo { get; set; }
public string Descricao { get; set; }
public string OprPath { get; set; }
public OperacaoControleModel Controle { get; set; } = new OperacaoControleModel();
public OperacaoControleModel ControleAnterior { get; set; } = new OperacaoControleModel();
public DispositivosService<MovimentacaoUnificadaModel> DispMvd { get; set; }
@ -84,7 +85,7 @@ namespace AgroBase.Models
Variaveis.OperacaoEmAndamento.TempoAguardando = DateTimeOffset.FromUnixTimeSeconds(tempoAguardando).UtcDateTime.AddSeconds(tempoAguardando % 1).ToLocalTime();
HealthWorkerService.ModulosSaude = RedisService.GetField<ManagerWorkerMessageResponseModulosPendentesModel[]>(CtxKey.DadosOperacao, "status_modulos").ToList();
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;
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);
@ -242,6 +243,7 @@ namespace AgroBase.Models
};
Variaveis.OperacaoEmAndamento.Descricao = Parametros.Descricao;
Variaveis.OperacaoEmAndamento.OprPath = opr_path;
Variaveis.OperacaoEmAndamento.QuantidadeCamerasSolo = Parametros.QtdCamerasSolo;
Variaveis.OperacaoEmAndamento.ModulosMandatorios = new List<OperacaoModulosMandatoriosModel>(Parametros.ModulosMandatorios ?? new List<OperacaoModulosMandatoriosModel>());
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();
Directory.CreateDirectory(Variaveis.CaminhoOperacoes + ID + "/");
SalvarOperacao();
Sensoriamento.AtualizarDados();
DispMvd?.Dados?.ReiniciarLeituras(DispMvd?.Dados);
@ -897,6 +901,20 @@ namespace AgroBase.Models
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
@ -1088,7 +1106,7 @@ namespace AgroBase.Models
}
Variaveis.OperacaoEmAndamento.Sensoriamento.AtualizarDados();
Variaveis.LoraService.EnviarDadosParaBase();
Variaveis.LoraService?.EnviarDadosParaBase();
if (!Variaveis.OperacaoEmAndamento.Iniciado)
{
@ -1114,10 +1132,9 @@ namespace AgroBase.Models
{
Emergencia = controleBase.Emergencia;
if (Emergencia)
{
return;
}
if (Emergencia) return;
if (Variaveis.OperacaoEmAndamento.Controle.MovimentoAutomatico) return;
var _Controle = Variaveis.OperacaoEmAndamento.Controle;

View File

@ -18,7 +18,7 @@ namespace AgroBase.Models
#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 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
@ -110,7 +110,7 @@ namespace AgroBase.Models
}
}
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<GPSModel> TrajetoriaDinamica => _TrajetoriaDinamica.ConvertAll(x => x.Posicao);
public void AtualizarTrajetoriaDinamica()
@ -332,8 +332,7 @@ namespace AgroBase.Models
}
else
{
int idx = (_TrajetoriaJanela.IndexOf(PontoAtual) + 1);
ProximoPonto = _TrajetoriaJanela[idx];
ProximoPonto = _TrajetoriaFixa[PontoAtual.idxPonto + 1];
}
/*// Busca eficiente: percorre do começo ao fim para achar o primeiro não visitado
@ -602,7 +601,7 @@ namespace AgroBase.Models
AtualizarIndicesJanela();
AtualizarTrajetoriaJanela();
//VerificaFimCorredorSegmentacao();
VerificaFimCorredorSegmentacao();
DefinirPontoAtual();
AtualizarCorredorAtual();
@ -627,38 +626,61 @@ namespace AgroBase.Models
private void VerificaFimCorredorSegmentacao()
{
double limiarDistanciaMargem = 4.0;
if (CorredorAtual != null)
if (CorredorAtual == null) return;
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;
double distanciaUltimoPontoCorredor = GPSUtils.DistanciaEntrePontos(Variaveis.OperacaoEmAndamento.Sensoriamento.Gps, CorredorAtual.Pontos.LastOrDefault().Posicao);
if (distanciaRestanteCorredor < limiarDistanciaMargem && distanciaUltimoPontoCorredor < limiarDistanciaMargem)
// Contagem de tempo por status em segundos
StatusCarroMapa statusCarro = DadosSegmentacao.status_corredor;
if (!CorredorAtual.TempoPorStatus.TryGetValue(statusCarro, out var status))
{
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 (OpVisual.Iniciado && OpVisualStatus == StatusModulo.Operante && DadosSegmentacao.status_corredor == StatusCarroMapa.Direcionando)
CorredorAtual.TempoPorStatus.Add(statusCarro, 0);
}
if (CorredorAtual.UltimoTempoStatus > DateTime.MinValue)
{
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;
foreach (var Ponto in CorredorAtual.Pontos.Where(x => !x.Visitado))
Ponto.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++)
{
Ponto.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();
CorredorAtual.Pontos[i].Visitado = true;
}
AtualizarIndicesJanela();
AtualizarTrajetoriaJanela();
}
}
}
@ -992,7 +1014,7 @@ namespace AgroBase.Models
return totalPontos > 0 ? somaDistancias / totalPontos : 0;
}
public void ProjetarTrajetoriaFixa()
public void ProjetarTrajetoriaFixa(GPSModel posicaoRobo = null)
{
List<PontoTrajetoriaModel> _trajetoriaFixa = new List<PontoTrajetoriaModel>();
(List<List<GPSModel>> corredores, List<double> CorredoresLarguras) = ProjetarCorredores();
@ -1008,7 +1030,7 @@ namespace AgroBase.Models
idxCorredor = 0,
idxPonto = 0,
idxPontoCorredor = 0,
Posicao = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps,
Posicao = posicaoRobo ?? Variaveis.OperacaoEmAndamento.Sensoriamento.Gps,
Direcao = direcaoAtual,
Orientacao = 0,
Visitado = true,
@ -1155,7 +1177,7 @@ namespace AgroBase.Models
anguloProjetar2 += anguloAcrescentar;
anguloAcrescentar *= -1;
}
double percentualAcrescimoPontoAberturaCurva = 1.5;
double percentualAcrescimoPontoAberturaCurva = 1.1;
GPSModel UltimoPonto = GPSUtils.ProjetarPontoDeslocado(CorredorAtual.Last(), !ultimoCorredor ? (DistanciaProjecaoRua * percentualAcrescimoPontoAberturaCurva) : (DistanciaProjecaoRua * 2.0), anguloProjetar2);
PontoTrajetoriaModel PontoFinal = new PontoTrajetoriaModel(TipoPontoRua.LigacaoSaida)
@ -1397,6 +1419,8 @@ namespace AgroBase.Models
public int idxRuaEsquerda { get; set; }
public int idxRuaDireita { get; set; }
public double FatorLarguraCorredor { get; set; }
public DateTime UltimoTempoStatus { get; set; } = DateTime.MinValue;
public Dictionary<StatusCarroMapa, double> TempoPorStatus { get; set; }
public void AtualizarDados()
{
@ -1445,6 +1469,8 @@ namespace AgroBase.Models
Pontos = new List<PontoTrajetoriaModel>(),
Ultimo = Ultimo,
FatorLarguraCorredor = FatorLarguraCorredor,
UltimoTempoStatus = UltimoTempoStatus,
TempoPorStatus = new Dictionary<StatusCarroMapa, double>(TempoPorStatus)
};
if (clonarPontos)
{

View File

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

View File

@ -44,11 +44,14 @@ namespace AgroBase.Services
public static int TaxaAmostragemHz { get; set; } = 5;
private static bool InverterHeading = true;
private static int rtk_timeout = 60;
private static int TempoMin_Ntrip = 10;
private static bool LoopRTK_Ntrip = false;
public static bool CorrecaoRTK_Ntrip = false;
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)
{
@ -622,7 +625,7 @@ namespace AgroBase.Services
UltimaLeitura.TimestampOri.valor = Stopwatch.GetTimestamp() / (double)Stopwatch.Frequency;
UltimaLeitura.Momento = DateTime.Now;
UltimaLeitura.OrientacaoReal = headingTrue;
UltimaLeitura.OrientacaoReal = InverterHeading ? GPSUtils.NormalizarAngulo(headingTrue + 180.0) : headingTrue;
UltimaLeitura.TipoOrientacao = status;
// ✅ 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);
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;
EnviarCoordenadasParaMapa(VariaveisOperacao.PosicaoBase.Latitude, VariaveisOperacao.PosicaoBase.Longitude, VariaveisOperacao.PosicaoBase.OrientacaoReal, false, EnderecoBase);
@ -1169,7 +1172,7 @@ namespace AgroBase.Services
}
// 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)

View File

@ -102,6 +102,7 @@ namespace AgroBase.Services
feature.geometry.id = i.ToString();
i++;
});
}
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": [ {
"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",
"config_version": 0,
"model_version": "0",
@ -27,7 +20,14 @@
"padded_top_topics_start_index": 0,
"taxonomy_version": 0,
"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",
"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/17-16:42:43.832 5848 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.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/22-15:30:19.509 1b7c Recovering log #3
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/17-16:20:23.493 57e4 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.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/22-14:17:21.943 12a0 Recovering log #3
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/17-17:13:27.656 5848 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.868 1b7c 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.869 1b7c Recovering log #3
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/17-16:23:13.742 57e4 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.486 12a0 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.487 12a0 Recovering log #3
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/17-16:42:43.750 5280 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.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/22-15:30:19.425 14dc Recovering log #7
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/17-16:20:23.404 23a8 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.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/22-14:17:21.863 5d88 Recovering log #7
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,
initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<style>
#map_e541659635fbe5ef795ffc63af53174e {
#map_a930f18588199d9d6021d4c49b85c784 {
position: relative;
width: 100.0%;
height: 100.0%;
@ -54,14 +54,14 @@
<body>
<div class="folium-map" id="map_e541659635fbe5ef795ffc63af53174e" ></div>
<div class="folium-map" id="map_a930f18588199d9d6021d4c49b85c784" ></div>
</body>
<script>
var map_e541659635fbe5ef795ffc63af53174e = L.map(
"map_e541659635fbe5ef795ffc63af53174e",
var map_a930f18588199d9d6021d4c49b85c784 = L.map(
"map_a930f18588199d9d6021d4c49b85c784",
{
center: [0.0, 0.0],
crs: L.CRS.EPSG3857,
@ -96,7 +96,7 @@
}
trajeto_json_add({"features": []});
trajeto_json.addTo(map_e541659635fbe5ef795ffc63af53174e);
trajeto_json.addTo(map_a930f18588199d9d6021d4c49b85c784);
function adicionarGeometria(novaGeometria) {
trajeto_json.addData(novaGeometria);
@ -159,9 +159,9 @@
var marcadorEquipamento = L.marker([0, 0], {
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(
{"extraClasses": "fa-rotate-0", "icon": "info-sign", "iconColor": "white", "markerColor": "red", "prefix": "glyphicon"}
);
@ -226,7 +226,7 @@
}
if (foco) {
map_e541659635fbe5ef795ffc63af53174e.setView(novaPosicao, map_e541659635fbe5ef795ffc63af53174e.getZoom());
map_a930f18588199d9d6021d4c49b85c784.setView(novaPosicao, map_a930f18588199d9d6021d4c49b85c784.getZoom());
}
}
@ -248,7 +248,7 @@
marcadorDinamico.setRotationAngle(angulo);
adicionarCoordenada("Tj", [novaLongitude, novaLatitude]);
map_e541659635fbe5ef795ffc63af53174e.setView(novaPosicao, map_e541659635fbe5ef795ffc63af53174e.getZoom());*/
map_a930f18588199d9d6021d4c49b85c784.setView(novaPosicao, map_a930f18588199d9d6021d4c49b85c784.getZoom());*/
});
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}")
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)
sonar_ativado = _operacao.get("Snr", {}).get("sonar_ativado", False)
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)
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):
mostrar_log(f"🟥 Movimento parado: obstaculo proximo detectado no sonar")
return _montar_comando_retorno(0.0, True)
op_modo = ModoOperacao(_operacao.get("modo", ModoOperacao.NaoDefinido.value))
_contexto = ContextoGlobalRedis.get_contexto()
_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)
#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)
percentual_ervas_no_radar = _dados_vw.get("estatisticas", {}).get("erva", {}).get("ema_global", 0.0)
_dados_ww = ContextoGlobalRedis.get(CtxKey.DadosWeedWorker, {}).get("analise", {})
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
ervas_min_percenet = 0.005
vel_com_ervas = _operacao.get("Mov", {}).get("percent_vel_min", 0)
vel_sem_ervas = _operacao.get("Mov", {}).get("percent_vel_max", 100)
ang_max = _operacao.get("Dir", {}).get("angulo_max", 30)
status_carro = StatusCarroMapa.Parado
erro = 0
@ -63,9 +63,8 @@ def definir_comando(parada_necessaria: bool, frear: bool, erro: bool, filtro_vel
erro = _trajetoria.get("erro_angular", 0)
manobrando = _trajetoria.get("manobrando", False)
elif op_modo == ModoOperacao.MapeamentoVisual:
_dados_vw = ContextoGlobalRedis.get(CtxKey.DadosVisualWorker, {}).get("segmentacao", {})
status_carro = StatusCarroMapa(_dados_vw.get("status_corredor", StatusCarroMapa.Parado.value))
erro = _dados_vw.get("erro_angular", 0)
status_carro = StatusCarroMapa(_dados_vw.get("segmentacao", {}).get("status_corredor", StatusCarroMapa.Parado.value))
erro = _dados_vw.get("segmentacao", {}).get("erro_angular", 0)
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
else:
velocidade_sp = calcular_velocidade_relativa(vel_com_ervas, vel_sem_ervas, ang_max, erro)
# Aplica limites
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
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
# 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
# 7) Delta final + clamp
delta = self._wrap_pi(theta_ref - theta) + nudge
ang_max = np.radians(angulo_max_graus)
delta = float(np.clip(delta, -ang_max, ang_max))
delta = self._wrap_pi(theta - theta_ref) + nudge
#ang_max = np.radians(angulo_max_graus)
#delta = float(np.clip(delta, -ang_max, ang_max))
debug = {
"e_lat": e_lat, "half": half, "sigma": sigma, "w_rua": w_rua,
@ -1007,6 +1007,8 @@ class ControladorMPC:
"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
for passo in range(self.qtd_comandos_sucessivos):
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)
#if passo == 0:
# print(f"idx_alvo: {idx_alvo}")
#if idx_alvo < len(self.pontos_info) - 1: idx_alvo += 1
ponto_alvo = self.pontos_info[idx_alvo]
@ -1251,7 +1255,7 @@ class ControladorMPC:
manobrando = CARRO.get("ManobrandoEntreRuas", False)
if manobrando or status in [StatusCarroMapa.EntrandoRua, StatusCarroMapa.SaindoRua, StatusCarroMapa.Manobrando]:
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]
else:
tipos_validos = [TipoMovimentoDirecional.RodasDianteiras]

View File

@ -205,6 +205,7 @@ class ContextoGlobalRedis:
# 🔹 Conjuntos de módulos
modulos_mandatorios = set(_operacao.get("modulos_mandatorios", []))
modulos_opcionais = set(_operacao.get("modulos_opcionais", []))
emergencia = _operacao.get("emergencia", False)
modulos_presentes = set()
status_modulos = []
@ -352,7 +353,12 @@ class ContextoGlobalRedis:
# 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.")
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(
CtxKey.DadosOperacao,
@ -385,6 +391,7 @@ class ContextoGlobalRedis:
modo = ModoOperacao(_operacao.get("modo", ModoOperacao.NaoDefinido.value))
status_atual = StatusOperacao(_operacao.get("status", StatusOperacao.NaoIniciado.value))
iniciado = _operacao.get("iniciado", False)
emergencia = _operacao.get("emergencia", False)
configurado = _operacao.get("configurado", False)
status_iniciado_anterior = _operacao.get("status_iniciado_anterior", False)
finalizando = _operacao.get("finalizando", False)
@ -407,6 +414,13 @@ class ContextoGlobalRedis:
cls.atualizar_ctx_dict(CtxKey.DadosOperacao, status=StatusOperacao.Parametrizando.value)
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
if modo == ModoOperacao.Manual:
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}."
)
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
reason = "blackout"
extra = ""

View File

@ -280,7 +280,7 @@ class SegmentacaoManager:
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]
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
H, W = self.predictions.shape
cx_img = W // 2
@ -398,49 +398,297 @@ class SegmentacaoManager:
"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):
original = cv2.resize(frame, self.resolucao)
try:
original = cv2.resize(frame, self.resolucao)
seg_color = np.zeros_like(original)
for class_id, color in enumerate(self.color_map):
seg_color[self.predictions == class_id] = color
seg_color = np.zeros_like(original)
for class_id, color in enumerate(self.color_map):
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ô
if centros_corredor and len(centros_corredor) >= 2:
for ponto in centros_corredor:
cv2.circle(overlay, ponto, 4, (0, 255, 255), -1)
for i in range(len(centros_corredor) - 1):
cv2.line(overlay, centros_corredor[i], centros_corredor[i + 1], (0, 255, 255), 2)
for ponto in centros_corredor:
x, y = ponto
cv2.line(overlay, (x - largura_robo_px // 2, y), (x + largura_robo_px // 2, y), (255, 0, 255), 1)
# 1. Linha do centro do corredor + largura do robô
if centros_corredor and len(centros_corredor) >= 2:
for ponto in centros_corredor:
x, y = ponto
if x is None or y is None: continue
cv2.circle(overlay, ponto, 4, (0, 255, 255), -1)
for i in range(len(centros_corredor) - 1):
cv2.line(overlay, centros_corredor[i], centros_corredor[i + 1], (0, 255, 255), 2)
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
if self.dados_visuais:
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
texto = [
f"Erro angular: {erro_angular:.2f} graus",
f"Erro lateral: {erro_lateral_pct:.2f} %",
f"Status: {StatusCarroMapa(self.dados_visuais['status_corredor']).name}"
]
for i, t in enumerate(texto):
cv2.putText(overlay, t, (10, 25 + i * 25), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2)
# 4. Texto de métricas
if self.dados_visuais:
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
texto = [
f"Erro angular: {erro_angular:.2f} graus",
f"Erro lateral: {erro_lateral_pct:.2f} %",
f"Status: {StatusCarroMapa(self.dados_visuais['status_corredor']).name}"
]
for i, t in enumerate(texto):
cv2.putText(overlay, t, (10, 25 + i * 25), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2)
# 5. Legenda das classes
legenda_inicio_y = 140
for i, cor in enumerate(self.color_map):
nome = self.classes[i]
pos_y = legenda_inicio_y + i * 30
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)
# 5. Legenda das classes
legenda_inicio_y = 140
for i, cor in enumerate(self.color_map):
nome = self.classes[i]
pos_y = legenda_inicio_y + i * 30
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)
# Mostrar
cv2.imshow("Segmentacao - Overlay", overlay)
cv2.waitKey(1)
#cv2.destroyAllWindows()
# Mostrar
cv2.imshow("Segmentacao - Overlay", overlay)
cv2.waitKey(1)
#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;
chbFrenagemAutomatica.Checked = _Controle.FrenagemAutomatica;
chbMovimentacaoAutomatica.Checked = _Controle.MovimentoAutomatico;
chbPulverizadorAutomatico.Checked = _Controle.PulverizadorAutomatico;
carregandoOperacao = false;
}
@ -173,12 +175,13 @@ namespace AgroMonitor.Forms
if (chbMapaDinamico.Checked)
{
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;
MapaDinamico.AtualizarDados(
null,
(float)0,
(float)0,
0f,
0f,
posicao,
_Trajetoria._TrajetoriaDinamica,
_Trajetoria.CorredorAtual.Pontos,

View File

@ -183,6 +183,11 @@ namespace AgroMonitor.Forms
txtLongitude.Text = Equipamento.Coordenadas.Longitude.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();
txtStatusOperacao.Text = (Equipamento.Operacao?.statusOperacao ?? StatusOperacao.NaoIniciado).ToString();

View File

@ -56,3 +56,108 @@
0:00:00 Tab1 FinishNav2
0:00:00 Tab1 PageLoad
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": [ ]
} ],
"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/17-15:37:59.892 2ac8 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.268 2ad8 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.269 2ad8 Recovering log #3
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/16-08:02:37.400 684 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.961 5008 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 Recovering log #3
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/17-15:37:59.857 3584 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.222 1e58 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.232 1e58 Recovering log #3
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/16-08:02:37.365 5b70 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.913 2cb0 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.923 2cb0 Recovering log #3
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/17-15:38:33.587 3584 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.262 1e58 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.264 1e58 Recovering log #3
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/16-08:07:53.500 5b70 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.064 2cb0 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.065 2cb0 Recovering log #3
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/17-15:37:59.786 2ad4 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.153 1de4 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.156 1de4 Recovering log #3
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/16-08:02:37.282 1d9c 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.844 36bc 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.847 36bc Recovering log #3
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/17-15:37:59.784 200c 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.153 2ad8 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.156 2ad8 Recovering log #3
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/16-08:02:37.282 3580 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.844 5008 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.847 5008 Recovering log #3
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/17-15:37:59.822 200c 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.186 5308 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.187 5308 Recovering log #3
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