acompanhamento das ruas do mapa antes de iniciar a operacao

This commit is contained in:
Diego Freitas 2024-10-10 16:58:57 -03:00
parent 7cabff2654
commit ad2a9a8b1b
19 changed files with 334 additions and 135 deletions

Binary file not shown.

View File

@ -29,6 +29,7 @@
private void InitializeComponent() private void InitializeComponent()
{ {
this.pnlOpcoes = new System.Windows.Forms.Panel(); this.pnlOpcoes = new System.Windows.Forms.Panel();
this.lblTempoEstimado = new System.Windows.Forms.Label();
this.lblStatusOperacao = new System.Windows.Forms.Label(); this.lblStatusOperacao = new System.Windows.Forms.Label();
this.lblDistanciaLateral = new System.Windows.Forms.Label(); this.lblDistanciaLateral = new System.Windows.Forms.Label();
this.btnAtualizarLeitura = new System.Windows.Forms.Button(); this.btnAtualizarLeitura = new System.Windows.Forms.Button();
@ -79,7 +80,7 @@
this.lblAproximando = new System.Windows.Forms.Label(); this.lblAproximando = new System.Windows.Forms.Label();
this.lblDistProx = new System.Windows.Forms.Label(); this.lblDistProx = new System.Windows.Forms.Label();
this.lblDistAnt = new System.Windows.Forms.Label(); this.lblDistAnt = new System.Windows.Forms.Label();
this.lblTempoEstimado = new System.Windows.Forms.Label(); this.chbAutomatico = new System.Windows.Forms.CheckBox();
this.pnlOpcoes.SuspendLayout(); this.pnlOpcoes.SuspendLayout();
this.gpbSonar.SuspendLayout(); this.gpbSonar.SuspendLayout();
this.gpbGPS.SuspendLayout(); this.gpbGPS.SuspendLayout();
@ -89,6 +90,7 @@
// //
// pnlOpcoes // pnlOpcoes
// //
this.pnlOpcoes.Controls.Add(this.chbAutomatico);
this.pnlOpcoes.Controls.Add(this.lblTempoEstimado); this.pnlOpcoes.Controls.Add(this.lblTempoEstimado);
this.pnlOpcoes.Controls.Add(this.lblStatusOperacao); this.pnlOpcoes.Controls.Add(this.lblStatusOperacao);
this.pnlOpcoes.Controls.Add(this.lblDistanciaLateral); this.pnlOpcoes.Controls.Add(this.lblDistanciaLateral);
@ -108,6 +110,17 @@
this.pnlOpcoes.Size = new System.Drawing.Size(1379, 100); this.pnlOpcoes.Size = new System.Drawing.Size(1379, 100);
this.pnlOpcoes.TabIndex = 0; this.pnlOpcoes.TabIndex = 0;
// //
// lblTempoEstimado
//
this.lblTempoEstimado.AutoSize = true;
this.lblTempoEstimado.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F);
this.lblTempoEstimado.Location = new System.Drawing.Point(201, 54);
this.lblTempoEstimado.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.lblTempoEstimado.Name = "lblTempoEstimado";
this.lblTempoEstimado.Size = new System.Drawing.Size(133, 13);
this.lblTempoEstimado.TabIndex = 25;
this.lblTempoEstimado.Text = "Tempo estimado: 00:00:00";
//
// lblStatusOperacao // lblStatusOperacao
// //
this.lblStatusOperacao.AutoSize = true; this.lblStatusOperacao.AutoSize = true;
@ -674,16 +687,17 @@
this.lblDistAnt.TabIndex = 24; this.lblDistAnt.TabIndex = 24;
this.lblDistAnt.Text = "Distância Ponto Anterior: 0,00 m"; this.lblDistAnt.Text = "Distância Ponto Anterior: 0,00 m";
// //
// lblTempoEstimado // chbAutomatico
// //
this.lblTempoEstimado.AutoSize = true; this.chbAutomatico.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.lblTempoEstimado.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F); this.chbAutomatico.AutoSize = true;
this.lblTempoEstimado.Location = new System.Drawing.Point(201, 54); this.chbAutomatico.Location = new System.Drawing.Point(1231, 72);
this.lblTempoEstimado.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.chbAutomatico.Margin = new System.Windows.Forms.Padding(2);
this.lblTempoEstimado.Name = "lblTempoEstimado"; this.chbAutomatico.Name = "chbAutomatico";
this.lblTempoEstimado.Size = new System.Drawing.Size(133, 13); this.chbAutomatico.Size = new System.Drawing.Size(137, 17);
this.lblTempoEstimado.TabIndex = 25; this.chbAutomatico.TabIndex = 30;
this.lblTempoEstimado.Text = "Tempo estimado: 00:00:00"; this.chbAutomatico.Text = "Atualização Automática";
this.chbAutomatico.UseVisualStyleBackColor = true;
// //
// frmSimulacaoMapaGPS // frmSimulacaoMapaGPS
// //
@ -778,5 +792,6 @@
private System.Windows.Forms.Label lblDistAnt; private System.Windows.Forms.Label lblDistAnt;
private System.Windows.Forms.Label lblStatusOperacao; private System.Windows.Forms.Label lblStatusOperacao;
private System.Windows.Forms.Label lblTempoEstimado; private System.Windows.Forms.Label lblTempoEstimado;
private System.Windows.Forms.CheckBox chbAutomatico;
} }
} }

View File

