
L'objet tmagnetoacceleromètrefusion combine la sortie du capteur de téléphone depuis:
Pour obtenir le vecteur d'attitude du téléphone . C'est la direction que le téléphone pointe et la rotation par rapport à la verticale. L'objet calcule les coordonnées rectangulaires du téléphone. Cela peut être utilisé pour alimenter les applications de réalité augmentée pour les appareils mobiles. Beaucoup de noms pour les coordonnées rectangulaires: azimut / altitude / rouleau ou en-tête / élévation / roll ou pitch / bank / roll. Vous choisissez.
phone attitude - rectangular coordinates
-Y Z altitude X
| / heading Y
| / roll Z
/===+===\ ( Y points down, Z points inside the screen )
| | / ||
| |/ ||
| *---|---------- X
| ||
| O ||
-------//
Trace plateforme Delphi Object Pascal pour Android et iOS. Pas de support Windows pour le moment.
Ce que fait l'objet:
La version iOS utilise une minuterie de 100 ms pour obtenir des lectures de capteurs. Il serait préférable d'utiliser des événements de changement de capteur, mais je ne sais pas comment le faire.
La version Android utilise le code du capteur natif (à partir de DelphiWorlds). Delphi TlocationsSensor est également utilisé. Les modifications récentes à Android et iOS nécessitent une permsion explicite avant de démarrer le capteur GPS.
Notez que le capteur GPS iOS possède une propriété réelle, qui pourrait être utilisée directement, en évitant tout cela. Mais il a un problème lorsque l'altitude traverse la limite de 45 degrés. Le GPS Trueheading saute plusieurs degrés à ce moment-là. Je suppose que iOS modifie l'axe des coordonnées rectangulaires lorsque l'altitude est supérieure à 45 degrés, ce qui, je pense, est mal. Pas sûr.
Dans les versions avant D10.3.3, j'ai utilisé un hack pour passer INT64 via JNI sur Android (Delphi Jni avait un problème endian). Cela a été commenté lorsque le compilateur a été corrigé. Regardez si vous utilisez les versions de Delphi précédentes (c.-à-d. Décommente le piratage) sur D10.4.1 Il semble que le bug soit de retour, donc le piratage a été réintroduit: | MISE À JOUR: DEZ20: à partir de D10.4.1 Sydney, le travail est nécessaire pour Android 32 bits. Source mise à jour pour résoudre ce problème.
TMAGNETOACCELEROMEMERMEMETFUSION n'est pas un composant, il n'est donc pas nécessaire de l'installer en tant que package. Il est instancé au moment de l'exécution.
Ajouter l'unité aux utilisations: magnétomètreacceleromètre
Ajouter une variable de formulaire: FMAGACCELFUSION: TMAGNETOACCELEROMEMERMEMEMENTFUSION;
Sur FormCreate:
fMagAccelFusion := TMagnetoAccelerometerFusion.Create(Self);
// fMagAccelFusion.OnAccelerometerChange := FusionSensorAccelChanged; // optional sensor events
// fMagAccelFusion.OnMagnetometerChange := FusionSensorMagChanged;
fMagAccelFusion.OnHeadingAltitudeChange:= FusionSensorHeadingAltitudeChanged; // combined sensor change handler
Implémentation du gestionnaire de capteurs:
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] );
....
...
Sur Formactivate: Démarrez les capteurs. Pour Android, vous devez demander la permission d'utiliser les capteurs et de démarrer lorsque les autorisations sont accordées. Sur les capteurs de démarrage iOS de Formactivate n'a pas fonctionné. Au lieu de cela, j'ai commencé à partir d'une minuterie. Notez que l'exemple d'application ne démarre pas les capteurs de cette façon. L'utilisateur doit commencer manuellement à l'aide de la case à cocher.
Ajouter System.Permissions aux utilisations
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;

Applications pour iOS et Android. Rechercher les magasins d'applications pour:
"CAMSEXTANT" - Utilisez des capteurs de téléphone comme sextant avec calculatrice céleste. Solution de navigation céleste la plus simple. Utilisez le téléphone comme outil CELNAV complet (calculatrice Sextant +). Almanach nautique perpétuel. Utilise des capteurs pour capturer des altitudes d'objets célestes. Obtenez deux viseurs ou plus et vous avez un correctif (position astronomique) +.
"PlanetFun" - Modèle du système solaire 4D (3D Space + Time). L'appareil photo 3D de scène peut être attaché aux capteurs du téléphone, créant une expérience de réalité augmentée. Utilise des données sérieuses de la planète almanac (théorie VSOP 2013 pour calculer les pósitions de la planète).
Voir https://github.com/omarreis/vsop2013/tree/master/planetfun
"Navigator HD" - outil complet de navigation céleste, avec almanach perpétuel, passage méridien, lignes de position, position astronomique. E-Book avec des bases de la navigation céleste.
"Opyc" - Game à voile. Offrez le bateau avec l'inclinaison du téléphone.
Ou recherchez un développeur "Omarreis".