diff --git a/AgroBase/.vs/AgroBase/FileContentIndex/5ac8e0ec-7da6-47aa-9bd1-360cf85d479f.vsidx b/AgroBase/.vs/AgroBase/FileContentIndex/5ac8e0ec-7da6-47aa-9bd1-360cf85d479f.vsidx new file mode 100644 index 000000000..ec55f9c37 Binary files /dev/null and b/AgroBase/.vs/AgroBase/FileContentIndex/5ac8e0ec-7da6-47aa-9bd1-360cf85d479f.vsidx differ diff --git a/AgroBase/.vs/AgroBase/FileContentIndex/62a9ae90-a018-4c17-80c1-780e35939744.vsidx b/AgroBase/.vs/AgroBase/FileContentIndex/62a9ae90-a018-4c17-80c1-780e35939744.vsidx deleted file mode 100644 index 48f8781ea..000000000 Binary files a/AgroBase/.vs/AgroBase/FileContentIndex/62a9ae90-a018-4c17-80c1-780e35939744.vsidx and /dev/null differ diff --git a/AgroBase/.vs/AgroBase/v17/.suo b/AgroBase/.vs/AgroBase/v17/.suo index 3a4bce862..91eeb65c2 100644 Binary files a/AgroBase/.vs/AgroBase/v17/.suo and b/AgroBase/.vs/AgroBase/v17/.suo differ diff --git a/AgroBase/AgroBase/Forms/IHM/frmDialogoMapa.cs b/AgroBase/AgroBase/Forms/IHM/frmDialogoMapa.cs index e7c5679ba..a46d4507d 100644 --- a/AgroBase/AgroBase/Forms/IHM/frmDialogoMapa.cs +++ b/AgroBase/AgroBase/Forms/IHM/frmDialogoMapa.cs @@ -136,7 +136,8 @@ namespace AgroBase.Forms.IHM _Trajetoria._TrajetoriaDinamica, _Trajetoria.CorredorAtual.Pontos, Variaveis.OperacaoEmAndamento.GPSTrajetoria, - _Trajetoria.RuasPlantacao + _Trajetoria.RuasPlantacao, + _Sensoriamento.Controle.ControladorMPC?.ComandoAtual?.simulacao ); } } diff --git a/AgroBase/AgroBase/Forms/frmSimulacaoMapaGPS.cs b/AgroBase/AgroBase/Forms/frmSimulacaoMapaGPS.cs index bbcf09154..e6cc43abf 100644 --- a/AgroBase/AgroBase/Forms/frmSimulacaoMapaGPS.cs +++ b/AgroBase/AgroBase/Forms/frmSimulacaoMapaGPS.cs @@ -138,7 +138,8 @@ namespace AgroBase.Forms _Trajetoria._TrajetoriaDinamica, _Trajetoria.CorredorAtual.Pontos, Variaveis.OperacaoEmAndamento.GPSTrajetoria, - _Trajetoria.RuasPlantacao + _Trajetoria.RuasPlantacao, + _Sensoriamento.Controle.ControladorMPC?.ComandoAtual?.simulacao ); } @@ -197,58 +198,83 @@ namespace AgroBase.Forms GPSService.AtualizarCoordenadasGPS(); } - private void btnAcrescentarGPS_Click(object sender, EventArgs e) + private async void btnAcrescentarGPS_Click(object sender, EventArgs e) { GPSModel novaPosicao = new GPSModel(); double velocidadeMs = FuncoesMatematicas.CalculaVelocidadeMsPercentual(Variaveis.OperacaoEmAndamento.SimulacaoRpmControle); double velocidade = FuncoesMatematicas.ConverteMsParaKmh(velocidadeMs); - if (passosOperacao.Count > 0 && Variaveis.OperacaoEmAndamento.Simulando) - { - novaPosicao = passosOperacao[Math.Min(passosOperacao.Count - 1, idxPassoOperacao)]; - idxPassoOperacao++; - } - else - { - if (Variaveis.OperacaoEmAndamento.StatusAtual == StatusOperacao.Concluido || Variaveis.OperacaoEmAndamento.StatusAtual == StatusOperacao.Aguardando) - { - return; - } + Variaveis.OperacaoEmAndamento.DispMvd.Dados.VelocidadeMedia = velocidadeMs; - var ControleDir = Variaveis.OperacaoEmAndamento.Controle.TiposControle.FirstOrDefault(x => x.Tipo == T_Code.Dir); - double anguloControle = double.Parse(txtAnguloControle.Text); - - double.TryParse(txtErroTempoComando.Text, out double fatorErro); - int ticksMax = (int)(ticksControleMax * Math.Max(1, fatorErro)); - - bool atualizarAnguloControle = (ticksControle >= ticksMax); - if (atualizarAnguloControle) - { - ticksControle = 0; - } - else - { - ticksControle++; - } - - if (atualizarAnguloControle) - { - btnCalcularAngulo_Click(new object(), new EventArgs()); - anguloControle = double.Parse(txtAnguloControle.Text); - } - - // Obtém os parâmetros - double anguloAtual = double.Parse(txtAnguloGPS.Text); - - TimeSpan tempoPassado = + TimeSpan tempoPassado = !chbAutomatico.Checked || UltimaAtualizacaoGps == DateTime.MinValue ? // esta no modo manual new TimeSpan((int)tempoGps * 10000) : // 1 tick do tempo gps DateTime.Now - UltimaAtualizacaoGps; // tempo decorrido entre ticks do timer de leitura - // Calcula a nova posicao do robo - novaPosicao = VariaveisEquipamento.SimularNovaPosicao(Variaveis.OperacaoEmAndamento.Controle.TipoMovimento, anguloControle, velocidadeMs, tempoPassado.TotalSeconds, anguloAtual, GPSService.UltimaLeitura); + // Obtém os parâmetros + double anguloAtual = double.Parse(txtAnguloGPS.Text); + + var _Gps = Variaveis.OperacaoEmAndamento.Sensoriamento.Gps; + + double anguloControle = 0.0; + TipoMovimentoDirecional tipoMovimento = TipoMovimentoDirecional.RodasDianteiras; + + var tipoControle = Variaveis.OperacaoEmAndamento.Controle.TipoControleDirecional; + switch (tipoControle) + { + case TiposControladorDirecional.PID: + { + tipoMovimento = Variaveis.OperacaoEmAndamento.Controle.TipoMovimento; + + if (passosOperacao.Count > 0 && Variaveis.OperacaoEmAndamento.Simulando) + { + novaPosicao = passosOperacao[Math.Min(passosOperacao.Count - 1, idxPassoOperacao)]; + idxPassoOperacao++; + } + else + { + if (Variaveis.OperacaoEmAndamento.StatusAtual == StatusOperacao.Concluido || Variaveis.OperacaoEmAndamento.StatusAtual == StatusOperacao.Aguardando) + { + return; + } + + var ControleDir = Variaveis.OperacaoEmAndamento.Controle.TiposControle.FirstOrDefault(x => x.Tipo == T_Code.Dir); + anguloControle = double.Parse(txtAnguloControle.Text); + + double.TryParse(txtErroTempoComando.Text, out double fatorErro); + int ticksMax = (int)(ticksControleMax * Math.Max(1, fatorErro)); + + bool atualizarAnguloControle = (ticksControle >= ticksMax); + if (atualizarAnguloControle) + { + ticksControle = 0; + } + else + { + ticksControle++; + } + + if (atualizarAnguloControle) + { + btnCalcularAngulo_Click(new object(), new EventArgs()); + anguloControle = double.Parse(txtAnguloControle.Text); + } + } + break; + } + case TiposControladorDirecional.MPC: + { + MPCComandoModel comando = Variaveis.OperacaoEmAndamento.Controle.ControladorMPC.ComandoAtual; + anguloControle = comando?.angulo ?? 0; + tipoMovimento = comando?.tipo ?? TipoMovimentoDirecional.RodasDianteiras; + break; + } + } + // Calcula a nova posicao do robo + novaPosicao = VariaveisEquipamento.SimularNovaPosicao(tipoMovimento, anguloControle, velocidadeMs, tempoPassado.TotalSeconds, anguloAtual, _Gps); + // Atualiza a interface gráfica txtAnguloGPS.Text = novaPosicao.OrientacaoReal.ToString("0.00"); txtVelocidade.Text = velocidade.ToString("0.00"); @@ -426,6 +452,12 @@ namespace AgroBase.Forms Variaveis.OperacaoEmAndamento.Controle.TipoControleDirecional = (TiposControladorDirecional)cmbTipoControleDirecional.SelectedIndex; } - + + + + + } + + } diff --git a/AgroBase/AgroBase/Models/Enums.cs b/AgroBase/AgroBase/Models/Enums.cs index ec1f8b9b0..739faf567 100644 --- a/AgroBase/AgroBase/Models/Enums.cs +++ b/AgroBase/AgroBase/Models/Enums.cs @@ -160,12 +160,12 @@ public enum StatusCarroMapa { - Parado, - EntrandoRua, - CaminhandoRua, - SaindoRua, - Manobrando, - Direcionando + Parado = 0, + EntrandoRua = 1, + CaminhandoRua = 2, + SaindoRua = 3, + Manobrando = 4, + Direcionando = 5 } public enum DirecaoCarroRua @@ -241,6 +241,7 @@ Script_GpsViewer = 13, ArquivoModelo3D = 14, ScriptListOAKCaneras = 15, + ScriptMPCController = 16, } public enum TipoConexao diff --git a/AgroBase/AgroBase/Models/MPCController.cs b/AgroBase/AgroBase/Models/MPCController.cs index 908ad7b03..ec2535466 100644 --- a/AgroBase/AgroBase/Models/MPCController.cs +++ b/AgroBase/AgroBase/Models/MPCController.cs @@ -1,224 +1,186 @@ using AgroBase.Models; using AgroBase.Services; +using Newtonsoft.Json; using System; using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Threading.Tasks; +using static AgroBase.Models.Enums; public class MPCController { - private int horizon; - private double maxSteeringAngle; - private double maxSteeringAngleFourWheels; - private double minVelocity; - private double maxVelocity; - private double accelerationLimit; - - // Pesos da função de custo ajustados - private double distancePredict = 3.0; - private double weightPosition = 1.0; - private double weightAlignment = 0.8; - private double weightSteering = 0.5; - private double weightVelocity = 0.3; - private double weightAcceleration = 1.0; // Penaliza mudanças bruscas de velocidade - private double weightObstacle = 2.5; // Maior penalização para obstáculos - private double weightLaneCentering = 1.2; // Mantém o robô no centro do corredor - + private string TopicoRota = "mpc/rota"; + private string TopicoPosicao = "mpc/posicao"; + private string TopicoComando = "mpc/comando"; + private int Horizonte = 20; + private double _dt = 0; private DateTime _ultimaAtualizacao = DateTime.MinValue; + public Process pythonProcess; + public readonly object processLock = new object(); + public bool Iniciado = false; + + public MPCComandoModel ComandoAtual = new MPCComandoModel(); public MPCController() { - // Definições baseadas em variáveis globais - this.horizon = Convert.ToInt32(distancePredict / TrajetoriaMapaOperacaoModel.DistanciaEntrePontos); - this.maxSteeringAngle = Variaveis.OperacaoEmAndamento?.Controle?.Angulo_Max ?? 30.0; - this.maxSteeringAngleFourWheels = this.maxSteeringAngle * 1.0; - this.minVelocity = Variaveis.OperacaoEmAndamento?.Controle?.PercentualVelocidadeMin ?? 20.0; - this.maxVelocity = Variaveis.OperacaoEmAndamento?.Controle?.PercentualVelocidadeMax ?? 100.0; - this.accelerationLimit = 1.5; // Limita aceleração a valores realistas + } - public (double steeringAngle, Enums.TipoMovimentoDirecional mode) ComputeControl( - double currentX, double currentY, double currentTheta, - double targetX, double targetY, double targetTheta, - double currentVelocity, double leftEdge, double rightEdge, List obstacles) + public async Task Inicializar() { - double dt = (DateTime.Now - _ultimaAtualizacao).TotalSeconds; - dt = Math.Max(0.01, Math.Min(dt, 0.2)); - - // Define o número total de passos e passos por grupo - int totalSteps = 10; - int stepsPerGroup = 5; - - // Calcula o número de grupos - int numGroups = totalSteps / stepsPerGroup; - - // Pré-calcula todas as combinações de controle - List<(double steering, Enums.TipoMovimentoDirecional mode)> controlOptions = PreGenerateControlOptions(); - - // Variáveis para armazenar o melhor custo e a melhor sequência - double bestCost = double.MaxValue; - List<(double steering, Enums.TipoMovimentoDirecional mode)> bestSequence = null; - - // Função de avaliação (passada como parâmetro) - Func, double> evaluateSequence = sequence => + await Variaveis.MqttService.AdicionarNovoTopico(TopicoRota); + await Variaveis.MqttService.AdicionarNovoTopico(TopicoPosicao); + await Variaveis.MqttService.AdicionarNovoTopico(TopicoComando, true, 2, async (mensagem) => { - return SimulateTrajectory( - currentX, currentY, currentTheta, - targetX, targetY, targetTheta, - currentVelocity, sequence, - leftEdge, rightEdge, obstacles, dt, Variaveis.OperacaoEmAndamento.Sensoriamento.Trajetoria.CorredorAtual.Dentro, - stepsPerGroup // Passa o número de passos por grupo - ); + if (!Iniciado && mensagem.Mensagem == "OK") + { + Iniciado = true; + } + else + { + try + { + ComandoAtual = JsonConvert.DeserializeObject(mensagem.Mensagem); + } + catch (Exception ex) + { + Console.WriteLine("Erro ao deserializar resposta do MPC: " + ex.Message.ToString()); + } + _ultimaAtualizacao = DateTime.Now; + } + }); + + lock (processLock) + { + pythonProcess = PythonService.RunScript(PythonService.ScriptMPCController, new string[] {}); + } + + bool ScriptIniciado() => Iniciado; + await FuncoesGlobais.AguardarCondicaoAsync(ScriptIniciado); + + return Iniciado; + } + + public async Task EnviarDadosTrajetoria(List _trajetoria) + { + var _Controle = Variaveis.OperacaoEmAndamento.Controle; + + var trajetoria = new + { + pontos = _trajetoria + .Select(p => new + { + lat = p.Posicao.Latitude, + lon = p.Posicao.Longitude, + tipo = (int)p.Tipo, + distanciaMargem = p.LarguraCorredor * 0.8 + }) + .ToList(), + horizonte = Horizonte, + angulo_max_graus = _Controle.Angulo_Max, + distancia_entre_eixos = (VariaveisEquipamento.DistanciaEntreEixos / 100.0), + velocidade_min = FuncoesMatematicas.CalculaVelocidadeMsPercentual(_Controle.PercentualVelocidadeMin), + velocidade_max = FuncoesMatematicas.CalculaVelocidadeMsPercentual(_Controle.PercentualVelocidadeMax) }; - // Gera e avalia todas as sequências dinamicamente - GenerateAndEvaluateSequences( - new List<(double steering, Enums.TipoMovimentoDirecional mode)>(), - numGroups, // Número de grupos - controlOptions, - ref bestCost, - ref bestSequence, - evaluateSequence + await Variaveis.MqttService.PublishAsync( + Variaveis.MqttService.Topicos.First(x => x.Topico == TopicoRota), + JsonConvert.SerializeObject(trajetoria) + ); + } + + public async Task Compute(double _lat, double _long, double _theta, double _velocidadeMs) + { + DateTime EnviadoEm = DateTime.Now; + + double taxaHz = GPSService.TaxaAmostragemHz; // ex: 10 Hz + double tempoIdeal = 1.0 / taxaHz; // = 0.1 s + double tempoMinimo = tempoIdeal * 0.5; // 50% abaixo + double tempoMaximo = tempoIdeal * 2.0; // até 2x acima + _dt = (EnviadoEm - _ultimaAtualizacao).TotalSeconds; + double dtCalc = Math.Max(tempoMinimo, Math.Min(tempoMaximo, _dt)); + + var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento; + + var dadosEnvio = new + { + lat = _lat, + lon = _long, + theta = _theta, + velocidade = _velocidadeMs, + dt = dtCalc, + contexto = new + { + StatusCarro = (int)_Sensoriamento.Trajetoria.StatusCarro, + DentroCorredor = _Sensoriamento.Trajetoria.CorredorAtual.Dentro, + ManobrandoEntreRuas = _Sensoriamento.Trajetoria.ManobrandoEntreRuas + } + }; + + await Variaveis.MqttService.PublishAsync( + Variaveis.MqttService.Topicos.First(x => x.Topico == TopicoPosicao), + JsonConvert.SerializeObject(dadosEnvio) ); - _ultimaAtualizacao = DateTime.Now; + bool Respondido() => _ultimaAtualizacao > EnviadoEm; + await FuncoesGlobais.AguardarCondicaoAsync(Respondido, 200, 10); - // Retorna o primeiro comando da melhor sequência - return bestSequence[0]; + return ComandoAtual; } - - private List<(double steering, Enums.TipoMovimentoDirecional mode)> PreGenerateControlOptions() + public MPCController Clone() { - List<(double steering, Enums.TipoMovimentoDirecional mode)> controlOptions = new List<(double steering, Enums.TipoMovimentoDirecional mode)>(); - - // Gera todas as opções de steering (ângulos) e modos - List steeringOptions = new List(); - for (double s = -maxSteeringAngle; s <= maxSteeringAngle; s += 5.0) // Passo de 5 graus + return new MPCController() { - steeringOptions.Add(s); + ComandoAtual = ComandoAtual?.Clone() ?? new MPCComandoModel(), + Horizonte = Horizonte, + Iniciado = Iniciado, + _ultimaAtualizacao = _ultimaAtualizacao, + _dt = _dt } +; } - List modeOptions = new List() - { - Enums.TipoMovimentoDirecional.RodasDianteiras, - Enums.TipoMovimentoDirecional.MovimentoArco - }; - - // Cria todas as combinações de steering e mode - foreach (var steering in steeringOptions) - { - foreach (var mode in modeOptions) - { - controlOptions.Add((steering, mode)); - } - } - - return controlOptions; - } - - private void GenerateControlSequences(List<(double steering, Enums.TipoMovimentoDirecional mode)> currentSequence, int remainingSteps, List> allSequences, List<(double steering, Enums.TipoMovimentoDirecional mode)> controlOptions) // Pré-geradas + public void Dispose() { - // Base da recursão: se não houver mais passos no horizonte, salva a sequência - if (remainingSteps == 0) + lock (processLock) { - allSequences.Add(new List<(double steering, Enums.TipoMovimentoDirecional mode)>(currentSequence)); - return; + pythonProcess?.Kill(); + pythonProcess?.Dispose(); + pythonProcess = null; } - // Itera sobre as combinações pré-calculadas - foreach (var control in controlOptions) - { - // Adiciona o controle atual à sequência - currentSequence.Add(control); - - // Chama recursivamente para o próximo passo, diminuindo o horizonte - GenerateControlSequences(currentSequence, remainingSteps - 1, allSequences, controlOptions); - - // Remove o controle para explorar a próxima combinação - currentSequence.RemoveAt(currentSequence.Count - 1); - } + Iniciado = false; + ComandoAtual = new MPCComandoModel(); + Task.Run(async () => { + Variaveis.MqttService.Topicos.Remove(Variaveis.MqttService.Topicos.FirstOrDefault(x => x.Topico == TopicoRota)); + Variaveis.MqttService.Topicos.Remove(Variaveis.MqttService.Topicos.FirstOrDefault(x => x.Topico == TopicoPosicao)); + await Variaveis.MqttService.UnsubscribeAsync(Variaveis.MqttService.Topicos.FirstOrDefault(x => x.Topico == TopicoComando)); + Variaveis.MqttService.Topicos.Remove(Variaveis.MqttService.Topicos.FirstOrDefault(x => x.Topico == TopicoComando)); + }); } - private void GenerateAndEvaluateSequences( - List<(double steering, Enums.TipoMovimentoDirecional mode)> currentSequence, - int remainingSteps, - List<(double steering, Enums.TipoMovimentoDirecional mode)> controlOptions, - ref double bestCost, - ref List<(double steering, Enums.TipoMovimentoDirecional mode)> bestSequence, - Func, double> evaluateSequence) - { - // Base da recursão: se não houver mais passos, avalia a sequência - if (remainingSteps == 0) - { - double cost = evaluateSequence(currentSequence); - - // Verifica se a sequência atual tem o menor custo - if (cost < bestCost) - { - bestCost = cost; - bestSequence = new List<(double steering, Enums.TipoMovimentoDirecional mode)>(currentSequence); - } - - return; - } - - // Itera sobre as combinações de controle - foreach (var control in controlOptions) - { - // Adiciona o controle atual à sequência - currentSequence.Add(control); - - // Chama recursivamente para o próximo passo, diminuindo o horizonte - GenerateAndEvaluateSequences(currentSequence, remainingSteps - 1, controlOptions, ref bestCost, ref bestSequence, evaluateSequence); - - // Remove o controle para explorar a próxima combinação - currentSequence.RemoveAt(currentSequence.Count - 1); - } - } - - - - - private double SimulateTrajectory( - double lat, double lon, double theta, - double targetLat, double targetLon, double targetTheta, - double currentVelocity, - List<(double steering, Enums.TipoMovimentoDirecional mode)> sequence, - double leftEdge, double rightEdge, List obstacles, double dt, bool insideStreet, - int stepsPerGroup) - { - double cost = 0; - - var posicaoAtual = new GPSModel { Latitude = lat, Longitude = lon, OrientacaoReal = theta }; - var posicaoAlvo = new GPSModel { Latitude = targetLat, Longitude = targetLon }; - (double targetX, double targetY) = GPSUtils.ConverterLatLongParaMetros(posicaoAlvo, posicaoAtual); - - foreach (var control in sequence) - { - double steering = control.steering; - Enums.TipoMovimentoDirecional mode = control.mode; - - // Simula "stepsPerGroup" passos para o mesmo comando - for (int step = 0; step < stepsPerGroup; step++) - { - var novaPosicao = VariaveisEquipamento.SimularNovaPosicao(mode, steering, currentVelocity, dt, theta, posicaoAtual); - - posicaoAtual = novaPosicao; - theta = novaPosicao.OrientacaoReal; - - (double novaX, double novaY) = GPSUtils.ConverterLatLongParaMetros(novaPosicao, posicaoAlvo); - - double distanceError = Math.Sqrt(Math.Pow(targetX - novaX, 2) + Math.Pow(targetY - novaY, 2)); - double laneError = insideStreet ? Math.Abs(leftEdge - rightEdge) : 0.0; - - // Acumula o custo - cost += (distanceError * 10.0) + (laneError * 20.0); - } - } - - return cost; - } - - - - +} + +public class MPCComandoModel +{ + public TipoMovimentoDirecional tipo { get; set; } = TipoMovimentoDirecional.RodasDianteiras; + public double angulo { get; set; } = 0; + public List simulacao { get; set; } = new List(); + + public MPCComandoModel Clone() + { + return new MPCComandoModel() + { + tipo = tipo, + angulo = angulo, + simulacao = new List(simulacao) + }; + } +} + +public class MPCSimulacaoModel +{ + public double latitude { get; set; } + public double longitude { get; set; } } diff --git a/AgroBase/AgroBase/Models/MapaDinamicoModel.cs b/AgroBase/AgroBase/Models/MapaDinamicoModel.cs index 36affa699..60fafd303 100644 --- a/AgroBase/AgroBase/Models/MapaDinamicoModel.cs +++ b/AgroBase/AgroBase/Models/MapaDinamicoModel.cs @@ -20,6 +20,7 @@ namespace AgroBase.Models private List TrajetoriaDinamica { get; set; } = new List(); private List TrajetoriaRuaProjetada { get; set; } = new List(); private List TrajetoriaRobo { get; set; } = new List(); + public List TrajetoriaSimuladaMPC { get; set; } = new List(); private Obstaculo obstaculoDetectado { get; set; } private float AnguloCaminho { get; set; } private float AnguloCarro { get; set; } @@ -42,7 +43,16 @@ namespace AgroBase.Models pnlZoomMapa.GetType().GetMethod("SetStyle", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).Invoke(pnlZoomMapa, new object[] { ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true }); } - public void AtualizarDados(Obstaculo obstaculo, float anguloCaminho, float anguloCarro, GPSModel posicaoAtual, List trajetoriaDinamica, List trajetoriaRua, List trajetoriaRobo, List> ruasPlantacao) + public void AtualizarDados( + Obstaculo obstaculo, + float anguloCaminho, + float anguloCarro, + GPSModel posicaoAtual, + List trajetoriaDinamica, + List trajetoriaRua, + List trajetoriaRobo, + List> ruasPlantacao, + List trajetoriaSimulada = null) { obstaculoDetectado = obstaculo; AnguloCaminho = anguloCaminho; @@ -52,6 +62,7 @@ namespace AgroBase.Models TrajetoriaRuaProjetada = trajetoriaRua; TrajetoriaRobo = trajetoriaRobo; RuasPlantacao = ruasPlantacao; + TrajetoriaSimuladaMPC = trajetoriaSimulada ?? new List(); pnlZoomMapa.Invalidate(); } @@ -151,6 +162,19 @@ namespace AgroBase.Models { DrawObstacle(g, centerX, centerY, Color.Cyan, Color.Cyan, AnguloCaminho - (float)obstaculoDetectado.AnguloParaDesvio, obstaculoDetectado, PxToCm); } + + // Desenha a simulação do MPC (linha tracejada verde-limão) + if (TrajetoriaSimuladaMPC != null && TrajetoriaSimuladaMPC.Count > 1) + { + var _trajetoriaSimulada = TrajetoriaSimuladaMPC + .Select(x => new PontoTrajetoriaModel(Enums.TipoPontoRua.Indefinido) { Posicao = new GPSModel() { Latitude = x.latitude, Longitude = x.longitude } }) + .ToList(); + + Pen penTracejada = new Pen(Color.LimeGreen, 2); + penTracejada.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash; + + DrawTrajectory(g, _trajetoriaSimulada, centerX, centerY, Color.LimeGreen, penTracejada); + } } catch (Exception ex) { diff --git a/AgroBase/AgroBase/Models/Operacoes/OperacaoMapaGPSModel.cs b/AgroBase/AgroBase/Models/Operacoes/OperacaoMapaGPSModel.cs index 5d2f8b5ea..643a33c6f 100644 --- a/AgroBase/AgroBase/Models/Operacoes/OperacaoMapaGPSModel.cs +++ b/AgroBase/AgroBase/Models/Operacoes/OperacaoMapaGPSModel.cs @@ -13,7 +13,7 @@ namespace AgroBase.Models.Operacoes #region DIRECIONAL - public void DefinirDadosControleDir() + public async void DefinirDadosControleDir() { if (Variaveis.OperacaoEmAndamento.Modo != ModoOperacao.MapaGPS) { @@ -37,13 +37,10 @@ namespace AgroBase.Models.Operacoes } case TiposControladorDirecional.MPC: { - var Trajetoria = Variaveis.OperacaoEmAndamento.Trajetoria; - - var MPC_A = new MPCControllerAprimorado(); - (double angulo, TipoMovimentoDirecional tipoControle) = MPC_A.CalcularControle(GPSService.UltimaLeitura, Controle.PercentualVelocidadeSP, Trajetoria.TrajetoriaDinamica, new TipoMovimentoDirecional[] { TipoMovimentoDirecional.RodasDianteiras }); - - Controle.Angulo = angulo; - Controle.TipoMovimento = tipoControle; + var _Sensoriamento = Variaveis.OperacaoEmAndamento.Sensoriamento; + MPCComandoModel comando = await Variaveis.OperacaoEmAndamento.Controle.ControladorMPC.Compute(_Sensoriamento.Gps.Latitude, _Sensoriamento.Gps.Longitude, _Sensoriamento.Gps.AnguloCarroDefinido, _Sensoriamento.Movimentacao.VelocidadeMedia); + Controle.Angulo = comando?.angulo ?? 0; + Controle.TipoMovimento = comando?.tipo ?? TipoMovimentoDirecional.RodasDianteiras; break; } } @@ -206,7 +203,7 @@ namespace AgroBase.Models.Operacoes Controle.FiltroVelocidade.Reset(Controle.PercentualVelocidadeSP); } - Console.WriteLine($"Velocidade SP: {Controle.PercentualVelocidadeSP}, ms: {FuncoesMatematicas.CalculaVelocidadeMsPercentual(Controle.PercentualVelocidadeSP)}, km/h: {FuncoesMatematicas.ConverteMsParaKmh(FuncoesMatematicas.CalculaVelocidadeMsPercentual(Controle.PercentualVelocidadeSP))}"); + //Console.WriteLine($"Velocidade SP: {Controle.PercentualVelocidadeSP}, ms: {FuncoesMatematicas.CalculaVelocidadeMsPercentual(Controle.PercentualVelocidadeSP)}, km/h: {FuncoesMatematicas.ConverteMsParaKmh(FuncoesMatematicas.CalculaVelocidadeMsPercentual(Controle.PercentualVelocidadeSP))}"); //double velocidadeFiltrada = Controle.FiltroVelocidade.Filtrar(Controle.PercentualVelocidadeSP); //Controle.PercentualVelocidadeSP = Math.Max(Controle.PercentualVelocidadeMin, velocidadeFiltrada); diff --git a/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs b/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs index 02a446753..e47b2642e 100644 --- a/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs +++ b/AgroBase/AgroBase/Models/Operacoes/OperacaoModel.cs @@ -440,6 +440,8 @@ namespace AgroBase.Models tmrLogs?.Stop(); + Variaveis.OperacaoEmAndamento.Controle.ControladorMPC?.Dispose(); + Variaveis.OperacaoEmAndamento = new OperacaoModel(Modo) { Iniciado = false, @@ -451,7 +453,6 @@ namespace AgroBase.Models Sensoriamento = new OperacaoSensoriamentoLogModel(), QuantidadeCamerasSolo = 1, }; - switch (Modo) { @@ -564,7 +565,7 @@ namespace AgroBase.Models SegmentacaoSemantica = false, PulverizadorAutomatico = true, TipoMovimento = TipoMovimentoDirecional.RodasDianteiras, - TipoControleDirecional = TiposControladorDirecional.PID, + TipoControleDirecional = TiposControladorDirecional.MPC, }; Variaveis.OperacaoEmAndamento.ModulosMandatorios = new List() { @@ -801,6 +802,11 @@ namespace AgroBase.Models }; Controle.FiltroVelocidade = new KalmanFilter(erroMedicao: 2.0, erroProcesso: 0.05); Controle.ControladorMPC = new MPCController(); + bool mpcIniciado = await Controle.ControladorMPC.Inicializar(); + if (mpcIniciado) + { + await Controle.ControladorMPC.EnviarDadosTrajetoria(Variaveis.OperacaoEmAndamento.Trajetoria._TrajetoriaFixa); + } } Controle.Angulo = 0; @@ -837,6 +843,8 @@ namespace AgroBase.Models Variaveis.OperacaoEmAndamento.PararCarroOperacaoInterrompida(true); + Variaveis.OperacaoEmAndamento.Controle.ControladorMPC?.Dispose(); + await Task.Delay(2000); Variaveis.OperacaoEmAndamento.Iniciado = false; @@ -909,21 +917,12 @@ namespace AgroBase.Models ID = ""; - if (DispMvd != null) - { - DispMvd.Dados.ReiniciarLeituras(DispMvd.Dados); - } - if (DispAtu != null) - { - DispAtu.Dados.ReiniciarLeituras(DispAtu.Dados); - } - if (DispSen != null) - { - DispSen.Dados.ReiniciarLeituras(DispSen.Dados); - } + DispMvd?.Dados?.ReiniciarLeituras(DispMvd.Dados); + DispAtu?.Dados?.ReiniciarLeituras(DispAtu.Dados); + DispSen?.Dados?.ReiniciarLeituras(DispSen.Dados); - Sensoriamento.AtualizarDados(); - OpMapaGPS.Sensoriamento.ReiniciarLeituras(); + Sensoriamento?.AtualizarDados(); + OpMapaGPS?.Sensoriamento?.ReiniciarLeituras(); if (Modo == ModoOperacao.MapaGPS) { @@ -934,6 +933,14 @@ namespace AgroBase.Models }; Controle.FiltroVelocidade = new KalmanFilter(erroMedicao: 2.0, erroProcesso: 0.05); Controle.ControladorMPC = new MPCController(); + Task.Run(async () => + { + bool mpcIniciado = await Controle.ControladorMPC.Inicializar(); + if (mpcIniciado) + { + await Controle.ControladorMPC.EnviarDadosTrajetoria(Variaveis.OperacaoEmAndamento.Trajetoria._TrajetoriaFixa); + } + }); } Controle.Angulo = 0; @@ -944,6 +951,7 @@ namespace AgroBase.Models public void ReiniciarSimulacao() { + Variaveis.OperacaoEmAndamento.Controle.ControladorMPC?.Dispose(); Variaveis.OperacaoEmAndamento.StatusAtual = StatusOperacao.Parametrizando; Variaveis.OperacaoEmAndamento.Iniciado = false; Variaveis.OperacaoEmAndamento.Simulando = false; @@ -2879,6 +2887,8 @@ namespace AgroBase.Models PercentualVelocidadeSP = PercentualVelocidadeSP, PIDdirecional = PIDdirecional.Clone(), FiltroVelocidade = FiltroVelocidade.Clone(), + ControladorMPC = ControladorMPC.Clone(), + _tipoMovimento = _tipoMovimento, PressaoLinha = PressaoLinha, PulverizadorAutomatico = PulverizadorAutomatico, RPM_Max = RPM_Max, diff --git a/AgroBase/AgroBase/Models/TrajetoriaMapaOperacaoModel.cs b/AgroBase/AgroBase/Models/TrajetoriaMapaOperacaoModel.cs index 2565000b3..4a836ea83 100644 --- a/AgroBase/AgroBase/Models/TrajetoriaMapaOperacaoModel.cs +++ b/AgroBase/AgroBase/Models/TrajetoriaMapaOperacaoModel.cs @@ -217,8 +217,8 @@ namespace AgroBase.Models public double DistanciaDireita { get; private set; } private void AtualizarDistanciasLaterais() { - DistanciaEsquerda = CalcularDistanciaLateral(true, GPSService.UltimaLeitura, CorredorAtual.idxRuaEsquerda, PontoAtual.Direcao); - DistanciaDireita = CalcularDistanciaLateral(false, GPSService.UltimaLeitura, CorredorAtual.idxRuaDireita, PontoAtual.Direcao); + DistanciaEsquerda = CalcularDistanciaLateral(true, GPSService.UltimaLeitura, CorredorAtual?.idxRuaEsquerda ?? 0, PontoAtual?.Direcao ?? DirecaoCarroRua.Ida); + DistanciaDireita = CalcularDistanciaLateral(false, GPSService.UltimaLeitura, CorredorAtual?.idxRuaDireita ?? 0, PontoAtual?.Direcao ?? DirecaoCarroRua.Ida); } public double CalcularDistanciaLateral(bool ladoEsquerdo, GPSModel posicaoAtual, int idxRua, DirecaoCarroRua direcaoAtual) diff --git a/AgroBase/AgroBase/Services/PythonService.cs b/AgroBase/AgroBase/Services/PythonService.cs index cb54ce58c..d0f76e8ba 100644 --- a/AgroBase/AgroBase/Services/PythonService.cs +++ b/AgroBase/AgroBase/Services/PythonService.cs @@ -63,6 +63,13 @@ namespace AgroBase.Services return VersionamentoService.ArquivoScript(Enums.TipoArquivoVersionado.ScriptListOAKCaneras).NomeArquivoLocal; } } + public static string ScriptMPCController + { + get + { + return VersionamentoService.ArquivoScript(Enums.TipoArquivoVersionado.ScriptMPCController).NomeArquivoLocal; + } + } private static List processosIniciados = new List(); diff --git a/AgroBase/AgroBase/bin/Debug/AgroBase.pdb b/AgroBase/AgroBase/bin/Debug/AgroBase.pdb index 9fccf9168..5dce817d2 100644 Binary files a/AgroBase/AgroBase/bin/Debug/AgroBase.pdb and b/AgroBase/AgroBase/bin/Debug/AgroBase.pdb differ diff --git a/AgroBase/AgroBase/bin/Debug/DawnCache/data_1 b/AgroBase/AgroBase/bin/Debug/DawnCache/data_1 index 3c68a114a..efd4eacac 100644 Binary files a/AgroBase/AgroBase/bin/Debug/DawnCache/data_1 and b/AgroBase/AgroBase/bin/Debug/DawnCache/data_1 differ diff --git a/AgroBase/AgroBase/bin/Debug/GPUCache/data_1 b/AgroBase/AgroBase/bin/Debug/GPUCache/data_1 index e177e3d00..8c9a46eba 100644 Binary files a/AgroBase/AgroBase/bin/Debug/GPUCache/data_1 and b/AgroBase/AgroBase/bin/Debug/GPUCache/data_1 differ diff --git a/AgroBase/AgroBase/bin/Debug/Parametros/parametersMvd-2_0.par b/AgroBase/AgroBase/bin/Debug/Parametros/parametersMvd-2_0.par index 23b8ea62d..69ec95628 100644 --- a/AgroBase/AgroBase/bin/Debug/Parametros/parametersMvd-2_0.par +++ b/AgroBase/AgroBase/bin/Debug/Parametros/parametersMvd-2_0.par @@ -1 +1 @@ -{"tmrRegistrador":{"_uiControl":null,"State":2,"IsRunning":false,"IsStopped":true,"IsCreated":false,"Interval":1000,"StackTrace":"MovimentacaoUnificadaModel.IniciarRegistrador","Id":"tmrRegistrador_Mvd","TimeTick":"00:00:00"},"tmrRegistradorMOV":{"_uiControl":null,"State":2,"IsRunning":false,"IsStopped":true,"IsCreated":false,"Interval":1000,"StackTrace":"MovimentacaoUnificadaModel.IniciarRegistrador","Id":"tmrRegistrador_Mov","TimeTick":"00:00:00"},"tmrRegistradorDIR":{"_uiControl":null,"State":2,"IsRunning":false,"IsStopped":true,"IsCreated":false,"Interval":300,"StackTrace":"MovimentacaoUnificadaModel.IniciarRegistrador","Id":"tmrRegistrador_Dir","TimeTick":"00:00:00"},"Dispositivo":109,"_EnderecoCAN":0,"Conectado":true,"_TaxaAmostragem":1000,"DistanciaPercorridaOperacao":0.0,"TempoEmAtividade":0.0,"DistanciaPercorridaTotal":0.0,"DistanciaPercorridaParcial":0.0,"VelocidadeMedia":0.0,"DiametroRoda":0.365,"ReducaoMotorBLDC":5.0,"RPM_Max_MotorBLDC":500.0,"IP_Mov":"192.168.105.10","IP_Dir":"192.168.105.11","Modulos":[{"Modulo_ID":"ET","Disponivel":false,"RequisitarDados":false,"Conectado":true,"MovMotor":{"ID":"Mov","Endereco":"0x01","EnderecoByte":1,"Mod_ID":"ET","LeituraLigado":false,"ComandoLigado":false,"CodigoAlarme":0,"AlarmeMotor":false,"RPM_SP":0,"RPM_SP_Controle":0,"RPM_SP_Leitura":0,"Sentido_SP":0,"NumeroPolos":10,"Rampa":0,"CorrenteTorqueMaximo":40,"OffsetLeitura":1.0,"AlarmeComando":false,"RPM_Roda":0.0,"Sentido":0,"Temperatura":0.0,"TemperaturaDriver":30.0,"Tensao":36.0,"Corrente_Barramento":0.0,"Corrente_Motor":0.0,"Potencia":0.0,"CicloTrabalho":0.6,"RPM_Motor":0.0,"VelocidadeInstantanea":0.0,"Comandar":true,"AlarmeSensores":false,"Inicializado":true,"Leitura":{"Endereco":1,"Iniciado":true,"Configurado":true,"UltimoComandoRecebido":"2025-04-16T10:11:40.922012-03:00","ModoControle":0,"ControleCorrente":0,"ControleVelocidade":125,"ControleCicloTrabalho":0,"ControleCorrenteFreio":3,"RampaSubidaVelocidade":0,"RampaDescidaVelocidade":0,"CodigoAlarme":0,"Heartbeat":1,"Torque_Max":0.0,"ERPM":0,"CorrenteMotor":0.0,"CorrenteBarramento":3.0000000260770322E-05,"Direcao":0,"RPM":0.0,"Tensao":36.0,"Temperatura":30.0,"Potencia":0.003599999938160181,"CicloTrabalho":0.6,"Freado":false,"parametros":[{"Registro":5000,"Valor":"AAA=","Escala":1.0},{"Registro":6001,"Valor":"AAA=","Escala":1.0},{"Registro":6014,"Valor":"AAM=","Escala":100.0},{"Registro":6003,"Valor":"AH0=","Escala":10.0},{"Registro":6028,"Valor":"ACg=","Escala":100.0},{"Registro":6016,"Valor":"AAA=","Escala":10.0},{"Registro":6025,"Valor":"AAA=","Escala":10.0},{"Registro":6002,"Valor":"AAA=","Escala":100.0},{"Registro":5001,"Valor":"AAAAAA==","Escala":1.0},{"Registro":5003,"Valor":"//oAAA==","Escala":10.0},{"Registro":5004,"Valor":"AAAAJA==","Escala":1.0},{"Registro":5005,"Valor":"ACQAAA==","Escala":1.0},{"Registro":5006,"Valor":"AAAAAA==","Escala":100.0},{"Registro":5007,"Valor":"AAAAHg==","Escala":100.0},{"Registro":5008,"Valor":"AB4AAA==","Escala":1.0},{"Registro":6000,"Valor":"AAE=","Escala":1.0}]},"CompensacaoNecessaria":false,"ConfigSentidos":{"RodasDianteiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoArco":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RotacionarNoEixo":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoLateral":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"Diagnostico":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0}},"Funcoes":[12,14,9,5,10],"LogGrafico":[],"Alarmes":[{"Tipo":411,"Valor":-1.0,"Minimo":true,"Maximo":false,"ParaMinimo":false,"ParaMaximo":false}],"ConfigFreio":{"Incremental":true,"AnguloInicial":10,"Leitura":false,"Controle":false}},"DirMotor":{"ID":"Dir","Endereco":"0x01","EnderecoByte":1,"Mod_ID":"ET","Sentido_SP":0,"Angulo_SP":0.0,"FolgaMecanica":0.0,"Velocidade_Max":600.0,"Velocidade":156,"Sentido":0,"SentidoReal":2,"Angulo":0.0,"RPM":0.0,"IN1_Atuado":false,"IN2_Atuado":false,"Referenciando":false,"Comandar":false,"Inicializado":true,"Leitura":{"Endereco":1,"Iniciado":true,"UltimoComandoRecebido":"2025-04-16T10:11:40.9636296-03:00","ErroCarregado":0.0,"ErroCarregado_Hex":null,"ErroAcumulado":0.0,"ErroAcumulado_Hex":null,"RPM":0.0,"RPM_Hex":null,"NumeroPulsos":0,"AnguloPulsos":0.0,"NumeroPulsos_Hex":null,"NumeroPulsosAbsoluto":0,"AnguloPulsosAbsoluto":0.0,"NumeroPulsosRelativo":0,"AnguloPulsosRelativo":0.0,"ErroAngulo":0.0,"ErroAngulo_Hex":null,"StatusDriver":0,"StatusModoLimiteZero":0,"StatusTravaMotor":0,"StatusBloqueioMotor":0,"StatusMovimentoMotor":0,"Sentido":0,"Velocidade":0.0,"Aceleracao":0.0,"Mensagem":null,"HV":null,"FV":"20.1.0.6","Entradas":[true,true],"Saidas":[true,true]},"UltimaDirecao":0,"UltimoComandoEnviado":"2025-04-14T19:29:46.7670569-03:00","RetornandoAzero":false,"EmMovimento":false,"AtingiuAnguloSP":true,"ConfigSentidos":{"RodasDianteiras":{"Frente":0,"Tras":0,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"MovimentoDiagonal":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"MovimentoArco":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"RotacionarNoEixo":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":1,"Parado":0},"MovimentoLateral":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"Diagnostico":{"Frente":2,"Tras":1,"Esquerda":1,"Direita":2,"Parado":0}},"Funcoes":[13,9,14,41]}},{"Modulo_ID":"EF","Disponivel":false,"RequisitarDados":false,"Conectado":true,"MovMotor":{"ID":"Mov","Endereco":"0x03","EnderecoByte":3,"Mod_ID":"EF","LeituraLigado":false,"ComandoLigado":false,"CodigoAlarme":0,"AlarmeMotor":false,"RPM_SP":0,"RPM_SP_Controle":0,"RPM_SP_Leitura":0,"Sentido_SP":0,"NumeroPolos":10,"Rampa":0,"CorrenteTorqueMaximo":40,"OffsetLeitura":1.0,"AlarmeComando":false,"RPM_Roda":0.0,"Sentido":0,"Temperatura":0.0,"TemperaturaDriver":25.86,"Tensao":36.0,"Corrente_Barramento":0.0,"Corrente_Motor":0.0,"Potencia":0.0,"CicloTrabalho":0.6,"RPM_Motor":0.0,"VelocidadeInstantanea":0.0,"Comandar":true,"AlarmeSensores":false,"Inicializado":true,"Leitura":{"Endereco":3,"Iniciado":true,"Configurado":true,"UltimoComandoRecebido":"2025-04-16T10:11:41.0640284-03:00","ModoControle":0,"ControleCorrente":0,"ControleVelocidade":125,"ControleCicloTrabalho":0,"ControleCorrenteFreio":3,"RampaSubidaVelocidade":0,"RampaDescidaVelocidade":0,"CodigoAlarme":0,"Heartbeat":1,"Torque_Max":0.0,"ERPM":0,"CorrenteMotor":0.0,"CorrenteBarramento":2.8999999631196261E-05,"Direcao":0,"RPM":0.0,"Tensao":36.0,"Temperatura":25.864599227905273,"Potencia":0.003599999938160181,"CicloTrabalho":0.6,"Freado":false,"parametros":[{"Registro":5000,"Valor":"AAA=","Escala":1.0},{"Registro":6001,"Valor":"AAA=","Escala":1.0},{"Registro":6014,"Valor":"AAM=","Escala":100.0},{"Registro":6003,"Valor":"AH0=","Escala":10.0},{"Registro":6028,"Valor":"ACg=","Escala":100.0},{"Registro":6016,"Valor":"AAA=","Escala":10.0},{"Registro":6025,"Valor":"AAA=","Escala":10.0},{"Registro":6002,"Valor":"AAA=","Escala":100.0},{"Registro":5001,"Valor":"AAAAAA==","Escala":1.0},{"Registro":5003,"Valor":"//oAAA==","Escala":10.0},{"Registro":5004,"Valor":"AAAAJA==","Escala":1.0},{"Registro":5005,"Valor":"ACQAAA==","Escala":1.0},{"Registro":5006,"Valor":"AAAAAA==","Escala":100.0},{"Registro":5007,"Valor":"AAAAHQ==","Escala":100.0},{"Registro":5008,"Valor":"AB2Fhg==","Escala":1.0},{"Registro":6000,"Valor":"AAE=","Escala":1.0}]},"CompensacaoNecessaria":false,"ConfigSentidos":{"RodasDianteiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoArco":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RotacionarNoEixo":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoLateral":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"Diagnostico":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0}},"Funcoes":[12,14,9,5,10],"LogGrafico":[],"Alarmes":[{"Tipo":411,"Valor":-1.0,"Minimo":true,"Maximo":false,"ParaMinimo":false,"ParaMaximo":false}],"ConfigFreio":{"Incremental":true,"AnguloInicial":10,"Leitura":false,"Controle":false}},"DirMotor":{"ID":"Dir","Endereco":"0x03","EnderecoByte":3,"Mod_ID":"EF","Sentido_SP":0,"Angulo_SP":0.0,"FolgaMecanica":9.0,"Velocidade_Max":600.0,"Velocidade":156,"Sentido":0,"SentidoReal":2,"Angulo":0.0,"RPM":0.0,"IN1_Atuado":true,"IN2_Atuado":false,"Referenciando":false,"Comandar":true,"Inicializado":true,"Leitura":{"Endereco":3,"Iniciado":true,"UltimoComandoRecebido":"2025-04-16T10:11:41.0640284-03:00","ErroCarregado":0.0,"ErroCarregado_Hex":null,"ErroAcumulado":0.0,"ErroAcumulado_Hex":null,"RPM":0.0,"RPM_Hex":null,"NumeroPulsos":0,"AnguloPulsos":0.0,"NumeroPulsos_Hex":null,"NumeroPulsosAbsoluto":0,"AnguloPulsosAbsoluto":0.0,"NumeroPulsosRelativo":0,"AnguloPulsosRelativo":0.0,"ErroAngulo":0.0,"ErroAngulo_Hex":null,"StatusDriver":0,"StatusModoLimiteZero":0,"StatusTravaMotor":0,"StatusBloqueioMotor":0,"StatusMovimentoMotor":0,"Sentido":0,"Velocidade":0.0,"Aceleracao":0.0,"Mensagem":null,"HV":null,"FV":"20.1.0.6","Entradas":[false,true],"Saidas":[true,true]},"UltimaDirecao":0,"UltimoComandoEnviado":"2025-04-16T10:11:35.3152608-03:00","RetornandoAzero":false,"EmMovimento":false,"AtingiuAnguloSP":true,"ConfigSentidos":{"RodasDianteiras":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"RodasTraseiras":{"Frente":0,"Tras":0,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"MovimentoArco":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"RotacionarNoEixo":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":1,"Parado":0},"MovimentoLateral":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"Diagnostico":{"Frente":2,"Tras":1,"Esquerda":1,"Direita":2,"Parado":0}},"Funcoes":[13,9,14,41]}},{"Modulo_ID":"DT","Disponivel":false,"RequisitarDados":false,"Conectado":true,"MovMotor":{"ID":"Mov","Endereco":"0x02","EnderecoByte":2,"Mod_ID":"DT","LeituraLigado":false,"ComandoLigado":false,"CodigoAlarme":0,"AlarmeMotor":false,"RPM_SP":0,"RPM_SP_Controle":0,"RPM_SP_Leitura":0,"Sentido_SP":0,"NumeroPolos":10,"Rampa":0,"CorrenteTorqueMaximo":40,"OffsetLeitura":1.0,"AlarmeComando":false,"RPM_Roda":0.0,"Sentido":0,"Temperatura":0.0,"TemperaturaDriver":29.59,"Tensao":36.0,"Corrente_Barramento":0.0,"Corrente_Motor":0.0,"Potencia":0.0,"CicloTrabalho":0.5,"RPM_Motor":0.0,"VelocidadeInstantanea":0.0,"Comandar":true,"AlarmeSensores":false,"Inicializado":true,"Leitura":{"Endereco":2,"Iniciado":true,"Configurado":true,"UltimoComandoRecebido":"2025-04-16T10:11:41.0013442-03:00","ModoControle":0,"ControleCorrente":0,"ControleVelocidade":125,"ControleCicloTrabalho":0,"ControleCorrenteFreio":3,"RampaSubidaVelocidade":0,"RampaDescidaVelocidade":0,"CodigoAlarme":0,"Heartbeat":1,"Torque_Max":0.0,"ERPM":0,"CorrenteMotor":0.0,"CorrenteBarramento":2.8999999631196261E-05,"Direcao":0,"RPM":0.0,"Tensao":36.0,"Temperatura":29.590400695800781,"Potencia":0.003599999938160181,"CicloTrabalho":0.5,"Freado":false,"parametros":[{"Registro":5000,"Valor":"AAA=","Escala":1.0},{"Registro":6001,"Valor":"AAA=","Escala":1.0},{"Registro":6014,"Valor":"AAM=","Escala":100.0},{"Registro":6003,"Valor":"AH0=","Escala":10.0},{"Registro":6028,"Valor":"ACg=","Escala":100.0},{"Registro":6016,"Valor":"AAA=","Escala":10.0},{"Registro":6025,"Valor":"AAA=","Escala":10.0},{"Registro":6002,"Valor":"AAA=","Escala":100.0},{"Registro":5001,"Valor":"AAAAAA==","Escala":1.0},{"Registro":5003,"Valor":"AAUAAA==","Escala":10.0},{"Registro":5004,"Valor":"AAAAJA==","Escala":1.0},{"Registro":5005,"Valor":"ACQAAA==","Escala":1.0},{"Registro":5006,"Valor":"AAAAAA==","Escala":100.0},{"Registro":5007,"Valor":"AAAAHQ==","Escala":100.0},{"Registro":5008,"Valor":"AB0XEA==","Escala":1.0},{"Registro":6000,"Valor":"AAE=","Escala":1.0}]},"CompensacaoNecessaria":false,"ConfigSentidos":{"RodasDianteiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoArco":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RotacionarNoEixo":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoLateral":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"Diagnostico":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0}},"Funcoes":[12,14,9,5,10],"LogGrafico":[],"Alarmes":[{"Tipo":411,"Valor":-1.0,"Minimo":true,"Maximo":false,"ParaMinimo":false,"ParaMaximo":false}],"ConfigFreio":{"Incremental":false,"AnguloInicial":170,"Leitura":false,"Controle":false}},"DirMotor":{"ID":"Dir","Endereco":"0x02","EnderecoByte":2,"Mod_ID":"DT","Sentido_SP":0,"Angulo_SP":0.0,"FolgaMecanica":3.0,"Velocidade_Max":600.0,"Velocidade":156,"Sentido":0,"SentidoReal":1,"Angulo":0.0,"RPM":0.0,"IN1_Atuado":false,"IN2_Atuado":false,"Referenciando":false,"Comandar":false,"Inicializado":true,"Leitura":{"Endereco":2,"Iniciado":true,"UltimoComandoRecebido":"2025-04-16T10:11:41.0640284-03:00","ErroCarregado":0.0,"ErroCarregado_Hex":null,"ErroAcumulado":0.0,"ErroAcumulado_Hex":null,"RPM":0.0,"RPM_Hex":null,"NumeroPulsos":0,"AnguloPulsos":0.0,"NumeroPulsos_Hex":null,"NumeroPulsosAbsoluto":0,"AnguloPulsosAbsoluto":0.0,"NumeroPulsosRelativo":0,"AnguloPulsosRelativo":0.0,"ErroAngulo":0.0,"ErroAngulo_Hex":null,"StatusDriver":0,"StatusModoLimiteZero":0,"StatusTravaMotor":0,"StatusBloqueioMotor":0,"StatusMovimentoMotor":0,"Sentido":0,"Velocidade":0.0,"Aceleracao":0.0,"Mensagem":null,"HV":null,"FV":"20.1.0.6","Entradas":[true,true],"Saidas":[true,true]},"UltimaDirecao":0,"UltimoComandoEnviado":"2025-04-16T10:07:04.2270834-03:00","RetornandoAzero":false,"EmMovimento":false,"AtingiuAnguloSP":true,"ConfigSentidos":{"RodasDianteiras":{"Frente":0,"Tras":0,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"MovimentoDiagonal":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"MovimentoArco":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"RotacionarNoEixo":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":1,"Parado":0},"MovimentoLateral":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"Diagnostico":{"Frente":2,"Tras":1,"Esquerda":1,"Direita":2,"Parado":0}},"Funcoes":[13,9,14,41]}},{"Modulo_ID":"DF","Disponivel":false,"RequisitarDados":false,"Conectado":true,"MovMotor":{"ID":"Mov","Endereco":"0x04","EnderecoByte":4,"Mod_ID":"DF","LeituraLigado":false,"ComandoLigado":false,"CodigoAlarme":0,"AlarmeMotor":false,"RPM_SP":0,"RPM_SP_Controle":0,"RPM_SP_Leitura":0,"Sentido_SP":0,"NumeroPolos":10,"Rampa":0,"CorrenteTorqueMaximo":40,"OffsetLeitura":1.0,"AlarmeComando":false,"RPM_Roda":0.0,"Sentido":0,"Temperatura":0.0,"TemperaturaDriver":29.12,"Tensao":36.0,"Corrente_Barramento":0.0,"Corrente_Motor":0.0,"Potencia":0.0,"CicloTrabalho":0.6,"RPM_Motor":0.0,"VelocidadeInstantanea":0.0,"Comandar":true,"AlarmeSensores":false,"Inicializado":true,"Leitura":{"Endereco":4,"Iniciado":true,"Configurado":true,"UltimoComandoRecebido":"2025-04-16T10:11:41.1525829-03:00","ModoControle":0,"ControleCorrente":0,"ControleVelocidade":125,"ControleCicloTrabalho":0,"ControleCorrenteFreio":3,"RampaSubidaVelocidade":0,"RampaDescidaVelocidade":0,"CodigoAlarme":0,"Heartbeat":1,"Torque_Max":0.0,"ERPM":0,"CorrenteMotor":0.0,"CorrenteBarramento":2.8999999631196261E-05,"Direcao":0,"RPM":0.0,"Tensao":36.0,"Temperatura":29.115100860595703,"Potencia":0.003599999938160181,"CicloTrabalho":0.6,"Freado":false,"parametros":[{"Registro":5000,"Valor":"AAA=","Escala":1.0},{"Registro":6001,"Valor":"AAA=","Escala":1.0},{"Registro":6014,"Valor":"AAM=","Escala":100.0},{"Registro":6003,"Valor":"AH0=","Escala":10.0},{"Registro":6028,"Valor":"ACg=","Escala":100.0},{"Registro":6016,"Valor":"AAA=","Escala":10.0},{"Registro":6025,"Valor":"AAA=","Escala":10.0},{"Registro":6002,"Valor":"AAA=","Escala":100.0},{"Registro":5001,"Valor":"AAAAAA==","Escala":1.0},{"Registro":5003,"Valor":"//oAAA==","Escala":10.0},{"Registro":5004,"Valor":"AAAAJA==","Escala":1.0},{"Registro":5005,"Valor":"ACQAAA==","Escala":1.0},{"Registro":5006,"Valor":"AAAAAA==","Escala":100.0},{"Registro":5007,"Valor":"AAAAHQ==","Escala":100.0},{"Registro":6000,"Valor":"AAE=","Escala":1.0},{"Registro":5008,"Valor":"AB0Efw==","Escala":1.0}]},"CompensacaoNecessaria":false,"ConfigSentidos":{"RodasDianteiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoArco":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RotacionarNoEixo":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoLateral":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"Diagnostico":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0}},"Funcoes":[12,14,9,5,10],"LogGrafico":[],"Alarmes":[{"Tipo":411,"Valor":-1.0,"Minimo":true,"Maximo":false,"ParaMinimo":false,"ParaMaximo":false}],"ConfigFreio":{"Incremental":false,"AnguloInicial":170,"Leitura":false,"Controle":false}},"DirMotor":{"ID":"Dir","Endereco":"0x04","EnderecoByte":4,"Mod_ID":"DF","Sentido_SP":0,"Angulo_SP":0.0,"FolgaMecanica":6.0,"Velocidade_Max":600.0,"Velocidade":156,"Sentido":0,"SentidoReal":1,"Angulo":0.0,"RPM":0.0,"IN1_Atuado":true,"IN2_Atuado":false,"Referenciando":false,"Comandar":true,"Inicializado":true,"Leitura":{"Endereco":4,"Iniciado":true,"UltimoComandoRecebido":"2025-04-16T10:11:41.0640284-03:00","ErroCarregado":0.0,"ErroCarregado_Hex":null,"ErroAcumulado":0.0,"ErroAcumulado_Hex":null,"RPM":0.0,"RPM_Hex":null,"NumeroPulsos":0,"AnguloPulsos":0.0,"NumeroPulsos_Hex":null,"NumeroPulsosAbsoluto":0,"AnguloPulsosAbsoluto":0.0,"NumeroPulsosRelativo":0,"AnguloPulsosRelativo":0.0,"ErroAngulo":0.0,"ErroAngulo_Hex":null,"StatusDriver":0,"StatusModoLimiteZero":0,"StatusTravaMotor":0,"StatusBloqueioMotor":0,"StatusMovimentoMotor":0,"Sentido":0,"Velocidade":0.0,"Aceleracao":0.0,"Mensagem":null,"HV":null,"FV":"20.1.0.6","Entradas":[false,true],"Saidas":[true,true]},"UltimaDirecao":0,"UltimoComandoEnviado":"2025-04-16T10:11:35.3152608-03:00","RetornandoAzero":false,"EmMovimento":false,"AtingiuAnguloSP":true,"ConfigSentidos":{"RodasDianteiras":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"RodasTraseiras":{"Frente":0,"Tras":0,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"MovimentoArco":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"RotacionarNoEixo":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":1,"Parado":0},"MovimentoLateral":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"Diagnostico":{"Frente":2,"Tras":1,"Esquerda":1,"Direita":2,"Parado":0}},"Funcoes":[13,9,14,41]}}]} \ No newline at end of file +{"tmrRegistrador":{"_uiControl":null,"State":2,"IsRunning":false,"IsStopped":true,"IsCreated":false,"Interval":1000,"StackTrace":"MovimentacaoUnificadaModel.IniciarRegistrador","Id":"tmrRegistrador_Mvd","TimeTick":"00:00:00"},"tmrRegistradorMOV":{"_uiControl":null,"State":2,"IsRunning":false,"IsStopped":true,"IsCreated":false,"Interval":1000,"StackTrace":"MovimentacaoUnificadaModel.IniciarRegistrador","Id":"tmrRegistrador_Mov","TimeTick":"00:00:00"},"tmrRegistradorDIR":{"_uiControl":null,"State":2,"IsRunning":false,"IsStopped":true,"IsCreated":false,"Interval":300,"StackTrace":"MovimentacaoUnificadaModel.IniciarRegistrador","Id":"tmrRegistrador_Dir","TimeTick":"00:00:00"},"Dispositivo":109,"_EnderecoCAN":0,"Conectado":false,"_TaxaAmostragem":1000,"DistanciaPercorridaOperacao":0.0,"TempoEmAtividade":0.0,"DistanciaPercorridaTotal":0.0,"DistanciaPercorridaParcial":0.0,"VelocidadeMedia":0.0,"DiametroRoda":0.365,"ReducaoMotorBLDC":5.0,"RPM_Max_MotorBLDC":500.0,"IP_Mov":"192.168.105.10","IP_Dir":"192.168.105.11","Modulos":[{"Modulo_ID":"ET","Disponivel":false,"RequisitarDados":false,"Conectado":false,"MovMotor":{"ID":"Mov","Endereco":"0x01","EnderecoByte":1,"Mod_ID":"ET","LeituraLigado":true,"ComandoLigado":true,"CodigoAlarme":0,"AlarmeMotor":false,"RPM_SP":0,"RPM_SP_Controle":0,"RPM_SP_Leitura":0,"Sentido_SP":1,"NumeroPolos":10,"Rampa":0,"CorrenteTorqueMaximo":40,"OffsetLeitura":1.0,"AlarmeComando":false,"RPM_Roda":0.0,"Sentido":0,"Temperatura":0.0,"TemperaturaDriver":0.0,"Tensao":0.0,"Corrente_Barramento":0.0,"Corrente_Motor":0.0,"Potencia":0.0,"CicloTrabalho":0.0,"RPM_Motor":0.0,"VelocidadeInstantanea":0.0,"Comandar":true,"AlarmeSensores":false,"Inicializado":false,"Leitura":null,"CompensacaoNecessaria":false,"ConfigSentidos":{"RodasDianteiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoArco":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RotacionarNoEixo":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoLateral":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"Diagnostico":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0}},"Funcoes":[12,14,9,5,10],"LogGrafico":[],"Alarmes":[{"Tipo":411,"Valor":-1.0,"Minimo":true,"Maximo":false,"ParaMinimo":false,"ParaMaximo":false}],"ConfigFreio":{"Incremental":true,"AnguloInicial":10,"Leitura":false,"Controle":false}},"DirMotor":{"ID":"Dir","Endereco":"0x01","EnderecoByte":1,"Mod_ID":"ET","Sentido_SP":0,"Angulo_SP":0.0,"FolgaMecanica":0.0,"Velocidade_Max":600.0,"Velocidade":300,"Sentido":0,"SentidoReal":1,"Angulo":0.0,"RPM":0.0,"IN1_Atuado":true,"IN2_Atuado":true,"Referenciando":false,"Comandar":true,"Inicializado":false,"Leitura":null,"UltimaDirecao":4,"UltimoComandoEnviado":"2025-04-14T19:29:46.7670569-03:00","RetornandoAzero":false,"EmMovimento":false,"AtingiuAnguloSP":true,"ConfigSentidos":{"RodasDianteiras":{"Frente":0,"Tras":0,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"MovimentoDiagonal":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"MovimentoArco":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"RotacionarNoEixo":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":1,"Parado":0},"MovimentoLateral":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"Diagnostico":{"Frente":2,"Tras":1,"Esquerda":1,"Direita":2,"Parado":0}},"Funcoes":[13,9,14,41]}},{"Modulo_ID":"EF","Disponivel":false,"RequisitarDados":false,"Conectado":false,"MovMotor":{"ID":"Mov","Endereco":"0x03","EnderecoByte":3,"Mod_ID":"EF","LeituraLigado":true,"ComandoLigado":true,"CodigoAlarme":0,"AlarmeMotor":false,"RPM_SP":0,"RPM_SP_Controle":0,"RPM_SP_Leitura":0,"Sentido_SP":1,"NumeroPolos":10,"Rampa":0,"CorrenteTorqueMaximo":40,"OffsetLeitura":1.0,"AlarmeComando":false,"RPM_Roda":0.0,"Sentido":0,"Temperatura":0.0,"TemperaturaDriver":0.0,"Tensao":0.0,"Corrente_Barramento":0.0,"Corrente_Motor":0.0,"Potencia":0.0,"CicloTrabalho":0.0,"RPM_Motor":0.0,"VelocidadeInstantanea":0.0,"Comandar":true,"AlarmeSensores":false,"Inicializado":false,"Leitura":null,"CompensacaoNecessaria":false,"ConfigSentidos":{"RodasDianteiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoArco":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RotacionarNoEixo":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoLateral":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"Diagnostico":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0}},"Funcoes":[12,14,9,5,10],"LogGrafico":[],"Alarmes":[{"Tipo":411,"Valor":-1.0,"Minimo":true,"Maximo":false,"ParaMinimo":false,"ParaMaximo":false}],"ConfigFreio":{"Incremental":true,"AnguloInicial":10,"Leitura":false,"Controle":false}},"DirMotor":{"ID":"Dir","Endereco":"0x03","EnderecoByte":3,"Mod_ID":"EF","Sentido_SP":0,"Angulo_SP":0.0,"FolgaMecanica":9.0,"Velocidade_Max":600.0,"Velocidade":300,"Sentido":0,"SentidoReal":2,"Angulo":0.0,"RPM":0.0,"IN1_Atuado":true,"IN2_Atuado":true,"Referenciando":false,"Comandar":true,"Inicializado":false,"Leitura":null,"UltimaDirecao":4,"UltimoComandoEnviado":"2025-04-16T10:11:35.3152608-03:00","RetornandoAzero":false,"EmMovimento":false,"AtingiuAnguloSP":true,"ConfigSentidos":{"RodasDianteiras":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"RodasTraseiras":{"Frente":0,"Tras":0,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"MovimentoArco":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"RotacionarNoEixo":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":1,"Parado":0},"MovimentoLateral":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"Diagnostico":{"Frente":2,"Tras":1,"Esquerda":1,"Direita":2,"Parado":0}},"Funcoes":[13,9,14,41]}},{"Modulo_ID":"DT","Disponivel":false,"RequisitarDados":false,"Conectado":false,"MovMotor":{"ID":"Mov","Endereco":"0x02","EnderecoByte":2,"Mod_ID":"DT","LeituraLigado":true,"ComandoLigado":true,"CodigoAlarme":0,"AlarmeMotor":false,"RPM_SP":0,"RPM_SP_Controle":0,"RPM_SP_Leitura":0,"Sentido_SP":1,"NumeroPolos":10,"Rampa":0,"CorrenteTorqueMaximo":40,"OffsetLeitura":1.0,"AlarmeComando":false,"RPM_Roda":0.0,"Sentido":0,"Temperatura":0.0,"TemperaturaDriver":0.0,"Tensao":0.0,"Corrente_Barramento":0.0,"Corrente_Motor":0.0,"Potencia":0.0,"CicloTrabalho":0.0,"RPM_Motor":0.0,"VelocidadeInstantanea":0.0,"Comandar":true,"AlarmeSensores":false,"Inicializado":false,"Leitura":null,"CompensacaoNecessaria":false,"ConfigSentidos":{"RodasDianteiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoArco":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RotacionarNoEixo":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoLateral":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"Diagnostico":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0}},"Funcoes":[12,14,9,5,10],"LogGrafico":[],"Alarmes":[{"Tipo":411,"Valor":-1.0,"Minimo":true,"Maximo":false,"ParaMinimo":false,"ParaMaximo":false}],"ConfigFreio":{"Incremental":false,"AnguloInicial":170,"Leitura":false,"Controle":false}},"DirMotor":{"ID":"Dir","Endereco":"0x02","EnderecoByte":2,"Mod_ID":"DT","Sentido_SP":0,"Angulo_SP":0.0,"FolgaMecanica":3.0,"Velocidade_Max":600.0,"Velocidade":300,"Sentido":0,"SentidoReal":2,"Angulo":0.0,"RPM":0.0,"IN1_Atuado":true,"IN2_Atuado":true,"Referenciando":false,"Comandar":true,"Inicializado":false,"Leitura":null,"UltimaDirecao":4,"UltimoComandoEnviado":"2025-04-16T10:07:04.2270834-03:00","RetornandoAzero":false,"EmMovimento":false,"AtingiuAnguloSP":true,"ConfigSentidos":{"RodasDianteiras":{"Frente":0,"Tras":0,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"MovimentoDiagonal":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"MovimentoArco":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"RotacionarNoEixo":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":1,"Parado":0},"MovimentoLateral":{"Frente":0,"Tras":0,"Esquerda":2,"Direita":1,"Parado":0},"Diagnostico":{"Frente":2,"Tras":1,"Esquerda":1,"Direita":2,"Parado":0}},"Funcoes":[13,9,14,41]}},{"Modulo_ID":"DF","Disponivel":false,"RequisitarDados":false,"Conectado":false,"MovMotor":{"ID":"Mov","Endereco":"0x04","EnderecoByte":4,"Mod_ID":"DF","LeituraLigado":true,"ComandoLigado":true,"CodigoAlarme":0,"AlarmeMotor":false,"RPM_SP":0,"RPM_SP_Controle":0,"RPM_SP_Leitura":0,"Sentido_SP":1,"NumeroPolos":10,"Rampa":0,"CorrenteTorqueMaximo":40,"OffsetLeitura":1.0,"AlarmeComando":false,"RPM_Roda":0.0,"Sentido":0,"Temperatura":0.0,"TemperaturaDriver":0.0,"Tensao":0.0,"Corrente_Barramento":0.0,"Corrente_Motor":0.0,"Potencia":0.0,"CicloTrabalho":0.0,"RPM_Motor":0.0,"VelocidadeInstantanea":0.0,"Comandar":true,"AlarmeSensores":false,"Inicializado":false,"Leitura":null,"CompensacaoNecessaria":false,"ConfigSentidos":{"RodasDianteiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RodasTraseiras":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoArco":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0},"RotacionarNoEixo":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoLateral":{"Frente":2,"Tras":1,"Esquerda":0,"Direita":0,"Parado":0},"Diagnostico":{"Frente":1,"Tras":2,"Esquerda":0,"Direita":0,"Parado":0}},"Funcoes":[12,14,9,5,10],"LogGrafico":[],"Alarmes":[{"Tipo":411,"Valor":-1.0,"Minimo":true,"Maximo":false,"ParaMinimo":false,"ParaMaximo":false}],"ConfigFreio":{"Incremental":false,"AnguloInicial":170,"Leitura":false,"Controle":false}},"DirMotor":{"ID":"Dir","Endereco":"0x04","EnderecoByte":4,"Mod_ID":"DF","Sentido_SP":0,"Angulo_SP":0.0,"FolgaMecanica":6.0,"Velocidade_Max":600.0,"Velocidade":300,"Sentido":0,"SentidoReal":1,"Angulo":0.0,"RPM":0.0,"IN1_Atuado":true,"IN2_Atuado":true,"Referenciando":false,"Comandar":true,"Inicializado":false,"Leitura":null,"UltimaDirecao":4,"UltimoComandoEnviado":"2025-04-16T10:11:35.3152608-03:00","RetornandoAzero":false,"EmMovimento":false,"AtingiuAnguloSP":true,"ConfigSentidos":{"RodasDianteiras":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"RodasTraseiras":{"Frente":0,"Tras":0,"Esquerda":0,"Direita":0,"Parado":0},"MovimentoDiagonal":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"MovimentoArco":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"RotacionarNoEixo":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":1,"Parado":0},"MovimentoLateral":{"Frente":0,"Tras":0,"Esquerda":1,"Direita":2,"Parado":0},"Diagnostico":{"Frente":2,"Tras":1,"Esquerda":1,"Direita":2,"Parado":0}},"Funcoes":[13,9,14,41]}}]} \ No newline at end of file diff --git a/AgroBase/AgroBase/bin/Debug/Parametros/version_files.vsf b/AgroBase/AgroBase/bin/Debug/Parametros/version_files.vsf index 767e13c10..dba8e599e 100644 --- a/AgroBase/AgroBase/bin/Debug/Parametros/version_files.vsf +++ b/AgroBase/AgroBase/bin/Debug/Parametros/version_files.vsf @@ -225,5 +225,18 @@ "Atualizado": true, "ArquivoAtualizado": true, "TipoArquivo": 15 + }, + { + "id": 20, + "Diretorio": "Python\\Scripts\\", + "Arquivo": "mpc_controller", + "Extensao": ".py", + "Versao": "1_0", + "ArquivoDownload": "mpc_controller-1_0.py", + "NomeArquivoLocal": "mpc_controller-1_0.py", + "CaminhoCompleto": "Python\\Scripts\\mpc_controller-1_0.py", + "Atualizado": true, + "ArquivoAtualizado": true, + "TipoArquivo": 16 } ] \ No newline at end of file diff --git a/AgroBase/AgroBase/bin/Debug/Python/Output/GeoJson.json b/AgroBase/AgroBase/bin/Debug/Python/Output/GeoJson.json index 86765068e..cbd02c3aa 100644 --- a/AgroBase/AgroBase/bin/Debug/Python/Output/GeoJson.json +++ b/AgroBase/AgroBase/bin/Debug/Python/Output/GeoJson.json @@ -1 +1,221 @@ -{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"Id":"1","Name":"CidadeJardimTerreno2","Length":14.558011415731592,"Dist1":14.558011415731592,"Dist2":0.0},"geometry":{"id":"0","type":"LineString","coordinates":[[-47.395205344,-22.172559531333334],[-47.395212610166666,-22.172614638833334],[-47.395219157,-22.172656417833334],[-47.395223544833335,-22.1726892105],[-47.395224140984432,-22.172693691611649],[-47.395225326538004,-22.172702654611555]]}},{"type":"Feature","properties":{"Id":"2","Name":"CidadeJardimTerreno2","Length":14.771318274761821,"Dist1":14.558011415731592,"Dist2":0.0},"geometry":{"id":"1","type":"LineString","coordinates":[[-47.395210902333332,-22.172708800833334],[-47.395206943666665,-22.172679811],[-47.395202420666664,-22.1726491015],[-47.395198865666664,-22.172615782833333],[-47.395193255833334,-22.172577132833332],[-47.395192610024395,-22.172572657695412],[-47.395191325698136,-22.172563706509337]]}},{"type":"Feature","properties":{"Id":"3","Name":"CidadeJardimTerreno2","Length":14.827915524386164,"Dist1":14.558011415731592,"Dist2":0.0},"geometry":{"id":"2","type":"LineString","coordinates":[[-47.3951762925,-22.172561603],[-47.395180824166665,-22.172591686166665],[-47.395185745333336,-22.172623080166666],[-47.395190433,-22.172656367166667],[-47.395195199,-22.172693641833334],[-47.395195769044363,-22.172698125891035],[-47.395196902671593,-22.172707094716973]]}},{"type":"Feature","properties":{"Id":"4","Name":"CidadeJardimTerreno2","Length":14.785159385903514,"Dist1":14.558011415731592,"Dist2":0.0},"geometry":{"id":"3","type":"LineString","coordinates":[[-47.395182932166669,-22.1727127985],[-47.39517819266667,-22.172680514833335],[-47.3951732595,-22.172646752833334],[-47.395168805166669,-22.1726149155],[-47.395163812333337,-22.172581167166665],[-47.395163154299318,-22.172576693573966],[-47.395161845655842,-22.172567745443878]]}},{"type":"Feature","properties":{"Id":"5","Name":"CidadeJardimTerreno2","Length":14.80117692191233,"Dist1":14.558011415731592,"Dist2":0.0},"geometry":{"id":"4","type":"LineString","coordinates":[[-47.395147317833334,-22.172566031],[-47.395151503166666,-22.172595452333333],[-47.3951561855,-22.172628011166665],[-47.395161598666668,-22.172663757333332],[-47.395166727166668,-22.172697770833334],[-47.395167397572706,-22.172702242832194],[-47.39516873082615,-22.172711187810091]]}}]} \ No newline at end of file +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "Id": "1", + "Name": "CidadeJardimTerreno2", + "Length": 14.558011415731592, + "Dist1": 14.558011415731592, + "Dist2": 0.0 + }, + "geometry": { + "id": null, + "type": "LineString", + "coordinates": [ + [ + -47.395205344, + -22.172559531333334 + ], + [ + -47.395212610166666, + -22.172614638833334 + ], + [ + -47.395219157, + -22.172656417833334 + ], + [ + -47.395223544833335, + -22.1726892105 + ], + [ + -47.39522414098443, + -22.17269369161165 + ], + [ + -47.395225326538004, + -22.172702654611555 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "Id": "2", + "Name": "CidadeJardimTerreno2", + "Length": 14.771318274761821, + "Dist1": 14.558011415731592, + "Dist2": 0.0 + }, + "geometry": { + "id": null, + "type": "LineString", + "coordinates": [ + [ + -47.39521090233333, + -22.172708800833334 + ], + [ + -47.395206943666665, + -22.172679811 + ], + [ + -47.395202420666664, + -22.1726491015 + ], + [ + -47.395198865666664, + -22.172615782833333 + ], + [ + -47.395193255833334, + -22.172577132833332 + ], + [ + -47.395192610024395, + -22.17257265769541 + ], + [ + -47.395191325698136, + -22.172563706509337 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "Id": "3", + "Name": "CidadeJardimTerreno2", + "Length": 14.827915524386164, + "Dist1": 14.558011415731592, + "Dist2": 0.0 + }, + "geometry": { + "id": null, + "type": "LineString", + "coordinates": [ + [ + -47.3951762925, + -22.172561603 + ], + [ + -47.395180824166665, + -22.172591686166665 + ], + [ + -47.395185745333336, + -22.172623080166666 + ], + [ + -47.395190433, + -22.172656367166667 + ], + [ + -47.395195199, + -22.172693641833334 + ], + [ + -47.39519576904436, + -22.172698125891035 + ], + [ + -47.39519690267159, + -22.172707094716973 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "Id": "4", + "Name": "CidadeJardimTerreno2", + "Length": 14.785159385903514, + "Dist1": 14.558011415731592, + "Dist2": 0.0 + }, + "geometry": { + "id": null, + "type": "LineString", + "coordinates": [ + [ + -47.39518293216667, + -22.1727127985 + ], + [ + -47.39517819266667, + -22.172680514833335 + ], + [ + -47.3951732595, + -22.172646752833334 + ], + [ + -47.39516880516667, + -22.1726149155 + ], + [ + -47.39516381233334, + -22.172581167166665 + ], + [ + -47.39516315429932, + -22.172576693573966 + ], + [ + -47.39516184565584, + -22.172567745443878 + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "Id": "5", + "Name": "CidadeJardimTerreno2", + "Length": 14.80117692191233, + "Dist1": 14.558011415731592, + "Dist2": 0.0 + }, + "geometry": { + "id": null, + "type": "LineString", + "coordinates": [ + [ + -47.395147317833334, + -22.172566031 + ], + [ + -47.395151503166666, + -22.172595452333333 + ], + [ + -47.3951561855, + -22.172628011166665 + ], + [ + -47.39516159866667, + -22.172663757333332 + ], + [ + -47.39516672716667, + -22.172697770833334 + ], + [ + -47.395167397572706, + -22.172702242832194 + ], + [ + -47.39516873082615, + -22.17271118781009 + ] + ] + } + } + ] +} \ No newline at end of file diff --git a/AgroBase/AgroBase/bin/Debug/Python/Output/mapa_interativo.html b/AgroBase/AgroBase/bin/Debug/Python/Output/mapa_interativo.html index b51c0cc59..65e14db8b 100644 --- a/AgroBase/AgroBase/bin/Debug/Python/Output/mapa_interativo.html +++ b/AgroBase/AgroBase/bin/Debug/Python/Output/mapa_interativo.html @@ -25,7 +25,7 @@