@ -12,17 +12,19 @@ namespace AgroBase.Forms
public partial class frmSimulacaoMapaGPS : Form public partial class frmSimulacaoMapaGPS : Form
{ {
Timer tmrSonar; Timer tmrSonar;
Timer tmrLeitura = new Timer() { Interval = 500 };
StatusCarroMapa StatusCarro = StatusCarroMapa.Parado; StatusCarroMapa StatusCarro = StatusCarroMapa.Parado;
MapaDinamicoModel MapaDinamico; MapaDinamicoModel MapaDinamico;
bool calc = false; bool calc = false;
bool parar = false;
DateTime UltimaAtualizacao = DateTime.MinValue;
public frmSimulacaoMapaGPS() public frmSimulacaoMapaGPS()
{ {
InitializeComponent(); InitializeComponent();
Timer tmr = new Timer() { Interval = 500 }; tmrLeitura.Tick += Tmr_Tick;
tmr.Tick += Tmr_Tick; tmrLeitura.Start();
//tmr.Start();
// Ativa o double buffering // Ativa o double buffering
this.DoubleBuffered = true; this.DoubleBuffered = true;
@ -35,7 +37,15 @@ namespace AgroBase.Forms
private void Tmr_Tick(object sender, EventArgs e) private void Tmr_Tick(object sender, EventArgs e)
{ {
btnCalcularAngulo_Click(sender, e); if (chbAutomatico.Checked)
{
btnAcrescentarGPS_Click(sender, e);
}
}
private void AtualizarDadosTela()
{
btnCalcularAngulo_Click(new object(), new EventArgs());
StatusCarro = Variaveis.OperacaoEmAndamento.OpMapaGPS.ReferencialRuaGPS.StatusAtual; StatusCarro = Variaveis.OperacaoEmAndamento.OpMapaGPS.ReferencialRuaGPS.StatusAtual;
@ -73,6 +83,13 @@ namespace AgroBase.Forms
} }
else else
{ {
if (btnIniciarSimulacao.Text.Contains("Parar"))
{
parar = true;
btnIniciarSimulacao_Click(new object(), new EventArgs());
parar = false;
}
Variaveis.OperacaoEmAndamento.OpMapaGPS.AtualizarRuasSelecionadas(); Variaveis.OperacaoEmAndamento.OpMapaGPS.AtualizarRuasSelecionadas();
} }
} }
@ -94,6 +111,10 @@ namespace AgroBase.Forms
{ {
tmrSonar.Stop(); tmrSonar.Stop();
} }
if (tmrLeitura != null && tmrLeitura.Enabled)
{
tmrLeitura.Stop();
}
Variaveis.OperacaoEmAndamento.Iniciado = false; Variaveis.OperacaoEmAndamento.Iniciado = false;
} }
@ -172,7 +193,7 @@ namespace AgroBase.Forms
AtualizarPosicaoGPS(); AtualizarPosicaoGPS();
calc = true; calc = true;
Tmr_Tick(sender, e); AtualizarDadosTela();
calc = false; calc = false;
} }
@ -183,8 +204,12 @@ namespace AgroBase.Forms
MessageBox.Show("Selecione as ruas para realizar a operação!"); MessageBox.Show("Selecione as ruas para realizar a operação!");
return; return;
} }
if (!Variaveis.OperacaoEmAndamento.Iniciado && !parar)
{
Variaveis.OperacaoEmAndamento.IniciarSimulacao(); Variaveis.OperacaoEmAndamento.IniciarSimulacao();
Variaveis.OperacaoEmAndamento.Iniciado = btnIniciarSimulacao.Text == "Iniciar Simulação"; }
btnIniciarSimulacao.Text = Variaveis.OperacaoEmAndamento.Iniciado ? "Parar Simulação" : "Iniciar Simulação"; btnIniciarSimulacao.Text = Variaveis.OperacaoEmAndamento.Iniciado ? "Parar Simulação" : "Iniciar Simulação";
if (Variaveis.OperacaoEmAndamento.Iniciado) if (Variaveis.OperacaoEmAndamento.Iniciado)
{ {
@ -192,7 +217,7 @@ namespace AgroBase.Forms
GPSService.PenultimaLeitura.Longitude = GPSService.UltimaLeitura.Longitude; GPSService.PenultimaLeitura.Longitude = GPSService.UltimaLeitura.Longitude;
Variaveis.OperacaoEmAndamento.Mapa.GerarTrajetoriaDinamica(); Variaveis.OperacaoEmAndamento.Mapa.GerarTrajetoriaDinamica();
Tmr_Tick(sender, e); AtualizarDadosTela();
} }
} }
@ -290,7 +315,7 @@ namespace AgroBase.Forms
private void btnAtualizarLeitura_Click(object sender, EventArgs e) private void btnAtualizarLeitura_Click(object sender, EventArgs e)
{ {
Tmr_Tick(new Timer(), e); AtualizarDadosTela();
} }
private void btnCalcularAngulo_Click(object sender, EventArgs e) private void btnCalcularAngulo_Click(object sender, EventArgs e)
@ -311,9 +336,11 @@ namespace AgroBase.Forms
double velocidadeMs = MovimentacaoModel.ConverteKmhParaMs(velocidade); double velocidadeMs = MovimentacaoModel.ConverteKmhParaMs(velocidade);
txtVelocidade.Text = velocidade.ToString("0.00"); txtVelocidade.Text = velocidade.ToString("0.00");
//double distancia = Math.Round((double)Variaveis.OperacaoEmAndamento.OpMapaGPS.Controle.RPM / 45.0, 2); TimeSpan tempoPassado = !chbAutomatico.Checked || UltimaAtualizacao == DateTime.MinValue ? new TimeSpan(10000000) : DateTime.Now - UltimaAtualizacao;
double distancia = velocidadeMs; // Calcula a distância com base no tempo passado (em segundos)
double distancia = velocidadeMs * tempoPassado.TotalSeconds;
txtDistanciaGPS.Text = distancia.ToString("0.00"); txtDistanciaGPS.Text = distancia.ToString("0.00");
UltimaAtualizacao = DateTime.Now;
pnlOrientacaoTrajeto.Invalidate(); pnlOrientacaoTrajeto.Invalidate();
pnlOrientacaoCarro.Invalidate(); pnlOrientacaoCarro.Invalidate();

View File

