ajustes no fluxo de deteccao de corredor
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"}}}
|
||||
|
|
@ -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}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
140.0.3485.66
|
||||
140.0.3485.81
|
||||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 = ""
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -15,5 +15,5 @@
|
|||
"top_topics_and_observing_domains": [ ]
|
||||
} ],
|
||||
"hex_encoded_hmac_key": "171DAE543B88106F5155169E0A8C7502CB2A0757E4948C32E2A04D196E23BE70",
|
||||
"next_scheduled_calculation_time": "13403098310652905"
|
||||
"next_scheduled_calculation_time": "13403098310652972"
|
||||
}
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"}}}
|
||||
|
|
@ -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}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||