
O objeto TmagnetoaccelerometerFusion combina a saída do sensor de telefone de:
Para obter o vetor de atitude do telefone . Esta é a direção que o telefone está apontando e a rotação em relação à vertical. O objeto calcula as coordenadas retangulares do telefone. Isso pode ser usado para alimentar aplicativos de realidade aumentada para dispositivos móveis. Muitos nomes para coordenadas retangulares: azimute/altitude/rolo ou cabeçalho/elevação/rolagem ou pitch/banco/rolo. Você escolhe.
phone attitude - rectangular coordinates
-Y Z altitude X
| / heading Y
| / roll Z
/===+===\ ( Y points down, Z points inside the screen )
| | / ||
| |/ ||
| *---|---------- X
| ||
| O ||
-------//
Cruz Platform Delphi Objeto Pascal para Android e iOS. Nenhum suporte ao Windows no momento.
O que o objeto faz:
A versão iOS usa um cronômetro de 100ms para obter leituras de sensores. Seria melhor usar eventos de mudança de sensor, mas não sei como fazer isso.
A versão Android usa o código do sensor nativo (da Delphiworlds). Delphi TlocationsEnsor também é usado. Alterações recentes no Android e no iOS requer permissão explícita antes de iniciar o sensor GPS.
Observe que o sensor GPS do iOS possui uma propriedade Trueheading, que pode ser usada diretamente, evitando tudo isso. Mas tem um problema quando a altitude ultrapassa o limite de 45 graus. O GPS Trueheading salta vários graus nesse ponto. Meu palpite é que o iOS altera o eixo das coordenadas retangulares quando a altitude é mais de 45 graus, o que eu acho que está errado. Não tenho certeza.
Nas versões antes do D10.3.3, usou um hack para passar o INT64 via JNI no Android (Delphi JNI teve algum problema endiano). Isso foi comentado quando o compilador foi corrigido. Assista se estiver usando as versões anteriores do Delphi (ou seja, descompor o hack) em d10.4.1 Parece que o bug está de volta, então o hack foi reintroduzido: | ATUALIZAÇÃO: DEZ20: A partir de D10.4.1 Sydney, o trabalho é necessário para o Android 32 bits. Fonte atualizada para corrigir isso.
O TMAGNETOACELEROMOMOFUSUS não é um componente, portanto não há necessidade de instalá -lo como um pacote. É instanciado em tempo de execução.
Adicionar unidade aos usos: MagnetometerAccelerometerFusion
Adicione a variável de formulário: fmagaccelfusion: tMagnetoaccelerometerFusion;
No FormCreate:
fMagAccelFusion := TMagnetoAccelerometerFusion.Create(Self);
// fMagAccelFusion.OnAccelerometerChange := FusionSensorAccelChanged; // optional sensor events
// fMagAccelFusion.OnMagnetometerChange := FusionSensorMagChanged;
fMagAccelFusion.OnHeadingAltitudeChange:= FusionSensorHeadingAltitudeChanged; // combined sensor change handler
Implementar manipulador de sensores:
procedure TfrmMain.FusionSensorHeadingAltitudeChanged(Sender:TObject);
begin
// in this sample just show rectagular coordinates
labMagHeading.Text := Format('m: %5.1f°', [fMagAccelFusion.fTCMagHeading]);
labTrueHeading.Text := Format('t: %5.1f°', [fMagAccelFusion.fTCTrueHeading]);
labAltitude.Text := Format('%5.1f°', [fMagAccelFusion.fAltitude] );
labRoll.Text := Format('%5.1f°', [fMagAccelFusion.fRoll] );
....
...
On FormActivate: Iniciar sensores. Para o Android, você deve pedir permissão para usar os sensores e iniciar quando as permissões são concedidas. No iOS, os sensores de formação do FormActivate não funcionaram. Em vez disso, comecei de um cronômetro. Observe que o aplicativo de amostra não inicia os sensores dessa maneira. O usuário precisa começar manualmente usando a caixa de seleção.
Adicionar System.permissões aos usos
procedure TfrmMain.timerStartSensorsiOSTimer(Sender: TObject); // iOS deferred start timer
begin
fMagAccelFusion.StartStopSensors({bStart:} true ); //start ios sensor feed
timerStartSensorsiOS.Enabled := false; //once
end;
procedure TfrmMain.FormActivate(Sender: TObject);
begin
{$IFDEF Android} // request permissions to start sensor
const PermissionAccessFineLocation = 'android.permission.ACCESS_FINE_LOCATION';
PermissionsService.RequestPermissions([PermissionAccessFineLocation],
procedure(const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray)
begin
if (Length(AGrantResults) = 1) and (AGrantResults[0] = TPermissionStatus.Granted) then
fMagAccelFusion.StartStopSensors( true ) // bStart=true
else TDialogService.ShowMessage('Location permission not granted');
end)
{$ENDIF Android}
{$IFDEF IOS}
// for IOS I found u cannot start LocationSensor from FormActivate or the sensor breaks
// used a Timer to defer sensor start a couple seconds
timerStartSensorsiOS.Enabled := true;
{$ENDIF IOS}
...
end;

Aplicativos para iOS e Android. Pesquisar lojas de aplicativos para:
"Camextant" - use sensores de telefone como sextant com calculadora celestial. Solução de navegação celestial mais simples. Use o telefone como uma ferramenta CELNAV completa (calculadora de sextante +). Almanaque náutico perpétuo. Usa sensores para capturar altitudes de objeto celeste. Obtenha duas ou mais pontos turísticos e você terá uma correção (posição astronômica)+.
"PlanetFun" - modelo de sistema solar 4D (espaço 3D+tempo). A câmera 3D da cena pode ser anexada aos sensores de telefone, criando uma experiência de realidade aumentada. Usa dados sérios do Planet Almanac (Teoria vSOP 2013 para calcular as pós -Positions Planet).
Consulte https://github.com/omarreis/vsop2013/tree/master/planetfun
"Navigator HD" - Ferramenta completa de navegação celestial, com almanaque perpétuo, passagem meridiana, linhas de posição, posição astronômica. E-book com princípios básicos de navegação celestial.
"Opyc" - jogo de vela. Dirija o barco com a inclinação do telefone.
Ou procure pelo desenvolvedor "Omarreis".