@ -2,9 +2,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
namespace AgroBase.Models namespace AgroBase.Models
@ -152,6 +149,8 @@ namespace AgroBase.Models
trajectory = new List<GPSModel>(); trajectory = new List<GPSModel>();
} }
try
{
for (int i = 0; i < trajectory.Count; i++) for (int i = 0; i < trajectory.Count; i++)
{ {
var trajPoint = trajectory[i]; var trajPoint = trajectory[i];
@ -173,6 +172,11 @@ namespace AgroBase.Models
} }
} }
} }
catch
{
}
}
private void DrawPoint(Graphics g, float x, float y, Color color) private void DrawPoint(Graphics g, float x, float y, Color color)
{ {

View File

@ -4,6 +4,7 @@ using CefSharp.WinForms;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Security.Cryptography;
using System.Windows.Forms; using System.Windows.Forms;
using static AgroBase.Models.Enums; using static AgroBase.Models.Enums;
@ -513,6 +514,7 @@ namespace AgroBase.Models
} }
} }
private bool GerandoTrajetoria = false; private bool GerandoTrajetoria = false;
private DateTime UltimaAtualizacaoTrajetoriaDinamica = DateTime.MinValue;
public void btnCarregar_Click(object sender, EventArgs e, string caminhoArquivo = "", bool monitoramento = false) public void btnCarregar_Click(object sender, EventArgs e, string caminhoArquivo = "", bool monitoramento = false)
@ -791,10 +793,10 @@ namespace AgroBase.Models
// O carro esta se direcionando para iniciar a operacao na primeira rua, entao escolhe o caminho mais proximo // O carro esta se direcionando para iniciar a operacao na primeira rua, entao escolhe o caminho mais proximo
if (DistanciaExtraTrajetoria == 0) if (DistanciaExtraTrajetoria == 0)
{ {
List<GPSModel> _caminhoDoInicioParaFim = GerarTrajetoLigacaoCarroPontoInicial(inicio, RuaAtual, RuaAtual[0], 0, DirecaoCarroRua.Ida, statusCarro); List<GPSModel> _caminhoDoInicioParaFim = GerarTrajetoLigacaoCarroPontoInicial(inicio, RuaAtual, RuaProjetada, RuaAtual[0], 0, DirecaoCarroRua.Ida, statusCarro);
distanciaInicialInicioParaFim = GPSService.DistanciaDoTrecho(_caminhoDoInicioParaFim); distanciaInicialInicioParaFim = GPSService.DistanciaDoTrecho(_caminhoDoInicioParaFim);
List<GPSModel> _caminhoDoFimParaInicio = GerarTrajetoLigacaoCarroPontoInicial(inicio, RuaAtual, RuaAtual[RuaAtual.Count() - 1], RuaAtual.Count() - 1, DirecaoCarroRua.Volta, statusCarro); List<GPSModel> _caminhoDoFimParaInicio = GerarTrajetoLigacaoCarroPontoInicial(inicio, RuaAtual, RuaProjetada, RuaAtual[RuaAtual.Count() - 1], RuaAtual.Count() - 1, DirecaoCarroRua.Volta, statusCarro);
distanciaInicialFimParaInicio = GPSService.DistanciaDoTrecho(_caminhoDoFimParaInicio); distanciaInicialFimParaInicio = GPSService.DistanciaDoTrecho(_caminhoDoFimParaInicio);
DefinirRotaInicial = true; DefinirRotaInicial = true;
@ -863,7 +865,7 @@ namespace AgroBase.Models
List<GPSModel> _caminhoInterpolado = GerarTrajetoLigacaoCarroPontoInicial(inicio, RuaAtual, PontoComparar, _extremoMaisProximoMapa, direcaoRua, statusCarro); List<GPSModel> _caminhoInterpolado = GerarTrajetoLigacaoCarroPontoInicial(inicio, RuaAtual, RuaProjetada, PontoComparar, _extremoMaisProximoMapa, direcaoRua, statusCarro);
_caminho.AddRange(_caminhoInterpolado); _caminho.AddRange(_caminhoInterpolado);
@ -905,6 +907,7 @@ namespace AgroBase.Models
Variaveis.OperacaoEmAndamento.OpMapaGPS.ReferencialRuaGPS.VerificaFimRuaAtual(); Variaveis.OperacaoEmAndamento.OpMapaGPS.ReferencialRuaGPS.VerificaFimRuaAtual();
if (!Variaveis.OperacaoEmAndamento.OpMapaGPS.Concluido) if (!Variaveis.OperacaoEmAndamento.OpMapaGPS.Concluido)
{ {
GerandoTrajetoria = false;
GerarTrajetoriaDinamica(); GerarTrajetoriaDinamica();
} }
return; return;
@ -923,7 +926,7 @@ namespace AgroBase.Models
List<GPSModel> _caminho = new List<GPSModel>(); List<GPSModel> _caminho = new List<GPSModel>();
// Verifica se a distância entre o ultimo ponto da rua anterior e o primeiro ponto da nova rua é curto o bastante para gerar a curva de manobra // Verifica se a distância entre o ultimo ponto da rua anterior e o primeiro ponto da nova rua é curto o bastante para gerar a curva de manobra
double distancia = GPSService.DistanciaEntrePontos(Caminho[Caminho.Count() - 1], PrimeiroPonto); double distancia = GPSService.DistanciaEntrePontos(Caminho[Caminho.Count() - 1], PrimeiroPonto);
bool distanciaMinima = distancia < MargemLimiteEntradaRua * 3; bool distanciaMinima = distancia < MargemLimiteEntradaRua * 3.0;
// Verifica se o angulo formado entre a rua anterior e a rua atual é grande o bastante para gerar a curva de manobra // Verifica se o angulo formado entre a rua anterior e a rua atual é grande o bastante para gerar a curva de manobra
double anguloEntreRuas = GPSService.CalcularOrientacao(Caminho.Last(), PrimeiroPonto); double anguloEntreRuas = GPSService.CalcularOrientacao(Caminho.Last(), PrimeiroPonto);
@ -931,7 +934,7 @@ namespace AgroBase.Models
double difAngulo = anguloFinalRuaAnterior - anguloEntreRuas; double difAngulo = anguloFinalRuaAnterior - anguloEntreRuas;
bool anguloMinimo = difAngulo >= -45.0 && difAngulo <= 45.0; bool anguloMinimo = difAngulo >= -45.0 && difAngulo <= 45.0;
if (distanciaMinima && !anguloMinimo) /*if (distanciaMinima && !anguloMinimo)
{ {
bool CurvaParaEsquerda = ExtremoMaisProximoMapa == 0; bool CurvaParaEsquerda = ExtremoMaisProximoMapa == 0;
GPSModel P0 = CalcularPontoControle(Caminho.Last(), PrimeiroPonto, distanciaEntreRuas * 2, CurvaParaEsquerda); GPSModel P0 = CalcularPontoControle(Caminho.Last(), PrimeiroPonto, distanciaEntreRuas * 2, CurvaParaEsquerda);
@ -943,7 +946,9 @@ namespace AgroBase.Models
else else
{ {
_caminho.Add(PrimeiroPonto); _caminho.Add(PrimeiroPonto);
} }*/
_caminho.Add(PrimeiroPonto);
//_caminho.AddRange(GPSService.InterpolarPontos(inicio, PrimeiroPonto, 1.0)); //_caminho.AddRange(GPSService.InterpolarPontos(inicio, PrimeiroPonto, 1.0));
_caminho.AddRange(RuaProjetada); _caminho.AddRange(RuaProjetada);
_caminho.Add(UltimoPonto); _caminho.Add(UltimoPonto);
@ -1054,52 +1059,90 @@ namespace AgroBase.Models
return pontosCurva; return pontosCurva;
} }
private List<GPSModel> GerarTrajetoLigacaoCarroPontoInicial(GPSModel inicio, List<GPSModel> RuaAtual, GPSModel PontoComparar, int _extremoMaisProximoMapa, DirecaoCarroRua direcaoRua, StatusCarroMapa statusCarro) private List<GPSModel> GerarTrajetoLigacaoCarroPontoInicial(GPSModel inicio, List<GPSModel> RuaAtual, List<GPSModel> RuaProjetada, GPSModel PontoComparar, int _extremoMaisProximoMapa, DirecaoCarroRua direcaoRua, StatusCarroMapa statusCarro)
{ {
List<GPSModel> _caminho = new List<GPSModel>(); List<GPSModel> _caminho = new List<GPSModel>();
bool CopiarRuasLaterais = true; bool CopiarRuasLaterais = true;
if (CopiarRuasLaterais && statusCarro == StatusCarroMapa.Direcionando && IdxRuaAtual == 0 && ((_extremoMaisProximoMapa == 0 && direcaoRua == DirecaoCarroRua.Ida) || (_extremoMaisProximoMapa > 0 && direcaoRua == DirecaoCarroRua.Volta))) if (CopiarRuasLaterais && new List<StatusCarroMapa>() { StatusCarroMapa.Parado, StatusCarroMapa.Direcionando }.Contains(statusCarro) && IdxRuaAtual == 0 && ((_extremoMaisProximoMapa == 0 && direcaoRua == DirecaoCarroRua.Ida) || (_extremoMaisProximoMapa > 0 && direcaoRua == DirecaoCarroRua.Volta)))
{ {
int idx = 0; int idx = 0;
double distMin = double.MaxValue; double distMin = double.MaxValue;
var DadosMapa = Variaveis.OperacaoEmAndamento.Mapa.mapaService.DadosMapa; var DadosMapa = Variaveis.OperacaoEmAndamento.Mapa.mapaService.DadosMapa;
double anguloCaminho = GPSService.CalcularOrientacao(inicio, PontoComparar); double anguloCaminho = GPSService.CalcularOrientacao(inicio, PontoComparar);
double tolerancia = 90; // Tolerância de 90 graus
GPSModel pontoAnterior = inicio; // Inicializamos com a posição inicial do robô
var PontosOrdenados = DadosMapa.features var PontosOrdenados = DadosMapa.features
.Select(x => new .Select(x => new
{ {
x.geometry.id, x.geometry.id,
dist = GPSService.DistanciaEntrePontos(inicio, new GPSModel() { Longitude = x.geometry.coordinates[GetIndexInicial(x.geometry.coordinates, _extremoMaisProximoMapa)][0], Latitude = x.geometry.coordinates[GetIndexInicial(x.geometry.coordinates, _extremoMaisProximoMapa)][1] }), dist = GPSService.DistanciaEntrePontos(pontoAnterior, new GPSModel()
orientacao = GPSService.CalcularOrientacao(inicio, new GPSModel() { Longitude = x.geometry.coordinates[GetIndexInicial(x.geometry.coordinates, _extremoMaisProximoMapa)][0], Latitude = x.geometry.coordinates[GetIndexInicial(x.geometry.coordinates, _extremoMaisProximoMapa)][1] }), {
Longitude = x.geometry.coordinates[GetIndexInicial(x.geometry.coordinates, _extremoMaisProximoMapa)][0],
Latitude = x.geometry.coordinates[GetIndexInicial(x.geometry.coordinates, _extremoMaisProximoMapa)][1]
}),
orientacao = GPSService.CalcularOrientacao(pontoAnterior, new GPSModel()
{
Longitude = x.geometry.coordinates[GetIndexInicial(x.geometry.coordinates, _extremoMaisProximoMapa)][0],
Latitude = x.geometry.coordinates[GetIndexInicial(x.geometry.coordinates, _extremoMaisProximoMapa)][1]
}),
coordenadas = new GPSModel() coordenadas = new GPSModel()
{ {
Longitude = x.geometry.coordinates[GetIndexInicial(x.geometry.coordinates, _extremoMaisProximoMapa)][0], Longitude = x.geometry.coordinates[GetIndexInicial(x.geometry.coordinates, _extremoMaisProximoMapa)][0],
Latitude = x.geometry.coordinates[GetIndexInicial(x.geometry.coordinates, _extremoMaisProximoMapa)][1], Latitude = x.geometry.coordinates[GetIndexInicial(x.geometry.coordinates, _extremoMaisProximoMapa)][1],
} },
distParaPontoFinal = GPSService.DistanciaEntrePontos(new GPSModel()
{
Longitude = x.geometry.coordinates[GetIndexInicial(x.geometry.coordinates, _extremoMaisProximoMapa)][0],
Latitude = x.geometry.coordinates[GetIndexInicial(x.geometry.coordinates, _extremoMaisProximoMapa)][1]
}, PontoComparar),
orientacaoParaPontoFinal = GPSService.CalcularOrientacao(new GPSModel()
{
Longitude = x.geometry.coordinates[GetIndexInicial(x.geometry.coordinates, _extremoMaisProximoMapa)][0],
Latitude = x.geometry.coordinates[GetIndexInicial(x.geometry.coordinates, _extremoMaisProximoMapa)][1]
}, PontoComparar)
})
.OrderBy(x => x.dist) // Ordena os pontos pela distância
.Select((x, i) => new
{
x.id,
idx = i,
x.dist,
x.orientacao,
x.coordenadas,
x.distParaPontoFinal,
x.orientacaoParaPontoFinal
}) })
.ToList()
.Where(x => .Where(x =>
{ {
// Normalizando os ângulos entre 0 e 360 // Verificar se o ponto está se aproximando do ponto final
double orientacaoNormalizada = (x.orientacao + 360) % 360; if (x.distParaPontoFinal > GPSService.DistanciaEntrePontos(pontoAnterior, PontoComparar))
double anguloCaminhoNormalizado = (anguloCaminho + 360) % 360;
// Definindo o intervalo de 90 graus para mais e para menos
double limiteInferior = (anguloCaminhoNormalizado - 90 + 360) % 360;
double limiteSuperior = (anguloCaminhoNormalizado + 90 + 360) % 360;
// Verificando se a orientação está dentro do intervalo permitido
if (limiteInferior < limiteSuperior)
{ {
return orientacaoNormalizada >= limiteInferior && orientacaoNormalizada <= limiteSuperior; return false; // Se o ponto atual está se afastando, desconsiderar
} }
else // Caso o intervalo passe por 0 graus
// Calcular a orientação entre o ponto atual e o ponto final
double orientacaoAtualParaPontoFinalNormalizada = (x.orientacaoParaPontoFinal + 360) % 360;
double orientacaoAnteriorParaPontoFinalNormalizada = GPSService.CalcularOrientacao(pontoAnterior, PontoComparar);
orientacaoAnteriorParaPontoFinalNormalizada = (orientacaoAnteriorParaPontoFinalNormalizada + 360) % 360;
// Verificar se a orientação leva o robô para o ponto final, ou se está se desviando
double diferencaAnguloFinal = Math.Abs(orientacaoAtualParaPontoFinalNormalizada - orientacaoAnteriorParaPontoFinalNormalizada);
diferencaAnguloFinal = diferencaAnguloFinal > 180 ? 360 - diferencaAnguloFinal : diferencaAnguloFinal;
// Se a diferença de ângulo for maior que a tolerância, desconsiderar o ponto
if (diferencaAnguloFinal > tolerancia)
{ {
return orientacaoNormalizada >= limiteInferior || orientacaoNormalizada <= limiteSuperior; return false;
} }
// Atualizar o ponto anterior para o próximo ponto
pontoAnterior = new GPSModel() { Longitude = x.coordenadas.Longitude, Latitude = x.coordenadas.Latitude };
return true;
}) })
.OrderBy(x => x.dist)
.ToList(); .ToList();
foreach (var rua in PontosOrdenados) foreach (var rua in PontosOrdenados)
@ -1112,22 +1155,25 @@ namespace AgroBase.Models
} }
}; };
double anguloDeslocar = CalcularDeslocamentoDinamico(_extremoMaisProximoMapa == 0 ? 0 : RuaAtual.Count() - 1, RuaAtual); double anguloDeslocar = CalcularDeslocamentoDinamico(_extremoMaisProximoMapa == 0 ? 0 : RuaProjetada.Count() - 1, RuaProjetada);
_caminho.Add(inicio); _caminho.Add(inicio);
double velocidade = MovimentacaoModel.CalculaVelocidadeRPM(Variaveis.OperacaoEmAndamento.Controle.RPM_SP); double velocidade = MovimentacaoModel.CalculaVelocidadeRPM(Variaveis.OperacaoEmAndamento.Controle.RPM_SP);
double velocidadeMs = MovimentacaoModel.ConverteKmhParaMs(velocidade); double velocidadeMs = MovimentacaoModel.ConverteKmhParaMs(velocidade);
double distancia = velocidadeMs; // Calcula o tempo que passou desde a última atualização
int pontosPular = 1; TimeSpan tempoPassado = UltimaAtualizacaoTrajetoriaDinamica == DateTime.MinValue ? new TimeSpan(10000000) : DateTime.Now - UltimaAtualizacaoTrajetoriaDinamica;
// Calcula a distância com base no tempo passado (em segundos)
double distancia = velocidadeMs * tempoPassado.TotalSeconds;
int pontosPular = 0;
PontosOrdenados.ForEach(p => PontosOrdenados.ForEach(p =>
{ {
double d = GPSService.DistanciaEntrePontos(inicio, p.coordenadas); if (p.dist <= (distancia + MargemLimiteEntradaRua))
if (d <= (distancia + 2))
{ {
pontosPular++; pontosPular++;
} }
}); });
UltimaAtualizacaoTrajetoriaDinamica = DateTime.Now;
for (int iidx = pontosPular; iidx < idx; iidx++) for (int iidx = pontosPular; iidx < idx; iidx++)
{ {
@ -1142,15 +1188,55 @@ namespace AgroBase.Models
double anguloP = GPSService.CalcularOrientacao(inicio, p); double anguloP = GPSService.CalcularOrientacao(inicio, p);
//if ((orientacao <= (orientacaoA + 90) && orientacao >= (orientacaoA - 90))) //if ((orientacao <= (orientacaoA + 90) && orientacao >= (orientacaoA - 90)))
if ((orientacao <= (orientacaoA + 90) && orientacao >= (orientacaoA - 90)) && distP1 > distP && (anguloP >= (anguloP1 - 45) && anguloP <= (anguloP1 + 45))) if (FuncoesMatematicas.ValorEstaEntre(orientacao, orientacaoA, 90) && distP1 > distP) // && FuncoesMatematicas.ValorEstaEntre(anguloP, anguloP1, 45)
{ {
_caminho.Add(p); _caminho.Add(p);
} }
} }
if (idx == 1)
{
double distPi = GPSService.DistanciaEntrePontos(inicio, RuaProjetada[0]);
GPSModel PrimeiroPonto = RuaProjetada[0];
GPSModel UltimoPonto = RuaProjetada[RuaProjetada.Count() - 1];
(GPSModel PontoMaisProximo, bool aproximando) = GPSService.PontoMaisProximoRuaProjetada(RuaProjetada, TrajetoriaTipo.Rua);
int idxPontoMaisProximo = RuaProjetada.IndexOf(PontoMaisProximo);
// Se o robo estiver se aproximando do ponto mais proximo, e estiver vindo de fora da rua
if (aproximando && statusCarro == StatusCarroMapa.Direcionando)
{
var _a = GPSService.DistanciaEntrePontos(inicio, PrimeiroPonto);
var _b = GPSService.DistanciaEntrePontos(inicio, PontoMaisProximo);
bool _c = GPSService.EstaEntrePontos(inicio, PontoMaisProximo, PrimeiroPonto);
// Verifica se o robo esta na margem da rua projetada e se a distancia do robo ate o ponto mais proximo da rua (0) e menor que a distancia ate o primeiro ponto projetado, ou entao se o robo esta entre ambos
if ((_b < DistanciaProjecaoRua && _b < _a) || _c)
{
PontoComparar = PontoMaisProximo;
}
else
{
PontoComparar = PrimeiroPonto;
}
}
else if (!aproximando && RuaProjetada.Count() == (idxPontoMaisProximo + 1))
{
PontoComparar = UltimoPonto;
}
else
{
PontoComparar = PontoMaisProximo;
}
_caminho.Add(PontoComparar); _caminho.Add(PontoComparar);
} }
else else
{
_caminho.Add(PontoComparar);
}
}
else
{ {
_caminho.AddRange(GPSService.InterpolarPontos(inicio, PontoComparar, 1.0)); _caminho.AddRange(GPSService.InterpolarPontos(inicio, PontoComparar, 1.0));
} }

