ajustes pre operacao
This commit is contained in:
parent
7d79848665
commit
9f80418d9a
Binary file not shown.
Binary file not shown.
|
|
@ -177,8 +177,11 @@ namespace AgroBase.Forms.Operacoes
|
|||
ReqFrameCam = true;
|
||||
OAKCameraFrameModel frame = await WeedWorkerService.GetCameraFrame(CameraFrameType.Rgb);
|
||||
Panel pnl = FuncoesGlobais.FindControlRecursive<Panel>(flwCamerasSolo, "pnlCamSolo_" + Variaveis.OperacaoEmAndamento.DispSen.Dados.CamerasSolo[0].Name);
|
||||
pnl.BackgroundImage?.Dispose();
|
||||
try { pnl.BackgroundImage = frame?.image(); } catch { }
|
||||
if (pnl != null)
|
||||
{
|
||||
pnl.BackgroundImage?.Dispose();
|
||||
try { pnl.BackgroundImage = frame?.image(); } catch { }
|
||||
}
|
||||
ReqFrameCam = false;
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -82,12 +82,15 @@ namespace AgroBase.Forms
|
|||
tempoGps = tempo;
|
||||
}
|
||||
|
||||
Func<bool> funcAtt = new Func<bool>(() =>
|
||||
if (!AtualizandoTela)
|
||||
{
|
||||
AtualizarDadosTela();
|
||||
return true;
|
||||
});
|
||||
Task.Run(() => FuncoesGlobais.ExecutarMetodoComVerificacaoCrossThread(this, funcAtt));
|
||||
Func<bool> funcAtt = new Func<bool>(() =>
|
||||
{
|
||||
AtualizarDadosTela();
|
||||
return true;
|
||||
});
|
||||
Task.Run(() => FuncoesGlobais.ExecutarMetodoComVerificacaoCrossThread(this, funcAtt));
|
||||
}
|
||||
|
||||
if (chbAutomatico.Checked)
|
||||
{
|
||||
|
|
@ -147,6 +150,10 @@ namespace AgroBase.Forms
|
|||
{
|
||||
simulacao = _Sensoriamento.Controle.SimulacaoMPC;
|
||||
}
|
||||
else
|
||||
{
|
||||
simulacao = new List<MPCSimulacaoModel>();
|
||||
}
|
||||
|
||||
if (_Trajetoria?.CorredorAtual != null)
|
||||
{
|
||||
|
|
@ -452,7 +459,7 @@ namespace AgroBase.Forms
|
|||
|
||||
double anguloControle = Variaveis.OperacaoEmAndamento.SimulacaoAnguloControle;
|
||||
|
||||
if (historicoAngulosControle.Count >= errosConsiderar || errosConsiderar == 0)
|
||||
if (historicoAngulosControle.Count > 0 && (historicoAngulosControle.Count >= errosConsiderar || errosConsiderar == 0))
|
||||
historicoAngulosControle.Dequeue(); // Remove o valor mais antigo
|
||||
|
||||
historicoAngulosControle.Enqueue(anguloControle);
|
||||
|
|
@ -483,6 +490,7 @@ namespace AgroBase.Forms
|
|||
private void cmbTipoControleDirecional_SelectedIndexChanged(object sender, EventArgs e)
|
||||
{
|
||||
Variaveis.OperacaoEmAndamento.Controle.TipoControleDirecional = (TiposControladorDirecional)cmbTipoControleDirecional.SelectedIndex;
|
||||
RedisService.AtualizarCampos(CtxKey.DadosOperacao, ("configurado", false));
|
||||
}
|
||||
|
||||
private void cmbStatusCorredor_SelectedIndexChanged(object sender, EventArgs e)
|
||||
|
|
|
|||
|
|
@ -305,7 +305,7 @@ namespace AgroBase.Models.Modules
|
|||
if (Comandar)
|
||||
{
|
||||
Variaveis.OperacaoEmAndamento.SimulacaoAnguloControle = Angulo_SP;
|
||||
//Console.WriteLine($"Angulo Atualizado para {Variaveis.OperacaoEmAndamento.SimulacaoAnguloControle}");
|
||||
//Console.WriteLine($"[{Mod_ID}] Angulo Atualizado para {Variaveis.OperacaoEmAndamento.SimulacaoAnguloControle}");
|
||||
}
|
||||
|
||||
int mx = Sentido_SP == Sentido.Antihorario ? -1 : 1;
|
||||
|
|
|
|||
|
|
@ -107,7 +107,7 @@ namespace AgroBase.Models
|
|||
public List<OperacaoParametrosMandatoriosModel> ParametrosMandatorios { get; set; } = new List<OperacaoParametrosMandatoriosModel>();
|
||||
public double CapacidadeReservatorio { get; set; } = 30;
|
||||
public int QuantidadeCamerasSolo { get; set; } = 1;
|
||||
public int TempoIniciarOperacao { get; set; } = 25;
|
||||
public int TempoIniciarOperacao { get; set; } = 5;
|
||||
public string ID { get; set; }
|
||||
public double tmrLogsInterval
|
||||
{
|
||||
|
|
@ -231,7 +231,7 @@ namespace AgroBase.Models
|
|||
Angulo = 0,
|
||||
Direcao = Direcao.Parado,
|
||||
PercentualVelocidadeSP = 0,
|
||||
TiposControle = Variaveis.OperacaoEmAndamento.Controle.TiposControle.ToList(),
|
||||
TiposControle = new List<OperacaoControleTipoModel>(Variaveis.OperacaoEmAndamento.Controle.TiposControle),
|
||||
SonarAtivado = Parametros.SonarAtivado,
|
||||
TipoControleDirecional = Parametros.DirTipoMovimento,
|
||||
PulverizadorAutomatico = Parametros.PulverizadorAutomatico,
|
||||
|
|
@ -404,7 +404,7 @@ namespace AgroBase.Models
|
|||
new OperacaoControleTipoModel()
|
||||
{
|
||||
Tipo = T_Code.Dir,
|
||||
DelayEnvioComando = 200,
|
||||
DelayEnvioComando = 500,
|
||||
Comandos = new List<string>(),
|
||||
UltimoComando = DateTime.Now
|
||||
},
|
||||
|
|
@ -704,12 +704,12 @@ namespace AgroBase.Models
|
|||
Controle.PercentualVelocidadeSP = 0;
|
||||
Controle.TiposControle.ForEach(x => x.UltimaDirecao = Direcao.Parado);
|
||||
Controle.TipoMovimento = TipoMovimentoDirecional.RodasDianteiras;
|
||||
|
||||
GPSTrajetoria = new List<GPSModel>();
|
||||
|
||||
Controle.BicosAtuados = DispAtu?.Dados?.BicosPulverizadores?.Select(x => x.Clone())?.ToList() ?? new List<AtuadorBicoModel>();
|
||||
Controle.BicosAtuados.ForEach(x => x.ComandoAtuar = false);
|
||||
ControleAnterior.BicosAtuados = Controle.BicosAtuados.Select(x => x.Clone()).ToList();
|
||||
|
||||
GPSTrajetoria = new List<GPSModel>();
|
||||
|
||||
await RealizarCalibragemInicialAsync();
|
||||
|
||||
if (Modo == ModoOperacao.Manual)
|
||||
|
|
@ -814,6 +814,9 @@ namespace AgroBase.Models
|
|||
|
||||
Controle.Angulo = 0;
|
||||
Controle.PercentualVelocidadeSP = 0;
|
||||
Controle.BicosAtuados = DispAtu?.Dados?.BicosPulverizadores?.Select(x => x.Clone())?.ToList() ?? new List<AtuadorBicoModel>();
|
||||
Controle.BicosAtuados.ForEach(x => x.ComandoAtuar = false);
|
||||
ControleAnterior.BicosAtuados = Controle.BicosAtuados.Select(x => x.Clone()).ToList();
|
||||
|
||||
GPSTrajetoria = new List<GPSModel>();
|
||||
|
||||
|
|
|
|||
|
|
@ -668,6 +668,9 @@ namespace AgroBase.Models
|
|||
|
||||
public void LoopAtualizaDados()
|
||||
{
|
||||
if (Variaveis.OperacaoEmAndamento.Modo != ModoOperacao.MapaGPS)
|
||||
return;
|
||||
|
||||
AtualizarPropriedadesPontosTrajetoria();
|
||||
|
||||
AtualizarDadosTrajetoria();
|
||||
|
|
@ -681,6 +684,9 @@ namespace AgroBase.Models
|
|||
|
||||
private void AtualizarDadosControleRedis()
|
||||
{
|
||||
if (!Variaveis.OperacaoEmAndamento.Iniciado)
|
||||
return;
|
||||
|
||||
int min_ticks_sem_resposta = 500;
|
||||
int max_ticks_sem_resposta = 2000;
|
||||
ManagerWorkerMessageResponseComandoModel novoComando = null;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
using AgroBase.Models;
|
||||
using Emgu.CV.Structure;
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
|
@ -514,7 +515,7 @@ namespace AgroBase.Services
|
|||
using (StreamReader reader = new StreamReader(stream, Encoding.ASCII))
|
||||
{
|
||||
string response = await reader.ReadLineAsync();
|
||||
if (response.Contains("200 OK"))
|
||||
if ((response ?? "").Contains("200 OK"))
|
||||
{
|
||||
Console.WriteLine("Conexão bem-sucedida ao mountpoint!");
|
||||
|
||||
|
|
@ -522,7 +523,7 @@ namespace AgroBase.Services
|
|||
int bytesRead;
|
||||
while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length)) > 0)
|
||||
{
|
||||
if (CorrecaoRTK)
|
||||
if (CorrecaoRTK && (PortaGPS?.IsOpen ?? false))
|
||||
{
|
||||
PortaGPS.Write(buffer, 0, bytesRead); // Envia os dados RTCM para o GPS
|
||||
//Console.WriteLine($"Enviando {bytesRead} bytes de correção RTCM para o GPS");
|
||||
|
|
@ -558,6 +559,10 @@ namespace AgroBase.Services
|
|||
return;
|
||||
}
|
||||
|
||||
DefinirAnguloCarroGPS();
|
||||
|
||||
AtualizaDadosRedis();
|
||||
|
||||
if (Variaveis.OperacaoEmAndamento.Iniciado)
|
||||
{
|
||||
var _Trajetoria = Variaveis.OperacaoEmAndamento.Trajetoria;
|
||||
|
|
@ -592,8 +597,6 @@ namespace AgroBase.Services
|
|||
}
|
||||
}
|
||||
|
||||
DefinirAnguloCarroGPS();
|
||||
|
||||
Variaveis.OperacaoEmAndamento.Trajetoria?.LoopAtualizaDados();
|
||||
|
||||
AtualizarTrajetoriaDinamica();
|
||||
|
|
@ -609,6 +612,13 @@ namespace AgroBase.Services
|
|||
|
||||
PenultimaLeitura.Inicializado = UltimaLeitura.Inicializado;
|
||||
UltimaLeitura.Inicializado = Iniciado;
|
||||
|
||||
if (false && UltimoEnvioCorrecaoRTK.AddSeconds(10) < DateTime.Now)
|
||||
{
|
||||
UltimoEnvioCorrecaoRTK = DateTime.Now;
|
||||
LoopRTK = false;
|
||||
Task.Run(() => AplicarCorrecaoRTK());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -851,5 +861,23 @@ namespace AgroBase.Services
|
|||
return anguloUnificado;
|
||||
}
|
||||
|
||||
private static void AtualizaDadosRedis()
|
||||
{
|
||||
RedisService.AtualizarCampos(
|
||||
RedisService.ModKey(T_Code.Gps),
|
||||
("timestamp", UltimaLeitura.Momento),
|
||||
("conectado", Iniciado),
|
||||
("freq_base", TaxaAmostragemHz),
|
||||
("lat", UltimaLeitura.Latitude),
|
||||
("lon", UltimaLeitura.Longitude),
|
||||
("theta", UltimaLeitura.AnguloCarroDefinido),
|
||||
("fix", (int)UltimaLeitura.QualidadeFix),
|
||||
("rtk", UltimoEnvioCorrecaoRTK.AddSeconds(10) > DateTime.Now),
|
||||
("hAcc", UltimaLeitura.PrecisaoCm),
|
||||
("nSatelites", UltimaLeitura.NumeroSatelites.valor),
|
||||
("freq", UltimaLeitura.NumeroSatelites.frequencia)
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -121,6 +121,8 @@ namespace AgroBase.Services.Operadores
|
|||
status = (int)_Sensoriamento.Trajetoria.StatusCarro,
|
||||
manobrando = _Sensoriamento.Trajetoria.ManobrandoEntreRuas,
|
||||
erro_angular = _Sensoriamento.Trajetoria.ErroOrientacaoAngularCombinado,
|
||||
erro_angular_caminho = _Sensoriamento.Trajetoria.ErroOrientacaoAngularCaminho,
|
||||
erro_angular_proximo_ponto = _Sensoriamento.Trajetoria.ErroOrientacaoAngularProximoPonto,
|
||||
idx_proximo_ponto = _Sensoriamento.Trajetoria.ProximoPonto.idxPonto,
|
||||
CorredorAtual = new
|
||||
{
|
||||
|
|
@ -207,10 +209,12 @@ namespace AgroBase.Services.Operadores
|
|||
distanciaMargem = p.LarguraCorredor * 0.8
|
||||
})
|
||||
.ToList(),
|
||||
horizonte = 2.5,
|
||||
horizonte = 2.0,
|
||||
angulo_max_graus = _Controle.Angulo_Max,
|
||||
velocidade_min = FuncoesMatematicas.CalculaVelocidadeMsPercentual(_Controle.PercentualVelocidadeMin),
|
||||
velocidade_max = FuncoesMatematicas.CalculaVelocidadeMsPercentual(_Controle.PercentualVelocidadeMax)
|
||||
velocidade_max = FuncoesMatematicas.CalculaVelocidadeMsPercentual(_Controle.PercentualVelocidadeMax),
|
||||
tempo_entre_comandos = (Variaveis.OperacaoEmAndamento.Controle.TiposControle.FirstOrDefault(x => x.Tipo == Enums.T_Code.Dir)?.DelayEnvioComando ?? 500) / 1000.0,
|
||||
passos_atraso = 1
|
||||
}
|
||||
}
|
||||
),
|
||||
|
|
@ -271,24 +275,6 @@ namespace AgroBase.Services.Operadores
|
|||
//RedisService.SetObject(RedisService.ModKey(Enums.T_Code.Mov), string.Empty);
|
||||
//RedisService.SetObject(RedisService.ModKey(Enums.T_Code.Sen), string.Empty);
|
||||
|
||||
if (_Sensoriamento.Gps != null)
|
||||
{
|
||||
RedisService.AtualizarCampos(
|
||||
RedisService.ModKey(Enums.T_Code.Gps),
|
||||
("timestamp", agora),
|
||||
("conectado", GPSService.Iniciado),
|
||||
("freq_base", GPSService.TaxaAmostragemHz),
|
||||
("lat", _Sensoriamento.Gps.Latitude),
|
||||
("lon", _Sensoriamento.Gps.Longitude),
|
||||
("theta", _Sensoriamento.Gps.AnguloCarroDefinido),
|
||||
("fix", (int)_Sensoriamento.Gps.QualidadeFix),
|
||||
("rtk", GPSService.UltimoEnvioCorrecaoRTK.AddSeconds(5) > DateTime.Now),
|
||||
("hAcc", _Sensoriamento.Gps.PrecisaoCm),
|
||||
("nSatelites", _Sensoriamento.Gps.NumeroSatelites.valor),
|
||||
("freq", _Sensoriamento.Gps.NumeroSatelites.frequencia)
|
||||
);
|
||||
}
|
||||
|
||||
foreach (var mod in Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos)
|
||||
{
|
||||
int endereco_dir = mod.DirMotor._EnderecoCAN_Tx;
|
||||
|
|
|
|||
|
|
@ -136,7 +136,7 @@ namespace AgroBase.Services
|
|||
|
||||
private async Task OuvirCAN()
|
||||
{
|
||||
if ((_PortaCAN?.BytesToRead ?? 0) > 0)
|
||||
if ((_PortaCAN?.IsOpen ?? false) && (_PortaCAN?.BytesToRead ?? 0) > 0)
|
||||
{
|
||||
byte[] tempBuffer = await SerialService.LerDadosDaPortaSerialAsync(_PortaCAN, _PortaCAN.BytesToRead);
|
||||
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
|
|
@ -20,7 +20,14 @@
|
|||
"padded_top_topics_start_index": 0,
|
||||
"taxonomy_version": 0,
|
||||
"top_topics_and_observing_domains": [ ]
|
||||
}, {
|
||||
"calculation_time": "13398455528662484",
|
||||
"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": "13398455528650013"
|
||||
"next_scheduled_calculation_time": "13399060328664266"
|
||||
}
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1,3 +1,3 @@
|
|||
2025/07/31-07:22:39.179 52d8 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Local Storage\leveldb/MANIFEST-000001
|
||||
2025/07/31-07:22:39.186 52d8 Recovering log #3
|
||||
2025/07/31-07:22:39.189 52d8 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Local Storage\leveldb/000003.log
|
||||
2025/08/01-17:32:12.527 3f40 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Local Storage\leveldb/MANIFEST-000001
|
||||
2025/08/01-17:32:12.532 3f40 Recovering log #3
|
||||
2025/08/01-17:32:12.536 3f40 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/07/30-21:33:49.609 56e4 Reusing MANIFEST C:\ZendionINC\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Local Storage\leveldb/MANIFEST-000001
|
||||
2025/07/30-21:33:49.618 56e4 Recovering log #3
|
||||
2025/07/30-21:33:49.621 56e4 Reusing old log C:\ZendionINC\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Local Storage\leveldb/000003.log
|
||||
2025/08/01-16:44:45.942 d8c Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Local Storage\leveldb/MANIFEST-000001
|
||||
2025/08/01-16:44:45.947 d8c Recovering log #3
|
||||
2025/08/01-16:44:45.950 d8c 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":"13398517414548096","port":443,"protocol_str":"quic"}],"anonymization":["DAAAAAcAAABmaWxlOi8vAA==",false,0],"network_stats":{"srtt":92405},"server":"https://tile.openstreetmap.org","supports_spdy":true}],"supports_quic":{"address":"2804:d78:609:f200:301a:6f15:c737:9f2","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":"13398640396216877","port":443,"protocol_str":"quic"}],"anonymization":["DAAAAAcAAABmaWxlOi8vAA==",false,0],"network_stats":{"srtt":12790},"server":"https://tile.openstreetmap.org","supports_spdy":true}],"supports_quic":{"address":"2804:d78:609:f200:8962:ca52:629b:6eab","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":1785493412.917201,"host":"bWGAftl61rqoc0YzqPncsLvQQh/iC2Bdp3ejUeGC83w=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1753957412.917203}],"version":2}
|
||||
{"sts":[{"expiry":1785612686.323915,"host":"bWGAftl61rqoc0YzqPncsLvQQh/iC2Bdp3ejUeGC83w=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1754076686.32392}],"version":2}
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -1,3 +1,3 @@
|
|||
2025/07/31-07:29:00.605 52d8 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Session Storage/MANIFEST-000001
|
||||
2025/07/31-07:29:00.606 52d8 Recovering log #3
|
||||
2025/07/31-07:29:00.610 52d8 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Session Storage/000003.log
|
||||
2025/08/01-17:55:22.636 3f40 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Session Storage/MANIFEST-000001
|
||||
2025/08/01-17:55:22.637 3f40 Recovering log #3
|
||||
2025/08/01-17:55:22.640 3f40 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/07/30-21:42:34.039 5418 Reusing MANIFEST C:\ZendionINC\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Session Storage/MANIFEST-000001
|
||||
2025/07/30-21:42:34.041 5418 Recovering log #3
|
||||
2025/07/30-21:42:34.045 5418 Reusing old log C:\ZendionINC\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Session Storage/000003.log
|
||||
2025/08/01-16:47:06.152 d8c Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Session Storage/MANIFEST-000001
|
||||
2025/08/01-16:47:06.153 d8c Recovering log #3
|
||||
2025/08/01-16:47:06.158 d8c Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Session Storage/000003.log
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
2025/07/31-07:22:39.101 67a4 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Site Characteristics Database/MANIFEST-000001
|
||||
2025/07/31-07:22:39.103 67a4 Recovering log #7
|
||||
2025/07/31-07:22:39.103 67a4 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Site Characteristics Database/000007.log
|
||||
2025/07/31-07:22:39.104 67a4 Delete type=2 #5
|
||||
2025/08/01-17:32:12.462 5618 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Site Characteristics Database/MANIFEST-000001
|
||||
2025/08/01-17:32:12.463 5618 Recovering log #7
|
||||
2025/08/01-17:32:12.463 5618 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/07/30-21:33:49.527 1e74 Reusing MANIFEST C:\ZendionINC\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Site Characteristics Database/MANIFEST-000001
|
||||
2025/07/30-21:33:49.529 1e74 Recovering log #12
|
||||
2025/07/30-21:33:49.529 1e74 Reusing old log C:\ZendionINC\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Site Characteristics Database/000012.log
|
||||
2025/08/01-16:44:45.861 6538 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Site Characteristics Database/MANIFEST-000001
|
||||
2025/08/01-16:44:45.862 6538 Recovering log #7
|
||||
2025/08/01-16:44:45.863 6538 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroBase\bin\x64\Debug\AgroBase.exe.WebView2\EBWebView\Default\Site Characteristics Database/000007.log
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1 +1 @@
|
|||
138.0.3351.109
|
||||
138.0.3351.121
|
||||
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
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
|
|
@ -17,7 +17,7 @@
|
|||
<meta name="viewport" content="width=device-width,
|
||||
initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
|
||||
<style>
|
||||
#map_426ce0459219256084c64d7f087a7121 {
|
||||
#map_d4ee5bbe6ad99a733fb2854c99929025 {
|
||||
position: relative;
|
||||
width: 100.0%;
|
||||
height: 100.0%;
|
||||
|
|
@ -54,14 +54,14 @@
|
|||
<body>
|
||||
|
||||
|
||||
<div class="folium-map" id="map_426ce0459219256084c64d7f087a7121" ></div>
|
||||
<div class="folium-map" id="map_d4ee5bbe6ad99a733fb2854c99929025" ></div>
|
||||
|
||||
</body>
|
||||
<script>
|
||||
|
||||
|
||||
var map_426ce0459219256084c64d7f087a7121 = L.map(
|
||||
"map_426ce0459219256084c64d7f087a7121",
|
||||
var map_d4ee5bbe6ad99a733fb2854c99929025 = L.map(
|
||||
"map_d4ee5bbe6ad99a733fb2854c99929025",
|
||||
{
|
||||
center: [0.0, 0.0],
|
||||
crs: L.CRS.EPSG3857,
|
||||
|
|
@ -78,7 +78,7 @@
|
|||
|
||||
|
||||
|
||||
var tile_layer_140f14d6baa129dd686e1618671edd34 = L.tileLayer(
|
||||
var tile_layer_7671b7be998bb4614c50936cac747db4 = L.tileLayer(
|
||||
"https://tile.openstreetmap.org/{z}/{x}/{y}.png",
|
||||
{
|
||||
"minZoom": 0,
|
||||
|
|
@ -95,7 +95,7 @@
|
|||
);
|
||||
|
||||
|
||||
tile_layer_140f14d6baa129dd686e1618671edd34.addTo(map_426ce0459219256084c64d7f087a7121);
|
||||
tile_layer_7671b7be998bb4614c50936cac747db4.addTo(map_d4ee5bbe6ad99a733fb2854c99929025);
|
||||
|
||||
</script>
|
||||
|
||||
|
|
@ -116,7 +116,7 @@
|
|||
}
|
||||
trajeto_json_add({"features": []});
|
||||
|
||||
trajeto_json.addTo(map_426ce0459219256084c64d7f087a7121);
|
||||
trajeto_json.addTo(map_d4ee5bbe6ad99a733fb2854c99929025);
|
||||
|
||||
function adicionarGeometria(novaGeometria) {
|
||||
trajeto_json.addData(novaGeometria);
|
||||
|
|
@ -179,9 +179,9 @@
|
|||
|
||||
var marcadorEquipamento = L.marker([0, 0], {
|
||||
icon: customIcon
|
||||
}).addTo(map_426ce0459219256084c64d7f087a7121);
|
||||
}).addTo(map_d4ee5bbe6ad99a733fb2854c99929025);
|
||||
|
||||
var marcadorBase = L.marker([0, 0], {}).addTo(map_426ce0459219256084c64d7f087a7121);
|
||||
var marcadorBase = L.marker([0, 0], {}).addTo(map_d4ee5bbe6ad99a733fb2854c99929025);
|
||||
var icon = L.AwesomeMarkers.icon(
|
||||
{"extraClasses": "fa-rotate-0", "icon": "info-sign", "iconColor": "white", "markerColor": "red", "prefix": "glyphicon"}
|
||||
);
|
||||
|
|
@ -246,7 +246,7 @@
|
|||
}
|
||||
|
||||
if (foco) {
|
||||
map_426ce0459219256084c64d7f087a7121.setView(novaPosicao, map_426ce0459219256084c64d7f087a7121.getZoom());
|
||||
map_d4ee5bbe6ad99a733fb2854c99929025.setView(novaPosicao, map_d4ee5bbe6ad99a733fb2854c99929025.getZoom());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -268,7 +268,7 @@
|
|||
marcadorDinamico.setRotationAngle(angulo);
|
||||
|
||||
adicionarCoordenada("Tj", [novaLongitude, novaLatitude]);
|
||||
map_426ce0459219256084c64d7f087a7121.setView(novaPosicao, map_426ce0459219256084c64d7f087a7121.getZoom());*/
|
||||
map_d4ee5bbe6ad99a733fb2854c99929025.setView(novaPosicao, map_d4ee5bbe6ad99a733fb2854c99929025.getZoom());*/
|
||||
});
|
||||
|
||||
function calcularOrientacao(P1latitude, P1longitude, P2latitude, P2longitude) {
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
Binary file not shown.
|
|
@ -316,9 +316,9 @@ class CameraOak:
|
|||
|
||||
frame, resultado = self.requisitar_frame_rgb()
|
||||
except Exception as e:
|
||||
self.mostrar_log(f"Erro ao requisitar dados da camera para atualizar saude")
|
||||
self.mostrar_log(f"Erro ao requisitar dados da camera para atualizar saude: {e}")
|
||||
resultado = {
|
||||
"erro": e,
|
||||
"erro": str(e),
|
||||
"frame_valido": False,
|
||||
"duracao": 0
|
||||
}
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
|
|
@ -15,7 +15,7 @@ class ManagerWorker:
|
|||
def __init__(self):
|
||||
self.processador = None
|
||||
|
||||
def executar(self):
|
||||
def executar(self, envia_resposta):
|
||||
t0 = time.time()
|
||||
|
||||
movimento_automatico = ContextoGlobalRedis.get_controle().get("movimento_automatico", False)
|
||||
|
|
@ -23,7 +23,7 @@ class ManagerWorker:
|
|||
self.definir_processador()
|
||||
if self.processador:
|
||||
comando = self.processador.processar()
|
||||
if comando is not None and False:
|
||||
if comando is not None and envia_resposta:
|
||||
ContextoGlobalRedis.publicar_comando(CmdKey.ManagerWorkerTx, { "cmd": ManagerWorkerCommandType.EnviarDadosControle.value, "params": comando })
|
||||
else:
|
||||
mostrar_log("Processador nao definido")
|
||||
|
|
|
|||
|
|
@ -18,11 +18,12 @@ def main():
|
|||
#mostrar_log("Processado da fila")
|
||||
acao = ManagerWorkerCommandType(cmd)
|
||||
if (acao == ManagerWorkerCommandType.AtualizarDadosControle):
|
||||
manager.executar()
|
||||
manager.executar(not loop_fixo)
|
||||
|
||||
manager = ManagerWorker()
|
||||
fila = WorkerFilaMensagens("controle", fila_callback, 1, True, 100)
|
||||
|
||||
loop_fixo = True
|
||||
frequencia_loop = 5 # hz
|
||||
|
||||
def loop_ativo():
|
||||
|
|
@ -33,8 +34,9 @@ def main():
|
|||
t0 = agora
|
||||
latencia = 0.0
|
||||
try:
|
||||
#pass
|
||||
latencia = manager.executar()
|
||||
if loop_fixo:
|
||||
latencia = manager.executar(not loop_fixo)
|
||||
pass
|
||||
except KeyboardInterrupt:
|
||||
mostrar_log("🛑 Encerrando Manager Worker...")
|
||||
break
|
||||
|
|
@ -49,7 +51,7 @@ def main():
|
|||
latencia=latencia
|
||||
)
|
||||
|
||||
delay_corrigido = max(0, (1.0 / frequencia_loop) - latencia) # 0.1
|
||||
delay_corrigido = max(0, (1.0 / frequencia_loop) - latencia) if loop_fixo else 0.1
|
||||
time.sleep(delay_corrigido)
|
||||
|
||||
def redis_callback(dados):
|
||||
|
|
@ -64,7 +66,7 @@ def main():
|
|||
elif acao == ManagerWorkerCommandType.AtualizarDadosControle:
|
||||
#mostrar_log("Adicionado na fila")
|
||||
fila.adicionar(acao)
|
||||
#manager.executar()
|
||||
#manager.executar(not loop_fixo)
|
||||
pass
|
||||
else:
|
||||
mostrar_log(f"⚠️ Comando desconhecido: {acao.name}")
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
|
|
@ -1,11 +1,14 @@
|
|||
from shared.enums import ModoOperacao, StatusCarroMapa, StatusModulo, StatusOperacao, T_Code, TipoMovimentoDirecional
|
||||
from shared.enums import ModoOperacao, StatusCarroMapa, StatusModulo, StatusOperacao, T_Code, TipoMovimentoDirecional, TiposControladorDirecional
|
||||
from shared.contexto_global_redis import ContextoGlobalRedis, CtxKey
|
||||
from manager_worker.config import mostrar_log
|
||||
from manager_worker.modulos.mpc import get_mpc, comando_parado
|
||||
from manager_worker.modulos.pid import PIDAdaptativo
|
||||
|
||||
def definir_comando():
|
||||
def definir_comando(pid: PIDAdaptativo):
|
||||
try:
|
||||
_operacao = ContextoGlobalRedis.get_operacao()
|
||||
_tipo_controle = TiposControladorDirecional(_operacao.get("Dir", {}).get("tipo_controle", TiposControladorDirecional.MPC.value))
|
||||
|
||||
_contexto = ContextoGlobalRedis.get_contexto()
|
||||
_equipamento = ContextoGlobalRedis.get_equipamento()
|
||||
_gps = ContextoGlobalRedis.get_modulo(T_Code.Gps)
|
||||
|
|
@ -24,14 +27,20 @@ def definir_comando():
|
|||
"AnguloCarro": _gps.get("theta", 0),
|
||||
},
|
||||
"Carro": {
|
||||
"Velocidade": 1.0, #3,6 km/h #min(0.8, _contexto.get("Gerais", {}).get("velocidade_ms", 0.0)),
|
||||
#"Velocidade": 1.0,
|
||||
"Velocidade": max(0.5, _contexto.get("Gerais", {}).get("velocidade_ms", 0.0)),
|
||||
"Status": _trajetoria.get("status", StatusCarroMapa.Parado.value),
|
||||
"ManobrandoEntreRuas": _trajetoria.get("manobrando", False),
|
||||
"DentroCorredor": _trajetoria.get("CorredorAtual", {}).get("dentro", False),
|
||||
"DistanciaEsquerda": _trajetoria.get("CorredorAtual", {}).get("dist_esq", 0.0),
|
||||
"DistanciaDireita": _trajetoria.get("CorredorAtual", {}).get("dist_dir", 0.0),
|
||||
"IdxProximoPonto": _trajetoria.get("idx_proximo_ponto", 0),
|
||||
"AnguloCaminho": _trajetoria.get("angulo", 0.0),
|
||||
"AnguloCaminho": _trajetoria.get("CorredorAtual", {}).get("angulo", 0.0),
|
||||
"ErroAngular": _trajetoria.get("erro_angular", 0),
|
||||
"ErroAngularCaminho": _trajetoria.get("erro_angular_caminho", 0),
|
||||
"ErroAngularProximoPonto": _trajetoria.get("erro_angular_proximo_ponto", 0),
|
||||
"TempoEntreComandos": _operacao.get("Dir", {}).get("mpc", {}).get("tempo_entre_comandos", 0.5),
|
||||
"PassosAtraso": _operacao.get("Dir", {}).get("mpc", {}).get("passos_atraso", 1),
|
||||
},
|
||||
"VisualWorker": {
|
||||
"Ativado": _operacao.get("Snr", {}).get("sonar_ativado", False),
|
||||
|
|
@ -45,7 +54,7 @@ def definir_comando():
|
|||
},
|
||||
"RegrasAtivas": {
|
||||
"matriz_custo": False,
|
||||
"deteccao_obstaculos": True,
|
||||
"deteccao_obstaculos": False,
|
||||
},
|
||||
"Equipamento": {
|
||||
"largura": _equipamento.get("largura", 0.85),
|
||||
|
|
@ -53,19 +62,48 @@ def definir_comando():
|
|||
}
|
||||
}
|
||||
|
||||
comando = _regras_taticas(contexto)
|
||||
|
||||
if (comando["comando_definido"]):
|
||||
return comando["angulo"], comando["tipo"], comando["simulacao"], comando["parada_necessaria"]
|
||||
else:
|
||||
op_modo = ModoOperacao(_operacao.get("modo", ModoOperacao.NaoDefinido.value))
|
||||
if op_modo == ModoOperacao.MapaGPS:
|
||||
return _comando_mapa_gps_mpc(contexto)
|
||||
elif op_modo == ModoOperacao.MapeamentoVisual:
|
||||
return _comando_mapeamento_visual(contexto)
|
||||
else:
|
||||
comando = _comando_direcional_parado()
|
||||
if _tipo_controle == TiposControladorDirecional.MPC:
|
||||
comando = _regras_taticas(contexto)
|
||||
|
||||
if (comando["comando_definido"]):
|
||||
return comando["angulo"], comando["tipo"], comando["simulacao"], comando["parada_necessaria"]
|
||||
else:
|
||||
op_modo = ModoOperacao(_operacao.get("modo", ModoOperacao.NaoDefinido.value))
|
||||
if op_modo == ModoOperacao.MapaGPS:
|
||||
return _comando_mapa_gps_mpc(contexto)
|
||||
elif op_modo == ModoOperacao.MapeamentoVisual:
|
||||
return _comando_mapeamento_visual(contexto)
|
||||
else:
|
||||
comando = _comando_direcional_parado()
|
||||
return comando["angulo"], comando["tipo"], comando["simulacao"], comando["parada_necessaria"]
|
||||
|
||||
elif _tipo_controle == TiposControladorDirecional.PID:
|
||||
_controle = ContextoGlobalRedis.get_controle()
|
||||
angulo_max = _controle.get("angulo_max", 30)
|
||||
velocidade_percentual = _controle.get("velocidade_sp", 0)
|
||||
|
||||
# Ajuste adaptativo do PID
|
||||
status_carro = StatusCarroMapa(contexto.get("Carro", {}).get("Status", StatusCarroMapa.Parado.value))
|
||||
dentro_corredor = contexto.get("Carro", {}).get("DentroCorredor", False)
|
||||
manobrando = contexto.get("Carro", {}).get("ManobrandoEntreRuas", False)
|
||||
erro_angular = contexto.get("Carro", {}).get("ErroAngular", 0)
|
||||
erro_angular_caminho = contexto.get("Carro", {}).get("ErroAngularCaminho", 0)
|
||||
erro_angular_proximo_ponto = contexto.get("Carro", {}).get("ErroAngularProximoPonto", 0)
|
||||
pid.ajustar_ganhos(velocidade_percentual)
|
||||
|
||||
# Decide se o movimento será arco
|
||||
usar_arco = (
|
||||
manobrando or
|
||||
status_carro in [StatusCarroMapa.SaindoRua, StatusCarroMapa.EntrandoRua, StatusCarroMapa.Manobrando] or
|
||||
(dentro_corredor and abs(erro_angular_caminho) >= angulo_max) or
|
||||
(not dentro_corredor and abs(erro_angular_proximo_ponto) >= angulo_max)
|
||||
)
|
||||
|
||||
tipo_movimento = TipoMovimentoDirecional.MovimentoArco if usar_arco else TipoMovimentoDirecional.RodasDianteiras
|
||||
angulo = round(pid.atualizar(erro_angular), 2)
|
||||
print(f"Angulo: {angulo}, Tipo Movimento: {tipo_movimento.name}, Erro Angular: {erro_angular:.2f}")
|
||||
return angulo, tipo_movimento, [], False
|
||||
|
||||
except Exception as e:
|
||||
mostrar_log(f"❌ Erro ao definir comando direcional: {e}")
|
||||
|
|
@ -103,7 +141,7 @@ def _regras_taticas(contexto):
|
|||
|
||||
imu = ContextoGlobalRedis.get_modulo(T_Code.Imu)
|
||||
if imu is not None and imu.get("saude", {}).get("status", StatusModulo.DESCONECTADO.value) == StatusModulo.OPERANTE.value:
|
||||
if abs(imu.get("pitch", 0.0)) > 15.0 or abs(imu.get("roll", 0.0)) > 10.0:
|
||||
if abs(imu.get("pitch", 0.0)) > 30.0 or abs(imu.get("roll", 0.0)) > 15.0:
|
||||
mostrar_log(f"🟥 Inclinação perigosa detectada. Parando movimentação. roll: {imu.get('roll')}, pitch: {imu.get('pitch')}, yaw: {imu.get('yaw')}")
|
||||
return _comando_direcional_parado(True)
|
||||
|
||||
|
|
|
|||
|
|
@ -86,12 +86,12 @@ class ControladorMPC:
|
|||
def _calcular_pesos_movimento(self, contexto, erro_ori_rad):
|
||||
peso_erro_pos = 1.2 # 0
|
||||
peso_erro_ori = 1.0 # 1
|
||||
peso_suavidade = 0.3 # 2
|
||||
peso_fator_re = 0.1 # 3
|
||||
peso_ideal = 0.1 # 4
|
||||
peso_suavidade = 1.4 # 2
|
||||
peso_fator_re = 0.2 # 3
|
||||
peso_ideal = 0.4 # 4
|
||||
|
||||
CARRO = contexto.get("Carro", {})
|
||||
status = CARRO.get("Status", 0)
|
||||
status = StatusCarroMapa(CARRO.get("Status", StatusCarroMapa.Parado.value))
|
||||
dentro = CARRO.get("DentroCorredor", False)
|
||||
manobrando = CARRO.get("ManobrandoEntreRuas", False)
|
||||
velocidade = CARRO.get("Velocidade", self.velocidade_min)
|
||||
|
|
@ -99,12 +99,12 @@ class ControladorMPC:
|
|||
# Penalidade proporcional à velocidade
|
||||
penalidade_por_velocidade = (velocidade / self.velocidade_max) / 10.0
|
||||
erro_ori_deg = np.degrees(erro_ori_rad)
|
||||
erro_ori_clipped = min(erro_ori_deg, self.angulo_max_graus)
|
||||
erro_ori_norm = erro_ori_clipped / self.angulo_max_graus
|
||||
erro_ori_clipped = max(min(erro_ori_deg, self.angulo_max_graus), -self.angulo_max_graus)
|
||||
erro_ori_norm = abs(erro_ori_clipped / self.angulo_max_graus)
|
||||
|
||||
custo_movimento = {
|
||||
TipoMovimentoDirecional.RodasDianteiras: penalidade_por_velocidade,
|
||||
TipoMovimentoDirecional.MovimentoArco: penalidade_por_velocidade
|
||||
TipoMovimentoDirecional.RodasDianteiras: 0.0,
|
||||
TipoMovimentoDirecional.MovimentoArco: 0.0
|
||||
}
|
||||
|
||||
if manobrando or status in [ StatusCarroMapa.EntrandoRua, StatusCarroMapa.SaindoRua, StatusCarroMapa.Manobrando ]:
|
||||
|
|
@ -112,7 +112,7 @@ class ControladorMPC:
|
|||
custo_movimento[TipoMovimentoDirecional.RodasDianteiras] += 1.0
|
||||
else:
|
||||
custo_movimento[TipoMovimentoDirecional.MovimentoArco] += 0.0 if erro_ori_norm >= 0.4 else 1.0
|
||||
custo_movimento[TipoMovimentoDirecional.RodasDianteiras] += 1.0 if erro_ori_norm >= 0.4 else 0.0
|
||||
custo_movimento[TipoMovimentoDirecional.RodasDianteiras] += 1.2 if erro_ori_norm >= 0.4 else 0.0
|
||||
|
||||
return (peso_erro_pos, peso_erro_ori, peso_suavidade, peso_fator_re, peso_ideal, custo_movimento)
|
||||
|
||||
|
|
@ -162,8 +162,12 @@ class ControladorMPC:
|
|||
#print(f"Ideal: {round(angulo_ideal_deg, 2)}°, Erro Ori: {round(erro_ori_deg, 2)}°, Obstáculos: {len(obstaculos)}, Candidatos: {[round(np.degrees(a), 2) for a in candidatos_radianos]}")
|
||||
return tipos_validos, candidatos_radianos
|
||||
|
||||
def _erro_angular(self, a, b):
|
||||
return abs((a - b + np.pi) % (2 * np.pi) - np.pi)
|
||||
def _erro_angular(self, angulo_alvo, angulo_atual, angulo_caminho, peso_local=0.5):
|
||||
erro_com_ponto = (angulo_alvo - angulo_atual + np.pi) % (2 * np.pi) - np.pi
|
||||
erro_com_caminho = (angulo_caminho - angulo_atual + np.pi) % (2 * np.pi) - np.pi
|
||||
|
||||
erro_combinado = (1 - peso_local) * erro_com_caminho + peso_local * erro_com_ponto
|
||||
return abs(erro_combinado)
|
||||
|
||||
def _atualiza_posicao_obstaculos(self, contexto, new_x, new_y, new_theta, omega):
|
||||
obstaculos = deepcopy(contexto.get("VisualWorker", {}).get("Obstaculos", []))
|
||||
|
|
@ -280,7 +284,7 @@ class ControladorMPC:
|
|||
|
||||
x_plot = x
|
||||
y_plot = y
|
||||
sim = [(x, y)]
|
||||
sim = [(x, y, theta)]
|
||||
x_temp, y_temp, theta_temp = x, y, theta
|
||||
|
||||
atraso_simulado_passos = 0 # Delay estimado de resposta do robô
|
||||
|
|
@ -342,23 +346,24 @@ class ControladorMPC:
|
|||
x_plot += velocidade * np.cos(theta_plot) * self.dt
|
||||
y_plot += velocidade * np.sin(theta_plot) * self.dt
|
||||
|
||||
sim.append((x_plot, y_plot))
|
||||
sim.append((x_plot, y_plot, theta_plot))
|
||||
|
||||
# Converte os pontos simulados para lat/lon
|
||||
simulacao_latlon = []
|
||||
for sx, sy in sim:
|
||||
for sx, sy, theta in sim:
|
||||
dlat = sy / self.gps_handler.raio_terra
|
||||
dlon = sx / (self.gps_handler.raio_terra * np.cos(np.radians(self.lat0)))
|
||||
lat = self.lat0 + np.degrees(dlat)
|
||||
lon = self.lon0 + np.degrees(dlon)
|
||||
simulacao_latlon.append([lat, lon])
|
||||
simulacao_latlon.append([lat, lon, theta])
|
||||
|
||||
#angulo_final, tipo_final = self._calcular_melhor_candidato(sim[0][0], sim[0][1], theta, self.visitados_execucao, contexto, comando_anterior, False)
|
||||
|
||||
return {
|
||||
"angulo": np.degrees(angulo_final),
|
||||
"tipo": tipo_final,
|
||||
"simulacao": simulacao_latlon
|
||||
"simulacao": simulacao_latlon,
|
||||
"parada_necessaria": False
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
|
|
@ -380,9 +385,16 @@ class ControladorMPC:
|
|||
velocidade = velocidade = contexto.get("Carro", {}).get("Velocidade", 0)
|
||||
deslocamento = velocidade * self.dt
|
||||
|
||||
matriz_custo = contexto.get("VisualWorker", {}).get("MatrizCusto", [[]])
|
||||
# 1. Analisa profundidade média por linha
|
||||
linhas_info = analisar_linhas_por_profundidade(matriz_custo, "distancia_m", contexto.get("VisualWorker", {}).get("Camera", {}).get("FovH", 0.7))
|
||||
ctx_vw = contexto.get("VisualWorker", {})
|
||||
vw_ativado = ctx_vw.get("Ativado", False)
|
||||
vw_operante = ctx_vw.get("Operante", False)
|
||||
com_matriz_custo = contexto.get("RegrasAtivas", {}).get("matriz_custo", False)
|
||||
filtrar_matriz = vw_ativado and vw_operante and com_matriz_custo
|
||||
|
||||
if filtrar_matriz:
|
||||
matriz_custo = contexto.get("VisualWorker", {}).get("MatrizCusto", [[]])
|
||||
# 1. Analisa profundidade média por linha
|
||||
linhas_info = analisar_linhas_por_profundidade(matriz_custo, "distancia_m", contexto.get("VisualWorker", {}).get("Camera", {}).get("FovH", 0.7))
|
||||
|
||||
for tipo in tipos_validos:
|
||||
for angulo_testado in angulos_candidatos:
|
||||
|
|
@ -394,9 +406,9 @@ class ControladorMPC:
|
|||
|
||||
custo = 0.0
|
||||
|
||||
custo_espaco, matriz_concluida = self._simular_trajetoria_matriz_custo(matriz_custo, linhas_info, tipo, angulo_testado, deslocamento, delta_theta_sim)
|
||||
|
||||
custo += custo_espaco
|
||||
if filtrar_matriz:
|
||||
custo_espaco, matriz_concluida = self._simular_trajetoria_matriz_custo(matriz_custo, linhas_info, tipo, angulo_testado, deslocamento, delta_theta_sim)
|
||||
custo += custo_espaco
|
||||
|
||||
if custo > melhor_custo:
|
||||
continue
|
||||
|
|
@ -408,7 +420,8 @@ class ControladorMPC:
|
|||
orient_sim = (orient_sim + np.pi) % (2 * np.pi)
|
||||
erro_pos = np.linalg.norm([x_sim - ponto_alvo_sim[0], y_sim - ponto_alvo_sim[1]])
|
||||
erro_ori_sim = self._erro_angular(orient_sim, theta_sim)
|
||||
peso_erro_pos, peso_erro_ori, peso_suavidade, peso_fator_re, peso_movimento, peso_ideal = self._calcular_pesos_movimento(contexto, erro_ori_sim, erro_pos)
|
||||
pesos = self._calcular_pesos_movimento(contexto, erro_ori_sim)
|
||||
peso_erro_pos, peso_erro_ori, peso_suavidade, peso_fator_re, peso_ideal, peso_movimento = pesos[0], pesos[1], pesos[2], pesos[3], pesos[4], pesos[5]
|
||||
vetor_alvo = np.array(ponto_alvo_sim) - np.array([x_sim, y_sim])
|
||||
vetor_alvo_norm = vetor_alvo / np.linalg.norm(vetor_alvo)
|
||||
vetor_movel = np.array([np.cos(theta_sim), np.sin(theta_sim)])
|
||||
|
|
@ -1034,7 +1047,7 @@ class ControladorMPC:
|
|||
#self.dt = max(min(self.dt, 0.4), 0.1)
|
||||
_dt = self.dt
|
||||
freq_tick = 1.0 / _dt
|
||||
self.dt = 0.5
|
||||
#self.dt = 0.5
|
||||
self.ultima_atualizacao = agora
|
||||
comando = self._processar_mpc_receding(contexto, comando_anterior)
|
||||
|
||||
|
|
@ -1053,26 +1066,41 @@ class ControladorMPC:
|
|||
GPS = contexto.get("GPS", {})
|
||||
pos_lat = GPS.get("Latitude", 0)
|
||||
pos_lon = GPS.get("Longitude", 0)
|
||||
theta = np.radians(GPS.get("AnguloCarro", 0))
|
||||
pos_theta = GPS.get("AnguloCarro", 0)
|
||||
theta = np.radians(pos_theta)
|
||||
velocidade = contexto.get("Carro", {}).get("Velocidade", 0)
|
||||
x, y = self.gps_handler.converter_latlon_para_xz(pos_lat, pos_lon)
|
||||
|
||||
#print(GPS)
|
||||
|
||||
distancia_m = velocidade * self.dt
|
||||
idx_alvo_real = contexto.get("Carro", {}).get("IdxProximoPonto", 0)
|
||||
ultimo_ponto = idx_alvo_real >= len(self.pontos_info)
|
||||
|
||||
self.tempo_execucao_local = 0.75
|
||||
if distancia_m > 0:
|
||||
passos_total = int(self.horizonte / distancia_m)
|
||||
self.tempo_execucao_local = contexto.get("Carro", {}).get("TempoEntreComandos", 0.5)
|
||||
if ultimo_ponto:
|
||||
self.passos_horizonte_local = 1
|
||||
self.qtd_comandos_sucessivos = 3
|
||||
elif distancia_m > 0:
|
||||
passos_total = min(int(self.horizonte / distancia_m), 20)
|
||||
self.passos_horizonte_local = max(1, math.ceil(self.tempo_execucao_local / self.dt))
|
||||
self.qtd_comandos_sucessivos = max(1, passos_total // self.passos_horizonte_local)
|
||||
else:
|
||||
self.passos_horizonte_local = 0
|
||||
self.qtd_comandos_sucessivos = 0
|
||||
|
||||
passos_atraso = contexto.get("Carro", {}).get("PassosAtraso", 1)
|
||||
for passo in range(passos_atraso):
|
||||
angulo_anterior = np.radians(comando_anterior.get("angulo", 0))
|
||||
tipo_anterior = TipoMovimentoDirecional(comando_anterior.get("tipo", TipoMovimentoDirecional.RodasDianteiras.value))
|
||||
_, posicao_futura, _ = self._simular_passo(x, y, theta, tipo_anterior, angulo_anterior, {}, { "tipo": tipo_anterior, "angulo": angulo_anterior }, contexto, deepcopy(self.visitados_execucao))
|
||||
x, y, theta = posicao_futura[-1]
|
||||
|
||||
simulacao_latlon = []
|
||||
idx_alvo_real = contexto.get("Carro", {}).get("IdxProximoPonto", 0)
|
||||
idx_alvo_correcao = self._corrigir_pontos_visitados(x, y, self.visitados_execucao, idx_alvo_real) # marca pontos antigos como visitados
|
||||
if idx_alvo_real >= len(self.pontos_info):
|
||||
if ultimo_ponto:
|
||||
angulo_final, tipo_final = comando_parado()
|
||||
parada_necessaria = True
|
||||
else:
|
||||
candidatos_ativos = [{
|
||||
"x": x, "y": y, "theta": theta,
|
||||
|
|
@ -1132,12 +1160,12 @@ class ControladorMPC:
|
|||
candidatos_ativos = self._selecionar_melhores(novos_candidatos, N=5)
|
||||
candidatos_ativos = self._filtrar_por_margem_angular(candidatos_ativos, margem_graus=2.0)
|
||||
#print("Melhores candidatos filtrados:")
|
||||
for i, c in enumerate(candidatos_ativos):
|
||||
comando = c["comandos"][-1] if c["comandos"] else ("-", 0)
|
||||
tipo = comando[0]
|
||||
angulo = np.degrees(comando[1])
|
||||
#print(f"{i+1}. Tipo: {tipo.name if hasattr(tipo, 'name') else tipo}, Angulo: {round(angulo, 2)}, Custo: {round(c['custo'], 4)}")
|
||||
t5 = time.time()
|
||||
#for i, c in enumerate(candidatos_ativos):
|
||||
# comando = c["comandos"][-1] if c["comandos"] else ("-", 0)
|
||||
# tipo = comando[0]
|
||||
# angulo = np.degrees(comando[1])
|
||||
# print(f"{i+1}. Tipo: {tipo.name if hasattr(tipo, 'name') else tipo}, Angulo: {round(angulo, 2)}, Custo: {round(c['custo'], 4)}")
|
||||
#t5 = time.time()
|
||||
#print(f"Passo {passo} simulado em {t5 - t1} segundos")
|
||||
|
||||
t100 = time.time()
|
||||
|
|
@ -1161,11 +1189,12 @@ class ControladorMPC:
|
|||
idx_cmd = 0 if len(melhor["comandos"]) == 1 else 1
|
||||
tipo_final, angulo_final = melhor["comandos"][idx_cmd]
|
||||
simulacao_latlon = list(self.gps_handler.converter_trajetoria_para_latlon(melhor["trajetoria"]) or [])
|
||||
simulacao_latlon.insert(0, (pos_lat, pos_lon, np.degrees(theta)))
|
||||
simulacao_latlon.insert(0, (pos_lat, pos_lon, pos_theta))
|
||||
else:
|
||||
angulo_final = 0
|
||||
tipo_final = TipoMovimentoDirecional.RodasDianteiras
|
||||
simulacao_latlon = []
|
||||
#print(f"Simulacao: {len(simulacao_latlon)}")
|
||||
_cmd = {
|
||||
"angulo": float(round(np.degrees(angulo_final), 2)),
|
||||
"tipo": tipo_final.value,
|
||||
|
|
@ -1474,6 +1503,9 @@ class ControladorMPC:
|
|||
comando_anterior_copy = deepcopy(comando_anterior)
|
||||
pontos_visitados = deepcopy(visitados)
|
||||
velocidade = contexto.get("Carro", {}).get("Velocidade", 0.0)
|
||||
angulo_caminho = np.radians(contexto.get("Carro", {}).get("AnguloCaminho", 0.0))
|
||||
status_carro = StatusCarroMapa(contexto.get("Carro", {}).get("Status", StatusCarroMapa.Parado.value))
|
||||
dentro_corredor = contexto.get("Carro", {}).get("DentroCorredor", False)
|
||||
omega = self.gps_handler.calcular_omega(velocidade, angulo_testado, tipo)
|
||||
custo_visual_worker = custos_candidatos.get(chave, 0.0)
|
||||
|
||||
|
|
@ -1490,7 +1522,8 @@ class ControladorMPC:
|
|||
orient_sim = (orient_sim + np.pi) % (2 * np.pi)
|
||||
|
||||
erro_pos = np.linalg.norm([x_sim - ponto_alvo_sim[0], y_sim - ponto_alvo_sim[1]])
|
||||
erro_ori_sim = self._erro_angular(orient_sim, theta_sim)
|
||||
peso_erro_orientacao_caminho = 0.3 if status_carro == StatusCarroMapa.CaminhandoRua and dentro_corredor else 0.7
|
||||
erro_ori_sim = self._erro_angular(orient_sim, theta_sim, angulo_caminho, peso_erro_orientacao_caminho)
|
||||
|
||||
pesos = self._calcular_pesos_movimento(contexto, erro_ori_sim)
|
||||
peso_erro_pos, peso_erro_ori, peso_suavidade, peso_fator_re, peso_movimento = pesos[0], pesos[1], pesos[2], pesos[3], pesos[5]
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
from shared.contexto_global_redis import ContextoGlobalRedis
|
||||
from manager_worker.modulos.pid import PIDAdaptativo
|
||||
from .base import ProcessadorBase
|
||||
from manager_worker.filtros import FiltroVelocidade
|
||||
from manager_worker.processadores.padroes import comando_controle
|
||||
|
|
@ -8,10 +9,21 @@ from manager_worker.modulos.movimentacao import definir_comando as definir_coman
|
|||
class ProcessadorEmAndamento(ProcessadorBase):
|
||||
def __init__(self):
|
||||
self.filtro_mov = FiltroVelocidade()
|
||||
ang_max = ContextoGlobalRedis.get_controle().get("angulo_max", 30)
|
||||
self.pid_dir = PIDAdaptativo(
|
||||
kp_base=0.55,
|
||||
kp=0.65,
|
||||
ki_base=0.005,
|
||||
ki=0.015,
|
||||
kd_base=0.08,
|
||||
kd=0.055,
|
||||
saida_min=-ang_max,
|
||||
saida_max=ang_max
|
||||
)
|
||||
|
||||
def processar(self):
|
||||
try:
|
||||
angulo_sp, tipo_dir, simulacao, parada_necessaria = definir_comando_dir()
|
||||
angulo_sp, tipo_dir, simulacao, parada_necessaria = definir_comando_dir(self.pid_dir)
|
||||
velocidade_sp = definir_comando_mov(parada_necessaria, self.filtro_mov)
|
||||
return comando_controle(
|
||||
percentual_velocidade=velocidade_sp,
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
|
|
@ -258,67 +258,79 @@ class ContextoGlobalRedis:
|
|||
#_contexto = cls.get_contexto()
|
||||
_operacao = cls.get_operacao()
|
||||
|
||||
modo = _operacao.get("modo")
|
||||
status_atual = _operacao.get("status")
|
||||
modo = ModoOperacao(_operacao.get("modo", ModoOperacao.NaoDefinido.value))
|
||||
status_atual = StatusOperacao(_operacao.get("status", StatusOperacao.NaoIniciado.value))
|
||||
iniciado = _operacao.get("iniciado", False)
|
||||
configurado = _operacao.get("configurado", False)
|
||||
status_iniciado_anterior = _operacao.get("status_iniciado_anterior", False)
|
||||
finalizando = _operacao.get("finalizando", False)
|
||||
op_liberada = _operacao.get("liberado", False)
|
||||
status_anterior_parado = _operacao.get("status_anterior_parado", StatusOperacao.Parado.value)
|
||||
|
||||
try:
|
||||
cls.atualizar_ctx_dict(CtxKey.DadosOperacao, status_iniciado_anterior=iniciado)
|
||||
if status_iniciado_anterior != iniciado:
|
||||
cls.atualizar_ctx_dict(CtxKey.DadosOperacao, status_iniciado_anterior=iniciado)
|
||||
|
||||
# Operacao nao configurada
|
||||
if not configurado:
|
||||
if status_atual != StatusOperacao.Parametrizando:
|
||||
cls.atualizar_ctx_dict(CtxKey.DadosOperacao, status=StatusOperacao.Parametrizando.value)
|
||||
return
|
||||
|
||||
# Operacao nao iniciada
|
||||
if not iniciado:
|
||||
if status_atual != StatusOperacao.Concluido.value:
|
||||
if status_atual not in [StatusOperacao.Concluido, StatusOperacao.Parametrizando]:
|
||||
cls.atualizar_ctx_dict(CtxKey.DadosOperacao, status=StatusOperacao.Parametrizando.value)
|
||||
return
|
||||
|
||||
# 🔸 Modo MANUAL
|
||||
if modo == ModoOperacao.Manual:
|
||||
if op_liberada:
|
||||
cls.atualizar_ctx_dict(CtxKey.DadosOperacao, status=StatusOperacao.EmAndamento.value)
|
||||
else:
|
||||
cls.atualizar_ctx_dict(CtxKey.DadosOperacao, status=StatusOperacao.Parado.value)
|
||||
novo_status = StatusOperacao.EmAndamento if op_liberada else StatusOperacao.Parado
|
||||
if status_atual != novo_status:
|
||||
cls.atualizar_ctx_dict(CtxKey.DadosOperacao, status=novo_status.value)
|
||||
return
|
||||
|
||||
# 🔸 Modo MAPA GPS ou IA
|
||||
if modo in (ModoOperacao.MapaGPS, ModoOperacao.TreinamentoIA, ModoOperacao.MapeamentoVisual):
|
||||
if modo in [ModoOperacao.MapaGPS, ModoOperacao.TreinamentoIA, ModoOperacao.MapeamentoVisual]:
|
||||
# Iniciando operacao
|
||||
if (iniciado and not status_iniciado_anterior):
|
||||
cls._iniciar_operacao()
|
||||
|
||||
# Verifica se esta em processo de calibragem inicial
|
||||
calibrando = _operacao.get("calibrando", False)
|
||||
if (calibrando):
|
||||
cls.atualizar_ctx_dict(CtxKey.DadosOperacao, status=StatusOperacao.Calibrando.value)
|
||||
if calibrando:
|
||||
if status_atual != StatusOperacao.Calibrando:
|
||||
cls.atualizar_ctx_dict(CtxKey.DadosOperacao, status=StatusOperacao.Calibrando.value)
|
||||
return
|
||||
|
||||
# Verifica se ainda está aguardando tempo inicial
|
||||
tempo_aguardando = _operacao.get("tempo_aguardando", 0)
|
||||
if (tempo_aguardando + _operacao.get("tempo_aguardar_inicio_operacao", 25)) > agora:
|
||||
cls.atualizar_ctx_dict(CtxKey.DadosOperacao, status=StatusOperacao.Aguardando.value)
|
||||
em_espera = (tempo_aguardando + _operacao.get("tempo_aguardar_inicio_operacao", 25)) > agora
|
||||
if em_espera:
|
||||
if status_atual != StatusOperacao.Aguardando:
|
||||
cls.atualizar_ctx_dict(CtxKey.DadosOperacao, status=StatusOperacao.Aguardando.value)
|
||||
return
|
||||
|
||||
# Ultimo corredor ja foi concluido
|
||||
_corredor = cls.get_contexto().get("Trajetoria", {}).get("CorredorAtual", {})
|
||||
if _corredor.get("ultimo", False) and _corredor.get("concluido", False):
|
||||
cls.atualizar_ctx_dict(CtxKey.DadosOperacao, status=StatusOperacao.Concluido.value)
|
||||
if status_atual != StatusOperacao.Concluido:
|
||||
cls.atualizar_ctx_dict(CtxKey.DadosOperacao, status=StatusOperacao.Concluido.value)
|
||||
if iniciado and not finalizando:
|
||||
cls._finalizar_operacao()
|
||||
return
|
||||
|
||||
# Não está liberado para operação
|
||||
if not op_liberada:
|
||||
if status_atual != StatusOperacao.Parado.value:
|
||||
cls.atualizar_ctx_dict(CtxKey.DadosOperacao, status_anterior_parado=status_atual)
|
||||
if status_atual != StatusOperacao.Parado:
|
||||
cls.atualizar_ctx_dict(CtxKey.DadosOperacao, status_anterior_parado=status_atual.value)
|
||||
mostrar_log(f"Operacao Parada! {_operacao.get('motivo_nao_liberado')}")
|
||||
cls.atualizar_ctx_dict(CtxKey.DadosOperacao, status=StatusOperacao.Parado.value)
|
||||
if status_atual != StatusOperacao.Parado:
|
||||
cls.atualizar_ctx_dict(CtxKey.DadosOperacao, status=StatusOperacao.Parado.value)
|
||||
return
|
||||
|
||||
# Estava parado e liberou: volta para aguardando
|
||||
if status_atual == StatusOperacao.Parado.value:
|
||||
if status_atual == StatusOperacao.Parado:
|
||||
cls.atualizar_ctx_dict(
|
||||
CtxKey.DadosOperacao,
|
||||
tempo_aguardando=agora,
|
||||
|
|
@ -335,7 +347,8 @@ class ContextoGlobalRedis:
|
|||
)
|
||||
return
|
||||
|
||||
cls.atualizar_ctx_dict(CtxKey.DadosOperacao, status=StatusOperacao.EmAndamento.value)
|
||||
if status_atual != StatusOperacao.EmAndamento:
|
||||
cls.atualizar_ctx_dict(CtxKey.DadosOperacao, status=StatusOperacao.EmAndamento.value)
|
||||
|
||||
finally:
|
||||
pass
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -22,18 +22,20 @@ class CameraManager:
|
|||
def __init__(self, mostrar_log):
|
||||
self.mostrar_log = mostrar_log
|
||||
self.mx_id = None
|
||||
self.reiniciar_status()
|
||||
|
||||
def reiniciar_status(self):
|
||||
self.camera = None
|
||||
self.operante = False
|
||||
self.iniciando = False
|
||||
self.calibrando = False
|
||||
|
||||
self._ultima_analise_anomalias = {}
|
||||
self._ultima_analise_solo = {}
|
||||
self._ultima_analise_radar = {}
|
||||
self._ultima_analise_segmentacao = {}
|
||||
self._ultima_analise_matriz_confianca = {}
|
||||
self._ultima_analise_matriz_custo = {}
|
||||
|
||||
|
||||
def inicializar(self, mx_id):
|
||||
if self.iniciando:
|
||||
return
|
||||
|
|
@ -114,8 +116,12 @@ class CameraManager:
|
|||
if frame is not None:
|
||||
self._ultimo_rgb_frame = frame
|
||||
return frame, self.camera.timestamp_ultimo_frame_rgb, res
|
||||
elif "X_LINK_ERROR" in res["erro"]:
|
||||
self.reiniciar_status()
|
||||
except Exception as e:
|
||||
self.mostrar_log("Erro ao requisitar rgb frame:", e)
|
||||
if "X_LINK_ERROR" in str(e):
|
||||
self.reiniciar_status()
|
||||
|
||||
return None, None, None
|
||||
|
||||
|
|
@ -127,8 +133,12 @@ class CameraManager:
|
|||
frame, res = self.camera.requisitar_frame_depth()
|
||||
if frame is not None:
|
||||
return frame, self.camera.timestamp_ultimo_frame_depth, res
|
||||
elif "X_LINK_ERROR" in res["erro"]:
|
||||
self.reiniciar_status()
|
||||
except Exception as e:
|
||||
self.mostrar_log("Erro ao requisitar depth frame:", e)
|
||||
if "X_LINK_ERROR" in str(e):
|
||||
self.reiniciar_status()
|
||||
|
||||
return None, None, None
|
||||
|
||||
|
|
@ -174,7 +184,7 @@ class CameraManager:
|
|||
if status == StatusModulo.DESCONECTADO:
|
||||
if self.camera.imu:
|
||||
self.camera.imu.parar()
|
||||
self.camera = None
|
||||
self.reiniciar_status()
|
||||
continue
|
||||
elif self.operante and not self.calibrando and status == StatusModulo.OPERANTE and self.camera is not None and self.camera.tem_depth:
|
||||
self._realizar_analises()
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
|
|
@ -15,6 +15,9 @@ class CameraManager:
|
|||
def __init__(self, mostrar_log):
|
||||
self.mostrar_log = mostrar_log
|
||||
self.mx_id = None
|
||||
self.reiniciar_status()
|
||||
|
||||
def reiniciar_status(self):
|
||||
self.camera = None
|
||||
self.operante = False
|
||||
self.iniciando = False
|
||||
|
|
@ -78,8 +81,12 @@ class CameraManager:
|
|||
if frame is not None:
|
||||
self._ultimo_rgb_frame = frame
|
||||
return frame, self.camera.timestamp_ultimo_frame_rgb, res
|
||||
elif "X_LINK_ERROR" in res["erro"]:
|
||||
self.reiniciar_status()
|
||||
except Exception as e:
|
||||
self.mostrar_log("Erro ao requisitar rgb frame:", e)
|
||||
if "X_LINK_ERROR" in str(e):
|
||||
self.reiniciar_status()
|
||||
|
||||
return None, None, None
|
||||
|
||||
|
|
@ -110,7 +117,7 @@ class CameraManager:
|
|||
try:
|
||||
status = StatusModulo((self.camera.ultima_saude or {}).get("status", StatusModulo.DESCONECTADO.value))
|
||||
if status == StatusModulo.DESCONECTADO:
|
||||
self.camera = None
|
||||
self.reiniciar_status()
|
||||
continue
|
||||
elif self.operante and status == StatusModulo.OPERANTE and self.camera is not None:
|
||||
self._realizar_analises()
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ from shared.utils import encode_image_base64
|
|||
class ClassesSegmentacao(IntEnum):
|
||||
ERVA = 0
|
||||
CANA = 1
|
||||
CHAO = 2
|
||||
|
||||
|
||||
class WeedDetector:
|
||||
|
|
@ -38,7 +39,8 @@ class WeedDetector:
|
|||
from weed_worker.config import load_config
|
||||
config = load_config()
|
||||
qtd_bicos = config.get("qtd_bicos")
|
||||
self.ervas_ativas = []
|
||||
self.ervas_ativas_radar = []
|
||||
self.ervas_ativas_filtradas = []
|
||||
self.next_erva_id = 1
|
||||
self.frame_idx = 0
|
||||
self.ervas_identificadas = [dict() for _ in range(qtd_bicos)]
|
||||
|
|
@ -202,13 +204,36 @@ class WeedDetector:
|
|||
print(f"Erro ao detectar ervas no frame: {e}")
|
||||
return None
|
||||
|
||||
def _calcular_iou(self, bbox1, bbox2):
|
||||
x1, y1, w1, h1 = bbox1
|
||||
x2, y2, w2, h2 = bbox2
|
||||
|
||||
xi1 = max(x1, x2)
|
||||
yi1 = max(y1, y2)
|
||||
xi2 = min(x1 + w1, x2 + w2)
|
||||
yi2 = min(y1 + h1, y2 + h2)
|
||||
inter_width = max(0, xi2 - xi1)
|
||||
inter_height = max(0, yi2 - yi1)
|
||||
inter_area = inter_width * inter_height
|
||||
|
||||
area1 = w1 * h1
|
||||
area2 = w2 * h2
|
||||
union_area = area1 + area2 - inter_area
|
||||
|
||||
if union_area == 0:
|
||||
return 0
|
||||
return inter_area / union_area
|
||||
|
||||
def _track_ervas(self, detections, histerese, velocidade_robo):
|
||||
try:
|
||||
max_dist_base = 40 # px (parado)
|
||||
fator_velocidade = 80 # px por m/s (ajuste conforme calibragem real!)
|
||||
max_dist_base = 60 # px (parado)
|
||||
fator_velocidade = 100 # px por m/s (ajuste conforme calibragem real!)
|
||||
max_dist = max_dist_base + fator_velocidade * velocidade_robo
|
||||
|
||||
cur_ervas = []
|
||||
_ervas_filtradas = []
|
||||
_ervas_radar = []
|
||||
|
||||
#print(f"Deteccoes: {detections}")
|
||||
|
||||
for det in detections:
|
||||
cx = det["x"] + det["largura"] // 2
|
||||
|
|
@ -216,17 +241,19 @@ class WeedDetector:
|
|||
class_id = det["id"]
|
||||
|
||||
found = False
|
||||
for erva in self.ervas_ativas:
|
||||
for erva in self.ervas_ativas_filtradas:
|
||||
if erva["class_id"] == class_id:
|
||||
ecx, ecy = erva["centro"]
|
||||
dist = np.hypot(cx - ecx, cy - ecy)
|
||||
if dist < max_dist:
|
||||
iou = self._calcular_iou((det["x"], det["y"], det["largura"], det["altura"]), erva["bbox"])
|
||||
if dist < max_dist or iou > 0.3:
|
||||
# Atualiza erva
|
||||
erva["centro"] = (cx, cy)
|
||||
erva["bbox"] = (det["x"], det["y"], det["largura"], det["altura"])
|
||||
erva["ultimo_frame"] = self.frame_idx
|
||||
erva["frames_detectada"] = erva.get("frames_detectada", 0) + 1
|
||||
cur_ervas.append(erva)
|
||||
_ervas_filtradas.append(erva)
|
||||
_ervas_radar.append(erva)
|
||||
found = True
|
||||
break
|
||||
if not found:
|
||||
|
|
@ -242,14 +269,22 @@ class WeedDetector:
|
|||
"confianca": det["confianca"]
|
||||
}
|
||||
self.next_erva_id += 1
|
||||
cur_ervas.append(erva)
|
||||
_ervas_filtradas.append(erva)
|
||||
_ervas_radar.append(erva)
|
||||
|
||||
# Remove ervas sumidas há mais de N frames
|
||||
self.ervas_ativas = [
|
||||
erva for erva in cur_ervas
|
||||
self.ervas_ativas_filtradas = [
|
||||
erva for erva in _ervas_filtradas
|
||||
if self.frame_idx - erva["ultimo_frame"] < histerese
|
||||
]
|
||||
return self.ervas_ativas
|
||||
self.ervas_ativas_radar = [
|
||||
erva for erva in _ervas_radar
|
||||
if self.frame_idx - erva["ultimo_frame"] < histerese
|
||||
]
|
||||
|
||||
#print(f"Ervas ativas: {self.ervas_ativas}")
|
||||
|
||||
return self.ervas_ativas_filtradas, self.ervas_ativas_radar
|
||||
except Exception as e:
|
||||
print(f"Erro ao trackear ervas: {e}")
|
||||
|
||||
|
|
@ -273,11 +308,11 @@ class WeedDetector:
|
|||
y_fim = int((1.0 - (zona_inicio + zona_altura)) * H)
|
||||
|
||||
atuacao_bicos = {i: False for i in range(qtd_bicos)}
|
||||
ervas = self._track_ervas(detections, histerese, velocidade_robo)
|
||||
ervas_filtradas, ervas_radar = self._track_ervas(detections, histerese, velocidade_robo)
|
||||
|
||||
deteccoes = []
|
||||
|
||||
for det in ervas:
|
||||
for det in ervas_radar:
|
||||
if not self._filtro_bbox(det, frame_shape, min_area, max_area):
|
||||
continue
|
||||
if det.get("frames_detectada", 0) < frames_consecutivos:
|
||||
|
|
@ -374,9 +409,14 @@ class WeedDetector:
|
|||
cv2.putText(debug_img, f"Bico {i} {status}", (x0+5, y_inicio+25),
|
||||
cv2.FONT_HERSHEY_SIMPLEX, 0.6, cor, 2)
|
||||
|
||||
escala_x = self.resolucao[0] / frame.shape[1]
|
||||
escala_y = self.resolucao[1] / frame.shape[0]
|
||||
# Desenha as bboxes das detecções
|
||||
for det in detections:
|
||||
x, y, w, h = det["bbox"][0], det["bbox"][1], det["bbox"][2], det["bbox"][3]
|
||||
x = int(det["bbox"][0] * escala_x)
|
||||
y = int(det["bbox"][1] * escala_y)
|
||||
w = int(det["bbox"][2] * escala_x)
|
||||
h = int(det["bbox"][3] * escala_y)
|
||||
id = det.get("id")
|
||||
class_name = det.get("descricao", "erva")
|
||||
conf = det.get("confianca", 0)
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1,13 @@
|
|||
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:52 Memory Pressure: Critical
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -15,5 +15,5 @@
|
|||
"top_topics_and_observing_domains": [ ]
|
||||
} ],
|
||||
"hex_encoded_hmac_key": "171DAE543B88106F5155169E0A8C7502CB2A0757E4948C32E2A04D196E23BE70",
|
||||
"next_scheduled_calculation_time": "13398863082822921"
|
||||
"next_scheduled_calculation_time": "13398863082822933"
|
||||
}
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1,2 +1,3 @@
|
|||
2025/07/30-14:17:51.925 4764 Creating DB C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Extension Rules since it was missing.
|
||||
2025/07/30-14:17:51.936 4764 Reusing MANIFEST C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Extension Rules/MANIFEST-000001
|
||||
2025/07/31-09:08:16.490 631c Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Extension Rules/MANIFEST-000001
|
||||
2025/07/31-09:08:16.492 631c Recovering log #3
|
||||
2025/07/31-09:08:16.492 631c Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Extension Rules/000003.log
|
||||
|
|
|
|||
|
|
@ -0,0 +1,2 @@
|
|||
2025/07/30-14:17:51.925 4764 Creating DB C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Extension Rules since it was missing.
|
||||
2025/07/30-14:17:51.936 4764 Reusing MANIFEST C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Extension Rules/MANIFEST-000001
|
||||
|
|
@ -1,2 +1,3 @@
|
|||
2025/07/30-14:17:51.942 4764 Creating DB C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Extension Scripts since it was missing.
|
||||
2025/07/30-14:17:51.950 4764 Reusing MANIFEST C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Extension Scripts/MANIFEST-000001
|
||||
2025/07/31-09:08:16.499 631c Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Extension Scripts/MANIFEST-000001
|
||||
2025/07/31-09:08:16.499 631c Recovering log #3
|
||||
2025/07/31-09:08:16.500 631c Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Extension Scripts/000003.log
|
||||
|
|
|
|||
|
|
@ -0,0 +1,2 @@
|
|||
2025/07/30-14:17:51.942 4764 Creating DB C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Extension Scripts since it was missing.
|
||||
2025/07/30-14:17:51.950 4764 Reusing MANIFEST C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Extension Scripts/MANIFEST-000001
|
||||
|
|
@ -1,3 +1,3 @@
|
|||
2025/07/30-15:00:17.699 3928 Reusing MANIFEST C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Extension State/MANIFEST-000001
|
||||
2025/07/30-15:00:17.700 3928 Recovering log #3
|
||||
2025/07/30-15:00:17.701 3928 Reusing old log C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Extension State/000003.log
|
||||
2025/07/31-09:08:16.595 30b8 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Extension State/MANIFEST-000001
|
||||
2025/07/31-09:08:16.596 30b8 Recovering log #3
|
||||
2025/07/31-09:08:16.596 30b8 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Extension State/000003.log
|
||||
|
|
|
|||
|
|
@ -1,2 +1,3 @@
|
|||
2025/07/30-14:17:52.018 c78 Creating DB C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Extension State since it was missing.
|
||||
2025/07/30-14:17:52.032 c78 Reusing MANIFEST C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Extension State/MANIFEST-000001
|
||||
2025/07/30-15:00:17.699 3928 Reusing MANIFEST C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Extension State/MANIFEST-000001
|
||||
2025/07/30-15:00:17.700 3928 Recovering log #3
|
||||
2025/07/30-15:00:17.701 3928 Reusing old log C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Extension State/000003.log
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
|
|
@ -1,3 +1,3 @@
|
|||
2025/07/30-15:00:17.786 9ac Reusing MANIFEST C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Local Storage\leveldb/MANIFEST-000001
|
||||
2025/07/30-15:00:17.803 9ac Recovering log #3
|
||||
2025/07/30-15:00:17.807 9ac Reusing old log C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Local Storage\leveldb/000003.log
|
||||
2025/07/31-09:08:16.557 2098 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Local Storage\leveldb/MANIFEST-000001
|
||||
2025/07/31-09:08:16.564 2098 Recovering log #3
|
||||
2025/07/31-09:08:16.567 2098 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Local Storage\leveldb/000003.log
|
||||
|
|
|
|||
|
|
@ -1,2 +1,3 @@
|
|||
2025/07/30-14:17:52.015 2888 Creating DB C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Local Storage\leveldb since it was missing.
|
||||
2025/07/30-14:17:52.057 2888 Reusing MANIFEST C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Local Storage\leveldb/MANIFEST-000001
|
||||
2025/07/30-15:00:17.786 9ac Reusing MANIFEST C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Local Storage\leveldb/MANIFEST-000001
|
||||
2025/07/30-15:00:17.803 9ac Recovering log #3
|
||||
2025/07/30-15:00:17.807 9ac 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":"13398455885221737","port":443,"protocol_str":"quic"}],"anonymization":["DAAAAAcAAABmaWxlOi8vAA==",false,0],"network_stats":{"srtt":44272},"server":"https://tile.openstreetmap.org","supports_spdy":true}],"supports_quic":{"address":"2804:d78:609:f200:474:dcf1:ff5b:53be","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":"13398455885221737","port":443,"protocol_str":"quic"}],"anonymization":["DAAAAAcAAABmaWxlOi8vAA==",false,0],"network_stats":{"srtt":44272},"server":"https://tile.openstreetmap.org","supports_spdy":true}],"supports_quic":{"address":"2804:d78:609:f200:474:dcf1:ff5b:53be","used_quic":true},"version":5},"network_qualities":{"CAISABiAgICA+P////8B":"3G","CAYSABiAgICA+P////8B":"Offline"}}}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1,3 +1,3 @@
|
|||
2025/07/30-15:58:59.952 9ac Reusing MANIFEST C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Session Storage/MANIFEST-000001
|
||||
2025/07/30-15:58:59.955 9ac Recovering log #3
|
||||
2025/07/30-15:58:59.958 9ac Reusing old log C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Session Storage/000003.log
|
||||
2025/07/31-09:09:09.196 2098 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Session Storage/MANIFEST-000001
|
||||
2025/07/31-09:09:09.198 2098 Recovering log #3
|
||||
2025/07/31-09:09:09.201 2098 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Session Storage/000003.log
|
||||
|
|
|
|||
|
|
@ -1,2 +1,3 @@
|
|||
2025/07/30-14:18:10.777 2888 Creating DB C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Session Storage since it was missing.
|
||||
2025/07/30-14:18:10.792 2888 Reusing MANIFEST C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Session Storage/MANIFEST-000001
|
||||
2025/07/30-15:58:59.952 9ac Reusing MANIFEST C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Session Storage/MANIFEST-000001
|
||||
2025/07/30-15:58:59.955 9ac Recovering log #3
|
||||
2025/07/30-15:58:59.958 9ac 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/07/30-15:00:17.512 d20 Reusing MANIFEST C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Site Characteristics Database/MANIFEST-000001
|
||||
2025/07/30-15:00:17.515 d20 Recovering log #3
|
||||
2025/07/30-15:00:17.515 d20 Reusing old log C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Site Characteristics Database/000003.log
|
||||
2025/07/31-09:08:16.477 6790 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Site Characteristics Database/MANIFEST-000001
|
||||
2025/07/31-09:08:16.480 6790 Recovering log #3
|
||||
2025/07/31-09:08:16.480 6790 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Site Characteristics Database/000003.log
|
||||
|
|
|
|||
|
|
@ -1,2 +1,3 @@
|
|||
2025/07/30-14:17:51.937 28b0 Creating DB C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Site Characteristics Database since it was missing.
|
||||
2025/07/30-14:17:51.947 28b0 Reusing MANIFEST C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Site Characteristics Database/MANIFEST-000001
|
||||
2025/07/30-15:00:17.512 d20 Reusing MANIFEST C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Site Characteristics Database/MANIFEST-000001
|
||||
2025/07/30-15:00:17.515 d20 Recovering log #3
|
||||
2025/07/30-15:00:17.515 d20 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/07/30-15:00:17.519 10d4 Reusing MANIFEST C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Sync Data\LevelDB/MANIFEST-000001
|
||||
2025/07/30-15:00:17.520 10d4 Recovering log #3
|
||||
2025/07/30-15:00:17.521 10d4 Reusing old log C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Sync Data\LevelDB/000003.log
|
||||
2025/07/31-09:08:16.477 12c4 Reusing MANIFEST C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Sync Data\LevelDB/MANIFEST-000001
|
||||
2025/07/31-09:08:16.479 12c4 Recovering log #3
|
||||
2025/07/31-09:08:16.480 12c4 Reusing old log C:\ZendionInc\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Sync Data\LevelDB/000003.log
|
||||
|
|
|
|||
|
|
@ -1,2 +1,3 @@
|
|||
2025/07/30-14:17:51.906 4218 Creating DB C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Sync Data\LevelDB since it was missing.
|
||||
2025/07/30-14:17:51.927 4218 Reusing MANIFEST C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Sync Data\LevelDB/MANIFEST-000001
|
||||
2025/07/30-15:00:17.519 10d4 Reusing MANIFEST C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Sync Data\LevelDB/MANIFEST-000001
|
||||
2025/07/30-15:00:17.520 10d4 Recovering log #3
|
||||
2025/07/30-15:00:17.521 10d4 Reusing old log C:\ZendionINC\agrobot_base\AgroBase\AgroMonitor\bin\Debug\AgroMonitor.exe.WebView2\EBWebView\Default\Sync Data\LevelDB/000003.log
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue