
Das TMagNetoAccelerometermometermesser -Objekt kombiniert die Ausgabe des Telefonsensors aus:
Um den Telefoneinstellungsvektor zu erhalten. Dies ist die Richtung, in die das Telefon zeigt und die Rotation in Bezug auf vertikale. Das Objekt berechnet die rechteckigen Koordinaten des Telefons. Dies kann verwendet werden, um Augmented -Reality -Apps für mobile Geräte zu versorgen. Viele Namen für rechteckige Koordinaten: Azimut/Höhe/Roll oder Überschrift/Höhen-/Rollen- oder Tonhöhe/Bank/Roll. Sie wählen.
phone attitude - rectangular coordinates
-Y Z altitude X
| / heading Y
| / roll Z
/===+===\ ( Y points down, Z points inside the screen )
| | / ||
| |/ ||
| *---|---------- X
| ||
| O ||
-------//
Cross Plattform Delphi -Objekt Pascal für Android und iOS. Zu diesem Zeitpunkt keine Windows -Unterstützung.
Was das Objekt tut:
Die iOS -Version verwendet einen 100 -ms -Timer, um Sensorwerte zu erhalten. Es wäre besser, Sensorwechsel -Ereignisse zu verwenden, aber ich weiß nicht, wie das geht.
Android -Version verwendet nativen Sensorcode (von DelphiWorlds). Delphi TlocationSensor wird ebenfalls verwendet. Jüngste Änderungen an Android und iOS erfordern eine explizite Permision, bevor der GPS -Sensor beginnt.
Beachten Sie, dass der iOS -GPS -Sensor über eine Trueheading -Eigenschaft verfügt, die direkt verwendet werden kann, um all dies zu vermeiden. Aber es hat ein Problem, wenn die Höhe die 45 -Grad -Grenze überschreitet. Das GPS Trueheading springt an diesem Punkt mehrere Grad. Ich vermute, dass iOS die rechteckige Koordinatenachse verändert, wenn die Höhe mehr als 45 Grad beträgt, was ich für falsch halte. Ich bin mir nicht sicher.
In Versionen vor D10.3.3 verwendete ein Hack, um INT64 über JNI auf Android zu bestehen (Delphi JNI hatte ein Endian -Problem). Dies wurde kommentiert, als der Compiler korrigiert wurde. Beobachten Sie, ob frühere Delphi -Versionen (dh die Überzeugung des Hacks) auf D10.4.1 verwendet. Es scheint, dass der Fehler zurück ist, sodass der Hack wieder eingeführt wurde: | UPDATE: DEZ20: Ab D10.4.1 Sydney ist die Arbeit für Android 32 Bit erforderlich. Quelle aktualisiert, um dies zu beheben.
TMagNetOaccelerometermometermesser ist keine Komponente, daher müssen sie nicht als Paket installiert werden. Es ist zur Laufzeit instanziert.
Verwendungseinheiten hinzufügen: Magnetometeraccelerometermometerfusion
Formularvariable hinzufügen: fMagaccelfusion: tmagnetoaccelerometermetermetermeterfusion;
Auf Formcreate:
fMagAccelFusion := TMagnetoAccelerometerFusion.Create(Self);
// fMagAccelFusion.OnAccelerometerChange := FusionSensorAccelChanged; // optional sensor events
// fMagAccelFusion.OnMagnetometerChange := FusionSensorMagChanged;
fMagAccelFusion.OnHeadingAltitudeChange:= FusionSensorHeadingAltitudeChanged; // combined sensor change handler
Sensorhandler implementieren:
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] );
....
...
Auf formActivate: Sensoren starten. Für Android müssen Sie um Erlaubnis bitten, die Sensoren zu verwenden und zu beginnen, wann die Berechtigungen erteilt werden. Auf iOS -Startsensoren von FormActivate funktionierten nicht. Stattdessen startete ich von einem Timer. Beachten Sie, dass die Beispielanwendung die Sensoren auf diese Weise nicht startet. Der Benutzer muss manuell verwenden, um das Kontrollkästchen zu verwenden.
Fügen Sie System.permissions zu Verwendung hinzu
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;

Apps für iOS und Android. Suchanwendungsgeschäfte für:
"Camsextant" - Verwenden Sie Telefonsensoren als Sextant mit Himmelsrechner. Einfachste himmlische Navigationslösung. Verwenden Sie das Telefon als vollständiges Celnav -Tool (Sextant + Taschenrechner). Perpetual Nautical Almanac. Verwendet Sensoren, um Himmelsobjekte zu erfassen. Holen Sie sich zwei oder mehr Sehenswürdigkeiten und Sie haben eine Lösung (astronomische Position)+.
"PlanetFun" - 4D -Solarsystemmodell (3D -Raum+Zeit). Die Szene -3D -Kamera kann an die Telefonsensoren angebracht werden, wodurch ein Augmented Reality -Erlebnis geschaffen wird. Verwendet ernsthafte Planet Almanac -Daten (Theorie vSOP 2013, um den Planeten Póverements zu berechnen).
Siehe https://github.com/omarreis/vsop2013/tree/master/planetfun
"Navigator HD" - Vollständiges Himmelsnavigationsinstrument mit ewigem Almanach, Meridian -Passage, Positionslinien, astronomischer Position. E-Book mit Himmelsnavigationsgrundlagen.
"Opyc" - Segelspiel. Steuern Sie das Boot mit der Telefonneigung.
Oder suchen Sie nach "Omarreis" -Entuch.