View File

@ -73,8 +73,8 @@ namespace AgroBase.Models.Modules
#region VAZAO #region VAZAO
public double VolumeVazaoAferido { get; set; } = 0; public double VolumeVazaoAferido { get; set; } = 0;
public double _FluxoMlRef { get; set;} = 600; public double _FluxoMlRef { get; set; } = 600;
public double _FluxoPulsoRef { get; set;} = 538; public double _FluxoPulsoRef { get; set; } = 538;
public int _LeituraPulsos { get; set; } public int _LeituraPulsos { get; set; }
public int _LeituraPeriodo { get; set; } public int _LeituraPeriodo { get; set; }
public double VazaoFluxoMLpS public double VazaoFluxoMLpS
@ -109,6 +109,31 @@ namespace AgroBase.Models.Modules
} }
} }
public double VolumeVazaoML { get; set; } public double VolumeVazaoML { get; set; }
public DateTime InicioAtuacao { get; set; } = DateTime.MinValue;
public DateTime FimAtuacao { get; set; } = DateTime.MinValue;
public double TempoAtuado { get; set; } = 0;
public void InicializaTempoAtuado()
{
bool atuadoAnteriormente = BicosPulverizadores.Any(x => x.Atuado);
if (!atuadoAnteriormente && InicioAtuacao == DateTime.MinValue)
{
InicioAtuacao = DateTime.Now;
FimAtuacao = DateTime.MinValue;
}
}
public void AtualizaTempoAtuado()
{
bool atuadoAnteriormente = BicosPulverizadores.Any(x => x.Atuado);
if (atuadoAnteriormente && FimAtuacao == DateTime.MinValue)
{
FimAtuacao = DateTime.Now;
TimeSpan duracao = FimAtuacao - InicioAtuacao;
TempoAtuado += duracao.TotalMilliseconds;
InicioAtuacao = DateTime.MinValue;
}
}
#endregion #endregion
#region PRESSAO #region PRESSAO
@ -261,6 +286,9 @@ namespace AgroBase.Models.Modules
Dados.BombaPressurizadora.Potencia = 0; Dados.BombaPressurizadora.Potencia = 0;
Dados.VolumeVazaoAferido = 0; Dados.VolumeVazaoAferido = 0;
Dados.VolumeVazaoML = 0; Dados.VolumeVazaoML = 0;
Dados.TempoAtuado = 0;
Dados.InicioAtuacao = DateTime.MinValue;
Dados.FimAtuacao = DateTime.MinValue;
Dados._LeituraPeriodo = 0; Dados._LeituraPeriodo = 0;
Dados._LeituraPressao = 0; Dados._LeituraPressao = 0;
Dados._LeituraPulsos = 0; Dados._LeituraPulsos = 0;
@ -707,6 +735,16 @@ namespace AgroBase.Models.Modules
((int)F_Code.Cmd).ToString() + SerialService.SplitMessage + ((int)F_Code.Cmd).ToString() + SerialService.SplitMessage +
ID + SerialService.SplitParams + ID + SerialService.SplitParams +
(Atuado ? "1" : "0"); (Atuado ? "1" : "0");
if (Atuado)
{
Variaveis.OperacaoEmAndamento.DispAtu.Dados.InicializaTempoAtuado();
}
else
{
Variaveis.OperacaoEmAndamento.DispAtu.Dados.AtualizaTempoAtuado();
}
return ProtocoloBico; return ProtocoloBico;
} }
return ""; return "";

