ajustado lever arm e mostrado inclinacao no attitude indicator
This commit is contained in:
parent
bdfa707968
commit
bebb1f42c8
|
|
@ -67,7 +67,9 @@ namespace AgroBase.Models
|
||||||
public double AnguloCarroDefinido { get; set; }
|
public double AnguloCarroDefinido { get; set; }
|
||||||
public int Heartbeat { get; set; } = 0;
|
public int Heartbeat { get; set; } = 0;
|
||||||
public double LeverArmLateral { get; set; } = 0;
|
public double LeverArmLateral { get; set; } = 0;
|
||||||
|
public double LeverArmLateralOp { get; set; } = 0;
|
||||||
public double LeverArmFrontal { get; set; } = 0;
|
public double LeverArmFrontal { get; set; } = 0;
|
||||||
|
public double LeverArmFrontalOp { get; set; } = 0;
|
||||||
|
|
||||||
public GPSModel Clone()
|
public GPSModel Clone()
|
||||||
{
|
{
|
||||||
|
|
@ -108,7 +110,9 @@ namespace AgroBase.Models
|
||||||
VDOP = VDOP,
|
VDOP = VDOP,
|
||||||
BaseID = BaseID,
|
BaseID = BaseID,
|
||||||
LeverArmFrontal = LeverArmFrontal,
|
LeverArmFrontal = LeverArmFrontal,
|
||||||
|
LeverArmFrontalOp = LeverArmFrontalOp,
|
||||||
LeverArmLateral = LeverArmLateral,
|
LeverArmLateral = LeverArmLateral,
|
||||||
|
LeverArmLateralOp = LeverArmLateralOp,
|
||||||
X = X,
|
X = X,
|
||||||
Y = Y
|
Y = Y
|
||||||
};
|
};
|
||||||
|
|
@ -123,9 +127,11 @@ namespace AgroBase.Models
|
||||||
IdadeCorrecao = IdadeCorrecao,
|
IdadeCorrecao = IdadeCorrecao,
|
||||||
Iniciado = Inicializado,
|
Iniciado = Inicializado,
|
||||||
Latitude = Latitude,
|
Latitude = Latitude,
|
||||||
|
LatitudeAnt = LatitudeAnt,
|
||||||
LeverArmFrontal = LeverArmFrontal,
|
LeverArmFrontal = LeverArmFrontal,
|
||||||
LeverArmLateral= LeverArmLateral,
|
LeverArmLateral= LeverArmLateral,
|
||||||
Longitude = Longitude,
|
Longitude = Longitude,
|
||||||
|
LongitudeAnt = LongitudeAnt,
|
||||||
NtripAtivado = Ntrip_ativado,
|
NtripAtivado = Ntrip_ativado,
|
||||||
NumeroSatelites = NumeroSatelites,
|
NumeroSatelites = NumeroSatelites,
|
||||||
OrientacaoMovimento = OrientacaoMovimento,
|
OrientacaoMovimento = OrientacaoMovimento,
|
||||||
|
|
|
||||||
|
|
@ -2478,31 +2478,17 @@ namespace AgroBase.Models
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
double? totalLateralCm = lever.Item1;
|
double? campoLateralCm = lever.Item1;
|
||||||
double? totalFrontalCm = lever.Item2;
|
double? campoFrontalCm = lever.Item2;
|
||||||
|
|
||||||
if (totalLateralCm == null && totalFrontalCm == null)
|
if (campoLateralCm == null && campoFrontalCm == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
double totalAtualLateralCm =
|
double novoLateralCm = campoLateralCm.HasValue ? campoLateralCm.Value : GPSService.LeverArm.LateralCampoCm;
|
||||||
GPSService.LeverArm?.LateralTotalCm ??
|
double novoFrontalCm = campoFrontalCm.HasValue ? campoFrontalCm.Value : GPSService.LeverArm.FrontalCampoCm;
|
||||||
VariaveisEquipamento.LeverArmLateralCm;
|
|
||||||
|
|
||||||
double totalAtualFrontalCm =
|
double novoTotalLateralCm = VariaveisEquipamento.LeverArmLateralCm + novoLateralCm;
|
||||||
GPSService.LeverArm?.FrontalTotalCm ??
|
double novoTotalFrontalCm = VariaveisEquipamento.LeverArmFrontalCm + novoFrontalCm;
|
||||||
VariaveisEquipamento.LeverArmFrontalCm;
|
|
||||||
|
|
||||||
double novoTotalLateralCm =
|
|
||||||
totalLateralCm ?? totalAtualLateralCm;
|
|
||||||
|
|
||||||
double novoTotalFrontalCm =
|
|
||||||
totalFrontalCm ?? totalAtualFrontalCm;
|
|
||||||
|
|
||||||
double campoLateralCm =
|
|
||||||
novoTotalLateralCm - VariaveisEquipamento.LeverArmLateralCm;
|
|
||||||
|
|
||||||
double campoFrontalCm =
|
|
||||||
novoTotalFrontalCm - VariaveisEquipamento.LeverArmFrontalCm;
|
|
||||||
|
|
||||||
Variaveis.MostrarLog(
|
Variaveis.MostrarLog(
|
||||||
$"[ComandoBase][LeverArm] Total RX: frontal={novoTotalFrontalCm:0.##}cm, lateral={novoTotalLateralCm:0.##}cm | " +
|
$"[ComandoBase][LeverArm] Total RX: frontal={novoTotalFrontalCm:0.##}cm, lateral={novoTotalLateralCm:0.##}cm | " +
|
||||||
|
|
@ -2513,8 +2499,11 @@ namespace AgroBase.Models
|
||||||
GPSService.LeverArm = new GeoLeverArm(
|
GPSService.LeverArm = new GeoLeverArm(
|
||||||
offsetFisicoFrontalCm: VariaveisEquipamento.LeverArmFrontalCm,
|
offsetFisicoFrontalCm: VariaveisEquipamento.LeverArmFrontalCm,
|
||||||
offsetFisicoLateralCm: VariaveisEquipamento.LeverArmLateralCm,
|
offsetFisicoLateralCm: VariaveisEquipamento.LeverArmLateralCm,
|
||||||
offsetCampoFrontalCm: campoFrontalCm,
|
offsetCampoFrontalCm: novoFrontalCm,
|
||||||
offsetCampoLateralCm: campoLateralCm
|
offsetCampoLateralCm: novoLateralCm,
|
||||||
|
mirrL: true,
|
||||||
|
invF: true,
|
||||||
|
invH: false
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -987,9 +987,11 @@ namespace AgroBase.Models.Operacoes
|
||||||
Distancia = gps?.Distancia ?? 0,
|
Distancia = gps?.Distancia ?? 0,
|
||||||
IdadeCorrecao = gps?.IdadeCorrecao ?? -1,
|
IdadeCorrecao = gps?.IdadeCorrecao ?? -1,
|
||||||
Latitude = gps?.Latitude ?? 0,
|
Latitude = gps?.Latitude ?? 0,
|
||||||
|
LatitudeAnt = gps?.LatitudeAnt ?? 0,
|
||||||
Longitude = gps?.Longitude ?? 0,
|
Longitude = gps?.Longitude ?? 0,
|
||||||
LeverArmFrontal = gps?.LeverArmFrontal ?? 0,
|
LongitudeAnt = gps?.LongitudeAnt ?? 0,
|
||||||
LeverArmLateral = gps?.LeverArmLateral ?? 0,
|
LeverArmFrontal = gps?.LeverArmFrontalOp ?? 0,
|
||||||
|
LeverArmLateral = gps?.LeverArmLateralOp ?? 0,
|
||||||
NtripAtivado = gps?.Ntrip_ativado ?? false,
|
NtripAtivado = gps?.Ntrip_ativado ?? false,
|
||||||
NumeroSatelites = gps?.NumeroSatelites ?? 0,
|
NumeroSatelites = gps?.NumeroSatelites ?? 0,
|
||||||
OrientacaoMovimento = gps?.OrientacaoMovimento ?? 0,
|
OrientacaoMovimento = gps?.OrientacaoMovimento ?? 0,
|
||||||
|
|
@ -1278,7 +1280,9 @@ namespace AgroBase.Models.Operacoes
|
||||||
{
|
{
|
||||||
Iniciado = src.Iniciado,
|
Iniciado = src.Iniciado,
|
||||||
Latitude = src.Latitude,
|
Latitude = src.Latitude,
|
||||||
|
LatitudeAnt = src.LatitudeAnt,
|
||||||
Longitude = src.Longitude,
|
Longitude = src.Longitude,
|
||||||
|
LongitudeAnt = src.LongitudeAnt,
|
||||||
Altitude = src.Altitude,
|
Altitude = src.Altitude,
|
||||||
Velocidade = src.Velocidade,
|
Velocidade = src.Velocidade,
|
||||||
Distancia = src.Distancia,
|
Distancia = src.Distancia,
|
||||||
|
|
@ -1686,7 +1690,9 @@ namespace AgroBase.Models.Operacoes
|
||||||
{
|
{
|
||||||
public bool Iniciado { get; set; }
|
public bool Iniciado { get; set; }
|
||||||
public double Latitude { get; set; }
|
public double Latitude { get; set; }
|
||||||
|
public double LatitudeAnt { get; set; }
|
||||||
public double Longitude { get; set; }
|
public double Longitude { get; set; }
|
||||||
|
public double LongitudeAnt { get; set; }
|
||||||
public double Altitude { get; set; }
|
public double Altitude { get; set; }
|
||||||
public double Velocidade { get; set; }
|
public double Velocidade { get; set; }
|
||||||
public double Distancia { get; set; }
|
public double Distancia { get; set; }
|
||||||
|
|
@ -1708,7 +1714,9 @@ namespace AgroBase.Models.Operacoes
|
||||||
{
|
{
|
||||||
Inicializado = Iniciado,
|
Inicializado = Iniciado,
|
||||||
Latitude = Latitude,
|
Latitude = Latitude,
|
||||||
|
LatitudeAnt = LatitudeAnt,
|
||||||
Longitude = Longitude,
|
Longitude = Longitude,
|
||||||
|
LongitudeAnt = LongitudeAnt,
|
||||||
Altitude = Altitude,
|
Altitude = Altitude,
|
||||||
Velocidade = Velocidade,
|
Velocidade = Velocidade,
|
||||||
Distancia = Distancia,
|
Distancia = Distancia,
|
||||||
|
|
|
||||||
|
|
@ -70,7 +70,10 @@ namespace AgroBase.Services
|
||||||
|
|
||||||
public static GeoLeverArm LeverArm = new GeoLeverArm(
|
public static GeoLeverArm LeverArm = new GeoLeverArm(
|
||||||
offsetFisicoFrontalCm: VariaveisEquipamento.LeverArmFrontalCm,
|
offsetFisicoFrontalCm: VariaveisEquipamento.LeverArmFrontalCm,
|
||||||
offsetFisicoLateralCm: VariaveisEquipamento.LeverArmLateralCm
|
offsetFisicoLateralCm: VariaveisEquipamento.LeverArmLateralCm,
|
||||||
|
mirrL: true,
|
||||||
|
invF: true,
|
||||||
|
invH: false
|
||||||
);
|
);
|
||||||
|
|
||||||
public static Queue<GPSModel> historicoPosicao = new Queue<GPSModel>();
|
public static Queue<GPSModel> historicoPosicao = new Queue<GPSModel>();
|
||||||
|
|
@ -2125,11 +2128,15 @@ namespace AgroBase.Services
|
||||||
PenultimaLeitura.Heartbeat = UltimaLeitura.Heartbeat;
|
PenultimaLeitura.Heartbeat = UltimaLeitura.Heartbeat;
|
||||||
PenultimaLeitura.LeverArmFrontal = UltimaLeitura.LeverArmFrontal;
|
PenultimaLeitura.LeverArmFrontal = UltimaLeitura.LeverArmFrontal;
|
||||||
PenultimaLeitura.LeverArmLateral = UltimaLeitura.LeverArmLateral;
|
PenultimaLeitura.LeverArmLateral = UltimaLeitura.LeverArmLateral;
|
||||||
|
PenultimaLeitura.LeverArmFrontalOp = UltimaLeitura.LeverArmFrontalOp;
|
||||||
|
PenultimaLeitura.LeverArmLateralOp = UltimaLeitura.LeverArmLateralOp;
|
||||||
UltimaLeitura.Ntrip_ativado = CorrecaoRTK_Ntrip;
|
UltimaLeitura.Ntrip_ativado = CorrecaoRTK_Ntrip;
|
||||||
|
|
||||||
UltimaLeitura.Heartbeat = (UltimaLeitura.Heartbeat + 1) % 10;
|
UltimaLeitura.Heartbeat = (UltimaLeitura.Heartbeat + 1) % 10;
|
||||||
UltimaLeitura.LeverArmFrontal = LeverArm != null ? LeverArm.FrontalTotalCm : 0;
|
UltimaLeitura.LeverArmFrontal = LeverArm != null ? LeverArm.FrontalTotalCm : 0;
|
||||||
UltimaLeitura.LeverArmLateral = LeverArm != null ? LeverArm.LateralTotalCm : 0;
|
UltimaLeitura.LeverArmLateral = LeverArm != null ? LeverArm.LateralTotalCm : 0;
|
||||||
|
UltimaLeitura.LeverArmFrontalOp = LeverArm != null ? LeverArm.FrontalCampoCm : 0;
|
||||||
|
UltimaLeitura.LeverArmLateralOp = LeverArm != null ? LeverArm.LateralCampoCm : 0;
|
||||||
|
|
||||||
UltimasLeituras.Add(UltimaLeitura.Clone());
|
UltimasLeituras.Add(UltimaLeitura.Clone());
|
||||||
|
|
||||||
|
|
@ -3466,6 +3473,7 @@ namespace AgroBase.Services
|
||||||
private readonly double yCampo;
|
private readonly double yCampo;
|
||||||
|
|
||||||
private readonly bool invertHeading;
|
private readonly bool invertHeading;
|
||||||
|
private readonly bool invertFrontal;
|
||||||
private readonly bool mirrorLateral;
|
private readonly bool mirrorLateral;
|
||||||
|
|
||||||
public GeoLeverArm(
|
public GeoLeverArm(
|
||||||
|
|
@ -3474,7 +3482,9 @@ namespace AgroBase.Services
|
||||||
double offsetCampoFrontalCm = 0,
|
double offsetCampoFrontalCm = 0,
|
||||||
double offsetCampoLateralCm = 0,
|
double offsetCampoLateralCm = 0,
|
||||||
bool invH = false,
|
bool invH = false,
|
||||||
bool mirrL = false)
|
bool invF = false,
|
||||||
|
bool mirrL = false
|
||||||
|
)
|
||||||
{
|
{
|
||||||
xFisico = offsetFisicoFrontalCm / 100.0;
|
xFisico = offsetFisicoFrontalCm / 100.0;
|
||||||
yFisico = offsetFisicoLateralCm / 100.0;
|
yFisico = offsetFisicoLateralCm / 100.0;
|
||||||
|
|
@ -3482,6 +3492,7 @@ namespace AgroBase.Services
|
||||||
yCampo = offsetCampoLateralCm / 100.0;
|
yCampo = offsetCampoLateralCm / 100.0;
|
||||||
|
|
||||||
invertHeading = invH;
|
invertHeading = invH;
|
||||||
|
invertFrontal = invF;
|
||||||
mirrorLateral = mirrL;
|
mirrorLateral = mirrL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3500,6 +3511,16 @@ namespace AgroBase.Services
|
||||||
get { return (yFisico + yCampo) * 100.0; }
|
get { return (yFisico + yCampo) * 100.0; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public double FrontalCampoCm
|
||||||
|
{
|
||||||
|
get { return (xCampo) * 100.0; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public double LateralCampoCm
|
||||||
|
{
|
||||||
|
get { return (yCampo) * 100.0; }
|
||||||
|
}
|
||||||
|
|
||||||
public (double lat, double lon) FixLeverArmLatLon_Fast(double latAnt_deg, double lonAnt_deg, double headingDeg, double headingFreq)
|
public (double lat, double lon) FixLeverArmLatLon_Fast(double latAnt_deg, double lonAnt_deg, double headingDeg, double headingFreq)
|
||||||
{
|
{
|
||||||
if (headingFreq < 1)
|
if (headingFreq < 1)
|
||||||
|
|
@ -3508,6 +3529,9 @@ namespace AgroBase.Services
|
||||||
double xTotal = xFisico + xCampo;
|
double xTotal = xFisico + xCampo;
|
||||||
double yTotal = yFisico + yCampo;
|
double yTotal = yFisico + yCampo;
|
||||||
|
|
||||||
|
if (invertFrontal)
|
||||||
|
xTotal = -xTotal;
|
||||||
|
|
||||||
if (mirrorLateral)
|
if (mirrorLateral)
|
||||||
yTotal = -yTotal;
|
yTotal = -yTotal;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -108,6 +108,25 @@
|
||||||
<Rectangle Width="8" Height="8" Stroke="White" StrokeThickness="2" Fill="#22FFFFFF" HorizontalAlignment="Center" VerticalAlignment="Center"/>
|
<Rectangle Width="8" Height="8" Stroke="White" StrokeThickness="2" Fill="#22FFFFFF" HorizontalAlignment="Center" VerticalAlignment="Center"/>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
|
<!-- HUD NUMÉRICO DE INCLINAÇÃO -->
|
||||||
|
<Grid VerticalAlignment="Bottom" HorizontalAlignment="Stretch" Margin="4,0,4,6" IsHitTestVisible="False">
|
||||||
|
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition/>
|
||||||
|
<ColumnDefinition/>
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
|
||||||
|
<!-- Inclinação lateral / Roll -->
|
||||||
|
<Border Grid.Column="0" CornerRadius="5" Background="#AA000000" BorderBrush="#55FFFFFF" BorderThickness="1" Padding="4,2" HorizontalAlignment="Left">
|
||||||
|
<TextBlock Text="{Binding RollTexto, RelativeSource={RelativeSource AncestorType=UserControl}}" Foreground="White" FontSize="11" FontWeight="SemiBold"/>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
<!-- Inclinação frontal / Pitch -->
|
||||||
|
<Border Grid.Column="1" CornerRadius="5" Background="#AA000000" BorderBrush="#55FFFFFF" BorderThickness="1" Padding="4,2" HorizontalAlignment="Right">
|
||||||
|
<TextBlock Text="{Binding PitchTexto, RelativeSource={RelativeSource AncestorType=UserControl}}" Foreground="White" FontSize="11" FontWeight="SemiBold"/>
|
||||||
|
</Border>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
<!-- BARRA DE ERRO LATERAL (linha 1) -->
|
<!-- BARRA DE ERRO LATERAL (linha 1) -->
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ namespace OperationControl.Controls
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Interaction logic for AttitudeIndicator.xaml
|
/// Interaction logic for AttitudeIndicator.xaml
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public partial class AttitudeIndicator : UserControl
|
public partial class AttitudeIndicator : UserControl, INotifyPropertyChanged
|
||||||
{
|
{
|
||||||
public AttitudeIndicator()
|
public AttitudeIndicator()
|
||||||
{
|
{
|
||||||
|
|
@ -47,8 +47,7 @@ namespace OperationControl.Controls
|
||||||
typeof(AttitudeIndicator),
|
typeof(AttitudeIndicator),
|
||||||
new PropertyMetadata(0.0));
|
new PropertyMetadata(0.0));
|
||||||
|
|
||||||
public static readonly DependencyProperty PitchOffsetPxProperty =
|
public static readonly DependencyProperty PitchOffsetPxProperty = PitchOffsetPxPropertyKey.DependencyProperty;
|
||||||
PitchOffsetPxPropertyKey.DependencyProperty;
|
|
||||||
|
|
||||||
public double PitchOffsetPx
|
public double PitchOffsetPx
|
||||||
{
|
{
|
||||||
|
|
@ -105,8 +104,7 @@ namespace OperationControl.Controls
|
||||||
typeof(AttitudeIndicator),
|
typeof(AttitudeIndicator),
|
||||||
new PropertyMetadata(0.0));
|
new PropertyMetadata(0.0));
|
||||||
|
|
||||||
public static readonly DependencyProperty LateralNormalizedProperty =
|
public static readonly DependencyProperty LateralNormalizedProperty = LateralNormalizedPropertyKey.DependencyProperty;
|
||||||
LateralNormalizedPropertyKey.DependencyProperty;
|
|
||||||
|
|
||||||
public double LateralError
|
public double LateralError
|
||||||
{
|
{
|
||||||
|
|
@ -133,15 +131,31 @@ namespace OperationControl.Controls
|
||||||
// Derivados
|
// Derivados
|
||||||
public double MaxAbsAngle => Math.Max(Math.Abs(RollDeg), Math.Abs(PitchDeg));
|
public double MaxAbsAngle => Math.Max(Math.Abs(RollDeg), Math.Abs(PitchDeg));
|
||||||
|
|
||||||
|
public string RollTexto => $"LAT {FormatSignedDeg(RollDeg)}";
|
||||||
|
public string PitchTexto => $"FRT {FormatSignedDeg(PitchDeg)}";
|
||||||
|
|
||||||
|
private static string FormatSignedDeg(double value)
|
||||||
|
{
|
||||||
|
if (double.IsNaN(value) || double.IsInfinity(value))
|
||||||
|
return "--.-°";
|
||||||
|
|
||||||
|
return value.ToString("+0.0;-0.0;0.0") + "°";
|
||||||
|
}
|
||||||
|
|
||||||
public event PropertyChangedEventHandler PropertyChanged;
|
public event PropertyChangedEventHandler PropertyChanged;
|
||||||
void Raise(string n) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(n));
|
void Raise(string n) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(n));
|
||||||
|
|
||||||
static void OnAngleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
static void OnAngleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
||||||
{
|
{
|
||||||
var c = (AttitudeIndicator)d; // agora compila pois herda de UserControl
|
var c = (AttitudeIndicator)d;
|
||||||
|
|
||||||
c.PitchOffsetPx = -c.PitchDeg * c.PxPerDeg;
|
c.PitchOffsetPx = -c.PitchDeg * c.PxPerDeg;
|
||||||
|
|
||||||
c.Raise(nameof(PitchOffsetPx));
|
c.Raise(nameof(PitchOffsetPx));
|
||||||
c.Raise(nameof(MaxAbsAngle));
|
c.Raise(nameof(MaxAbsAngle));
|
||||||
|
c.Raise(nameof(RollTexto));
|
||||||
|
c.Raise(nameof(PitchTexto));
|
||||||
|
|
||||||
c.UpdateChrome();
|
c.UpdateChrome();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1268,7 +1268,20 @@ namespace OperationControl.Controls
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddMarker(string id, bool isBase, double? lat = null, double? lon = null, double? heading = null, System.Windows.Media.Color? color = null, string? label = null, StatusOperacao? status = null, bool? pulv = null, bool center = false)
|
public void AddMarker(
|
||||||
|
string id,
|
||||||
|
bool isBase,
|
||||||
|
double? lat = null,
|
||||||
|
double? lon = null,
|
||||||
|
double? heading = null,
|
||||||
|
System.Windows.Media.Color? color = null,
|
||||||
|
string? label = null,
|
||||||
|
StatusOperacao? status = null,
|
||||||
|
bool? pulv = null,
|
||||||
|
bool center = false,
|
||||||
|
double? rawGnssLat = null,
|
||||||
|
double? rawGnssLon = null
|
||||||
|
)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(id)) return;
|
if (string.IsNullOrWhiteSpace(id)) return;
|
||||||
|
|
||||||
|
|
@ -1277,7 +1290,17 @@ namespace OperationControl.Controls
|
||||||
var marker = _features.FirstOrDefault(x => x.Id == id);
|
var marker = _features.FirstOrDefault(x => x.Id == id);
|
||||||
if (marker != null)
|
if (marker != null)
|
||||||
{
|
{
|
||||||
marker.UpdateData(lat: lat, lon: lon, heading: heading, label: label, color: color, status: status, pulverizando: pulv);
|
marker.UpdateData(
|
||||||
|
lat: lat,
|
||||||
|
lon: lon,
|
||||||
|
heading: heading,
|
||||||
|
label: label,
|
||||||
|
color: color,
|
||||||
|
status: status,
|
||||||
|
pulverizando: pulv,
|
||||||
|
rawGnssLat: rawGnssLat,
|
||||||
|
rawGnssLon: rawGnssLon
|
||||||
|
);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -1287,13 +1310,15 @@ namespace OperationControl.Controls
|
||||||
Features = new List<MIFeature>(),
|
Features = new List<MIFeature>(),
|
||||||
Color = color ?? GetColorForMarker(id, isBase),
|
Color = color ?? GetColorForMarker(id, isBase),
|
||||||
Heading = heading ?? 0,
|
Heading = heading ?? 0,
|
||||||
Lat = lat ?? 0,
|
Lat = lat ?? 0,
|
||||||
Lon = lon ?? 0,
|
Lon = lon ?? 0,
|
||||||
|
RawGnssLat = rawGnssLat,
|
||||||
|
RawGnssLon = rawGnssLon,
|
||||||
Label = lbl,
|
Label = lbl,
|
||||||
MarkerShapes = new List<MIFeature>(),
|
MarkerShapes = new List<MIFeature>(),
|
||||||
IsBase = isBase,
|
IsBase = isBase,
|
||||||
Status = status ?? StatusOperacao.NaoIniciado,
|
Status = status ?? StatusOperacao.NaoIniciado,
|
||||||
Pulverizando = pulv ?? false,
|
Pulverizando = pulv ?? false,
|
||||||
Focused = false
|
Focused = false
|
||||||
};
|
};
|
||||||
marker.CreateTrajectory(_map);
|
marker.CreateTrajectory(_map);
|
||||||
|
|
@ -1307,15 +1332,30 @@ namespace OperationControl.Controls
|
||||||
_map.Map?.Navigator?.CenterOn(marker.Point.Point);
|
_map.Map?.Navigator?.CenterOn(marker.Point.Point);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UpdateMarkerPosition(string id, double? lat = null, double? lon = null, double? heading = null, List<double[]>? predict = null)
|
public void UpdateMarkerPosition(
|
||||||
|
string id,
|
||||||
|
double? lat = null,
|
||||||
|
double? lon = null,
|
||||||
|
double? heading = null,
|
||||||
|
List<double[]>? predict = null,
|
||||||
|
double? rawGnssLat = null,
|
||||||
|
double? rawGnssLon = null
|
||||||
|
)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(id)) return;
|
if (string.IsNullOrWhiteSpace(id)) return;
|
||||||
|
|
||||||
var marker = _features.FirstOrDefault(x => x.Id == id);
|
var marker = _features.FirstOrDefault(x => x.Id == id);
|
||||||
if (marker == null) return;
|
if (marker == null) return;
|
||||||
|
|
||||||
marker.UpdateData(lat: lat, lon: lon, heading: heading, predict: predict);
|
marker.UpdateData(
|
||||||
|
lat: lat,
|
||||||
|
lon: lon,
|
||||||
|
heading: heading,
|
||||||
|
predict: predict,
|
||||||
|
rawGnssLat: rawGnssLat,
|
||||||
|
rawGnssLon: rawGnssLon
|
||||||
|
);
|
||||||
|
|
||||||
UpdateFeatures();
|
UpdateFeatures();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1385,6 +1425,9 @@ namespace OperationControl.Controls
|
||||||
public double Lat { get; set; }
|
public double Lat { get; set; }
|
||||||
public double Lon { get; set; }
|
public double Lon { get; set; }
|
||||||
public double Heading { get; set; }
|
public double Heading { get; set; }
|
||||||
|
public double? RawGnssLat { get; set; }
|
||||||
|
public double? RawGnssLon { get; set; }
|
||||||
|
public bool MostrarPontosLeverArm { get; set; } = true;
|
||||||
public string Label { get; set; }
|
public string Label { get; set; }
|
||||||
public System.Windows.Media.Color Color { get; set; }
|
public System.Windows.Media.Color Color { get; set; }
|
||||||
public StatusOperacao Status { get; set; }
|
public StatusOperacao Status { get; set; }
|
||||||
|
|
@ -1393,12 +1436,25 @@ namespace OperationControl.Controls
|
||||||
public Coordinate Position { get; set; }
|
public Coordinate Position { get; set; }
|
||||||
public List<double[]> Predict { get; set; }
|
public List<double[]> Predict { get; set; }
|
||||||
|
|
||||||
public void UpdateData(double? lat = null, double? lon = null, double? heading = null, string? label = null, System.Windows.Media.Color? color = null, bool? pulverizando = null, StatusOperacao? status = null, List<double[]>? predict = null)
|
public void UpdateData(
|
||||||
|
double? lat = null,
|
||||||
|
double? lon = null,
|
||||||
|
double? heading = null,
|
||||||
|
string? label = null,
|
||||||
|
System.Windows.Media.Color? color = null,
|
||||||
|
bool? pulverizando = null,
|
||||||
|
StatusOperacao? status = null,
|
||||||
|
List<double[]>? predict = null,
|
||||||
|
double? rawGnssLat = null,
|
||||||
|
double? rawGnssLon = null
|
||||||
|
)
|
||||||
{
|
{
|
||||||
Features.Clear();
|
Features.Clear();
|
||||||
|
|
||||||
if (lat != null) Lat = (double)lat;
|
if (lat != null) Lat = (double)lat;
|
||||||
if (lon != null) Lon = (double)lon;
|
if (lon != null) Lon = (double)lon;
|
||||||
|
if (rawGnssLat != null) RawGnssLat = rawGnssLat;
|
||||||
|
if (rawGnssLon != null) RawGnssLon = rawGnssLon;
|
||||||
if (heading != null) Heading = (double)heading;
|
if (heading != null) Heading = (double)heading;
|
||||||
if (label != null) Label = label;
|
if (label != null) Label = label;
|
||||||
if (color != null) Color = (System.Windows.Media.Color)color;
|
if (color != null) Color = (System.Windows.Media.Color)color;
|
||||||
|
|
@ -1524,6 +1580,7 @@ namespace OperationControl.Controls
|
||||||
});
|
});
|
||||||
|
|
||||||
MarkerShapes.Add(triangle);
|
MarkerShapes.Add(triangle);
|
||||||
|
CreateLeverArmReferencePoints(centerWorld);
|
||||||
|
|
||||||
if (Focused)
|
if (Focused)
|
||||||
{
|
{
|
||||||
|
|
@ -1714,6 +1771,88 @@ namespace OperationControl.Controls
|
||||||
return (baseColor, glyph, back);
|
return (baseColor, glyph, back);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void CreateLeverArmReferencePoints(MPoint correctedWorld)
|
||||||
|
{
|
||||||
|
if (!MostrarPontosLeverArm)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!IsValidLatLon(RawGnssLat, RawGnssLon))
|
||||||
|
return;
|
||||||
|
|
||||||
|
var rawMercator = Mapsui.Projections.SphericalMercator.FromLonLat(
|
||||||
|
RawGnssLon!.Value,
|
||||||
|
RawGnssLat!.Value
|
||||||
|
);
|
||||||
|
|
||||||
|
var rawWorld = new MPoint(rawMercator.x, rawMercator.y);
|
||||||
|
|
||||||
|
// Linha tracejada entre GNSS bruto e ponto corrigido
|
||||||
|
var line = new GeometryFeature
|
||||||
|
{
|
||||||
|
Geometry = new LineString(new[]
|
||||||
|
{
|
||||||
|
new Coordinate(rawWorld.X, rawWorld.Y),
|
||||||
|
new Coordinate(correctedWorld.X, correctedWorld.Y)
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
line.Styles.Add(new VectorStyle
|
||||||
|
{
|
||||||
|
Line = new Pen
|
||||||
|
{
|
||||||
|
Color = new Mapsui.Styles.Color(255, 255, 255, 170),
|
||||||
|
Width = 1,
|
||||||
|
PenStyle = PenStyle.Dash
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
MarkerShapes.Add(line);
|
||||||
|
|
||||||
|
// Ponto GNSS bruto: amarelo
|
||||||
|
var rawPoint = new PointFeature(rawWorld);
|
||||||
|
rawPoint["MarkerPart"] = "GnssBruto";
|
||||||
|
rawPoint.Styles.Add(new SymbolStyle
|
||||||
|
{
|
||||||
|
SymbolType = SymbolType.Ellipse,
|
||||||
|
SymbolScale = 0.55,
|
||||||
|
Fill = new Brush(new Mapsui.Styles.Color(255, 215, 0, 255)),
|
||||||
|
Outline = new Pen(new Mapsui.Styles.Color(20, 20, 20, 230), 1)
|
||||||
|
});
|
||||||
|
|
||||||
|
MarkerShapes.Add(rawPoint);
|
||||||
|
|
||||||
|
// Ponto corrigido: branco com contorno preto
|
||||||
|
var correctedPoint = new PointFeature(correctedWorld);
|
||||||
|
correctedPoint["MarkerPart"] = "GnssCorrigidoLeverArm";
|
||||||
|
correctedPoint.Styles.Add(new SymbolStyle
|
||||||
|
{
|
||||||
|
SymbolType = SymbolType.Ellipse,
|
||||||
|
SymbolScale = 0.50,
|
||||||
|
Fill = new Brush(Mapsui.Styles.Color.White),
|
||||||
|
Outline = new Pen(new Mapsui.Styles.Color(20, 20, 20, 230), 1)
|
||||||
|
});
|
||||||
|
|
||||||
|
MarkerShapes.Add(correctedPoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool IsValidLatLon(double? lat, double? lon)
|
||||||
|
{
|
||||||
|
if (!lat.HasValue || !lon.HasValue)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (lat.Value < -90 || lat.Value > 90)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (lon.Value < -180 || lon.Value > 180)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Evita desenhar ponto fake em 0,0
|
||||||
|
if (Math.Abs(lat.Value) < 0.0000001 && Math.Abs(lon.Value) < 0.0000001)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public void ClearTrajectory(bool clearPrediction = true)
|
public void ClearTrajectory(bool clearPrediction = true)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,8 @@ using static AgroBase.Models.Enums;
|
||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
using OperationControl.Helpers;
|
using OperationControl.Helpers;
|
||||||
using static AgroBase.Services.CoolerControlService;
|
using static AgroBase.Services.CoolerControlService;
|
||||||
|
using AgroBase.Services;
|
||||||
|
using AgroBase.Models;
|
||||||
|
|
||||||
namespace OperationControl.ViewModels.Views.Operacao.Monitoramento.Diagnostico
|
namespace OperationControl.ViewModels.Views.Operacao.Monitoramento.Diagnostico
|
||||||
{
|
{
|
||||||
|
|
@ -201,7 +203,7 @@ namespace OperationControl.ViewModels.Views.Operacao.Monitoramento.Diagnostico
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
if (SetProperty(ref _gpsLeverArmLateral, value))
|
if (SetProperty(ref _gpsLeverArmLateral, value))
|
||||||
GpsLeverArmLateralTexto = $"{value:0.##} cm";
|
GpsLeverArmLateralTexto = $"{value:0} cm";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -219,7 +221,7 @@ namespace OperationControl.ViewModels.Views.Operacao.Monitoramento.Diagnostico
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
if (SetProperty(ref _gpsLeverArmFrontal, value))
|
if (SetProperty(ref _gpsLeverArmFrontal, value))
|
||||||
GpsLeverArmFrontalTexto = $"{value:0.##} cm";
|
GpsLeverArmFrontalTexto = $"{value:0} cm";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -822,6 +824,33 @@ namespace OperationControl.ViewModels.Views.Operacao.Monitoramento.Diagnostico
|
||||||
lateral: GpsLeverArmLateral,
|
lateral: GpsLeverArmLateral,
|
||||||
frontal: GpsLeverArmFrontal
|
frontal: GpsLeverArmFrontal
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (AppShell.Mock && AppShell.AddRover)
|
||||||
|
{
|
||||||
|
var gnss = VariaveisControleOperacao.RoverEmFoco.DadosLeitura.Gnss;
|
||||||
|
gnss.LeverArmFrontal = GpsLeverArmFrontal;
|
||||||
|
gnss.LeverArmLateral = GpsLeverArmLateral;
|
||||||
|
|
||||||
|
GeoLeverArm la = new GeoLeverArm(
|
||||||
|
offsetFisicoFrontalCm: VariaveisEquipamento.LeverArmFrontalCm,
|
||||||
|
offsetFisicoLateralCm: VariaveisEquipamento.LeverArmLateralCm,
|
||||||
|
offsetCampoFrontalCm: GpsLeverArmFrontal,
|
||||||
|
offsetCampoLateralCm: GpsLeverArmLateral,
|
||||||
|
mirrL: true,
|
||||||
|
invF: true,
|
||||||
|
invH: false
|
||||||
|
);
|
||||||
|
|
||||||
|
var corrigida = la.FixLeverArmLatLon_Fast(
|
||||||
|
gnss.LatitudeAnt,
|
||||||
|
gnss.LongitudeAnt,
|
||||||
|
gnss.OrientacaoReal,
|
||||||
|
5
|
||||||
|
);
|
||||||
|
|
||||||
|
gnss.Latitude = corrigida.lat;
|
||||||
|
gnss.Longitude = corrigida.lon;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -726,7 +726,7 @@ namespace OperationControl.ViewModels
|
||||||
_viewPreparacaoMapaTop?._vm?.AtualizarDados(dados);
|
_viewPreparacaoMapaTop?._vm?.AtualizarDados(dados);
|
||||||
}
|
}
|
||||||
CriarMarcadorBase(Mapa);
|
CriarMarcadorBase(Mapa);
|
||||||
Mapa?.markers?.UpdateMarkerPosition(VariaveisControleOperacao.BaseMarkerID, lat: dados?.Latitude, lon: dados?.Longitude, heading: dados?.OrientacaoReal);
|
Mapa?.markers?.UpdateMarkerPosition(VariaveisControleOperacao.BaseMarkerID, lat: dados?.Latitude, lon: dados?.Longitude, heading: dados?.OrientacaoReal, rawGnssLat: dados?.LatitudeAnt, rawGnssLon: dados?.LongitudeAnt);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AtualizarParametrosRover(OperacaoParametrosModel? rover)
|
public void AtualizarParametrosRover(OperacaoParametrosModel? rover)
|
||||||
|
|
@ -805,7 +805,7 @@ namespace OperationControl.ViewModels
|
||||||
|
|
||||||
if (fixar)
|
if (fixar)
|
||||||
{
|
{
|
||||||
_viewPreparacaoMapaBottom?._vm.IniciarFixacao();
|
_viewPreparacaoMapaBottom?._vm?.IniciarFixacao();
|
||||||
await Models.Variaveis.GpsService.ConfigurarModulo(true, metodoFix, lat, lon, alt);
|
await Models.Variaveis.GpsService.ConfigurarModulo(true, metodoFix, lat, lon, alt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -884,7 +884,9 @@ namespace OperationControl.ViewModels
|
||||||
false,
|
false,
|
||||||
lat: roverDados.DadosLeitura?.Gnss?.Latitude ?? 0,
|
lat: roverDados.DadosLeitura?.Gnss?.Latitude ?? 0,
|
||||||
lon: roverDados.DadosLeitura?.Gnss?.Longitude ?? 0,
|
lon: roverDados.DadosLeitura?.Gnss?.Longitude ?? 0,
|
||||||
heading: roverDados.DadosLeitura?.Gnss?.OrientacaoReal ?? 0
|
heading: roverDados.DadosLeitura?.Gnss?.OrientacaoReal ?? 0,
|
||||||
|
rawGnssLat: roverDados.DadosLeitura?.Gnss?.LatitudeAnt ?? 0,
|
||||||
|
rawGnssLon: roverDados.DadosLeitura?.Gnss?.LongitudeAnt ?? 0
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -899,7 +901,7 @@ namespace OperationControl.ViewModels
|
||||||
|
|
||||||
// MAPA
|
// MAPA
|
||||||
var simulacao = obj.Controle?.SimulacaoMPC?.Select(x => new double[] { x.longitude, x.latitude })?.ToList();
|
var simulacao = obj.Controle?.SimulacaoMPC?.Select(x => new double[] { x.longitude, x.latitude })?.ToList();
|
||||||
_viewOperacaoCenter?.Mapa?.markers.UpdateMarkerPosition(rover.RoverId, lat: obj.Gnss?.Latitude, lon: obj.Gnss?.Longitude, heading: obj.Gnss?.OrientacaoReal, predict: simulacao);
|
_viewOperacaoCenter?.Mapa?.markers.UpdateMarkerPosition(rover.RoverId, lat: obj.Gnss?.Latitude, lon: obj.Gnss?.Longitude, heading: obj.Gnss?.OrientacaoReal, predict: simulacao, rawGnssLat: obj.Gnss?.LatitudeAnt, rawGnssLon: obj.Gnss?.LongitudeAnt);
|
||||||
if (_viewOperacaoCenter?.Mapa?.chbAcompanhar.IsChecked ?? false) _viewOperacaoCenter?.Mapa?.SetView(obj.Gnss?.Latitude, obj.Gnss?.Longitude);
|
if (_viewOperacaoCenter?.Mapa?.chbAcompanhar.IsChecked ?? false) _viewOperacaoCenter?.Mapa?.SetView(obj.Gnss?.Latitude, obj.Gnss?.Longitude);
|
||||||
_viewOperacaoCenter?.Mapa?.markers.UpdateMarkerInfo(rover.RoverId, status: obj.Operacao?.Status ?? AgroBase.Models.Enums.StatusOperacao.NaoIniciado);
|
_viewOperacaoCenter?.Mapa?.markers.UpdateMarkerInfo(rover.RoverId, status: obj.Operacao?.Status ?? AgroBase.Models.Enums.StatusOperacao.NaoIniciado);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -412,11 +412,11 @@
|
||||||
|
|
||||||
<StackPanel Orientation="Horizontal" Margin="0,0,0,8">
|
<StackPanel Orientation="Horizontal" Margin="0,0,0,8">
|
||||||
<Label Content="Lateral" Foreground="#DDDDDD"/>
|
<Label Content="Lateral" Foreground="#DDDDDD"/>
|
||||||
<Slider Width="110" Minimum="-5" Maximum="5" Margin="8,0" Value="{Binding OpcoesVM.GpsLeverArmLateral, Mode=TwoWay}"/>
|
<Slider Width="110" Minimum="-100" Maximum="100" Margin="8,0" Value="{Binding OpcoesVM.GpsLeverArmLateral, Mode=TwoWay}" TickFrequency="1" IsSnapToTickEnabled="True" SmallChange="1" LargeChange="1"/>
|
||||||
<Label Content="{Binding OpcoesVM.GpsLeverArmLateralTexto}" Foreground="#DDDDDD" Margin="0,0,10,0"/>
|
<Label Content="{Binding OpcoesVM.GpsLeverArmLateralTexto}" Foreground="#DDDDDD" Margin="0,0,10,0"/>
|
||||||
|
|
||||||
<Label Content="Frontal" Foreground="#DDDDDD"/>
|
<Label Content="Frontal" Foreground="#DDDDDD"/>
|
||||||
<Slider Width="110" Minimum="-10" Maximum="10" Margin="8,0" Value="{Binding OpcoesVM.GpsLeverArmFrontal, Mode=TwoWay}"/>
|
<Slider Width="110" Minimum="-100" Maximum="100" Margin="8,0" Value="{Binding OpcoesVM.GpsLeverArmFrontal, Mode=TwoWay}" TickFrequency="1" IsSnapToTickEnabled="True" SmallChange="1" LargeChange="1"/>
|
||||||
<Label Content="{Binding OpcoesVM.GpsLeverArmFrontalTexto}" Foreground="#DDDDDD"/>
|
<Label Content="{Binding OpcoesVM.GpsLeverArmFrontalTexto}" Foreground="#DDDDDD"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue