ajustes pre operacao

This commit is contained in:
Diego Freitas 2025-08-01 17:56:04 -03:00
parent 7d79848665
commit 9f80418d9a
128 changed files with 3447 additions and 482 deletions

Binary file not shown.

View File

@ -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;
});
}

View File

@ -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)

View File

@ -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;

View File

@ -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>();

View File

@ -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;

View File

@ -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)
);
}
}
}

View File

@ -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;

View File

@ -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);

View File

@ -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"
}

View File

@ -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

View File

@ -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

View File

@ -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"}}}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -1 +1 @@
138.0.3351.109
138.0.3351.121

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

File diff suppressed because one or more lines are too long

View File

@ -17,7 +17,7 @@
<meta name="viewport" content="width=device-width,
initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<style>
#map_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

View File

@ -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
}

View File

@ -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")

View File

@ -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}")

View File

@ -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)

View File

@ -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]

View File

@ -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,

View File

@ -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

View File

@ -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()

View File

@ -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()

View File

@ -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)

View File

@ -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

View File

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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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