View File

@ -151,7 +151,7 @@ namespace AgroBase.Models
// Etapa atual é finalizada, então finaliza a operação // Etapa atual é finalizada, então finaliza a operação
else if (_EtapaAtual == StatusOperacao.Concluido) else if (_EtapaAtual == StatusOperacao.Concluido)
{ {
if (Variaveis.OperacaoEmAndamento.Iniciado) if (Variaveis.OperacaoEmAndamento.Iniciado && !Variaveis.OperacaoEmAndamento.Finalizando)
{ {
Variaveis.OperacaoEmAndamento.FinalizarOperacao(); Variaveis.OperacaoEmAndamento.FinalizarOperacao();
} }
@ -305,6 +305,7 @@ namespace AgroBase.Models
} }
public bool Iniciado { get; set; } public bool Iniciado { get; set; }
public bool Simulando { get; set; } = false; public bool Simulando { get; set; } = false;
public bool Finalizando { get; set; } = false;
public long TimestampInicio { get; set; } public long TimestampInicio { get; set; }
public long TimestampFim { get; set; } public long TimestampFim { get; set; }
public TimeSpan Tempo public TimeSpan Tempo
@ -526,14 +527,8 @@ namespace AgroBase.Models
double distanciaPercorrida = GPSService.DistanciaDoTrecho(Variaveis.OperacaoEmAndamento.GPSTrajetoria); double distanciaPercorrida = GPSService.DistanciaDoTrecho(Variaveis.OperacaoEmAndamento.GPSTrajetoria);
double distanciaRestante = distanciaTotal - distanciaPercorrida; double distanciaRestante = distanciaTotal - distanciaPercorrida;
// Percentuais de distância sem ervas e com ervas
double distanciaSemErvasTotal = (Variaveis.OperacaoEmAndamento.Mapa.DistanciaTotal * VariaveisOperacao.PercentualSemErvas);
double distanciaComErvasTotal = (Variaveis.OperacaoEmAndamento.Mapa.DistanciaTotal * VariaveisOperacao.PercentualComErvas);
// Variáveis para armazenar o tempo restante para cada parte // Variáveis para armazenar o tempo restante para cada parte
double tempoRestanteDirecionamento = 0; double tempoRestanteDirecionamento = 0;
double tempoRestanteSemErvas = 0;
double tempoRestanteComErvas = 0;
// Se o robô ainda estiver na fase de direcionamento // Se o robô ainda estiver na fase de direcionamento
if (distanciaPercorrida < distanciaDirecionamento) if (distanciaPercorrida < distanciaDirecionamento)
@ -541,31 +536,20 @@ namespace AgroBase.Models
// Calcula o tempo restante apenas para a fase de direcionamento // Calcula o tempo restante apenas para a fase de direcionamento
double distanciaDirecionamentoRestante = distanciaDirecionamento - distanciaPercorrida; double distanciaDirecionamentoRestante = distanciaDirecionamento - distanciaPercorrida;
tempoRestanteDirecionamento = distanciaDirecionamentoRestante / velocidadeTrajetoriaMs; tempoRestanteDirecionamento = distanciaDirecionamentoRestante / velocidadeTrajetoriaMs;
distanciaRestante = Variaveis.OperacaoEmAndamento.Mapa.DistanciaTotal;
} }
else
{
// Robô já completou a fase de direcionamento, agora lida com a distância sem e com ervas
// Subtrai a distância de direcionamento já percorrida
distanciaPercorrida -= distanciaDirecionamento;
distanciaRestante -= distanciaDirecionamento;
// Calcular a distância restante sem ervas e com ervas // Calcular a distância restante sem ervas e com ervas
double distanciaSemErvasRestante = (distanciaSemErvasTotal > distanciaPercorrida) double distanciaSemErvasRestante = distanciaRestante * VariaveisOperacao.PercentualSemErvas;
? distanciaSemErvasTotal - distanciaPercorrida
: 0;
double distanciaComErvasRestante = (distanciaComErvasTotal > distanciaPercorrida) double distanciaComErvasRestante = distanciaRestante * VariaveisOperacao.PercentualComErvas;
? distanciaComErvasTotal - distanciaPercorrida
: 0;
// Calcular o tempo restante para as áreas sem ervas e com ervas // Calcular o tempo restante para as áreas sem ervas e com ervas
tempoRestanteSemErvas = distanciaSemErvasRestante / velocidadeSemErvasMs; double tempoRestanteSemErvas = distanciaSemErvasRestante / velocidadeSemErvasMs;
tempoRestanteComErvas = distanciaComErvasRestante / velocidadeComErvasMs; double tempoRestanteComErvas = distanciaComErvasRestante / velocidadeComErvasMs;
}
// Tempo restante para as manobras // Tempo restante para as manobras
double tempoRestanteManobras = Variaveis.OperacaoEmAndamento.Mapa.RuasPercorrer.Count() * VariaveisOperacao.TempoManobra; double tempoRestanteManobras = Variaveis.OperacaoEmAndamento.Mapa.TrajetoriaProjetada.Count() * VariaveisOperacao.TempoManobra;
// Tempo total restante em segundos // Tempo total restante em segundos
double tempoTotalRestanteSegundos = tempoRestanteDirecionamento + tempoRestanteSemErvas + tempoRestanteComErvas + tempoRestanteManobras; double tempoTotalRestanteSegundos = tempoRestanteDirecionamento + tempoRestanteSemErvas + tempoRestanteComErvas + tempoRestanteManobras;
@ -885,6 +869,8 @@ namespace AgroBase.Models
public void FinalizarOperacao() public void FinalizarOperacao()
{ {
Variaveis.OperacaoEmAndamento.Finalizando = true;
if (!Variaveis.OperacaoEmAndamento.Iniciado) if (!Variaveis.OperacaoEmAndamento.Iniciado)
{ {
Variaveis.OperacaoEmAndamento.CamerasSolo.ForEach(Camera => Variaveis.OperacaoEmAndamento.CamerasSolo.ForEach(Camera =>
@ -913,6 +899,8 @@ namespace AgroBase.Models
} }
AtualizarSinaleiroOperacao(); AtualizarSinaleiroOperacao();
Variaveis.OperacaoEmAndamento.Finalizando = false;
} }
public async Task RealizarCalibracaoInicialAsync() public async Task RealizarCalibracaoInicialAsync()
@ -3037,6 +3025,18 @@ namespace AgroBase.Models
public (bool, List<string>) MovEsq_Status { get; set; } public (bool, List<string>) MovEsq_Status { get; set; }
public (bool, List<string>) MovDir_Status { get; set; } public (bool, List<string>) MovDir_Status { get; set; }
public (bool, List<string>) Dir_Status { get; set; } public (bool, List<string>) Dir_Status { get; set; }
public double PercentualErvasTerreno
{
get
{
if (Variaveis.OperacaoEmAndamento.Tempo.TotalMilliseconds == 0)
{
return 0;
}
double p = Math.Round((Variaveis.OperacaoEmAndamento.DispAtu.Dados.TempoAtuado / Variaveis.OperacaoEmAndamento.Tempo.TotalMilliseconds) * 100, 2);
return p;
}
}
} }
public class PzmSensoriamentoLogModel public class PzmSensoriamentoLogModel

