acompanhamento das ruas do mapa antes de iniciar a operacao
This commit is contained in:
parent
7cabff2654
commit
ad2a9a8b1b
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 "";
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -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}
|
||||||
|
|
@ -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
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue