correcao peso imu, descoberta oid e orientacao real gnss

This commit is contained in:
Diego Freitas 2026-06-12 10:44:53 -03:00
parent 405903d5da
commit cec03f3df4
3 changed files with 23 additions and 21 deletions

View File

@ -131,6 +131,7 @@ namespace AgroBase.Services
// NMEA só na USB (COM1) // NMEA só na USB (COM1)
$"gngga {porta_usb} {freq}\r\n", $"gngga {porta_usb} {freq}\r\n",
$"gpths {porta_usb} {freq}\r\n", $"gpths {porta_usb} {freq}\r\n",
$"gnvtg {porta_usb} {freq}\r\n",
$"saveconfig\r\n" $"saveconfig\r\n"
}; };
@ -384,7 +385,7 @@ namespace AgroBase.Services
string altitudeRaw = campos.Length > 9 ? campos[9] : "0"; string altitudeRaw = campos.Length > 9 ? campos[9] : "0";
string geoidSepRaw = campos.Length > 11 ? campos[11] : "0"; string geoidSepRaw = campos.Length > 11 ? campos[11] : "0";
string idadeCorrecaoRaw = campos.Length > 13 ? campos[13] : ""; string idadeCorrecaoRaw = campos.Length > 13 ? campos[13] : "";
string base_id = campos.Length > 14 ? campos[14] : ""; string base_id = campos.Length > 14 ? campos[14].Split('*')[0] : "";
// Conversão de Latitude (ddmm.mmmm) // Conversão de Latitude (ddmm.mmmm)
double latitude = 0; double latitude = 0;
@ -1192,6 +1193,7 @@ namespace AgroBase.Services
bool imuIniciado = Variaveis.OperacaoEmAndamento.Sensoriamento?.IMU?.Iniciado ?? false; bool imuIniciado = Variaveis.OperacaoEmAndamento.Sensoriamento?.IMU?.Iniciado ?? false;
bool gpsIniciado = Iniciado; bool gpsIniciado = Iniciado;
bool headingValido = UltimaLeitura.TimestampOri.frequencia >= 1.0;
if (imuIniciado) if (imuIniciado)
{ {
@ -1202,30 +1204,21 @@ namespace AgroBase.Services
{ {
anguloFinal = UltimaLeitura.OrientacaoReal; anguloFinal = UltimaLeitura.OrientacaoReal;
} }
else if (gpsIniciado) else if (gpsIniciado && headingValido)
{ {
// O GPS está disponível anguloFinal = UltimaLeitura.OrientacaoReal;
//anguloFinal = UltimaLeitura.OrientacaoReal; }
else if (gpsIniciado && UltimaLeitura.Distancia > 0.25)
double heading = UltimaLeitura.OrientacaoReal; {
double angMov = UltimaLeitura.OrientacaoMovimento; anguloFinal = UltimaLeitura.OrientacaoMovimento;
double distJan = UltimaLeitura.Distancia;
double velPercent = Variaveis.OperacaoEmAndamento.Simulando ? Variaveis.OperacaoEmAndamento.Controle.RPM_SP : Variaveis.OperacaoEmAndamento.Sensoriamento?.Movimentacao?.RPMMedio ?? 0;
bool rtkFix = UltimaLeitura.QualidadeFix == TiposCorrecaoGPS.RTKFixo;
double angAnterior = UltimaLeitura.AnguloCarroDefinido;
//anguloFinal = FundirHeadingComMovimento(heading, angMov, distJan, velPercent, rtkFix, angFundidoAnterior: angAnterior, alfaLowPass: 0.25);
anguloFinal = heading;
} }
else if (imuIniciado) else if (imuIniciado)
{ {
// Apenas o WT901C está disponível
anguloFinal = Variaveis.OperacaoEmAndamento.Sensoriamento.IMU.YawSeguro; anguloFinal = Variaveis.OperacaoEmAndamento.Sensoriamento.IMU.YawSeguro;
} }
else else
{ {
anguloFinal = UltimaLeitura.OrientacaoMovimento; anguloFinal = UltimaLeitura.AnguloCarroDefinido;
} }
// Atualiza o ângulo final // Atualiza o ângulo final
@ -1323,6 +1316,15 @@ namespace AgroBase.Services
{ {
GPSModel posicaoAtual = Variaveis.OperacaoEmAndamento.Simulando ? historicoPosicao.Peek() : UltimaLeitura; GPSModel posicaoAtual = Variaveis.OperacaoEmAndamento.Simulando ? historicoPosicao.Peek() : UltimaLeitura;
bool rtkValido =
posicaoAtual.IdadeCorrecao >= 0 &&
posicaoAtual.IdadeCorrecao < rtk_timeout &&
(
posicaoAtual.QualidadeFix == TiposCorrecaoGPS.RTKFixo ||
posicaoAtual.QualidadeFix == TiposCorrecaoGPS.RTKFlutuante ||
posicaoAtual.QualidadeFix == TiposCorrecaoGPS.DGPS
);
RedisService.AtualizarCampos( RedisService.AtualizarCampos(
RedisService.ModKey(T_Code.Gps), RedisService.ModKey(T_Code.Gps),
("conectado", Iniciado), ("conectado", Iniciado),
@ -1331,7 +1333,7 @@ namespace AgroBase.Services
("lon", posicaoAtual.Longitude), ("lon", posicaoAtual.Longitude),
("theta", posicaoAtual.AnguloCarroDefinido), ("theta", posicaoAtual.AnguloCarroDefinido),
("fix", (int)posicaoAtual.QualidadeFix), ("fix", (int)posicaoAtual.QualidadeFix),
("rtk", posicaoAtual.IdadeCorrecao < rtk_timeout), ("rtk", rtkValido),
("hAcc", posicaoAtual.PrecisaoCm), ("hAcc", posicaoAtual.PrecisaoCm),
("nSatelites", posicaoAtual.NumeroSatelites), ("nSatelites", posicaoAtual.NumeroSatelites),
("freq.posicao", posicaoAtual.TimestampPos.frequencia), ("freq.posicao", posicaoAtual.TimestampPos.frequencia),

View File

@ -109,7 +109,7 @@ namespace AgroBase.Services
private static void EnviarComandoDescoberta(byte idTx, byte idRx) private static void EnviarComandoDescoberta(byte idTx, byte idRx)
{ {
CanManager.CanService.AdicionarMensagemNaFila(Dispositivo, new byte[] { idTx }, new byte[] { idRx }, (byte)OidParametros.CodErro, (byte)OidParametros.CodErro, null, true, false, true); CanManager.CanService.AdicionarMensagemNaFila(Dispositivo, new byte[] { idTx }, new byte[] { idRx }, (byte)OidFuncCode.Consulta, (byte)OidFuncCode.Consulta, new byte[] { (byte)OidParametros.CodErro }, true, false, true);
} }
private static void EnviarComando(T_Code Dispositivo, byte idTx, byte idRx, byte funcCode, byte[] payload = null, bool get = true) private static void EnviarComando(T_Code Dispositivo, byte idTx, byte idRx, byte funcCode, byte[] payload = null, bool get = true)

View File

@ -169,11 +169,11 @@ class CameraIMU(ModuloDiagnosticoBase):
# OAK-D Lite presa no chassi/cabine deve ser a principal. # OAK-D Lite presa no chassi/cabine deve ser a principal.
if "oak-d" in modelo or "snr" in dispositivo: if "oak-d" in modelo or "snr" in dispositivo:
return 0.75 return 1.0
# Multiespectral na haste entra como redundância. # Multiespectral na haste entra como redundância.
if "ffc" in modelo or "multiespectral" in modelo or "multispectral" in modelo: if "ffc" in modelo or "multiespectral" in modelo or "multispectral" in modelo:
return 0.35 return 0.0
# Fallback seguro. # Fallback seguro.
return 0.50 return 0.50