View File

@ -199,9 +199,29 @@ namespace AgroBase.Models
public static class VariaveisOperacao public static class VariaveisOperacao
{ {
public static double TempoManobra { get; set; } = 15; public static double TempoManobra { get; set; } = 10;
public static double PercentualComErvas { get; set; } = 0.3; public static double PercentualComErvas
public static double PercentualSemErvas { get; set; } = 0.7; {
get
{
if (!Variaveis.IsAgroMonitor && Variaveis.OperacaoEmAndamento.DispAtu != null)
{
return Variaveis.OperacaoEmAndamento.Sensoriamento.PercentualErvasTerreno / 100.0;
}
return 0.3;
}
}
public static double PercentualSemErvas
{
get
{
if (!Variaveis.IsAgroMonitor && Variaveis.OperacaoEmAndamento.DispAtu != null)
{
return (100.0 - Variaveis.OperacaoEmAndamento.Sensoriamento.PercentualErvasTerreno) / 100.0;
}
return 0.7;
}
}
public static GPSModel PosicaoBase { get; set; } public static GPSModel PosicaoBase { get; set; }
} }
@ -748,6 +768,15 @@ namespace AgroBase.Models
return Tc; return Tc;
} }
public static bool ValorEstaEntre(double valorAtual, double valorComparar, double margem)
{
if (valorAtual <= (valorComparar + margem) && valorAtual >= (valorComparar - margem))
{
return true;
}
return false;
}
} }
} }

