diff --git a/AgroBase/.vs/AgroBase/FileContentIndex/79bbbed6-c7c4-487f-b5b6-5966e9e30898.vsidx b/AgroBase/.vs/AgroBase/FileContentIndex/2cbc8e63-afab-4034-84ee-34a55b21f0cf.vsidx similarity index 54% rename from AgroBase/.vs/AgroBase/FileContentIndex/79bbbed6-c7c4-487f-b5b6-5966e9e30898.vsidx rename to AgroBase/.vs/AgroBase/FileContentIndex/2cbc8e63-afab-4034-84ee-34a55b21f0cf.vsidx index 87e2a3d3a..0f728e5bc 100644 Binary files a/AgroBase/.vs/AgroBase/FileContentIndex/79bbbed6-c7c4-487f-b5b6-5966e9e30898.vsidx and b/AgroBase/.vs/AgroBase/FileContentIndex/2cbc8e63-afab-4034-84ee-34a55b21f0cf.vsidx differ diff --git a/AgroBase/.vs/AgroBase/FileContentIndex/63c6aa73-21ab-49be-bd3e-1d5771c18afe.vsidx b/AgroBase/.vs/AgroBase/FileContentIndex/63c6aa73-21ab-49be-bd3e-1d5771c18afe.vsidx new file mode 100644 index 000000000..7de122edb Binary files /dev/null and b/AgroBase/.vs/AgroBase/FileContentIndex/63c6aa73-21ab-49be-bd3e-1d5771c18afe.vsidx differ diff --git a/AgroBase/.vs/AgroBase/FileContentIndex/9b778fe5-4b6d-4c2f-8e2f-0c9e70f65bc5.vsidx b/AgroBase/.vs/AgroBase/FileContentIndex/9b778fe5-4b6d-4c2f-8e2f-0c9e70f65bc5.vsidx deleted file mode 100644 index 38daecf7c..000000000 Binary files a/AgroBase/.vs/AgroBase/FileContentIndex/9b778fe5-4b6d-4c2f-8e2f-0c9e70f65bc5.vsidx and /dev/null differ diff --git a/AgroBase/.vs/AgroBase/FileContentIndex/f498dcdb-f7a5-4092-903d-2f568f442f38.vsidx b/AgroBase/.vs/AgroBase/FileContentIndex/d06ecca4-86cb-4d3f-93c9-b3d958677279.vsidx similarity index 59% rename from AgroBase/.vs/AgroBase/FileContentIndex/f498dcdb-f7a5-4092-903d-2f568f442f38.vsidx rename to AgroBase/.vs/AgroBase/FileContentIndex/d06ecca4-86cb-4d3f-93c9-b3d958677279.vsidx index d759f26a2..f8d6ea46d 100644 Binary files a/AgroBase/.vs/AgroBase/FileContentIndex/f498dcdb-f7a5-4092-903d-2f568f442f38.vsidx and b/AgroBase/.vs/AgroBase/FileContentIndex/d06ecca4-86cb-4d3f-93c9-b3d958677279.vsidx differ diff --git a/AgroBase/.vs/AgroBase/v17/.suo b/AgroBase/.vs/AgroBase/v17/.suo index b1b3337f1..2f61a9937 100644 Binary files a/AgroBase/.vs/AgroBase/v17/.suo and b/AgroBase/.vs/AgroBase/v17/.suo differ diff --git a/AgroBase/AgroBase/AgroBase.csproj b/AgroBase/AgroBase/AgroBase.csproj index b75cf8151..10bfc1efe 100644 --- a/AgroBase/AgroBase/AgroBase.csproj +++ b/AgroBase/AgroBase/AgroBase.csproj @@ -461,6 +461,7 @@ + diff --git a/AgroBase/AgroBase/Forms/IHM/frmDialogoMapa.cs b/AgroBase/AgroBase/Forms/IHM/frmDialogoMapa.cs index baf49f537..d234c9b8c 100644 --- a/AgroBase/AgroBase/Forms/IHM/frmDialogoMapa.cs +++ b/AgroBase/AgroBase/Forms/IHM/frmDialogoMapa.cs @@ -54,7 +54,7 @@ namespace AgroBase.Forms.IHM ); if (res == DialogResult.Yes) { - Variaveis.OperacaoEmAndamento.FinalizarOperacao(); + await Variaveis.OperacaoEmAndamento.FinalizarOperacao(); if (Variaveis.OperacaoEmAndamento.Modo == Enums.ModoOperacao.Manual) { this.Close(); diff --git a/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.cs b/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.cs index 6dd4c410c..2a3e526b1 100644 --- a/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.cs +++ b/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoManual.cs @@ -84,12 +84,12 @@ namespace AgroBase.Forms.Operacoes private void frmOperacaoManual_FormClosing(object sender, FormClosingEventArgs e) { tmrLeitura.Dispose(); - Variaveis.OperacaoEmAndamento.FinalizarOperacao(); + Task.Run(async () => await Variaveis.OperacaoEmAndamento.FinalizarOperacao()); Variaveis.OperacaoEmAndamento.DesligarCameras(); KinectService.picRGB = null; } - private async void btnIniciarOperacao_Click(object sender, EventArgs e) + private void btnIniciarOperacao_Click(object sender, EventArgs e) { if (btnIniciarOperacao.Text == "Finalizar Operação") { @@ -101,7 +101,7 @@ namespace AgroBase.Forms.Operacoes }); // Executa a finalização da operação - Variaveis.OperacaoEmAndamento.FinalizarOperacao(); + Task.Run(async () => await Variaveis.OperacaoEmAndamento.FinalizarOperacao()); // Atualiza a UI novamente na thread principal btnIniciarOperacao.Invoke((MethodInvoker)delegate @@ -123,7 +123,7 @@ namespace AgroBase.Forms.Operacoes if (Variaveis.OperacaoEmAndamento.OperacaoLiberada) { // Inicia a operação de forma assíncrona - await Variaveis.OperacaoEmAndamento.IniciarOperacao(); + Task.Run(async () => await Variaveis.OperacaoEmAndamento.IniciarOperacao()); // Atualiza a UI após o início da operação btnIniciarOperacao.Invoke((MethodInvoker)delegate diff --git a/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoMapaGPS.cs b/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoMapaGPS.cs index aaa8bb597..4a05e4322 100644 --- a/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoMapaGPS.cs +++ b/AgroBase/AgroBase/Forms/Operacoes/frmOperacaoMapaGPS.cs @@ -47,7 +47,7 @@ namespace AgroBase.Forms.Operacoes private void frmOperacaoMapaGPS_FormClosing(object sender, FormClosingEventArgs e) { tmrLeituras.Dispose(); - Variaveis.OperacaoEmAndamento.FinalizarOperacao(); + Task.Run(async () => await Variaveis.OperacaoEmAndamento.FinalizarOperacao()); Variaveis.OperacaoEmAndamento.DesligarCameras(); } @@ -143,7 +143,7 @@ namespace AgroBase.Forms.Operacoes if (btnIniciarOperacao.Text == "Finalizar Operação") { - Variaveis.OperacaoEmAndamento.FinalizarOperacao(); + await Variaveis.OperacaoEmAndamento.FinalizarOperacao(); } else { diff --git a/AgroBase/AgroBase/Forms/Operacoes/frmResultadosOperacao.cs b/AgroBase/AgroBase/Forms/Operacoes/frmResultadosOperacao.cs index d5330a64c..690773df0 100644 --- a/AgroBase/AgroBase/Forms/Operacoes/frmResultadosOperacao.cs +++ b/AgroBase/AgroBase/Forms/Operacoes/frmResultadosOperacao.cs @@ -1565,7 +1565,7 @@ namespace AgroBase.Forms.Operacoes private void pnlOrientacaoDif_Paint(object sender, PaintEventArgs e) { var Logs = LogsOperacao.Where(x => x.Momento == MomentoAtual).ToList(); - double Angulo = Logs.Any() ? Logs.Average(x => x.AnguloDif) : 0; + double Angulo = Logs.Any() ? Logs.Average(x => x.Trajetoria.ErroOrientacaoAngularProximoPonto) : 0; FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)Angulo, 90); } diff --git a/AgroBase/AgroBase/Forms/frmPrincipal.cs b/AgroBase/AgroBase/Forms/frmPrincipal.cs index dfa01a28d..4e795740e 100644 --- a/AgroBase/AgroBase/Forms/frmPrincipal.cs +++ b/AgroBase/AgroBase/Forms/frmPrincipal.cs @@ -266,7 +266,7 @@ namespace AgroBase { if (Variaveis.OperacaoEmAndamento.Iniciado) { - Variaveis.OperacaoEmAndamento.FinalizarOperacao(); + Task.Run(async () => await Variaveis.OperacaoEmAndamento.FinalizarOperacao()); btnIniciarOperacao.Text = "Abrir Operação"; cmbModoOperacao.Enabled = true; diff --git a/AgroBase/AgroBase/Forms/frmSimulacaoMapaGPS.cs b/AgroBase/AgroBase/Forms/frmSimulacaoMapaGPS.cs index 137f087c5..bbcf09154 100644 --- a/AgroBase/AgroBase/Forms/frmSimulacaoMapaGPS.cs +++ b/AgroBase/AgroBase/Forms/frmSimulacaoMapaGPS.cs @@ -367,7 +367,7 @@ namespace AgroBase.Forms try { double angulo = Variaveis.OperacaoEmAndamento.SimulacaoAnguloControle; - double dif = Variaveis.OperacaoEmAndamento.OpMapaGPS.Sensoriamento.AnguloDif; + double dif = Variaveis.OperacaoEmAndamento.Sensoriamento.Trajetoria.ErroOrientacaoAngularProximoPonto; FuncoesGlobais.DesenharInclinacao((Panel)sender, e, (float)angulo, 90, (float)dif); } catch { } diff --git a/AgroBase/AgroBase/Models/GPSModel.cs b/AgroBase/AgroBase/Models/GPSModel.cs index 22647a707..9714f0441 100644 --- a/AgroBase/AgroBase/Models/GPSModel.cs +++ b/AgroBase/AgroBase/Models/GPSModel.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Globalization; +using System.Linq; using static AgroBase.Models.Enums; namespace AgroBase.Models @@ -404,6 +405,45 @@ namespace AgroBase.Models return decimalDegrees; } + public static double MisturarAngulosPorDistancia(double anguloFrente, double anguloMovimento, double distanciaMetros, double distanciaMaxima, double distanciaMinima = 0.05, double pesoMinFrente = 0.2) + { + // Se robô praticamente não se moveu, confia só na orientação + if (distanciaMetros < distanciaMinima) + return anguloFrente; + + double fator = Math.Min(distanciaMetros / distanciaMaxima, 1.0); + + double pesoFrente = (1.0 - fator) * (1.0 - pesoMinFrente) + pesoMinFrente; + + return MisturarAngulos(anguloFrente, anguloMovimento, pesoFrente); + } + + public static double MisturarAngulos(double angulo1, double angulo2, double pesoAngulo1 = 0.5) + { + // Converte os ângulos para vetores unitários no plano + double rad1 = angulo1 * Math.PI / 180.0; + double rad2 = angulo2 * Math.PI / 180.0; + + double x = Math.Cos(rad1) * pesoAngulo1 + Math.Cos(rad2) * (1.0 - pesoAngulo1); + double y = Math.Sin(rad1) * pesoAngulo1 + Math.Sin(rad2) * (1.0 - pesoAngulo1); + + double resultado = Math.Atan2(y, x) * 180.0 / Math.PI; + + return GPSUtils.NormalizarAngulo(resultado); + } + + public static (GPSModel ponto, int index) PontoMaisProximoTrechoComIndice(GPSModel pontoRef, List trecho) + { + if (trecho == null || trecho.Count == 0) + return (null, -1); + + var resultado = trecho + .Select((p, i) => (ponto: p, index: i, dist: DistanciaEntrePontos(pontoRef, p))) + .OrderBy(x => x.dist) + .First(); + + return (resultado.ponto, resultado.index); + } } diff --git a/AgroBase/AgroBase/Models/KalmanFilter.cs b/AgroBase/AgroBase/Models/KalmanFilter.cs index 54c7e7bcb..eabc0d6f6 100644 --- a/AgroBase/AgroBase/Models/KalmanFilter.cs +++ b/AgroBase/AgroBase/Models/KalmanFilter.cs @@ -37,5 +37,16 @@ _valorEstimado = novoValorEstimado; _erroEstimado = 1; } + + public KalmanFilter Clone() + { + return new KalmanFilter() + { + _erroEstimado = _erroEstimado, + _erroMedicao = _erroMedicao, + _erroProcesso = _erroProcesso, + _valorEstimado = _valorEstimado + }; + } } } diff --git a/AgroBase/AgroBase/Models/MPCControllerAprimorado.cs b/AgroBase/AgroBase/Models/MPCControllerAprimorado.cs new file mode 100644 index 000000000..c8da527d6 --- /dev/null +++ b/AgroBase/AgroBase/Models/MPCControllerAprimorado.cs @@ -0,0 +1,174 @@ +using AgroBase.Models; +using AgroBase.Services; +using System; +using System.Collections.Generic; +using System.Linq; + +public class MPCControllerAprimorado +{ + private double distanciaPrevisao = 2.0; + private int horizonte; + private double maxAnguloDirecao; + private double maxAngulo4Rodas; + private double velocidadeMin; + private double velocidadeMax; + + private double pesoOrientacao = 2.5; + private double pesoLateral = 1.5; + private double pesoDistancia = 0.8; + private double pesoSuavidade = 0.5; + private double limiteErroOrientacao = 45.0; + private double limiteErroLateral = 2.5; // metros + + private DateTime ultimaAtualizacao = DateTime.MinValue; + + public MPCControllerAprimorado() + { + this.maxAnguloDirecao = Variaveis.OperacaoEmAndamento?.Controle?.Angulo_Max ?? 30.0; + this.maxAngulo4Rodas = this.maxAnguloDirecao * 0.8; + this.velocidadeMin = Variaveis.OperacaoEmAndamento?.Controle?.PercentualVelocidadeMin ?? 20.0; + this.velocidadeMax = Variaveis.OperacaoEmAndamento?.Controle?.PercentualVelocidadeMax ?? 100.0; + } + + public (double anguloControle, Enums.TipoMovimentoDirecional modo) CalcularControle(GPSModel posicalAtual, double velocidadeAtual, List proximaTrajetoria, Enums.TipoMovimentoDirecional[] modosPermitidos) + { + if (proximaTrajetoria == null || proximaTrajetoria.Count < 2) + return (0, Enums.TipoMovimentoDirecional.RodasDianteiras); + + if (proximaTrajetoria.Count > 3) + { + proximaTrajetoria = new List(proximaTrajetoria.Take(3)); + } + + if (ultimaAtualizacao == DateTime.MinValue) + { + ultimaAtualizacao = DateTime.Now.AddMilliseconds(-(1.0 / GPSService.TaxaAmostragemHz)); + } + + double dt = (DateTime.Now - ultimaAtualizacao).TotalSeconds; + double tempoMax = (1.0 / GPSService.TaxaAmostragemHz) * 1.5; + dt = Math.Max(0.5, Math.Min(dt, tempoMax)); + + double velMs = FuncoesMatematicas.CalculaVelocidadeMsPercentual(velocidadeAtual); + double passoDist = velMs * dt; + + horizonte = Math.Min(Convert.ToInt32(distanciaPrevisao / passoDist), proximaTrajetoria.Count); + + var candidatos = GerarCandidatos(modosPermitidos); + double melhorCusto = double.MaxValue; + (double angulo, Enums.TipoMovimentoDirecional modo) melhorControle = (0, Enums.TipoMovimentoDirecional.RodasDianteiras); + + foreach (var candidato in candidatos) + { + double custo = SimularTrajetoriaComReavaliacao(posicalAtual, proximaTrajetoria, posicalAtual.AnguloCarroDefinido, candidato.angulo, candidato.modo, velMs, dt); + //Console.WriteLine($"Candidato: {candidato.angulo}, Custo: {custo.ToString()}"); + if (custo < melhorCusto) + { + melhorCusto = custo; + melhorControle = candidato; + } + } + + ultimaAtualizacao = DateTime.Now; + return melhorControle; + } + + private List<(double angulo, Enums.TipoMovimentoDirecional modo)> GerarCandidatos(Enums.TipoMovimentoDirecional[] modos) + { + var candidatos = new List<(double, Enums.TipoMovimentoDirecional)>(); + + foreach (var modo in modos) + { + double maxAng = (modo == Enums.TipoMovimentoDirecional.MovimentoArco || modo == Enums.TipoMovimentoDirecional.MovimentoDiagonal) + ? maxAngulo4Rodas : maxAnguloDirecao; + + for (double ang = -maxAng; ang <= maxAng; ang += 5.0) + { + candidatos.Add((ang, modo)); + } + } + + return candidatos; + } + + private double SimularTrajetoriaComReavaliacao(GPSModel posicaoInicial, List trajeto, double anguloInicial, double anguloControleInicial, Enums.TipoMovimentoDirecional modoInicial, double velocidadeMs, double dt) + { + double custoTotal = 0; + GPSModel posAtual = posicaoInicial; + double anguloAtual = anguloInicial; + double anguloControle = anguloControleInicial; + Enums.TipoMovimentoDirecional modo = modoInicial; + + posAtual = VariaveisEquipamento.SimularNovaPosicao(modoInicial, anguloControleInicial, velocidadeMs, dt, anguloAtual, posAtual); + anguloAtual = posAtual.OrientacaoReal; + + for (int i = 0; i < horizonte; i++) + { + double melhorCustoIteracao = double.MaxValue; + + foreach (var candidato in GerarCandidatos(new[] { modo })) + { + var novaPos = VariaveisEquipamento.SimularNovaPosicao(candidato.modo, candidato.angulo, velocidadeMs, dt, anguloAtual, posAtual); + var pontoAlvo = trajeto[Math.Min(i + 1, trajeto.Count - 1)]; + + double orientacaoAlvo = GPSUtils.CalcularOrientacao(posAtual, pontoAlvo); + + double d0 = GPSUtils.DistanciaEntrePontos(posAtual, novaPos); + double a0 = GPSUtils.CalcularOrientacao(posAtual, novaPos); + + double d1 = GPSUtils.DistanciaEntrePontos(posAtual, pontoAlvo); + double a1 = GPSUtils.CalcularOrientacao(posAtual, pontoAlvo); + + double d2 = GPSUtils.DistanciaEntrePontos(novaPos, pontoAlvo); + double a2 = GPSUtils.CalcularOrientacao(novaPos, pontoAlvo); + + double erroDist = d2 - d1; + double erroOri = Math.Abs(GPSUtils.CalcularDiferencaAngulo(novaPos.OrientacaoReal, orientacaoAlvo)); + + (GPSModel ponto, int idx) = GPSUtils.PontoMaisProximoTrechoComIndice(posAtual, trajeto); + int idxNovoPonto = Variaveis.OperacaoEmAndamento.Trajetoria.PontoAtual.idxPonto + idx; + PontoTrajetoriaModel pontoAtual = Variaveis.OperacaoEmAndamento.Trajetoria._TrajetoriaFixa[idxNovoPonto].Clone(); + + int idxRuaEsquerda = Variaveis.OperacaoEmAndamento.Trajetoria._Corredores[pontoAtual.idxCorredor].idxRuaEsquerda; + double distEsq = Variaveis.OperacaoEmAndamento.Trajetoria.CalcularDistanciaLateral(true, posAtual, idxRuaEsquerda, pontoAtual.Direcao); + + int idxRuaDireita = Variaveis.OperacaoEmAndamento.Trajetoria._Corredores[pontoAtual.idxCorredor].idxRuaDireita; + double distDir = Variaveis.OperacaoEmAndamento.Trajetoria.CalcularDistanciaLateral(false, posAtual, idxRuaDireita, pontoAtual.Direcao); + + double erroLat = Math.Abs(distEsq - distDir); + + double deltaAngulo = Math.Abs(GPSUtils.CalcularDiferencaAngulo(novaPos.OrientacaoReal, anguloAtual)); + + //Console.WriteLine($"Angulo Inicial: {anguloControleInicial}, Passo: {i}, Candidato: {candidato.angulo}, Erro lateral: {erroLat}, Erro orientacao: {erroOri}"); + + if (false && (erroOri > limiteErroOrientacao || erroLat > limiteErroLateral)) + { + continue; // Ignora este candidato + } + + double custo = (erroOri * pesoOrientacao) + (erroLat * pesoLateral) + (erroDist * pesoDistancia) + (deltaAngulo * pesoSuavidade); + + if (custo < melhorCustoIteracao) + { + melhorCustoIteracao = custo; + posAtual = novaPos; + anguloAtual = novaPos.OrientacaoReal; + anguloControle = candidato.angulo; + modo = candidato.modo; + + //Console.WriteLine($"Angulo Inicial: {anguloControleInicial}, Passo: {i}, Candidato: {candidato.angulo}, Custo: {custo}, Erro lateral: {erroLat}, Erro orientacao: {erroOri}, Erro distancia: {erroDist}"); + } + } + + custoTotal += melhorCustoIteracao; + + if (melhorCustoIteracao == double.MaxValue) + { + break; + } + } + + return custoTotal; + } + +} diff --git a/AgroBase/AgroBase/Models/Modules/MovimentacaoModel.cs b/AgroBase/AgroBase/Models/Modules/MovimentacaoModel.cs index a1ee4e0dc..4e9d5fdfd 100644 --- a/AgroBase/AgroBase/Models/Modules/MovimentacaoModel.cs +++ b/AgroBase/AgroBase/Models/Modules/MovimentacaoModel.cs @@ -414,7 +414,7 @@ namespace AgroBase.Models.Modules RPM_SP = Convert.ToInt32(RPM_SP * FatorCompensacaoCurvas); - Variaveis.OperacaoEmAndamento.SimulacaoRpmControle = (RPM_SP / VariaveisEquipamento.RelacaoRPM); + Variaveis.OperacaoEmAndamento.SimulacaoRpmControle = Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos.Average(x => x.MovMotor.RPM_SP) / VariaveisEquipamento.RelacaoRPM; switch (DirecaoAtual) { diff --git a/AgroBase/AgroBase/Models/Operacoes/OperacaoMapaGPSModel.cs b/AgroBase/AgroBase/Models/Operacoes/OperacaoMapaGPSModel.cs index ecf3cb879..32a0e4c63 100644 --- a/AgroBase/AgroBase/Models/Operacoes/OperacaoMapaGPSModel.cs +++ b/AgroBase/AgroBase/Models/Operacoes/OperacaoMapaGPSModel.cs @@ -37,16 +37,13 @@ namespace AgroBase.Models.Operacoes } case TiposControladorDirecional.MPC: { - var MPC = Controle.ControladorMPC; var Trajetoria = Variaveis.OperacaoEmAndamento.Trajetoria; - (double steeringAngle, Enums.TipoMovimentoDirecional mode) = MPC.ComputeControl( - GPSService.UltimaLeitura.Latitude, GPSService.UltimaLeitura.Longitude, Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.AnguloCarroDefinido, - Trajetoria.ProximoPonto.Posicao.Latitude, Trajetoria.ProximoPonto.Posicao.Longitude, Trajetoria.ProximoPonto.Orientacao, - Controle.PercentualVelocidadeSP, Trajetoria.DistanciaEsquerda, Trajetoria.DistanciaDireita, new List()); + var MPC_A = new MPCControllerAprimorado(); + (double angulo, TipoMovimentoDirecional tipoControle) = MPC_A.CalcularControle(GPSService.UltimaLeitura, Controle.PercentualVelocidadeSP, Trajetoria.TrajetoriaDinamica, new TipoMovimentoDirecional[] { TipoMovimentoDirecional.RodasDianteiras }); - Controle.Angulo = steeringAngle; - Controle.TipoMovimento = mode; + Controle.Angulo = angulo; + Controle.TipoMovimento = tipoControle; break; } } @@ -61,15 +58,17 @@ namespace AgroBase.Models.Operacoes private void DefinirTipoMovimento() { - var Trajetoria = Variaveis.OperacaoEmAndamento.Trajetoria; + var Trajetoria = Variaveis.OperacaoEmAndamento.Sensoriamento.Trajetoria; + var Controle = Variaveis.OperacaoEmAndamento.Controle; bool arcoNecessario = Trajetoria.ManobrandoEntreRuas || - Trajetoria.StatusAtual == StatusCarroMapa.SaindoRua || - Trajetoria.StatusAtual == StatusCarroMapa.EntrandoRua || - Math.Abs(Variaveis.OperacaoEmAndamento.OpMapaGPS.Sensoriamento.AnguloDif) >= Variaveis.OperacaoEmAndamento.Controle.Angulo_Max; + Trajetoria.StatusCarro == StatusCarroMapa.SaindoRua || + Trajetoria.StatusCarro == StatusCarroMapa.EntrandoRua || + (Trajetoria.CorredorAtual.Dentro && Math.Abs(Trajetoria.ErroOrientacaoAngularCaminho) >= Controle.Angulo_Max) || + (!Trajetoria.CorredorAtual.Dentro && Math.Abs(Trajetoria.ErroOrientacaoAngularProximoPonto) >= Controle.Angulo_Max); - Variaveis.OperacaoEmAndamento.Controle.TipoMovimento = + Controle.TipoMovimento = arcoNecessario ? TipoMovimentoDirecional.MovimentoArco : TipoMovimentoDirecional.RodasDianteiras; } @@ -79,35 +78,21 @@ namespace AgroBase.Models.Operacoes var _Trajetoria = Variaveis.OperacaoEmAndamento.Sensoriamento.Trajetoria; var _Controle = Variaveis.OperacaoEmAndamento.Controle; - double erroOrientacao = 0.0; - double anguloCamera = Variaveis.OperacaoEmAndamento.Sensoriamento.AnguloRuaCamera; - double anguloCarro = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.AnguloCarroDefinido; - double anguloRua = _Trajetoria.ProximoPonto.OrientacaoAtual; + bool consideraAnguloCorredor = + (_Trajetoria.CorredorAtual.Dentro && Math.Abs(_Trajetoria.ErroLateralAngular) < 30.0 && _Trajetoria.PontoAtual.Tipo != TipoPontoRua.BordaSaida) || + _Trajetoria.PontoAtual.Tipo == TipoPontoRua.BordaEntrada || + _Trajetoria.PontoAtual.Tipo == TipoPontoRua.LigacaoEntrada; - // Calcula a diferença de ângulo entre o carro e a rua - double diferencaAngulo = GPSUtils.CalcularDiferencaAngulo(anguloCarro, anguloRua); - - erroOrientacao = diferencaAngulo; - - Variaveis.OperacaoEmAndamento.OpMapaGPS.Sensoriamento.AnguloDif = erroOrientacao; - - // Calcule o erro lateral baseado nas distâncias entre as ruas do mapa atraves do GPS - double erroLateral = - !_Trajetoria.CorredorAtual.Dentro ? 0 : - (_Trajetoria.DistanciaEsquerda - _Trajetoria.DistanciaDireita); - - double distanciaProximoPonto = _Trajetoria.ProximoPonto.DistanciaAtual; - - double erroUltrassom = UltrasonicA05Helper.CalcularErroUltrassons(); - - double erroCombinado = CalcularErroCombinado(erroLateral, erroOrientacao, erroUltrassom, distanciaProximoPonto); - - AjustarGanhosPID(_Controle.PercentualVelocidadeSP); + double erroCombinado = + consideraAnguloCorredor ? _Trajetoria.ErroOrientacaoAngularCombinado : + _Trajetoria.ErroOrientacaoAngularProximoPonto; var PID = _Controle.PIDdirecional; - // Atualiza o PID com o erro combinado if (_Trajetoria.StatusCarro != StatusCarroMapa.Parado) { + // Atualiza o PID com o erro combinado + AjustarGanhosPID(_Controle); + PID.LimiteSaida = _Controle.Angulo_Max; PID.Atualizar(erroCombinado, 0); } @@ -122,79 +107,23 @@ namespace AgroBase.Models.Operacoes _Controle.Angulo = correcaoAngulo; } - private double CalcularErroCombinado(double erroLateral, double erroOrientacao, double erroUltrassons, double distanciaProximoPonto) + private void AjustarGanhosPID(OperacaoControleModel Controle) { - bool carroDentroRua = Variaveis.OperacaoEmAndamento.Sensoriamento.Trajetoria.CorredorAtual.Dentro; - bool naMargeRua = Variaveis.OperacaoEmAndamento.Sensoriamento.Trajetoria.NaMargemDoCorredor; + var PID = Controle.PIDdirecional; + double velocidadePercnt = (Controle.PercentualVelocidadeMax - Controle.PercentualVelocidadeMin) * Controle.PercentualVelocidadeSP / 100.0; - // Quando o robô está dentro do corredor, queremos priorizar a centralização primeiro - double pesoLateral; - double pesoOrientacao; - double pesoUltrassons = 0; // Por enquanto, ultrassons desativados + double v = FuncoesMatematicas.Clamp(velocidadePercnt / 100.0, 0.0, 1.0); - // Converte erro lateral (metros) para graus - double erroLateralEmGraus = Math.Atan2(erroLateral, distanciaProximoPonto) * (180.0 / Math.PI); + // 🔹 Kp reduz suavemente com o quadrado da velocidade (menos agressivo em alta) + PID.Kp = PID.KpBase * (1.0 - 0.4 * Math.Pow(v, 2)); - if (carroDentroRua) - { - // Normaliza os erros para um intervalo entre 0 e 1 - double erroOrientacaoNormalizado = Math.Min(Math.Abs(erroOrientacao) / 5.0, 1.0); // Assume 10° como erro máximo + // 🔹 Ki cai mais rápido e zera a partir de 60% + PID.Ki = v >= 0.6 ? 0.0 : PID.KiBase * (1.0 - Math.Pow(v, 1.5)); - // Usa a mesma regra de peso dinâmica - pesoOrientacao = Math.Max(0.3, erroOrientacaoNormalizado); // Quanto maior o erro de orientação, maior seu peso + // 🔹 Kd cresce suavemente (forte amortecimento em alta velocidade) + PID.Kd = PID.KdBase * (1.0 + 1.2 * Math.Pow(v, 1.2)); - pesoOrientacao = 1.0; - pesoLateral = 1.0 - pesoOrientacao; // Quanto menor o erro de orientação, maior o peso lateral - } - else - { - // Quando está fora do corredor, prioriza a orientação - pesoLateral = 0; - pesoOrientacao = 1; - } - - // Garante que os pesos somem exatamente 1 - pesoUltrassons = Math.Max(0, 1 - pesoLateral - pesoOrientacao); - - // Calcula o erro combinado ponderado pelos pesos - double erroCombinado = - (erroOrientacao * pesoOrientacao) + - (erroLateralEmGraus * pesoLateral) + - (erroUltrassons * pesoUltrassons); - - return erroCombinado; - } - - /*private void AjustarGanhosPID(double velocidadePercnt) - { - var PID = Variaveis.OperacaoEmAndamento.Controle.PIDdirecional; - - // Fração da velocidade atual em relação à velocidade máxima (0 a 1) - double fatorVelocidade = Math.Min(velocidadePercnt / 100.0, 1.0); - - // Ajuste dinâmico dos ganhos PID com curva exponencial para Kp e Kd - PID.Kp = PID.KpBase - (0.5 * Math.Pow(fatorVelocidade, 2)); // Reduz Kp mais agressivamente em altas velocidades - PID.Ki = fatorVelocidade > 0.8 ? 0.0 : PID.KiBase - (0.01 * fatorVelocidade); // Desativa Ki em altas velocidades - PID.Kd = PID.KdBase + (0.05 * Math.Pow(fatorVelocidade, 2)); // Aumenta Kd exponencialmente para amortecer oscilações - }*/ - - private void AjustarGanhosPID(double velocidadePercnt) - { - var PID = Variaveis.OperacaoEmAndamento.Controle.PIDdirecional; - - double fatorVelocidade = Math.Min(velocidadePercnt / 100.0, 1.0); - - // 🔹 Redução mais suave de Kp - PID.Kp = PID.KpBase - (0.4 * Math.Pow(fatorVelocidade, 1.5)); // Ajuste menos agressivo - - // 🔹 Redução mais controlada do Ki - PID.Ki = fatorVelocidade > 0.7 ? 0.0 : PID.KiBase - (0.005 * fatorVelocidade); // Ki desativa mais cedo - - // 🔹 Aumento um pouco mais forte do Kd - PID.Kd = PID.KdBase + (0.07 * Math.Pow(fatorVelocidade, 2)); // Amortecimento mais forte - - // 🔹 Log opcional para monitorar ajustes (remover depois de testes) - Console.WriteLine($"PID Ajustado: Kp={PID.Kp:F3}, Ki={PID.Ki:F3}, Kd={PID.Kd:F3}"); + Console.WriteLine($"[PID ADAPT] Vel={velocidadePercnt:F1}% | Kp={PID.Kp:F3}, Ki={PID.Ki:F3}, Kd={PID.Kd:F3}"); } @@ -214,11 +143,10 @@ namespace AgroBase.Models.Operacoes if (Variaveis.OperacaoEmAndamento.StatusAtual != StatusOperacao.EmAndamento) { Controle.PercentualVelocidadeSP = 0; + Controle.FiltroVelocidade.Reset(Controle.PercentualVelocidadeSP); return; } - Controle.PercentualVelocidadeSP = CalcularVelocidadeRelativa(Controle); - switch (Variaveis.OperacaoEmAndamento.Trajetoria.StatusAtual) { case StatusCarroMapa.Parado: @@ -232,7 +160,11 @@ namespace AgroBase.Models.Operacoes bool DesvioSonar = (KinectService.Iniciado && Variaveis.OperacaoEmAndamento.Sensoriamento.SonarFrontal_Kinect.DesvioNecessario); if (Manobrando || DesvioSonar) { - Controle.PercentualVelocidadeSP = Math.Min(20.0, Controle.PercentualVelocidadeMin); + Controle.PercentualVelocidadeSP = Controle.PercentualVelocidadeMin; + } + else + { + Controle.PercentualVelocidadeSP = CalcularVelocidadeRelativa(Controle); } break; } @@ -252,6 +184,10 @@ namespace AgroBase.Models.Operacoes { Controle.PercentualVelocidadeSP = Controle.PercentualVelocidadeMin; } + else + { + Controle.PercentualVelocidadeSP = CalcularVelocidadeRelativa(Controle); + } break; } case StatusCarroMapa.Manobrando: @@ -260,42 +196,41 @@ namespace AgroBase.Models.Operacoes break; } } + + Controle.PercentualVelocidadeSP = Math.Max(Controle.PercentualVelocidadeMin, Controle.PercentualVelocidadeSP); + Controle.PercentualVelocidadeSP = Math.Min(Controle.PercentualVelocidadeMax, Controle.PercentualVelocidadeSP); + + if (Controle.PercentualVelocidadeSP == Controle.PercentualVelocidadeMin) + { + Controle.FiltroVelocidade.Reset(Controle.PercentualVelocidadeSP); + } + + Console.WriteLine($"Velocidade SP: {Controle.PercentualVelocidadeSP}, ms: {FuncoesMatematicas.CalculaVelocidadeMsPercentual(Controle.PercentualVelocidadeSP)}, km/h: {FuncoesMatematicas.ConverteMsParaKmh(FuncoesMatematicas.CalculaVelocidadeMsPercentual(Controle.PercentualVelocidadeSP))}"); + + //double velocidadeFiltrada = Controle.FiltroVelocidade.Filtrar(Controle.PercentualVelocidadeSP); + //Controle.PercentualVelocidadeSP = Math.Max(Controle.PercentualVelocidadeMin, velocidadeFiltrada); } private double CalcularVelocidadeRelativa(OperacaoControleModel Controle) { - double limiteAnguloMax = Controle.Angulo_Max; // Ângulo máximo permitido (ex.: 30 graus) - double anguloAtual = Math.Abs(Controle.Angulo); // Ângulo de controle atual em módulo - double percentualReduzido = anguloAtual / limiteAnguloMax; // Percentual do ângulo de controle usado (0 a 1) + double erroCombinado = Variaveis.OperacaoEmAndamento.Sensoriamento.Trajetoria.ErroOrientacaoAngularCombinado; - // Obtém os ângulos do carro e da rua - double anguloCarro = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps.AnguloCarroDefinido; - double anguloCorredor = Variaveis.OperacaoEmAndamento.Trajetoria.AnguloMedioCorredor; + // Converte erro para uma penalização de velocidade (até 1.5x mais severa em curvas) + double severidade = Math.Min(Math.Abs(erroCombinado) / 30.0, 1.0); // Normaliza até 30° + double penalidade = severidade * 0.85; // até 85% de penalização - // **Erro de orientação agora é a diferença real entre os ângulos** - double erroOrientacao = Math.Abs(anguloCarro - anguloCorredor); // Diferenca real de ângulos - erroOrientacao = Math.Min(erroOrientacao, 30.0); // Limita a 90° para normalização + // Calcula velocidade proporcional + double faixaVel = Controle.PercentualVelocidadeMax - Controle.PercentualVelocidadeMin; + double velocidadeFinal = Controle.PercentualVelocidadeMax - (faixaVel * penalidade); - // **Peso dinâmico baseado no desalinhamento** - // Se o erro for grande, reduz mais a velocidade. Se for pequeno, mantém velocidade alta - double pesoErro = erroOrientacao / 30.0; // Normaliza erro para 0 (perfeito) a 1 (erro de 90°) + double velocidadeRelativa = Math.Round(Math.Max(Controle.PercentualVelocidadeMin, velocidadeFinal), 2); - // **Ajusta a influência do ângulo de controle na velocidade** - double pesoAnguloControle = 1 - pesoErro; // Quanto maior o erro, menor a influência do ângulo de controle + double velocidadeFiltrada = Controle.FiltroVelocidade.Filtrar(velocidadeRelativa); - // **Redução dinâmica da velocidade baseada no desalinhamento** - double reducaoPorErroOrientacao = pesoErro * 0.8; // Quanto maior o erro, maior a penalização (ajustável) - - // **Calcula a velocidade proporcional combinando os dois efeitos com pesos dinâmicos** - double percentualVelocidadeRelativo = Controle.PercentualVelocidadeMin + - (1 - (pesoAnguloControle * percentualReduzido) - reducaoPorErroOrientacao) * (Controle.PercentualVelocidadeMax - Controle.PercentualVelocidadeMin); - - // **Garante que a velocidade fique dentro dos limites aceitáveis (0 a 100%)** - percentualVelocidadeRelativo = Math.Round(Math.Max(Controle.PercentualVelocidadeMin, Math.Min(Controle.PercentualVelocidadeMax, percentualVelocidadeRelativo)), 2); - - return percentualVelocidadeRelativo; + return velocidadeFiltrada; } + #endregion #region ATUADOR @@ -325,7 +260,6 @@ namespace AgroBase.Models.Operacoes public int ErvasNoRadar { get; set; } = 0; public double HerbicidaConsumido { get; set; } = 0; public double HerbicidaPorErva { get; set; } = 0; - public double AnguloDif { get; set; } = 0; public double AnguloRuaCamera { get; set; } = 0; public int ErvasIdentificadas { @@ -347,7 +281,6 @@ namespace AgroBase.Models.Operacoes ErvasNoRadar = 0; HerbicidaConsumido = 0; HerbicidaPorErva = 0; - AnguloDif = 0; AtuacoesPorBico = new List>(); if (Variaveis.OperacaoEmAndamento.DispAtu != null) diff --git a/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs b/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs index 4994882bc..09fbbe108 100644 --- a/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs +++ b/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs @@ -104,7 +104,7 @@ namespace AgroBase.Models { if (Variaveis.OperacaoEmAndamento.Iniciado && !Variaveis.OperacaoEmAndamento.Finalizando) { - Variaveis.OperacaoEmAndamento.FinalizarOperacao(); + Task.Run(async () => await Variaveis.OperacaoEmAndamento.FinalizarOperacao()); } } // Se a operação tiver algum item mandatório interrompido @@ -386,6 +386,7 @@ namespace AgroBase.Models Direcao = Direcao.Parado, PercentualVelocidadeSP = 0, PIDdirecional = new PIDModel(), + FiltroVelocidade = new KalmanFilter(), TiposControle = Variaveis.OperacaoEmAndamento.Controle.TiposControle.ToList(), SonarAtivado = Parametros.SonarAtivado, SegmentacaoSemantica = Parametros.Modo == ModoOperacao.MapaGPS, @@ -795,6 +796,7 @@ namespace AgroBase.Models LimiteSaida = Controle.Angulo_Max, SetPoint = 0 }; + Controle.FiltroVelocidade = new KalmanFilter(erroMedicao: 2.0, erroProcesso: 0.05); Controle.ControladorMPC = new MPCController(); } @@ -819,12 +821,21 @@ namespace AgroBase.Models } } - public void FinalizarOperacao() + public async Task FinalizarOperacao() { + if (Variaveis.OperacaoEmAndamento.Finalizando) + { + return; + } + Variaveis.OperacaoEmAndamento.Finalizando = true; PararCarroOperacaoInterrompida(true); + Variaveis.OperacaoEmAndamento.Trajetoria.LoopAtualizaDados(); + + await Task.Delay(2000); + Variaveis.OperacaoEmAndamento.Iniciado = false; Variaveis.OperacaoEmAndamento.DataFim = DateTime.Now; @@ -917,6 +928,7 @@ namespace AgroBase.Models LimiteSaida = Controle.Angulo_Max, SetPoint = 0 }; + Controle.FiltroVelocidade = new KalmanFilter(erroMedicao: 2.0, erroProcesso: 0.05); Controle.ControladorMPC = new MPCController(); } @@ -930,8 +942,10 @@ namespace AgroBase.Models { Variaveis.OperacaoEmAndamento.StatusAtual = StatusOperacao.Parametrizando; Variaveis.OperacaoEmAndamento.Iniciado = false; + Variaveis.OperacaoEmAndamento.Simulando = false; Variaveis.OperacaoEmAndamento.Mapa = new MapasModel(); Variaveis.OperacaoEmAndamento.Trajetoria = new TrajetoriaMapaOperacaoModel(new List>()); + Variaveis.OperacaoEmAndamento.GPSTrajetoria = new List(); var Topico = Variaveis.MqttService.Topicos.FirstOrDefault(x => x.Topico == MapasVariaveisModel.TopicoSelecaoRuasMapa); Topico.Mensagens.Add(new MqttService.MqttTopicosMensagensModel() @@ -975,6 +989,7 @@ namespace AgroBase.Models LimiteSaida = Controle.Angulo_Max, SetPoint = 0 }; + Controle.FiltroVelocidade = new KalmanFilter(erroMedicao: 2.0, erroProcesso: 0.05); } Controle.Angulo = 0; @@ -2815,6 +2830,7 @@ namespace AgroBase.Models public TiposControladorDirecional TipoControleDirecional { get; set; } = TiposControladorDirecional.PID; public PIDModel PIDdirecional { get; set; } = new PIDModel(); + public KalmanFilter FiltroVelocidade { get; set; } = new KalmanFilter(); public MPCController ControladorMPC { get; set; } = new MPCController(); public OperacaoControleModel Clone() @@ -2829,6 +2845,7 @@ namespace AgroBase.Models PercentualInicioPulverizacao = PercentualInicioPulverizacao, PercentualVelocidadeSP = PercentualVelocidadeSP, PIDdirecional = PIDdirecional.Clone(), + FiltroVelocidade = FiltroVelocidade.Clone(), PressaoLinha = PressaoLinha, PulverizadorAutomatico = PulverizadorAutomatico, RPM_Max = RPM_Max, @@ -2918,7 +2935,6 @@ namespace AgroBase.Models } public double AnguloRuaCamera { get; set; } = 0; - public double AnguloDif { get; set; } = 0; public OperacaoSensoriamentoLogAtuModel Atuador { get; set; } public OperacaoSensoriamentoLogMvdModel Movimentacao { get; set; } @@ -2998,15 +3014,22 @@ namespace AgroBase.Models CorredorAtual = _Trajetoria?.CorredorAtual?.Clone(false) ?? new CorredorTrajetoriaModel(), DirecaoCaminho = _Trajetoria?.DirecaoCaminho ?? DirecaoCarroRua.Parado, AnguloCaminho = _Trajetoria?.AnguloCaminho ?? 0, + AnguloMedioCorredor = _Trajetoria?.AnguloMedioCorredor ?? 0, DistanciaTotal = _Trajetoria?.DistanciaTotal ?? 0, DistanciaPercorrida = _Trajetoria?.DistanciaPercorrida ?? 0, DistanciaRestante = _Trajetoria?.DistanciaRestante ?? 0, NaMargemDoCorredor = _Trajetoria?.NaMargemDoCorredor ?? false, + ManobrandoEntreRuas = _Trajetoria?.ManobrandoEntreRuas ?? false, TempoEstimadoRestante = _Trajetoria?.TempoEstimadoRestante ?? "", TempoEstimadoOperacao = _Trajetoria?.TempoEstimadoOperacao ?? "", ProximoPonto = _Trajetoria?.ProximoPonto?.Clone() ?? new PontoTrajetoriaModel(TipoPontoRua.PosicaoRobo), PontoMaisProximo = _Trajetoria?.PontoMaisProximo?.Clone() ?? new PontoTrajetoriaModel(TipoPontoRua.PosicaoRobo), - PontoAtual = _Trajetoria?.PontoAtual?.Clone() ?? new PontoTrajetoriaModel(TipoPontoRua.PosicaoRobo) + PontoAtual = _Trajetoria?.PontoAtual?.Clone() ?? new PontoTrajetoriaModel(TipoPontoRua.PosicaoRobo), + ErroLateralAngular = _Trajetoria?.ErroLateralAngular ?? 0, + ErroOrientacaoAngular = _Trajetoria?.ErroOrientacaoAngular ?? 0, + ErroOrientacaoAngularCombinado = _Trajetoria?.ErroOrientacaoAngularCombinado ?? 0, + ErroOrientacaoAngularCaminho = _Trajetoria?.ErroOrientacaoAngularCaminho ?? 0, + ErroOrientacaoAngularProximoPonto = _Trajetoria?.ErroOrientacaoAngularProximoPonto ?? 0 }; var dadosGps = GPSService.UltimaLeitura.Clone(); @@ -3029,7 +3052,6 @@ namespace AgroBase.Models DataFim = Variaveis.OperacaoEmAndamento.DataFim, TempoDecorridoSeg = Variaveis.OperacaoEmAndamento.TempoDecorridoSegs, - AnguloDif = _OpMapaGPS.Sensoriamento.AnguloDif, AnguloRuaCamera = Variaveis.OperacaoEmAndamento.CameraCaminho?.Angulo ?? 0, Atuador = dadosAtuador, @@ -3057,7 +3079,6 @@ namespace AgroBase.Models DataInicio = DataInicio, DataFim = DataFim, TempoDecorridoSeg = TempoDecorridoSeg, - AnguloDif = AnguloDif, AnguloRuaCamera = AnguloRuaCamera, Atuador = Atuador.Clone(), Movimentacao = Movimentacao.Clone(), @@ -3173,6 +3194,7 @@ namespace AgroBase.Models public StatusCarroMapa StatusCarro { get; set; } public double ProgressoTrajeto { get; set; } public double AnguloCaminho { get; set; } + public double AnguloMedioCorredor { get; set; } public DirecaoCarroRua DirecaoCaminho { get; set; } public CorredorTrajetoriaModel CorredorAtual { get; set; } public double DistanciaEsquerda { get; set; } @@ -3181,18 +3203,26 @@ namespace AgroBase.Models public double DistanciaPercorrida { get; set; } public double DistanciaRestante { get; set; } public bool NaMargemDoCorredor { get; set; } + public bool ManobrandoEntreRuas { get; set; } public string TempoEstimadoRestante { get; set; } public string TempoEstimadoOperacao { get; set; } public PontoTrajetoriaModel ProximoPonto { get; set; } public PontoTrajetoriaModel PontoAtual { get; set; } public PontoTrajetoriaModel PontoMaisProximo { get; set; } + public double ErroOrientacaoAngular { get; set; } + public double ErroOrientacaoAngularCombinado { get; set; } + public double ErroOrientacaoAngularCaminho { get; set; } + public double ErroOrientacaoAngularProximoPonto { get; set; } + public double ErroLateralAngular { get; set; } + public OperacaoSensoriamentoLogTrajetoriaModel Clone() { return new OperacaoSensoriamentoLogTrajetoriaModel() { StatusCarro = StatusCarro, AnguloCaminho = AnguloCaminho, + AnguloMedioCorredor = AnguloMedioCorredor, DirecaoCaminho = DirecaoCaminho, DistanciaDireita = DistanciaDireita, DistanciaEsquerda = DistanciaEsquerda, @@ -3202,8 +3232,14 @@ namespace AgroBase.Models DistanciaPercorrida = DistanciaPercorrida, DistanciaRestante = DistanciaRestante, NaMargemDoCorredor = NaMargemDoCorredor, + ManobrandoEntreRuas = ManobrandoEntreRuas, TempoEstimadoRestante = TempoEstimadoRestante, TempoEstimadoOperacao = TempoEstimadoOperacao, + ErroLateralAngular = ErroLateralAngular, + ErroOrientacaoAngularCombinado = ErroOrientacaoAngularCombinado, + ErroOrientacaoAngular = ErroOrientacaoAngular, + ErroOrientacaoAngularCaminho = ErroOrientacaoAngularCaminho, + ErroOrientacaoAngularProximoPonto = ErroOrientacaoAngularProximoPonto, ProximoPonto = ProximoPonto.Clone(), PontoAtual = PontoAtual.Clone(), PontoMaisProximo = PontoMaisProximo.Clone(), diff --git a/AgroBase/AgroBase/Models/TrajetoriaMapaOperacaoModel.cs b/AgroBase/AgroBase/Models/TrajetoriaMapaOperacaoModel.cs index 35e11ec5c..9d40cb5d2 100644 --- a/AgroBase/AgroBase/Models/TrajetoriaMapaOperacaoModel.cs +++ b/AgroBase/AgroBase/Models/TrajetoriaMapaOperacaoModel.cs @@ -120,7 +120,7 @@ namespace AgroBase.Models { Posicao = GPSService.UltimaLeitura, LarguraCorredor = 1.0, - idxCorredor = CorredorAtual.Idx, + idxCorredor = CorredorAtual?.Idx ?? 0, Visitado = true } }; @@ -208,8 +208,8 @@ namespace AgroBase.Models public double AnguloCaminho { get; private set; } private void AtualizarAnguloCaminho() { - GPSModel pontoComparar = ProximoPonto != null ? ProximoPonto.Posicao : PontoAtual.Posicao; - AnguloCaminho = GPSUtils.CalcularOrientacao(GPSService.UltimaLeitura, pontoComparar); + PontoTrajetoriaModel pontoComparar = PontoAtual.Aproximando ? PontoAtual : ProximoPonto != null ? ProximoPonto : PontoAtual; + AnguloCaminho = GPSUtils.CalcularOrientacao(GPSService.UltimaLeitura, pontoComparar.Posicao); } [JsonProperty] public double DistanciaEsquerda { get; private set; } @@ -217,39 +217,66 @@ namespace AgroBase.Models public double DistanciaDireita { get; private set; } private void AtualizarDistanciasLaterais() { - DistanciaEsquerda = CalcularDistanciaLateral(true); - DistanciaDireita = CalcularDistanciaLateral(false); + DistanciaEsquerda = CalcularDistanciaLateral(true, GPSService.UltimaLeitura, CorredorAtual.idxRuaEsquerda, PontoAtual.Direcao); + DistanciaDireita = CalcularDistanciaLateral(false, GPSService.UltimaLeitura, CorredorAtual.idxRuaDireita, PontoAtual.Direcao); } - private double CalcularDistanciaLateral(bool ladoEsquerdo) + public double CalcularDistanciaLateral(bool ladoEsquerdo, GPSModel posicaoAtual, int idxRua, DirecaoCarroRua direcaoAtual) { // Verifica se o corredor atual existe if (!_CorredorAtualDefinido) return 0; - var rua = ladoEsquerdo ? new List(RuasPlantacao[CorredorAtual.idxRuaEsquerda]) : new List(RuasPlantacao[CorredorAtual.idxRuaDireita]); + List rua = new List(RuasPlantacao[idxRua]); - double anguloAprojetar = GPSUtils.CalcularOrientacao(rua[rua.Count - 1], rua[0]); - double anguloBprojetar = GPSUtils.CalcularOrientacao(rua[0], rua[rua.Count - 1]); - GPSModel pontoA = GPSUtils.GerarPontoDeslocado(rua[0], anguloAprojetar, 10); - GPSModel pontoB = GPSUtils.GerarPontoDeslocado(rua[rua.Count - 1], anguloBprojetar, 10); + double d0 = double.MaxValue; + int idx = -1; + for (int i = 0; i < rua.Count; i++) + { + double dist = GPSUtils.DistanciaEntrePontos(posicaoAtual, rua[i]); + if (dist < d0) + { + d0 = dist; + idx = i; + } + else + { + break; + } + } - rua.Insert(0, pontoA); - rua.Add(pontoB); + GPSModel p0 = rua[idx - (idx > 0 ? 1 : 0)]; + GPSModel p1 = rua[idx + (idx < (rua.Count - 1) ? 1 : 0)]; + int idxPa = rua.IndexOf(p0); + int idxPb = rua.IndexOf(p1); + double anguloAprojetar = GPSUtils.CalcularOrientacao(rua[idxPb], rua[idxPa]); + double anguloBprojetar = GPSUtils.CalcularOrientacao(rua[idxPa], rua[idxPb]); + + GPSModel pontoA = GPSUtils.GerarPontoDeslocado(rua[idxPa], anguloAprojetar, DistanciaManobraEntreRuas); + GPSModel pontoB = GPSUtils.GerarPontoDeslocado(rua[idxPb], anguloBprojetar, DistanciaManobraEntreRuas); + + List novaRua = new List(); + novaRua.Add(pontoA); + for (int i = idxPa; i <= idxPb; i++) + { + novaRua.Add(rua[i]); + } + novaRua.Add(pontoB); + + rua = novaRua; int qtdPontosRua = Convert.ToInt32(GPSUtils.DistanciaDoTrecho(rua)); rua = GPSUtils.InterpolarRota(rua, qtdPontosRua); - double d = GPSUtils.DistanciaDoTrecho(rua); // Calcula a menor distância entre o robô e a rua - double distancia = GPSUtils.CalcularMenorDistanciaAteTrecho(GPSService.UltimaLeitura, rua); + double distancia = GPSUtils.CalcularMenorDistanciaAteTrecho(posicaoAtual, rua); // Calcula o vetor entre os pontos da rua e o vetor entre o ponto A e o GPS double crossProduct = - (pontoB.Longitude - pontoA.Longitude) * (GPSService.UltimaLeitura.Latitude - pontoA.Latitude) - - (pontoB.Latitude - pontoA.Latitude) * (GPSService.UltimaLeitura.Longitude - pontoA.Longitude); + (pontoB.Longitude - pontoA.Longitude) * (posicaoAtual.Latitude - pontoA.Latitude) - + (pontoB.Latitude - pontoA.Latitude) * (posicaoAtual.Longitude - pontoA.Longitude); // Ajusta a distância com base no sentido de deslocamento do robô - if ((PontoAtual.Direcao == DirecaoCarroRua.Volta && ladoEsquerdo) || (PontoAtual.Direcao == DirecaoCarroRua.Ida && !ladoEsquerdo)) + if ((direcaoAtual == DirecaoCarroRua.Volta && ladoEsquerdo) || (direcaoAtual == DirecaoCarroRua.Ida && !ladoEsquerdo)) { distancia *= crossProduct > 0 ? 1 : -1; } @@ -378,7 +405,7 @@ namespace AgroBase.Models private void AtualizarStatusAtual() { StatusAtual = StatusCarroMapa.Parado; - if (ProximoPonto != null && CorredorAtual != null) + if (ProximoPonto != null && CorredorAtual != null && Variaveis.OperacaoEmAndamento.StatusAtual == StatusOperacao.EmAndamento) { if (!CorredorAtual.Dentro && ProximoPonto.DistanciaAtual > DistanciaManobraEntreRuas) { @@ -480,6 +507,63 @@ namespace AgroBase.Models TempoEstimadoRestante = totalRestante.ToString("HH:mm:ss"); } + [JsonProperty] + public double ErroOrientacaoAngular { get; private set; } + [JsonProperty] + public double ErroOrientacaoAngularCombinado { get; private set; } + [JsonProperty] + public double ErroOrientacaoAngularCaminho { get; private set; } + [JsonProperty] + public double ErroOrientacaoAngularProximoPonto { get; private set; } + [JsonProperty] + public double ErroLateralAngular { get; private set; } + + private void AtualizarErroCombinado() + { + var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento; + + double anguloCamera = _Sensoriamento.AnguloRuaCamera; + double anguloCorredor = AnguloMedioCorredor; + double anguloProximoPonto = AnguloCaminho; + double anguloCarro = _Sensoriamento.Gps.AnguloCarroDefinido; + + // Erro 1: Direção para onde o robô deve ir (centro do corredor) + double erroIrParaCentro = GPSUtils.CalcularDiferencaAngulo(anguloCarro, anguloProximoPonto); + + // Erro 2: Quanto o robô está desalinhado da orientação da rua + double desalinhamentoComRua = GPSUtils.CalcularDiferencaAngulo(anguloCarro, anguloCorredor); + + // Erro 3 (secundário): Diferença entre o ângulo do corredor e o ponto (curva futura) + double curvaDaRua = GPSUtils.CalcularDiferencaAngulo(anguloProximoPonto, anguloCorredor); + + // Peso do desalinhamento atual (prioriza alinhar o robô ao corredor) + double pesoAlinhamento = Math.Min(Math.Abs(desalinhamentoComRua) / 30.0, 1.0); // Normaliza até 30° + + // Peso do centro (prioriza ir pro ponto central do corredor) + double pesoCentro = 1.0 - pesoAlinhamento; + + // Peso extra para curvas mais fechadas + double boostCurva = 1.0 + (Math.Abs(curvaDaRua) / 45.0); // aumenta peso em curvas + + // Calcule o erro lateral baseado nas distâncias entre as ruas do mapa atraves do GPS + double erroLateral = !(CorredorAtual?.Dentro ?? false) ? 0 : (DistanciaEsquerda - DistanciaDireita); + double distanciaProximoPonto = ProximoPonto.DistanciaAtual; + double erroLateralGraus = Math.Atan2(erroLateral, distanciaProximoPonto) * (180.0 / Math.PI); + + // Calcule o erro do ultrassom + double erroUltrassom = UltrasonicA05Helper.CalcularErroUltrassons(); + + // Combina os erros com pesos dinâmicos + double erroCombinado = (erroIrParaCentro * pesoCentro) + (desalinhamentoComRua * pesoAlinhamento); + + + ErroOrientacaoAngularProximoPonto = erroIrParaCentro; + ErroOrientacaoAngularCaminho = desalinhamentoComRua; + ErroOrientacaoAngular = curvaDaRua; + ErroOrientacaoAngularCombinado = erroCombinado * boostCurva; + ErroLateralAngular = erroLateralGraus; + } + private void MarcarPontosIntermediariosNaoVisitados() { if (!_TrajetoriaFixaDefinida) return; @@ -532,6 +616,8 @@ namespace AgroBase.Models AtualizarPercentualTrajetoria(); AtualizarTempoEstimado(); + AtualizarErroCombinado(); + AtualizarTrajetoriaDinamica(); } @@ -787,7 +873,7 @@ namespace AgroBase.Models PontoTrajetoriaModel PontoRobo = new PontoTrajetoriaModel(TipoPontoRua.PosicaoRobo) { idxCorredor = 0, - idxPonto = _trajetoriaFixa.Count(), + idxPonto = 0, idxPontoCorredor = 0, Posicao = GPSService.UltimaLeitura, Direcao = direcaoAtual, @@ -809,7 +895,9 @@ namespace AgroBase.Models if (_trajetoriaFixa.Count() > 1 && idxEsq == 0 && idxDir == 0) { - (List ruaEsq, List ruaDir) = DeterminarRuasLaterais(_trajetoriaFixa[1].Posicao, _trajetoriaFixa[2].Posicao, RuasPlantacao[0], RuasPlantacao[1]); + var p0 = _trajetoriaFixa.Where(x => x.Tipo == TipoPontoRua.Rua).Skip(2).FirstOrDefault(); + var p1 = _trajetoriaFixa.Where(x => x.Tipo == TipoPontoRua.Rua).Skip(3).FirstOrDefault(); + (List ruaEsq, List ruaDir) = DeterminarRuasLaterais(p0.Posicao, p1.Posicao, RuasPlantacao[0], RuasPlantacao[1]); idxEsq = RuasPlantacao.IndexOf(ruaEsq); idxDir = RuasPlantacao.IndexOf(ruaDir); } @@ -847,7 +935,7 @@ namespace AgroBase.Models Direcao = direcaoAtual, Orientacao = GPSUtils.CalcularOrientacao(ultimoPontoTrajetoria.Posicao, PrimeiroPonto), Visitado = false, - LarguraCorredor = LarguraCorredorPadrao + LarguraCorredor = larguraCorredorMenor }; bool PontoInicialAdicionado = false; @@ -919,9 +1007,7 @@ namespace AgroBase.Models Direcao = direcaoAtual, Orientacao = GPSUtils.CalcularOrientacao(_trajetoriaFixa.Last().Posicao, pontoAtual), Visitado = false, - LarguraCorredor = - distanciaCorredor < DistanciaPrimeirosPontosProjecao && !bordaEntrada && !bordaSaida ? larguraCorredorMenor : - CorredoresLarguras[idx] + LarguraCorredor = bordaEntrada || bordaSaida ? larguraCorredorMenor : CorredoresLarguras[idx] }; _trajetoriaFixa.Add(PontoTrajetoria); @@ -1110,7 +1196,13 @@ namespace AgroBase.Models private (List ruaEsquerda, List ruaDireita) DeterminarRuasLaterais(GPSModel robo, GPSModel proximoPonto, List rua1, List rua2) { // Determinar qual está à esquerda e qual está à direita - bool rua1EstaEsquerda = EstaEsquerda(robo, proximoPonto, Centroide(rua1)); + var r1 = new List(rua1); + if (ExtremoMaisProximoMapa == 1) + { + r1.Reverse(); + } + r1 = r1.Take(3).ToList(); + bool rua1EstaEsquerda = EstaEsquerda(robo, proximoPonto, Centroide(r1)); return rua1EstaEsquerda ? (rua1, rua2) : (rua2, rua1); } @@ -1221,8 +1313,8 @@ namespace AgroBase.Models public int idxPontoCorredor { get; set; } public GPSModel Posicao { get; set; } public double Orientacao { get; set; } - public Enums.DirecaoCarroRua Direcao { get; set; } - public Enums.TipoPontoRua Tipo { get; } + public DirecaoCarroRua Direcao { get; set; } + public TipoPontoRua Tipo { get; } public double LarguraCorredor { get; set; } public double DistanciaMargem { get; private set; } public bool Visitado { get; set; } = false; diff --git a/AgroBase/AgroBase/Services/GPSService.cs b/AgroBase/AgroBase/Services/GPSService.cs index e86594a67..41b78e997 100644 --- a/AgroBase/AgroBase/Services/GPSService.cs +++ b/AgroBase/AgroBase/Services/GPSService.cs @@ -719,35 +719,6 @@ namespace AgroBase.Services WT901CService.DadosLeitura.AtualizarOffset(UltimaLeitura); - /*if (witIniciado && gpsIniciado) - { - // Obtém os ângulos de ambos os sensores - double anguloWT901C = WT901CService.DadosLeitura.AnguloCorrigido; - double anguloGPS = UltimaLeitura.OrientacaoReal; - double anguloGPSMovimento = UltimaLeitura.OrientacaoMovimento; - double distAnguloGPS = UltimaLeitura.Distancia; - - anguloFinal = CalcularAnguloUnificado(anguloGPS, UltimaLeitura.QualidadeFix, anguloGPSMovimento, distAnguloGPS, anguloWT901C); - } - else if (witIniciado) - { - // Apenas o WT901C está disponível - anguloFinal = WT901CService.DadosLeitura.AnguloCorrigido; - } - else if (gpsIniciado) - { - // Apenas o GPS está disponível - double anguloGPS = UltimaLeitura.OrientacaoReal; - double anguloGPSMovimento = UltimaLeitura.OrientacaoMovimento; - double distAnguloGPS = UltimaLeitura.Distancia; - - anguloFinal = CalcularAnguloUnificado(anguloGPS, UltimaLeitura.QualidadeFix, anguloGPSMovimento, distAnguloGPS); - } - else - { - anguloFinal = UltimaLeitura.OrientacaoMovimento; - }*/ - if (gpsIniciado) { // O GPS está disponível @@ -758,8 +729,9 @@ namespace AgroBase.Services double distAnguloGPS = UltimaLeitura.Distancia; //anguloFinal = CalcularAnguloUnificado(anguloGPS, UltimaLeitura.QualidadeFix, anguloGPSMovimento, distAnguloGPS); + anguloFinal = GPSUtils.MisturarAngulosPorDistancia(anguloGPS, anguloGPSMovimento, distAnguloGPS, TrajetoriaMapaOperacaoModel.DistanciaMaximaEntreLeituras, 0.03, 0.3); - anguloFinal = anguloGPS; + //anguloFinal = anguloGPS; } else if (witIniciado) { diff --git a/AgroBase/AgroBase/bin/Debug/AgroBase.pdb b/AgroBase/AgroBase/bin/Debug/AgroBase.pdb index ed5d7b0fd..00f16e4d3 100644 Binary files a/AgroBase/AgroBase/bin/Debug/AgroBase.pdb and b/AgroBase/AgroBase/bin/Debug/AgroBase.pdb differ diff --git a/AgroBase/AgroBase/bin/Debug/DawnCache/data_1 b/AgroBase/AgroBase/bin/Debug/DawnCache/data_1 index bbf52d192..a4772cb74 100644 Binary files a/AgroBase/AgroBase/bin/Debug/DawnCache/data_1 and b/AgroBase/AgroBase/bin/Debug/DawnCache/data_1 differ diff --git a/AgroBase/AgroBase/bin/Debug/GPUCache/data_1 b/AgroBase/AgroBase/bin/Debug/GPUCache/data_1 index b8d6a76ed..fc77359bd 100644 Binary files a/AgroBase/AgroBase/bin/Debug/GPUCache/data_1 and b/AgroBase/AgroBase/bin/Debug/GPUCache/data_1 differ diff --git a/AgroBase/AgroBase/bin/Debug/Parametros/parametersMvd-2_0.par b/AgroBase/AgroBase/bin/Debug/Parametros/parametersMvd-2_0.par index 09adf84a0..fb0f3d936 100644 --- a/AgroBase/AgroBase/bin/Debug/Parametros/parametersMvd-2_0.par +++ b/AgroBase/AgroBase/bin/Debug/Parametros/parametersMvd-2_0.par @@ -1 +1 @@ -{"tmrRegistrador":{"_uiControl":null,"State":2,"IsRunning":false,"IsStopped":true,"IsCreated":false,"Interval":1000,"StackTrace":"MovimentacaoUnificadaModel.IniciarRegistrador","Id":"tmrRegistrador_Mvd","TimeTick":"00:00:00"},"tmrRegistradorMOV":{"_uiControl":null,"State":2,"IsRunning":false,"IsStopped":true,"IsCreated":false,"Interval":1000,"StackTrace":"MovimentacaoUnificadaModel.IniciarRegistrador","Id":"tmrRegistrador_Mov","TimeTick":"00:00:00"},"tmrRegistradorDIR":{"_uiControl":null,"State":2,"IsRunning":false,"IsStopped":true,"IsCreated":false,"Interval":500,"StackTrace":"MovimentacaoUnificadaModel.IniciarRegistrador","Id":"tmrRegistrador_Dir","TimeTick":"00:00:00"},"Conectado":true,"DistanciaPercorridaOperacao":0.0,"TempoEmAtividade":0.0,"DistanciaPercorridaTotal":0.0,"DistanciaPercorridaParcial":0.0,"VelocidadeMedia":0.0,"DiametroRoda":0.365,"ReducaoMotorBLDC":5.0,"RPM_Max_MotorBLDC":500.0,"IP_Mov":"192.168.105.10","IP_Dir":"192.168.105.11","Modulos":[{"Modulo_ID":"ET","Disponivel":false,"RequisitarDados":false,"Conectado":true,"MovMotor":{"ID":"Mov","Endereco":"0x01","EnderecoByte":1,"Mod_ID":"ET","LeituraLigado":false,"ComandoLigado":false,"CodigoAlarme":0,"AlarmeMotor":false,"RPM_SP":0,"RPM_SP_Controle":0,"RPM_SP_Leitura":0,"Sentido_SP":0,"NumeroPolos":10,"Rampa":0,"CorrenteTorqueMaximo":40,"OffsetLeitura":1.0,"AlarmeComando":false,"RPM_Roda":0.0,"Sentido":0,"Temperatura":0.0,"TemperaturaDriver":53.0,"Tensao":36.0,"Corrente_Barramento":0.0,"Corrente_Motor":0.0,"Potencia":0.0,"CicloTrabalho":0.6,"RPM_Motor":0.0,"VelocidadeInstantanea":0.0,"Comandar":true,"AlarmeSensores":false,"Inicializado":true,"Leitura":{"Endereco":1,"Iniciado":true,"Configurado":true,"UltimoComandoRecebido":"2025-03-28T15:20:00.750966-03:00","ModoControle":0,"ControleCorrente":0,"ControleVelocidade":135,"ControleCicloTrabalho":0,"ControleCorrenteFreio":3,"RampaSubidaVelocidade":0,"RampaDescidaVelocidade":0,"CodigoAlarme":0,"Heartbeat":0,"Torque_Max":0.0,"ERPM":0,"CorrenteMotor":0.0,"CorrenteBarramento":5.2999998442828657E-05,"Direcao":0,"RPM":0.0,"Tensao":36.0,"Temperatura":53.0,"Potencia":0.003599999938160181,"CicloTrabalho":0.6,"Freado":false,"parametros":[{"Registro":5000,"Valor":"AAA=","Escala":1.0},{"Registro":6001,"Valor":"AAA=","Escala":1.0},{"Registro":6014,"Valor":"AAM=","Escala":100.0},{"Registro":6003,"Valor":"AIc=","Escala":10.0},{"Registro":6028,"Valor":"ACg=","Escala":100.0},{"Registro":6016,"Valor":"AAA=","Escala":10.0},{"Registro":6025,"Valor":"AAA=","Escala":10.0},{"Registro":6002,"Valor":"AAA=","Escala":100.0},{"Registro":5001,"Valor":"AAAAAA==","Escala":1.0},{"Registro":5003,"Valor":"AAYAAA==","Escala":10.0},{"Registro":5004,"Valor":"AAAAJA==","Escala":1.0},{"Registro":5005,"Valor":"ACQAAA==","Escala":1.0},{"Registro":5006,"Valor":"AAAAAA==","Escala":100.0},{"Registro":5007,"Valor":"AAAANQ==","Escala":100.0},{"Registro":5008,"Valor":"ADUAAA==","Escala":1.0},{"Registro":6000,"Valor":"AAA=","Escala":1.0}]},"CompensacaoNecessaria":false,"ConfigSentidos":{"RodasDianteiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoArco":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RotacionarNoEixo":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoLateral":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"Diagnostico":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0}},"Funcoes":[12,14,9,5,10],"LogGrafico":[],"Alarmes":[{"Tipo":411,"Valor":4.22,"Minimo":false,"Maximo":true,"ParaMinimo":false,"ParaMaximo":false}],"ConfigFreio":{"Incremental":true,"AnguloInicial":10,"Leitura":false,"Controle":false}},"DirMotor":{"ID":"Dir","Endereco":"0x01","EnderecoByte":1,"Mod_ID":"ET","Sentido_SP":0,"Angulo_SP":0.0,"Angulo_Offset":0.0,"Velocidade_Max":600.0,"Velocidade":240,"Sentido":0,"SentidoReal":1,"Angulo":0.0,"RPM":0.0,"IN1_Atuado":true,"IN2_Atuado":true,"Comandar":false,"Inicializado":true,"Leitura":{"Endereco":1,"Iniciado":true,"UltimoComandoRecebido":"2025-03-28T15:20:01.2841183-03:00","ErroCarregado":0.0,"ErroCarregado_Hex":null,"ErroAcumulado":0.0,"ErroAcumulado_Hex":null,"RPM":0.0,"RPM_Hex":null,"NumeroPulsos":0,"NumeroPulsos_Hex":null,"ErroAngulo":0.0,"ErroAngulo_Hex":null,"StatusDriver":0,"StatusModoLimiteZero":0,"StatusTravaMotor":0,"StatusBloqueioMotor":0,"StatusMovimentoMotor":5,"Sentido":0,"Velocidade":0.0,"Aceleracao":0.0,"Mensagem":null,"HV":"MKS SERVO57D_485","FV":"V1.0.6","Entradas":[false,false],"Saidas":[false,false]},"UltimaDirecao":0,"UltimoComandoEnviado":"2025-03-28T15:02:59.8479221-03:00","RetornandoAzero":false,"EmMovimento":false,"AtingiuAnguloSP":true,"ConfigSentidos":{"RodasDianteiras":{"Frente":0,"Tras":0,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"MovimentoDiagonal":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"MovimentoArco":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"RotacionarNoEixo":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":1,"Parado":0},"MovimentoLateral":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"Diagnostico":{"Frente":2,"Tras":1,"Esquerda":1,"Direita":2,"Parado":0}},"Funcoes":[13,9,14,41]}},{"Modulo_ID":"EF","Disponivel":false,"RequisitarDados":false,"Conectado":true,"MovMotor":{"ID":"Mov","Endereco":"0x03","EnderecoByte":3,"Mod_ID":"EF","LeituraLigado":false,"ComandoLigado":false,"CodigoAlarme":0,"AlarmeMotor":false,"RPM_SP":0,"RPM_SP_Controle":0,"RPM_SP_Leitura":0,"Sentido_SP":0,"NumeroPolos":10,"Rampa":0,"CorrenteTorqueMaximo":40,"OffsetLeitura":1.0,"AlarmeComando":false,"RPM_Roda":0.0,"Sentido":0,"Temperatura":0.0,"TemperaturaDriver":51.04,"Tensao":36.0,"Corrente_Barramento":0.0,"Corrente_Motor":0.0,"Potencia":0.0,"CicloTrabalho":0.6,"RPM_Motor":0.0,"VelocidadeInstantanea":0.0,"Comandar":true,"AlarmeSensores":false,"Inicializado":true,"Leitura":{"Endereco":3,"Iniciado":true,"Configurado":true,"UltimoComandoRecebido":"2025-03-28T15:20:01.0163538-03:00","ModoControle":0,"ControleCorrente":0,"ControleVelocidade":135,"ControleCicloTrabalho":0,"ControleCorrenteFreio":3,"RampaSubidaVelocidade":0,"RampaDescidaVelocidade":0,"CodigoAlarme":0,"Heartbeat":1,"Torque_Max":0.0,"ERPM":0,"CorrenteMotor":0.0,"CorrenteBarramento":4.9000000581145285E-05,"Direcao":0,"RPM":0.0,"Tensao":36.0,"Temperatura":51.042999267578125,"Potencia":0.003599999938160181,"CicloTrabalho":0.6,"Freado":false,"parametros":[{"Registro":5000,"Valor":"AAA=","Escala":1.0},{"Registro":6001,"Valor":"AAA=","Escala":1.0},{"Registro":6014,"Valor":"AAM=","Escala":100.0},{"Registro":6003,"Valor":"AIc=","Escala":10.0},{"Registro":6028,"Valor":"ACg=","Escala":100.0},{"Registro":6016,"Valor":"AAA=","Escala":10.0},{"Registro":6025,"Valor":"AAA=","Escala":10.0},{"Registro":6002,"Valor":"AAA=","Escala":100.0},{"Registro":5001,"Valor":"AAAAAA==","Escala":1.0},{"Registro":5003,"Valor":"AAYAAA==","Escala":10.0},{"Registro":5004,"Valor":"AAAAJA==","Escala":1.0},{"Registro":5005,"Valor":"ACQAAA==","Escala":1.0},{"Registro":5006,"Valor":"AAAAAA==","Escala":100.0},{"Registro":5007,"Valor":"AAAAMQ==","Escala":100.0},{"Registro":5008,"Valor":"ADFPzg==","Escala":1.0},{"Registro":6000,"Valor":"AAE=","Escala":1.0}]},"CompensacaoNecessaria":false,"ConfigSentidos":{"RodasDianteiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoArco":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RotacionarNoEixo":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoLateral":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"Diagnostico":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0}},"Funcoes":[12,14,9,5,10],"LogGrafico":[],"Alarmes":[{"Tipo":411,"Valor":14.8,"Minimo":false,"Maximo":true,"ParaMinimo":false,"ParaMaximo":false}],"ConfigFreio":{"Incremental":true,"AnguloInicial":10,"Leitura":false,"Controle":false}},"DirMotor":{"ID":"Dir","Endereco":"0x03","EnderecoByte":3,"Mod_ID":"EF","Sentido_SP":0,"Angulo_SP":0.0,"Angulo_Offset":0.0,"Velocidade_Max":600.0,"Velocidade":240,"Sentido":0,"SentidoReal":1,"Angulo":0.0,"RPM":0.0,"IN1_Atuado":true,"IN2_Atuado":true,"Comandar":true,"Inicializado":true,"Leitura":{"Endereco":3,"Iniciado":true,"UltimoComandoRecebido":"2025-03-28T15:20:01.3429879-03:00","ErroCarregado":0.0,"ErroCarregado_Hex":null,"ErroAcumulado":0.0,"ErroAcumulado_Hex":null,"RPM":0.0,"RPM_Hex":null,"NumeroPulsos":0,"NumeroPulsos_Hex":null,"ErroAngulo":0.0,"ErroAngulo_Hex":null,"StatusDriver":0,"StatusModoLimiteZero":0,"StatusTravaMotor":0,"StatusBloqueioMotor":0,"StatusMovimentoMotor":5,"Sentido":0,"Velocidade":0.0,"Aceleracao":0.0,"Mensagem":null,"HV":"MKS SERVO57D_485","FV":"V1.0.6","Entradas":[false,false],"Saidas":[false,false]},"UltimaDirecao":0,"UltimoComandoEnviado":"2025-03-28T15:19:45.5407658-03:00","RetornandoAzero":false,"EmMovimento":false,"AtingiuAnguloSP":true,"ConfigSentidos":{"RodasDianteiras":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"RodasTraseiras":{"Frente":0,"Tras":0,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"MovimentoArco":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"RotacionarNoEixo":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":1,"Parado":0},"MovimentoLateral":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"Diagnostico":{"Frente":2,"Tras":1,"Esquerda":1,"Direita":2,"Parado":0}},"Funcoes":[13,9,14,41]}},{"Modulo_ID":"DT","Disponivel":false,"RequisitarDados":false,"Conectado":true,"MovMotor":{"ID":"Mov","Endereco":"0x02","EnderecoByte":2,"Mod_ID":"DT","LeituraLigado":false,"ComandoLigado":false,"CodigoAlarme":0,"AlarmeMotor":false,"RPM_SP":0,"RPM_SP_Controle":0,"RPM_SP_Leitura":0,"Sentido_SP":0,"NumeroPolos":10,"Rampa":0,"CorrenteTorqueMaximo":40,"OffsetLeitura":1.0,"AlarmeComando":false,"RPM_Roda":0.0,"Sentido":0,"Temperatura":0.0,"TemperaturaDriver":53.49,"Tensao":36.0,"Corrente_Barramento":0.0,"Corrente_Motor":0.0,"Potencia":0.0,"CicloTrabalho":0.5,"RPM_Motor":0.0,"VelocidadeInstantanea":0.0,"Comandar":true,"AlarmeSensores":false,"Inicializado":true,"Leitura":{"Endereco":2,"Iniciado":true,"Configurado":true,"UltimoComandoRecebido":"2025-03-28T15:20:00.9495912-03:00","ModoControle":0,"ControleCorrente":0,"ControleVelocidade":135,"ControleCicloTrabalho":0,"ControleCorrenteFreio":3,"RampaSubidaVelocidade":0,"RampaDescidaVelocidade":0,"CodigoAlarme":0,"Heartbeat":1,"Torque_Max":0.0,"ERPM":0,"CorrenteMotor":0.0,"CorrenteBarramento":5.2000000141561029E-05,"Direcao":0,"RPM":0.0,"Tensao":36.0,"Temperatura":53.493900299072266,"Potencia":0.003599999938160181,"CicloTrabalho":0.5,"Freado":false,"parametros":[{"Registro":5000,"Valor":"AAA=","Escala":1.0},{"Registro":6001,"Valor":"AAA=","Escala":1.0},{"Registro":6014,"Valor":"AAM=","Escala":100.0},{"Registro":6003,"Valor":"AIc=","Escala":10.0},{"Registro":6028,"Valor":"ACg=","Escala":100.0},{"Registro":6016,"Valor":"AAA=","Escala":10.0},{"Registro":6025,"Valor":"AAA=","Escala":10.0},{"Registro":6002,"Valor":"AAA=","Escala":100.0},{"Registro":5001,"Valor":"AAAAAA==","Escala":1.0},{"Registro":5003,"Valor":"//sAAA==","Escala":10.0},{"Registro":5004,"Valor":"AAAAJA==","Escala":1.0},{"Registro":5005,"Valor":"ACQAAA==","Escala":1.0},{"Registro":5006,"Valor":"AAAAAA==","Escala":100.0},{"Registro":5007,"Valor":"AAAANA==","Escala":100.0},{"Registro":5008,"Valor":"ADQ6Ww==","Escala":1.0},{"Registro":6000,"Valor":"AAE=","Escala":1.0}]},"CompensacaoNecessaria":false,"ConfigSentidos":{"RodasDianteiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoArco":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RotacionarNoEixo":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoLateral":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"Diagnostico":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0}},"Funcoes":[12,14,9,5,10],"LogGrafico":[],"Alarmes":[{"Tipo":411,"Valor":16.69,"Minimo":false,"Maximo":true,"ParaMinimo":false,"ParaMaximo":false}],"ConfigFreio":{"Incremental":false,"AnguloInicial":170,"Leitura":false,"Controle":false}},"DirMotor":{"ID":"Dir","Endereco":"0x02","EnderecoByte":2,"Mod_ID":"DT","Sentido_SP":0,"Angulo_SP":0.0,"Angulo_Offset":0.0,"Velocidade_Max":600.0,"Velocidade":240,"Sentido":0,"SentidoReal":1,"Angulo":0.0,"RPM":0.0,"IN1_Atuado":true,"IN2_Atuado":true,"Comandar":false,"Inicializado":true,"Leitura":{"Endereco":2,"Iniciado":true,"UltimoComandoRecebido":"2025-03-28T15:20:01.4080097-03:00","ErroCarregado":0.0,"ErroCarregado_Hex":null,"ErroAcumulado":0.0,"ErroAcumulado_Hex":null,"RPM":0.0,"RPM_Hex":null,"NumeroPulsos":0,"NumeroPulsos_Hex":null,"ErroAngulo":0.0,"ErroAngulo_Hex":null,"StatusDriver":0,"StatusModoLimiteZero":0,"StatusTravaMotor":0,"StatusBloqueioMotor":0,"StatusMovimentoMotor":5,"Sentido":0,"Velocidade":0.0,"Aceleracao":0.0,"Mensagem":null,"HV":"MKS SERVO57D_485","FV":"V1.0.6","Entradas":[false,false],"Saidas":[false,false]},"UltimaDirecao":0,"UltimoComandoEnviado":"2025-03-28T15:02:59.31804-03:00","RetornandoAzero":false,"EmMovimento":false,"AtingiuAnguloSP":true,"ConfigSentidos":{"RodasDianteiras":{"Frente":0,"Tras":0,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"MovimentoDiagonal":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"MovimentoArco":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"RotacionarNoEixo":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":1,"Parado":0},"MovimentoLateral":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"Diagnostico":{"Frente":2,"Tras":1,"Esquerda":1,"Direita":2,"Parado":0}},"Funcoes":[13,9,14,41]}},{"Modulo_ID":"DF","Disponivel":false,"RequisitarDados":false,"Conectado":true,"MovMotor":{"ID":"Mov","Endereco":"0x04","EnderecoByte":4,"Mod_ID":"DF","LeituraLigado":false,"ComandoLigado":false,"CodigoAlarme":0,"AlarmeMotor":false,"RPM_SP":0,"RPM_SP_Controle":0,"RPM_SP_Leitura":0,"Sentido_SP":0,"NumeroPolos":10,"Rampa":0,"CorrenteTorqueMaximo":40,"OffsetLeitura":1.0,"AlarmeComando":false,"RPM_Roda":0.0,"Sentido":0,"Temperatura":0.0,"TemperaturaDriver":49.26,"Tensao":36.0,"Corrente_Barramento":0.0,"Corrente_Motor":0.0,"Potencia":0.0,"CicloTrabalho":0.5,"RPM_Motor":0.0,"VelocidadeInstantanea":0.0,"Comandar":true,"AlarmeSensores":false,"Inicializado":true,"Leitura":{"Endereco":4,"Iniciado":true,"Configurado":false,"UltimoComandoRecebido":"2025-03-28T15:20:01.085375-03:00","ModoControle":0,"ControleCorrente":0,"ControleVelocidade":135,"ControleCicloTrabalho":0,"ControleCorrenteFreio":3,"RampaSubidaVelocidade":0,"RampaDescidaVelocidade":0,"CodigoAlarme":0,"Heartbeat":0,"Torque_Max":0.0,"ERPM":0,"CorrenteMotor":0.0,"CorrenteBarramento":4.8000002279877663E-05,"Direcao":0,"RPM":0.0,"Tensao":36.0,"Temperatura":49.258201599121094,"Potencia":0.003599999938160181,"CicloTrabalho":0.5,"Freado":false,"parametros":[{"Registro":5000,"Valor":"AAA=","Escala":1.0},{"Registro":6001,"Valor":"AAA=","Escala":1.0},{"Registro":6014,"Valor":"AAM=","Escala":100.0},{"Registro":6003,"Valor":"AIc=","Escala":10.0},{"Registro":6028,"Valor":"ACg=","Escala":100.0},{"Registro":6016,"Valor":"AAA=","Escala":10.0},{"Registro":6025,"Valor":"AAA=","Escala":10.0},{"Registro":6002,"Valor":"AAA=","Escala":100.0},{"Registro":5001,"Valor":"AAAAAA==","Escala":1.0},{"Registro":5003,"Valor":"//sAAA==","Escala":10.0},{"Registro":5004,"Valor":"AAAAJA==","Escala":1.0},{"Registro":5005,"Valor":"ACQAAA==","Escala":1.0},{"Registro":5006,"Valor":"AAAAAA==","Escala":100.0},{"Registro":5007,"Valor":"AAAAMA==","Escala":100.0},{"Registro":5008,"Valor":"ADAxJg==","Escala":1.0},{"Registro":6000,"Valor":"AAA=","Escala":1.0}]},"CompensacaoNecessaria":false,"ConfigSentidos":{"RodasDianteiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoArco":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RotacionarNoEixo":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoLateral":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"Diagnostico":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0}},"Funcoes":[12,14,9,5,10],"LogGrafico":[],"Alarmes":[{"Tipo":411,"Valor":15.32,"Minimo":false,"Maximo":true,"ParaMinimo":false,"ParaMaximo":false}],"ConfigFreio":{"Incremental":false,"AnguloInicial":170,"Leitura":false,"Controle":false}},"DirMotor":{"ID":"Dir","Endereco":"0x04","EnderecoByte":4,"Mod_ID":"DF","Sentido_SP":0,"Angulo_SP":0.0,"Angulo_Offset":0.0,"Velocidade_Max":600.0,"Velocidade":240,"Sentido":0,"SentidoReal":1,"Angulo":0.0,"RPM":0.0,"IN1_Atuado":true,"IN2_Atuado":true,"Comandar":true,"Inicializado":true,"Leitura":{"Endereco":4,"Iniciado":true,"UltimoComandoRecebido":"2025-03-28T15:20:01.4690316-03:00","ErroCarregado":0.0,"ErroCarregado_Hex":null,"ErroAcumulado":0.0,"ErroAcumulado_Hex":null,"RPM":0.0,"RPM_Hex":null,"NumeroPulsos":0,"NumeroPulsos_Hex":null,"ErroAngulo":0.0,"ErroAngulo_Hex":null,"StatusDriver":0,"StatusModoLimiteZero":0,"StatusTravaMotor":0,"StatusBloqueioMotor":0,"StatusMovimentoMotor":5,"Sentido":0,"Velocidade":0.0,"Aceleracao":0.0,"Mensagem":null,"HV":"MKS SERVO57D_485","FV":"V1.0.6","Entradas":[false,false],"Saidas":[false,false]},"UltimaDirecao":0,"UltimoComandoEnviado":"2025-03-28T15:19:44.7544117-03:00","RetornandoAzero":false,"EmMovimento":false,"AtingiuAnguloSP":true,"ConfigSentidos":{"RodasDianteiras":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"RodasTraseiras":{"Frente":0,"Tras":0,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"MovimentoArco":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"RotacionarNoEixo":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":1,"Parado":0},"MovimentoLateral":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"Diagnostico":{"Frente":2,"Tras":1,"Esquerda":1,"Direita":2,"Parado":0}},"Funcoes":[13,9,14,41]}}]} \ No newline at end of file +{"tmrRegistrador":{"_uiControl":null,"State":2,"IsRunning":false,"IsStopped":true,"IsCreated":false,"Interval":1000,"StackTrace":"MovimentacaoUnificadaModel.IniciarRegistrador","Id":"tmrRegistrador_Mvd","TimeTick":"00:00:00"},"tmrRegistradorMOV":{"_uiControl":null,"State":2,"IsRunning":false,"IsStopped":true,"IsCreated":false,"Interval":1000,"StackTrace":"MovimentacaoUnificadaModel.IniciarRegistrador","Id":"tmrRegistrador_Mov","TimeTick":"00:00:00"},"tmrRegistradorDIR":{"_uiControl":null,"State":2,"IsRunning":false,"IsStopped":true,"IsCreated":false,"Interval":500,"StackTrace":"MovimentacaoUnificadaModel.IniciarRegistrador","Id":"tmrRegistrador_Dir","TimeTick":"00:00:00"},"Conectado":false,"DistanciaPercorridaOperacao":0.0,"TempoEmAtividade":0.0,"DistanciaPercorridaTotal":0.0,"DistanciaPercorridaParcial":0.0,"VelocidadeMedia":0.0,"DiametroRoda":0.365,"ReducaoMotorBLDC":5.0,"RPM_Max_MotorBLDC":500.0,"IP_Mov":"192.168.105.10","IP_Dir":"192.168.105.11","Modulos":[{"Modulo_ID":"ET","Disponivel":false,"RequisitarDados":false,"Conectado":false,"MovMotor":{"ID":"Mov","Endereco":"0x01","EnderecoByte":1,"Mod_ID":"ET","LeituraLigado":true,"ComandoLigado":false,"CodigoAlarme":0,"AlarmeMotor":false,"RPM_SP":0,"RPM_SP_Controle":0,"RPM_SP_Leitura":0,"Sentido_SP":0,"NumeroPolos":10,"Rampa":0,"CorrenteTorqueMaximo":40,"OffsetLeitura":1.0,"AlarmeComando":false,"RPM_Roda":0.0,"Sentido":0,"Temperatura":0.0,"TemperaturaDriver":0.0,"Tensao":0.0,"Corrente_Barramento":0.0,"Corrente_Motor":0.0,"Potencia":0.0,"CicloTrabalho":0.0,"RPM_Motor":0.0,"VelocidadeInstantanea":0.0,"Comandar":true,"AlarmeSensores":false,"Inicializado":false,"Leitura":null,"CompensacaoNecessaria":false,"ConfigSentidos":{"RodasDianteiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoArco":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RotacionarNoEixo":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoLateral":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"Diagnostico":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0}},"Funcoes":[12,14,9,5,10],"LogGrafico":[],"Alarmes":[{"Tipo":411,"Valor":4.22,"Minimo":false,"Maximo":true,"ParaMinimo":false,"ParaMaximo":false}],"ConfigFreio":{"Incremental":true,"AnguloInicial":10,"Leitura":false,"Controle":false}},"DirMotor":{"ID":"Dir","Endereco":"0x01","EnderecoByte":1,"Mod_ID":"ET","Sentido_SP":0,"Angulo_SP":0.0,"Angulo_Offset":0.0,"Velocidade_Max":600.0,"Velocidade":300,"Sentido":0,"SentidoReal":2,"Angulo":0.0,"RPM":0.0,"IN1_Atuado":false,"IN2_Atuado":false,"Comandar":true,"Inicializado":false,"Leitura":null,"UltimaDirecao":0,"UltimoComandoEnviado":"2025-03-28T15:02:59.8479221-03:00","RetornandoAzero":false,"EmMovimento":false,"AtingiuAnguloSP":true,"ConfigSentidos":{"RodasDianteiras":{"Frente":0,"Tras":0,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"MovimentoDiagonal":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"MovimentoArco":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"RotacionarNoEixo":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":1,"Parado":0},"MovimentoLateral":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"Diagnostico":{"Frente":2,"Tras":1,"Esquerda":1,"Direita":2,"Parado":0}},"Funcoes":[13,9,14,41]}},{"Modulo_ID":"EF","Disponivel":false,"RequisitarDados":false,"Conectado":false,"MovMotor":{"ID":"Mov","Endereco":"0x03","EnderecoByte":3,"Mod_ID":"EF","LeituraLigado":true,"ComandoLigado":false,"CodigoAlarme":0,"AlarmeMotor":false,"RPM_SP":0,"RPM_SP_Controle":0,"RPM_SP_Leitura":0,"Sentido_SP":0,"NumeroPolos":10,"Rampa":0,"CorrenteTorqueMaximo":40,"OffsetLeitura":1.0,"AlarmeComando":false,"RPM_Roda":0.0,"Sentido":0,"Temperatura":0.0,"TemperaturaDriver":0.0,"Tensao":0.0,"Corrente_Barramento":0.0,"Corrente_Motor":0.0,"Potencia":0.0,"CicloTrabalho":0.0,"RPM_Motor":0.0,"VelocidadeInstantanea":0.0,"Comandar":true,"AlarmeSensores":false,"Inicializado":false,"Leitura":null,"CompensacaoNecessaria":false,"ConfigSentidos":{"RodasDianteiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoArco":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RotacionarNoEixo":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoLateral":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"Diagnostico":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0}},"Funcoes":[12,14,9,5,10],"LogGrafico":[],"Alarmes":[{"Tipo":411,"Valor":14.8,"Minimo":false,"Maximo":true,"ParaMinimo":false,"ParaMaximo":false}],"ConfigFreio":{"Incremental":true,"AnguloInicial":10,"Leitura":false,"Controle":false}},"DirMotor":{"ID":"Dir","Endereco":"0x03","EnderecoByte":3,"Mod_ID":"EF","Sentido_SP":0,"Angulo_SP":0.0,"Angulo_Offset":0.0,"Velocidade_Max":600.0,"Velocidade":300,"Sentido":0,"SentidoReal":2,"Angulo":0.0,"RPM":0.0,"IN1_Atuado":false,"IN2_Atuado":false,"Comandar":true,"Inicializado":false,"Leitura":null,"UltimaDirecao":0,"UltimoComandoEnviado":"2025-03-28T15:19:45.5407658-03:00","RetornandoAzero":false,"EmMovimento":false,"AtingiuAnguloSP":true,"ConfigSentidos":{"RodasDianteiras":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"RodasTraseiras":{"Frente":0,"Tras":0,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"MovimentoArco":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"RotacionarNoEixo":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":1,"Parado":0},"MovimentoLateral":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"Diagnostico":{"Frente":2,"Tras":1,"Esquerda":1,"Direita":2,"Parado":0}},"Funcoes":[13,9,14,41]}},{"Modulo_ID":"DT","Disponivel":false,"RequisitarDados":false,"Conectado":false,"MovMotor":{"ID":"Mov","Endereco":"0x02","EnderecoByte":2,"Mod_ID":"DT","LeituraLigado":true,"ComandoLigado":false,"CodigoAlarme":0,"AlarmeMotor":false,"RPM_SP":0,"RPM_SP_Controle":0,"RPM_SP_Leitura":0,"Sentido_SP":0,"NumeroPolos":10,"Rampa":0,"CorrenteTorqueMaximo":40,"OffsetLeitura":1.0,"AlarmeComando":false,"RPM_Roda":0.0,"Sentido":0,"Temperatura":0.0,"TemperaturaDriver":0.0,"Tensao":0.0,"Corrente_Barramento":0.0,"Corrente_Motor":0.0,"Potencia":0.0,"CicloTrabalho":0.0,"RPM_Motor":0.0,"VelocidadeInstantanea":0.0,"Comandar":true,"AlarmeSensores":false,"Inicializado":false,"Leitura":null,"CompensacaoNecessaria":false,"ConfigSentidos":{"RodasDianteiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoArco":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RotacionarNoEixo":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoLateral":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"Diagnostico":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0}},"Funcoes":[12,14,9,5,10],"LogGrafico":[],"Alarmes":[{"Tipo":411,"Valor":16.69,"Minimo":false,"Maximo":true,"ParaMinimo":false,"ParaMaximo":false}],"ConfigFreio":{"Incremental":false,"AnguloInicial":170,"Leitura":false,"Controle":false}},"DirMotor":{"ID":"Dir","Endereco":"0x02","EnderecoByte":2,"Mod_ID":"DT","Sentido_SP":0,"Angulo_SP":0.0,"Angulo_Offset":0.0,"Velocidade_Max":600.0,"Velocidade":300,"Sentido":0,"SentidoReal":2,"Angulo":0.0,"RPM":0.0,"IN1_Atuado":false,"IN2_Atuado":false,"Comandar":true,"Inicializado":false,"Leitura":null,"UltimaDirecao":0,"UltimoComandoEnviado":"2025-03-28T15:02:59.31804-03:00","RetornandoAzero":false,"EmMovimento":false,"AtingiuAnguloSP":true,"ConfigSentidos":{"RodasDianteiras":{"Frente":0,"Tras":0,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"MovimentoDiagonal":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"MovimentoArco":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"RotacionarNoEixo":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":1,"Parado":0},"MovimentoLateral":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"Diagnostico":{"Frente":2,"Tras":1,"Esquerda":1,"Direita":2,"Parado":0}},"Funcoes":[13,9,14,41]}},{"Modulo_ID":"DF","Disponivel":false,"RequisitarDados":false,"Conectado":false,"MovMotor":{"ID":"Mov","Endereco":"0x04","EnderecoByte":4,"Mod_ID":"DF","LeituraLigado":true,"ComandoLigado":false,"CodigoAlarme":0,"AlarmeMotor":false,"RPM_SP":0,"RPM_SP_Controle":0,"RPM_SP_Leitura":0,"Sentido_SP":0,"NumeroPolos":10,"Rampa":0,"CorrenteTorqueMaximo":40,"OffsetLeitura":1.0,"AlarmeComando":false,"RPM_Roda":0.0,"Sentido":0,"Temperatura":0.0,"TemperaturaDriver":0.0,"Tensao":0.0,"Corrente_Barramento":0.0,"Corrente_Motor":0.0,"Potencia":0.0,"CicloTrabalho":0.0,"RPM_Motor":0.0,"VelocidadeInstantanea":0.0,"Comandar":true,"AlarmeSensores":false,"Inicializado":false,"Leitura":null,"CompensacaoNecessaria":false,"ConfigSentidos":{"RodasDianteiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoArco":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RotacionarNoEixo":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoLateral":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"Diagnostico":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0}},"Funcoes":[12,14,9,5,10],"LogGrafico":[],"Alarmes":[{"Tipo":411,"Valor":15.32,"Minimo":false,"Maximo":true,"ParaMinimo":false,"ParaMaximo":false}],"ConfigFreio":{"Incremental":false,"AnguloInicial":170,"Leitura":false,"Controle":false}},"DirMotor":{"ID":"Dir","Endereco":"0x04","EnderecoByte":4,"Mod_ID":"DF","Sentido_SP":0,"Angulo_SP":0.0,"Angulo_Offset":0.0,"Velocidade_Max":600.0,"Velocidade":300,"Sentido":0,"SentidoReal":2,"Angulo":0.0,"RPM":0.0,"IN1_Atuado":false,"IN2_Atuado":false,"Comandar":true,"Inicializado":false,"Leitura":null,"UltimaDirecao":0,"UltimoComandoEnviado":"2025-03-28T15:19:44.7544117-03:00","RetornandoAzero":false,"EmMovimento":false,"AtingiuAnguloSP":true,"ConfigSentidos":{"RodasDianteiras":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"RodasTraseiras":{"Frente":0,"Tras":0,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"MovimentoArco":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"RotacionarNoEixo":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":1,"Parado":0},"MovimentoLateral":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"Diagnostico":{"Frente":2,"Tras":1,"Esquerda":1,"Direita":2,"Parado":0}},"Funcoes":[13,9,14,41]}}]} \ No newline at end of file diff --git a/AgroBase/AgroBase/bin/Debug/Parametros/parametersSen-1_2.par b/AgroBase/AgroBase/bin/Debug/Parametros/parametersSen-1_2.par index b1e5116d3..f8c71e0d8 100644 --- a/AgroBase/AgroBase/bin/Debug/Parametros/parametersSen-1_2.par +++ b/AgroBase/AgroBase/bin/Debug/Parametros/parametersSen-1_2.par @@ -1 +1 @@ -{"tmrRegistrador":{"_uiControl":null,"State":2,"IsRunning":false,"IsStopped":true,"IsCreated":false,"Interval":500,"StackTrace":"SensoriamentoModel.IniciarRegistrador","Id":"tmrRegistrador_Sen","TimeTick":"00:00:00"},"Modulo_ID":"Sen","IP":"192.168.100.12","RequisitarDados":false,"Conectado":false,"Sensores":[{"LogGrafico":[],"ID":"TMVET","Prioridade":0,"Descricao":"Temperatura Motor Esquerdo Trás","Componente":411,"Aferir":true,"DelayAmostragem":200,"Leitura":null,"Inicializado":false,"Testando":false,"Funcoes":[12],"Parametros":[["Offset","-20"]],"UnidadeMedida":"ºC","LimiteMaximo":0.0,"LimiteMinimo":0.0},{"LogGrafico":[],"ID":"TMVEF","Prioridade":0,"Descricao":"Temperatura Motor Esquerdo Frente","Componente":411,"Aferir":true,"DelayAmostragem":200,"Leitura":null,"Inicializado":false,"Testando":false,"Funcoes":[12],"Parametros":[["Offset","-20"]],"UnidadeMedida":"ºC","LimiteMaximo":0.0,"LimiteMinimo":0.0},{"LogGrafico":[],"ID":"TMVDT","Prioridade":0,"Descricao":"Temperatura Motor Direito Trás","Componente":411,"Aferir":true,"DelayAmostragem":200,"Leitura":null,"Inicializado":false,"Testando":false,"Funcoes":[12],"Parametros":[["Offset","-20"]],"UnidadeMedida":"ºC","LimiteMaximo":0.0,"LimiteMinimo":0.0},{"LogGrafico":[],"ID":"TMVDF","Prioridade":0,"Descricao":"Temperatura Motor Direito Frente","Componente":411,"Aferir":true,"DelayAmostragem":200,"Leitura":null,"Inicializado":false,"Testando":false,"Funcoes":[12],"Parametros":[["Offset","-20"]],"UnidadeMedida":"ºC","LimiteMaximo":0.0,"LimiteMinimo":0.0},{"LogGrafico":[],"ID":"AB5V","Prioridade":10,"Descricao":"Corrente no Barramento 5V","Componente":322,"Aferir":true,"DelayAmostragem":500,"Leitura":null,"Inicializado":false,"Testando":false,"Funcoes":[27],"Parametros":[["Endereço I2C","0x41"],["Corrente Max","3.2"]],"UnidadeMedida":"A","LimiteMaximo":0.0,"LimiteMinimo":0.0},{"LogGrafico":[],"ID":"AB7V2","Prioridade":10,"Descricao":"Corrente no Barramento 7,2V","Componente":322,"Aferir":true,"DelayAmostragem":500,"Leitura":null,"Inicializado":false,"Testando":false,"Funcoes":[27],"Parametros":[["Endereço I2C","0x44"],["CI","219"]],"UnidadeMedida":"A","LimiteMaximo":0.0,"LimiteMinimo":0.0},{"LogGrafico":[],"ID":"AB12V","Prioridade":10,"Descricao":"Corrente no Barramento 12V","Componente":322,"Aferir":true,"DelayAmostragem":500,"Leitura":null,"Inicializado":false,"Testando":false,"Funcoes":[27],"Parametros":[["Endereço I2C","0x40"],["Corrente Max","100"]],"UnidadeMedida":"A","LimiteMaximo":0.0,"LimiteMinimo":0.0},{"LogGrafico":[],"ID":"TBAT","Prioridade":5,"Descricao":"Temperatura da bateria","Componente":411,"Aferir":false,"DelayAmostragem":500,"Leitura":null,"Inicializado":false,"Testando":false,"Funcoes":[12],"Parametros":[["Offset","-20"]],"UnidadeMedida":"ºC","LimiteMaximo":0.0,"LimiteMinimo":0.0},{"LogGrafico":[],"ID":"POTET","Prioridade":24,"Descricao":"Potenciometro ET","Componente":481,"Aferir":false,"DelayAmostragem":500,"Leitura":null,"Inicializado":false,"Testando":false,"Funcoes":[46],"Parametros":[["Minimo","-110"],["Meio","-8"],["Maximo","104"],["Margem","5"]],"UnidadeMedida":"º","LimiteMaximo":104.0,"LimiteMinimo":-110.0},{"LogGrafico":[],"ID":"POTDT","Prioridade":24,"Descricao":"Potenciometro DT","Componente":481,"Aferir":false,"DelayAmostragem":500,"Leitura":null,"Inicializado":false,"Testando":false,"Funcoes":[46],"Parametros":[["Minimo","-110"],["Meio","-18"],["Maximo","80"],["Margem","5"]],"UnidadeMedida":"º","LimiteMaximo":80.0,"LimiteMinimo":-110.0},{"LogGrafico":[],"ID":"POTEF","Prioridade":24,"Descricao":"Potenciometro EF","Componente":481,"Aferir":false,"DelayAmostragem":500,"Leitura":null,"Inicializado":false,"Testando":false,"Funcoes":[46],"Parametros":[["Minimo","-110"],["Meio","-13"],["Maximo","90"],["Margem","5"]],"UnidadeMedida":"º","LimiteMaximo":90.0,"LimiteMinimo":-110.0},{"LogGrafico":[],"ID":"POTDF","Prioridade":24,"Descricao":"Potenciometro DF","Componente":481,"Aferir":false,"DelayAmostragem":500,"Leitura":null,"Inicializado":false,"Testando":false,"Funcoes":[46],"Parametros":[["Minimo","-104"],["Meio","5"],["Maximo","120"],["Margem","5"]],"UnidadeMedida":"º","LimiteMaximo":120.0,"LimiteMinimo":-104.0}],"Sinaleiros":[{"ID":"LEDMN","Descricao":"Sinaleiro indicação de modo Manual ativo","Componente":445,"Funcoes":[38],"Comportamento":{"statusLED":0,"QtdPiscadas":1,"TempoMs":1000,"PausaMs":1000},"Leitura":null,"Inicializado":false,"LeituraComando":0,"LeituraStatus":0},{"ID":"LEDAT","Descricao":"Sinaleiro indicação de modo Automático ativo","Componente":445,"Funcoes":[38],"Comportamento":{"statusLED":1,"QtdPiscadas":1,"TempoMs":1000,"PausaMs":1000},"Leitura":null,"Inicializado":false,"LeituraComando":0,"LeituraStatus":0},{"ID":"LEDOP","Descricao":"Sinaleiro indicação do status da operação ativa","Componente":445,"Funcoes":[38],"Comportamento":{"statusLED":2,"QtdPiscadas":3,"TempoMs":200,"PausaMs":2000},"Leitura":null,"Inicializado":false,"LeituraComando":0,"LeituraStatus":0}],"Reles":[{"ID":"RLLRA","Descricao":"Relé modo operação LoRa","Componente":479,"Funcoes":[26],"ControleExterno":false,"Controlar":true,"AtuacaoNivelAlto":true,"StatusControle":0,"Leitura":null,"Inicializado":false,"LeituraEstado":0},{"ID":"RLPOTET","Descricao":"Relé alimentação Direcional ET","Componente":479,"Funcoes":[26],"ControleExterno":true,"Controlar":false,"AtuacaoNivelAlto":true,"StatusControle":0,"Leitura":null,"Inicializado":false,"LeituraEstado":0},{"ID":"RLPOTDT","Descricao":"Relé alimentação Direcional DT","Componente":479,"Funcoes":[26],"ControleExterno":true,"Controlar":false,"AtuacaoNivelAlto":true,"StatusControle":0,"Leitura":null,"Inicializado":false,"LeituraEstado":0},{"ID":"RLPOTEF","Descricao":"Relé alimentação Direcional EF","Componente":479,"Funcoes":[26],"ControleExterno":true,"Controlar":false,"AtuacaoNivelAlto":true,"StatusControle":0,"Leitura":null,"Inicializado":false,"LeituraEstado":0},{"ID":"RLPOTDF","Descricao":"Relé alimentação Direcional DF","Componente":479,"Funcoes":[26],"ControleExterno":true,"Controlar":false,"AtuacaoNivelAlto":true,"StatusControle":0,"Leitura":null,"Inicializado":false,"LeituraEstado":0}],"Servos":[{"ID":"FRO_ET","Descricao":"Freio Motor ET","Componente":480,"Funcoes":[45],"Controlar":true,"_AnguloControle":0,"Leitura":null,"Inicializado":false,"LeituraAngulo":0.0},{"ID":"FRO_EF","Descricao":"Freio Motor EF","Componente":480,"Funcoes":[45],"Controlar":false,"_AnguloControle":0,"Leitura":null,"Inicializado":false,"LeituraAngulo":0.0},{"ID":"FRO_DT","Descricao":"Freio Motor DT","Componente":480,"Funcoes":[45],"Controlar":true,"_AnguloControle":0,"Leitura":null,"Inicializado":false,"LeituraAngulo":0.0},{"ID":"FRO_DF","Descricao":"Freio Motor DF","Componente":480,"Funcoes":[45],"Controlar":false,"_AnguloControle":0,"Leitura":null,"Inicializado":false,"LeituraAngulo":0.0}],"CameraID_Caminho":"14442C10C143E2D600","CameraID_Solo":["14442C1011AD1ED000",""],"ConfiguracaoSensorUltrassom":{"Configuracao":2,"Sensores":[{"ID":1,"Posicao":1,"LimiteMinimo":true,"LimiteMinimoVal":50.0,"MargemMinimo":2.0,"LimiteMaximo":false,"LimiteMaximoVal":0.0,"MargemMaximo":0.0,"Desvio":true,"Parada":false,"DistanciaIdeal":50.0,"EmUso":true,"LeituraCm":48.0,"SensorAtuado":false},{"ID":2,"Posicao":3,"LimiteMinimo":true,"LimiteMinimoVal":50.0,"MargemMinimo":2.0,"LimiteMaximo":false,"LimiteMaximoVal":0.0,"MargemMaximo":0.0,"Desvio":true,"Parada":false,"DistanciaIdeal":50.0,"EmUso":true,"LeituraCm":46.8,"SensorAtuado":true},{"ID":3,"Posicao":4,"LimiteMinimo":true,"LimiteMinimoVal":50.0,"MargemMinimo":2.0,"LimiteMaximo":false,"LimiteMaximoVal":0.0,"MargemMaximo":0.0,"Desvio":true,"Parada":false,"DistanciaIdeal":50.0,"EmUso":true,"LeituraCm":61.2,"SensorAtuado":false},{"ID":4,"Posicao":6,"LimiteMinimo":true,"LimiteMinimoVal":50.0,"MargemMinimo":2.0,"LimiteMaximo":false,"LimiteMaximoVal":0.0,"MargemMaximo":0.0,"Desvio":true,"Parada":false,"DistanciaIdeal":50.0,"EmUso":true,"LeituraCm":53.6,"SensorAtuado":false}],"_paradaFrontal":false,"_paradaTraseira":false,"_paradaEsquerda":false,"_paradaDireita":false,"DesvioNecessario":true,"ParadaNecessaria":false,"DirecoesObstaculos":[4],"DirecaoDesvio":3},"BateriaCargaConsumida":0.0,"DadosLeitura":{"Momento":"0001-01-01T00:00:00","Conectado":false,"Mod_ID":null,"QualidadeWifi":0,"LatenciaLoop":0,"SensoresTemperatura":[],"SensoresCorrente":[],"Sinaleiros":[],"Reles":[],"ServoFreios":[],"SensoresPotenciometro":[],"UltimoComandoRespondido":"0001-01-01T00:00:00"},"LoRaParametrosBase":{"UltimaLeitura":"0001-01-01T00:00:00","PortaCOM":"COM21","baudRate":96,"airRate":2,"baudAndAirRate":98,"parity":0,"packetSize":0,"power":0,"packetSizeAndPower":0,"tranMode":64,"worCycle":7,"tranModeAndWorCycle":71,"channelRssi":0,"lbt":0,"packetRssi":0,"address":1,"channel":23,"key":0}} \ No newline at end of file +{"tmrRegistrador":{"_uiControl":null,"State":2,"IsRunning":false,"IsStopped":true,"IsCreated":false,"Interval":500,"StackTrace":"SensoriamentoModel.IniciarRegistrador","Id":"tmrRegistrador_Sen","TimeTick":"00:00:00"},"Modulo_ID":"Sen","IP":"192.168.100.12","RequisitarDados":false,"Conectado":false,"Sensores":[{"LogGrafico":[],"ID":"TMVET","Prioridade":0,"Descricao":"Temperatura Motor Esquerdo Trás","Componente":411,"Aferir":true,"DelayAmostragem":200,"Leitura":null,"Inicializado":false,"Testando":false,"Funcoes":[12],"Parametros":[["Offset","-20"]],"UnidadeMedida":"ºC","LimiteMaximo":0.0,"LimiteMinimo":0.0},{"LogGrafico":[],"ID":"TMVEF","Prioridade":0,"Descricao":"Temperatura Motor Esquerdo Frente","Componente":411,"Aferir":true,"DelayAmostragem":200,"Leitura":null,"Inicializado":false,"Testando":false,"Funcoes":[12],"Parametros":[["Offset","-20"]],"UnidadeMedida":"ºC","LimiteMaximo":0.0,"LimiteMinimo":0.0},{"LogGrafico":[],"ID":"TMVDT","Prioridade":0,"Descricao":"Temperatura Motor Direito Trás","Componente":411,"Aferir":true,"DelayAmostragem":200,"Leitura":null,"Inicializado":false,"Testando":false,"Funcoes":[12],"Parametros":[["Offset","-20"]],"UnidadeMedida":"ºC","LimiteMaximo":0.0,"LimiteMinimo":0.0},{"LogGrafico":[],"ID":"TMVDF","Prioridade":0,"Descricao":"Temperatura Motor Direito Frente","Componente":411,"Aferir":true,"DelayAmostragem":200,"Leitura":null,"Inicializado":false,"Testando":false,"Funcoes":[12],"Parametros":[["Offset","-20"]],"UnidadeMedida":"ºC","LimiteMaximo":0.0,"LimiteMinimo":0.0},{"LogGrafico":[],"ID":"AB5V","Prioridade":10,"Descricao":"Corrente no Barramento 5V","Componente":322,"Aferir":true,"DelayAmostragem":500,"Leitura":null,"Inicializado":false,"Testando":false,"Funcoes":[27],"Parametros":[["Endereço I2C","0x41"],["Corrente Max","3.2"]],"UnidadeMedida":"A","LimiteMaximo":0.0,"LimiteMinimo":0.0},{"LogGrafico":[],"ID":"AB7V2","Prioridade":10,"Descricao":"Corrente no Barramento 7,2V","Componente":322,"Aferir":true,"DelayAmostragem":500,"Leitura":null,"Inicializado":false,"Testando":false,"Funcoes":[27],"Parametros":[["Endereço I2C","0x44"],["CI","219"]],"UnidadeMedida":"A","LimiteMaximo":0.0,"LimiteMinimo":0.0},{"LogGrafico":[],"ID":"AB12V","Prioridade":10,"Descricao":"Corrente no Barramento 12V","Componente":322,"Aferir":true,"DelayAmostragem":500,"Leitura":null,"Inicializado":false,"Testando":false,"Funcoes":[27],"Parametros":[["Endereço I2C","0x40"],["Corrente Max","100"]],"UnidadeMedida":"A","LimiteMaximo":0.0,"LimiteMinimo":0.0},{"LogGrafico":[],"ID":"TBAT","Prioridade":5,"Descricao":"Temperatura da bateria","Componente":411,"Aferir":false,"DelayAmostragem":500,"Leitura":null,"Inicializado":false,"Testando":false,"Funcoes":[12],"Parametros":[["Offset","-20"]],"UnidadeMedida":"ºC","LimiteMaximo":0.0,"LimiteMinimo":0.0},{"LogGrafico":[],"ID":"POTET","Prioridade":24,"Descricao":"Potenciometro ET","Componente":481,"Aferir":false,"DelayAmostragem":500,"Leitura":null,"Inicializado":false,"Testando":false,"Funcoes":[46],"Parametros":[["Minimo","-110"],["Meio","-8"],["Maximo","104"],["Margem","5"]],"UnidadeMedida":"º","LimiteMaximo":104.0,"LimiteMinimo":-110.0},{"LogGrafico":[],"ID":"POTDT","Prioridade":24,"Descricao":"Potenciometro DT","Componente":481,"Aferir":false,"DelayAmostragem":500,"Leitura":null,"Inicializado":false,"Testando":false,"Funcoes":[46],"Parametros":[["Minimo","-110"],["Meio","-18"],["Maximo","80"],["Margem","5"]],"UnidadeMedida":"º","LimiteMaximo":80.0,"LimiteMinimo":-110.0},{"LogGrafico":[],"ID":"POTEF","Prioridade":24,"Descricao":"Potenciometro EF","Componente":481,"Aferir":false,"DelayAmostragem":500,"Leitura":null,"Inicializado":false,"Testando":false,"Funcoes":[46],"Parametros":[["Minimo","-110"],["Meio","-13"],["Maximo","90"],["Margem","5"]],"UnidadeMedida":"º","LimiteMaximo":90.0,"LimiteMinimo":-110.0},{"LogGrafico":[],"ID":"POTDF","Prioridade":24,"Descricao":"Potenciometro DF","Componente":481,"Aferir":false,"DelayAmostragem":500,"Leitura":null,"Inicializado":false,"Testando":false,"Funcoes":[46],"Parametros":[["Minimo","-104"],["Meio","5"],["Maximo","120"],["Margem","5"]],"UnidadeMedida":"º","LimiteMaximo":120.0,"LimiteMinimo":-104.0}],"Sinaleiros":[{"ID":"LEDMN","Descricao":"Sinaleiro indicação de modo Manual ativo","Componente":445,"Funcoes":[38],"Comportamento":{"statusLED":0,"QtdPiscadas":1,"TempoMs":1000,"PausaMs":1000},"Leitura":null,"Inicializado":false,"LeituraComando":0,"LeituraStatus":0},{"ID":"LEDAT","Descricao":"Sinaleiro indicação de modo Automático ativo","Componente":445,"Funcoes":[38],"Comportamento":{"statusLED":1,"QtdPiscadas":1,"TempoMs":1000,"PausaMs":1000},"Leitura":null,"Inicializado":false,"LeituraComando":0,"LeituraStatus":0},{"ID":"LEDOP","Descricao":"Sinaleiro indicação do status da operação ativa","Componente":445,"Funcoes":[38],"Comportamento":{"statusLED":2,"QtdPiscadas":3,"TempoMs":200,"PausaMs":2000},"Leitura":null,"Inicializado":false,"LeituraComando":0,"LeituraStatus":0}],"Reles":[{"ID":"RLLRA","Descricao":"Relé modo operação LoRa","Componente":479,"Funcoes":[26],"ControleExterno":false,"Controlar":true,"AtuacaoNivelAlto":true,"StatusControle":0,"Leitura":null,"Inicializado":false,"LeituraEstado":0},{"ID":"RLPOTET","Descricao":"Relé alimentação Direcional ET","Componente":479,"Funcoes":[26],"ControleExterno":true,"Controlar":false,"AtuacaoNivelAlto":true,"StatusControle":0,"Leitura":null,"Inicializado":false,"LeituraEstado":0},{"ID":"RLPOTDT","Descricao":"Relé alimentação Direcional DT","Componente":479,"Funcoes":[26],"ControleExterno":true,"Controlar":false,"AtuacaoNivelAlto":true,"StatusControle":0,"Leitura":null,"Inicializado":false,"LeituraEstado":0},{"ID":"RLPOTEF","Descricao":"Relé alimentação Direcional EF","Componente":479,"Funcoes":[26],"ControleExterno":true,"Controlar":false,"AtuacaoNivelAlto":true,"StatusControle":0,"Leitura":null,"Inicializado":false,"LeituraEstado":0},{"ID":"RLPOTDF","Descricao":"Relé alimentação Direcional DF","Componente":479,"Funcoes":[26],"ControleExterno":true,"Controlar":false,"AtuacaoNivelAlto":true,"StatusControle":0,"Leitura":null,"Inicializado":false,"LeituraEstado":0}],"Servos":[{"ID":"FRO_ET","Descricao":"Freio Motor ET","Componente":480,"Funcoes":[45],"Controlar":true,"_AnguloControle":0,"Leitura":null,"Inicializado":false,"LeituraAngulo":0.0},{"ID":"FRO_EF","Descricao":"Freio Motor EF","Componente":480,"Funcoes":[45],"Controlar":false,"_AnguloControle":0,"Leitura":null,"Inicializado":false,"LeituraAngulo":0.0},{"ID":"FRO_DT","Descricao":"Freio Motor DT","Componente":480,"Funcoes":[45],"Controlar":true,"_AnguloControle":0,"Leitura":null,"Inicializado":false,"LeituraAngulo":0.0},{"ID":"FRO_DF","Descricao":"Freio Motor DF","Componente":480,"Funcoes":[45],"Controlar":false,"_AnguloControle":0,"Leitura":null,"Inicializado":false,"LeituraAngulo":0.0}],"CameraID_Caminho":"14442C10C143E2D600","CameraID_Solo":["14442C1011AD1ED000",""],"ConfiguracaoSensorUltrassom":{"Configuracao":2,"Sensores":[{"ID":1,"Posicao":1,"LimiteMinimo":true,"LimiteMinimoVal":50.0,"MargemMinimo":2.0,"LimiteMaximo":false,"LimiteMaximoVal":0.0,"MargemMaximo":0.0,"Desvio":true,"Parada":false,"DistanciaIdeal":50.0,"EmUso":true,"LeituraCm":48.0,"SensorAtuado":false},{"ID":2,"Posicao":3,"LimiteMinimo":true,"LimiteMinimoVal":50.0,"MargemMinimo":2.0,"LimiteMaximo":false,"LimiteMaximoVal":0.0,"MargemMaximo":0.0,"Desvio":true,"Parada":false,"DistanciaIdeal":50.0,"EmUso":true,"LeituraCm":46.8,"SensorAtuado":true},{"ID":3,"Posicao":4,"LimiteMinimo":true,"LimiteMinimoVal":50.0,"MargemMinimo":2.0,"LimiteMaximo":false,"LimiteMaximoVal":0.0,"MargemMaximo":0.0,"Desvio":true,"Parada":false,"DistanciaIdeal":50.0,"EmUso":true,"LeituraCm":61.2,"SensorAtuado":false},{"ID":4,"Posicao":6,"LimiteMinimo":true,"LimiteMinimoVal":50.0,"MargemMinimo":2.0,"LimiteMaximo":false,"LimiteMaximoVal":0.0,"MargemMaximo":0.0,"Desvio":true,"Parada":false,"DistanciaIdeal":50.0,"EmUso":true,"LeituraCm":53.6,"SensorAtuado":false}],"_paradaFrontal":false,"_paradaTraseira":false,"_paradaEsquerda":false,"_paradaDireita":false,"DesvioNecessario":true,"ParadaNecessaria":false,"DirecoesObstaculos":[4],"DirecaoDesvio":3},"BateriaCargaConsumida":0.0,"DadosLeitura":{"Momento":"0001-01-01T00:00:00","Conectado":false,"Mod_ID":null,"QualidadeWifi":0,"LatenciaLoop":0,"SensoresTemperatura":[],"SensoresCorrente":[],"Sinaleiros":[],"Reles":[],"ServoFreios":[],"SensoresPotenciometro":[],"UltimoComandoRespondido":"0001-01-01T00:00:00"},"LoRaParametrosBase":{"UltimaLeitura":"0001-01-01T00:00:00","PortaCOM":"","baudRate":96,"airRate":2,"baudAndAirRate":98,"parity":0,"packetSize":0,"power":0,"packetSizeAndPower":0,"tranMode":64,"worCycle":7,"tranModeAndWorCycle":71,"channelRssi":0,"lbt":0,"packetRssi":0,"address":1,"channel":23,"key":0}} \ No newline at end of file diff --git a/AgroBase/AgroBase/bin/Debug/Python/Output/GeoJson.json b/AgroBase/AgroBase/bin/Debug/Python/Output/GeoJson.json index 3376beeef..cbd02c3aa 100644 --- a/AgroBase/AgroBase/bin/Debug/Python/Output/GeoJson.json +++ b/AgroBase/AgroBase/bin/Debug/Python/Output/GeoJson.json @@ -1 +1,221 @@ -{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"Id":"1","Name":"28_03_2025_14_52_47","Length":24.117658942990531,"Dist1":0.0,"Dist2":0.0},"geometry":{"id":null,"type":"LineString","coordinates":[[-47.395224896,-22.172530905666665],[-47.395224814666669,-22.172530881166665],[-47.395224869166668,-22.172530858666665],[-47.395224843666668,-22.1725308255],[-47.395224782833331,-22.1725309215],[-47.395224707166669,-22.1725309895],[-47.395224716333331,-22.172530981666668],[-47.3952246845,-22.1725309905],[-47.395224654333333,-22.172531001833335],[-47.395224638333332,-22.1725310205],[-47.395224615333333,-22.1725310215],[-47.395224601333332,-22.1725310395],[-47.3952245865,-22.172531038333332],[-47.395224556666669,-22.172531053333334],[-47.395224520833331,-22.1725310615],[-47.395224496833336,-22.172531070166666],[-47.395224473833331,-22.172531077166667],[-47.395224445666663,-22.172531089166668],[-47.395224442166665,-22.172531103166666],[-47.395224427,-22.172531076333332],[-47.395224394833335,-22.1725310685],[-47.395224381666665,-22.1725311315],[-47.395224372666668,-22.172531105666668],[-47.395224357333333,-22.172531095],[-47.395224388166667,-22.172531347666666],[-47.395225137333334,-22.172534490666667],[-47.395225645,-22.172538111],[-47.39522384633333,-22.172540902666668],[-47.39522103583333,-22.172543275166667],[-47.395217679,-22.17254414],[-47.395214692833335,-22.172546121833335],[-47.395210529,-22.172546959833333],[-47.395206482333336,-22.172548131666666],[-47.395202635833336,-22.172548931],[-47.395198742666665,-22.1725496485],[-47.39519530816667,-22.172551297],[-47.395193089166668,-22.172553379166665],[-47.3951906165,-22.172556357833333],[-47.39518954,-22.172558924333334],[-47.3951892955,-22.172562425333332],[-47.395189338666668,-22.172565753333334],[-47.3951903165,-22.172569415833333],[-47.395191980333337,-22.172572816333332],[-47.395194284666665,-22.172577084833332],[-47.395197333333336,-22.172582304666665],[-47.3951991365,-22.172587995166666],[-47.395201415833334,-22.172594441666668],[-47.395203092666669,-22.172602672666667],[-47.395204304333333,-22.172610736333333],[-47.395205132,-22.172618987833335],[-47.395205720666667,-22.172626966833334],[-47.395206206833336,-22.172634488333333],[-47.395206750333337,-22.1726419035],[-47.395207180666667,-22.172649125166668],[-47.3952078105,-22.172656991166665],[-47.395208609,-22.1726643035],[-47.395209229,-22.1726726965],[-47.395209939166669,-22.1726804585],[-47.395211465666669,-22.172686973],[-47.395212691,-22.1726939085],[-47.3952135945,-22.172699633833332],[-47.3952137895,-22.1727036245],[-47.395214332833334,-22.1727079415],[-47.395215900666663,-22.172710840833332],[-47.395216996833334,-22.172713710833332],[-47.395218383666666,-22.172715863833332],[-47.39521935016667,-22.172718333833334],[-47.395218823,-22.172720601166667],[-47.395218898333333,-22.172720221166667],[-47.395218846666666,-22.172720248],[-47.3952188105,-22.172720256333335],[-47.39521881266667,-22.172720288333334],[-47.395218752333335,-22.1727202475],[-47.395218729166665,-22.172720266333332],[-47.3952186995,-22.172720271833334],[-47.395218683,-22.172720275166668],[-47.395218645666667,-22.172720276333333],[-47.395218627666665,-22.1727202785],[-47.3952186145,-22.172720284],[-47.395218570333334,-22.1727203085],[-47.395218561833332,-22.172720305666665],[-47.3952185305,-22.172720299],[-47.3952184855,-22.172720302666665],[-47.3952184605,-22.172720312166668],[-47.39521843233333,-22.172720307833334],[-47.395218399833333,-22.1727203335],[-47.395218375333336,-22.172720338333335],[-47.395218384,-22.172720347666665],[-47.395218363333335,-22.172720357666666],[-47.395218321833333,-22.172720362666666],[-47.3952182875,-22.172720388833334],[-47.395218217666667,-22.172720461333334],[-47.395218247333332,-22.1727204295],[-47.395218216166668,-22.172720418833332],[-47.395218204666669,-22.1727204255],[-47.395218174,-22.172720434166667]]}}]} \ No newline at end of file +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "Id": "1", + "Name": "CidadeJardimTerreno2", + "Length": 14.558011415731592, + "Dist1": 14.558011415731592, + "Dist2": 0.0 + }, + "geometry": { + "id": null, + "type": "LineString", + "coordinates": [ + [ + -47.395205344, + -22.172559531333334 + ], + [ + -47.395212610166666, + -22.172614638833334 + ], + [ + -47.395219157, + -22.172656417833334 + ], + [ + -47.395223544833335, + -22.1726892105 + ], + [ + -47.39522414098443, + -22.17269369161165 + ], + [ + -47.395225326538004, + -22.172702654611555 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "Id": "2", + "Name": "CidadeJardimTerreno2", + "Length": 14.771318274761821, + "Dist1": 14.558011415731592, + "Dist2": 0.0 + }, + "geometry": { + "id": null, + "type": "LineString", + "coordinates": [ + [ + -47.39521090233333, + -22.172708800833334 + ], + [ + -47.395206943666665, + -22.172679811 + ], + [ + -47.395202420666664, + -22.1726491015 + ], + [ + -47.395198865666664, + -22.172615782833333 + ], + [ + -47.395193255833334, + -22.172577132833332 + ], + [ + -47.395192610024395, + -22.17257265769541 + ], + [ + -47.395191325698136, + -22.172563706509337 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "Id": "3", + "Name": "CidadeJardimTerreno2", + "Length": 14.827915524386164, + "Dist1": 14.558011415731592, + "Dist2": 0.0 + }, + "geometry": { + "id": null, + "type": "LineString", + "coordinates": [ + [ + -47.3951762925, + -22.172561603 + ], + [ + -47.395180824166665, + -22.172591686166665 + ], + [ + -47.395185745333336, + -22.172623080166666 + ], + [ + -47.395190433, + -22.172656367166667 + ], + [ + -47.395195199, + -22.172693641833334 + ], + [ + -47.39519576904436, + -22.172698125891035 + ], + [ + -47.39519690267159, + -22.172707094716973 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "Id": "4", + "Name": "CidadeJardimTerreno2", + "Length": 14.785159385903514, + "Dist1": 14.558011415731592, + "Dist2": 0.0 + }, + "geometry": { + "id": null, + "type": "LineString", + "coordinates": [ + [ + -47.39518293216667, + -22.1727127985 + ], + [ + -47.39517819266667, + -22.172680514833335 + ], + [ + -47.3951732595, + -22.172646752833334 + ], + [ + -47.39516880516667, + -22.1726149155 + ], + [ + -47.39516381233334, + -22.172581167166665 + ], + [ + -47.39516315429932, + -22.172576693573966 + ], + [ + -47.39516184565584, + -22.172567745443878 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "Id": "5", + "Name": "CidadeJardimTerreno2", + "Length": 14.80117692191233, + "Dist1": 14.558011415731592, + "Dist2": 0.0 + }, + "geometry": { + "id": null, + "type": "LineString", + "coordinates": [ + [ + -47.395147317833334, + -22.172566031 + ], + [ + -47.395151503166666, + -22.172595452333333 + ], + [ + -47.3951561855, + -22.172628011166665 + ], + [ + -47.39516159866667, + -22.172663757333332 + ], + [ + -47.39516672716667, + -22.172697770833334 + ], + [ + -47.395167397572706, + -22.172702242832194 + ], + [ + -47.39516873082615, + -22.17271118781009 + ] + ] + } + } + ] +} \ No newline at end of file diff --git a/AgroBase/AgroBase/bin/Debug/Python/Output/mapa_interativo.html b/AgroBase/AgroBase/bin/Debug/Python/Output/mapa_interativo.html index 78f9a03a7..2550eca3e 100644 --- a/AgroBase/AgroBase/bin/Debug/Python/Output/mapa_interativo.html +++ b/AgroBase/AgroBase/bin/Debug/Python/Output/mapa_interativo.html @@ -25,7 +25,7 @@