View File

@ -1 +1 @@
{"Modulo_ID":"Atu","RequisitarDados":false,"Conectado":false,"QuantidadeBicos":4,"DensidadeHerbicida":1.05,"AtuacaoNivelAlto":true,"BicosPulverizadores":[{"ID":"B01","Posicao":1,"Atuado":false,"Comandar":true,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":0.0},{"ID":"B02","Posicao":2,"Atuado":false,"Comandar":true,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":0.0},{"ID":"B03","Posicao":3,"Atuado":false,"Comandar":true,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":0.0},{"ID":"B04","Posicao":4,"Atuado":false,"Comandar":true,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":0.0}],"BombaPressurizadora":{"ID":"BOMBA","BombaAtuada":false,"Ligado":false,"Comandar":true,"Inicializado":false,"Testando":false,"Funcoes":[14,35,36,37,5],"Pressao":0.0,"Potencia":0.0},"Sensores":[{"LogGrafico":[],"ID":"FLXLN","Prioridade":23,"Descricao":"Fluxo na linha principal","Componente":198,"Aferir":true,"DelayAmostragem":300,"Inicializado":false,"Testando":false,"Funcoes":[25],"Parametros":[],"UnidadeMedida":"mL/s","Leituras":[],"ValorMinimo":0.0,"ValorMaximo":0.0,"LimiteMaximo":0.0,"LimiteMinimo":0.0},{"LogGrafico":[],"ID":"MASRS","Prioridade":3,"Descricao":"Massa do reservatório de herbicida","Componente":532,"Aferir":true,"DelayAmostragem":1000,"Inicializado":false,"Testando":false,"Funcoes":[22,23],"Parametros":[],"UnidadeMedida":"Kg","Leituras":[],"ValorMinimo":0.0,"ValorMaximo":0.0,"LimiteMaximo":50.0,"LimiteMinimo":5.0},{"LogGrafico":[],"ID":"PRSLN","Prioridade":3,"Descricao":"Pressão na linha principal","Componente":333,"Aferir":true,"DelayAmostragem":1000,"Inicializado":false,"Testando":false,"Funcoes":[24],"Parametros":[["Vmin","000.00"],["Vmax","004.50"],["Pmax","174.04"]],"UnidadeMedida":"psi","Leituras":[],"ValorMinimo":0.0,"ValorMaximo":0.0,"LimiteMaximo":120.0,"LimiteMinimo":60.0}],"ScriptDeteccaoErvas":"weed-detector-v7.py","_MassaRef":0.8,"_MassaLeituraRef":40876.37,"_MassaLeituraExtra":1895800.0,"_MassaLeitura":1895800.0,"MassaReservatorio":0.0,"VolumeReservatorio":0.0,"PercentualReservatorio":0.0,"VolumeVazaoAferido":0.0,"_FluxoMlRef":102.0,"_FluxoPulsoRef":80.0,"_LeituraPulsos":0,"_LeituraPeriodo":0,"VazaoFluxoMLpS":0.0,"VolumeVazaoML":0.0,"_PressaoVmin":0.0,"_PressaoVmax":4.5,"_PressaoMax":174.045,"_LeituraPressao":0.0,"PressaoLinha":0.0,"PressaoLinhaCalc":0.0} {"Modulo_ID":"Atu","RequisitarDados":false,"Conectado":false,"QuantidadeBicos":4,"DensidadeHerbicida":1.05,"AtuacaoNivelAlto":true,"BicosPulverizadores":[{"ID":"B01","Posicao":1,"Atuado":false,"Comandar":true,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":0.0},{"ID":"B02","Posicao":2,"Atuado":false,"Comandar":true,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":0.0},{"ID":"B03","Posicao":3,"Atuado":false,"Comandar":true,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":0.0},{"ID":"B04","Posicao":4,"Atuado":false,"Comandar":true,"Inicializado":false,"Testando":false,"Funcoes":[21],"StatusBico":false,"MediaNivelFluxo":0.0}],"BombaPressurizadora":{"ID":"BOMBA","BombaAtuada":false,"Ligado":false,"Comandar":true,"Inicializado":false,"Testando":false,"Funcoes":[14,35,36,37,5],"Pressao":0.0,"Potencia":0.0},"Sensores":[{"LogGrafico":[],"ID":"FLXLN","Prioridade":23,"Descricao":"Fluxo na linha principal","Componente":198,"Aferir":true,"DelayAmostragem":300,"Inicializado":false,"Testando":false,"Funcoes":[25],"Parametros":[],"UnidadeMedida":"mL/s","Leituras":[],"ValorMinimo":0.0,"ValorMaximo":0.0,"LimiteMaximo":0.0,"LimiteMinimo":0.0},{"LogGrafico":[],"ID":"MASRS","Prioridade":3,"Descricao":"Massa do reservatório de herbicida","Componente":532,"Aferir":true,"DelayAmostragem":1000,"Inicializado":false,"Testando":false,"Funcoes":[22,23],"Parametros":[],"UnidadeMedida":"Kg","Leituras":[],"ValorMinimo":0.0,"ValorMaximo":0.0,"LimiteMaximo":50.0,"LimiteMinimo":5.0},{"LogGrafico":[],"ID":"PRSLN","Prioridade":3,"Descricao":"Pressão na linha principal","Componente":333,"Aferir":true,"DelayAmostragem":1000,"Inicializado":false,"Testando":false,"Funcoes":[24],"Parametros":[["Vmin","000.00"],["Vmax","004.50"],["Pmax","174.04"]],"UnidadeMedida":"psi","Leituras":[],"ValorMinimo":0.0,"ValorMaximo":0.0,"LimiteMaximo":120.0,"LimiteMinimo":60.0}],"ScriptDeteccaoErvas":"weed-detector-v7.py","_MassaRef":0.8,"_MassaLeituraRef":40876.37,"_MassaLeituraExtra":1895800.0,"_MassaLeitura":1895800.0,"MassaReservatorio":0.0,"VolumeReservatorio":0.0,"PercentualReservatorio":0.0,"VolumeVazaoAferido":0.0,"_FluxoMlRef":102.0,"_FluxoPulsoRef":80.0,"_LeituraPulsos":0,"_LeituraPeriodo":0,"VazaoFluxoMLpS":0.0,"VolumeVazaoML":0.0,"InicioAtuacao":"0001-01-01T00:00:00","FimAtuacao":"0001-01-01T00:00:00","TempoAtuado":0.0,"_PressaoVmin":0.0,"_PressaoVmax":4.5,"_PressaoMax":174.045,"_LeituraPressao":0.0,"PressaoLinha":0.0,"PressaoLinhaCalc":0.0}

View File

@ -25,7 +25,7 @@
<meta name="viewport" content="width=device-width, <meta name="viewport" content="width=device-width,
initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<style> <style>
#map_6ebe7d676636a464bcda2698ef3dd0bc { #map_ffb413d2f3fe7abcaee361ff364b756f {
position: relative; position: relative;
width: 100.0%; width: 100.0%;
height: 100.0%; height: 100.0%;
@ -39,14 +39,14 @@
<body> <body>
<div class="folium-map" id="map_6ebe7d676636a464bcda2698ef3dd0bc" ></div> <div class="folium-map" id="map_ffb413d2f3fe7abcaee361ff364b756f" ></div>
</body> </body>
<script> <script>
var map_6ebe7d676636a464bcda2698ef3dd0bc = L.map( var map_ffb413d2f3fe7abcaee361ff364b756f = L.map(
"map_6ebe7d676636a464bcda2698ef3dd0bc", "map_ffb413d2f3fe7abcaee361ff364b756f",
{ {
center: [0.0, 0.0], center: [0.0, 0.0],
crs: L.CRS.EPSG3857, crs: L.CRS.EPSG3857,
@ -60,13 +60,13 @@
var tile_layer_a492f19b6d3542b6b52ca525e7345e29 = L.tileLayer( var tile_layer_8ae61ec8796e266ae86c1b58594227d5 = L.tileLayer(
"https://tile.openstreetmap.org/{z}/{x}/{y}.png", "https://tile.openstreetmap.org/{z}/{x}/{y}.png",
{"attribution": "\u0026copy; \u003ca href=\"https://www.openstreetmap.org/copyright\"\u003eOpenStreetMap\u003c/a\u003e contributors", "detectRetina": false, "maxNativeZoom": 19, "maxZoom": 19, "minZoom": 0, "noWrap": false, "opacity": 1, "subdomains": "abc", "tms": false} {"attribution": "\u0026copy; \u003ca href=\"https://www.openstreetmap.org/copyright\"\u003eOpenStreetMap\u003c/a\u003e contributors", "detectRetina": false, "maxNativeZoom": 19, "maxZoom": 19, "minZoom": 0, "noWrap": false, "opacity": 1, "subdomains": "abc", "tms": false}
); );
tile_layer_a492f19b6d3542b6b52ca525e7345e29.addTo(map_6ebe7d676636a464bcda2698ef3dd0bc); tile_layer_8ae61ec8796e266ae86c1b58594227d5.addTo(map_ffb413d2f3fe7abcaee361ff364b756f);
</script> </script>
@ -87,7 +87,7 @@
} }
trajeto_json_add({"features": []}); trajeto_json_add({"features": []});
trajeto_json.addTo(map_6ebe7d676636a464bcda2698ef3dd0bc); trajeto_json.addTo(map_ffb413d2f3fe7abcaee361ff364b756f);
function adicionarGeometria(novaGeometria) { function adicionarGeometria(novaGeometria) {
trajeto_json.addData(novaGeometria); trajeto_json.addData(novaGeometria);
@ -145,7 +145,7 @@
var marcadorDinamico = L.marker([0, 0], { var marcadorDinamico = L.marker([0, 0], {
icon: customIcon icon: customIcon
}).addTo(map_6ebe7d676636a464bcda2698ef3dd0bc); }).addTo(map_ffb413d2f3fe7abcaee361ff364b756f);
// Conectar ao broker MQTT // Conectar ao broker MQTT
const client = mqtt.connect('ws://localhost:9001'); // Use wss para conexão segura const client = mqtt.connect('ws://localhost:9001'); // Use wss para conexão segura
@ -183,7 +183,7 @@
marcadorDinamico.setRotationAngle(angulo); marcadorDinamico.setRotationAngle(angulo);
adicionarCoordenada("Tj", [novaLongitude, novaLatitude]); adicionarCoordenada("Tj", [novaLongitude, novaLatitude]);
map_6ebe7d676636a464bcda2698ef3dd0bc.setView(novaPosicao, map_6ebe7d676636a464bcda2698ef3dd0bc.getZoom()); map_ffb413d2f3fe7abcaee361ff364b756f.setView(novaPosicao, map_ffb413d2f3fe7abcaee361ff364b756f.getZoom());
}); });
function calcularOrientacao(P1latitude, P1longitude, P2latitude, P2longitude) { function calcularOrientacao(P1latitude, P1longitude, P2latitude, P2longitude) {

File diff suppressed because one or more lines are too long