
TMAGNETOACCELEROMETERFUSION Object combina la salida del sensor del teléfono de:
Para obtener el vector de actitud telefónica . Esta es la dirección que apunta el teléfono y la rotación en relación con la vertical. El objeto calcula las coordenadas rectangulares del teléfono. Esto se puede usar para encender aplicaciones de realidad aumentada para dispositivos móviles. Muchos nombres para coordenadas rectangulares: acimut/altitud/roll o encabezado/elevación/rollo o tono/banco/rollo. Tu eliges.
phone attitude - rectangular coordinates
-Y Z altitude X
| / heading Y
| / roll Z
/===+===\ ( Y points down, Z points inside the screen )
| | / ||
| |/ ||
| *---|---------- X
| ||
| O ||
-------//
Cross Platform Delphi Object Pascal para Android e iOS. No hay soporte de Windows en este momento.
Lo que hace el objeto:
La versión iOS utiliza un temporizador de 100 ms para obtener lecturas del sensor. Sería mejor usar eventos de cambio de sensor, pero no sé cómo hacerlo.
La versión de Android utiliza código de sensor nativo (de DelphiWorlds). Delphi tlocationsensor también se usa. Cambios recientes tanto en Android como a iOS requieren permiso explícito antes de comenzar el sensor GPS.
Tenga en cuenta que el sensor GPS de iOS tiene una propiedad verdadera, que podría usarse directamente, evitando todo esto. Pero tiene un problema cuando la altitud cruza el límite de 45 grados. El verdadero GPS salta varios grados en ese punto. Supongo que iOS cambia el eje de las coordenadas rectangulares cuando la altitud es de más de 45 grados, lo que creo que está mal. No estoy seguro.
En las versiones antes de D10.3.3 usó un hack para pasar INT64 a través de JNI en Android (Delphi JNI tenía algún problema de endian). Esto fue comentado cuando se corrigió el compilador. Observe si usa versiones anteriores de Delphi (es decir, uncomment the Hack) en D10.4.1 Parece que el error ha vuelto, por lo que el hack fue reintroducido: | ACTUALIZACIÓN: DEZ20: A partir de D10.4.1 Sydney, el trabajo se requiere para Android 32 bits. Fuente actualizada para solucionar esto.
TmagnetoAccelerometerfusion no es un componente, por lo que no hay necesidad de instalarlo como un paquete. Está instancionado en el tiempo de ejecución.
Agregar unidad a usos: magnetometeraccelerometerfusion
Agregar variable de formulario: fmagaccelfusion: tmagnetoaccelerometerfusion;
En FormCreate:
fMagAccelFusion := TMagnetoAccelerometerFusion.Create(Self);
// fMagAccelFusion.OnAccelerometerChange := FusionSensorAccelChanged; // optional sensor events
// fMagAccelFusion.OnMagnetometerChange := FusionSensorMagChanged;
fMagAccelFusion.OnHeadingAltitudeChange:= FusionSensorHeadingAltitudeChanged; // combined sensor change handler
Implementar el controlador 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] );
....
...
En FormActivate: Sensores de inicio. Para Android, debe pedir permiso para usar los sensores y comenzar cuando se otorgan permisos. En iOS, los sensores iniciales de Formactivate no funcionaban. En cambio, comencé desde un temporizador. Tenga en cuenta que la aplicación de muestra no inicia los sensores de esta manera. El usuario debe comenzar a usar manualmente con la casilla de verificación.
Agregar System. Permisos a 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;

Aplicaciones para iOS y Android. Búsqueda de tiendas de aplicaciones para:
"CamSextant": use sensores de teléfono como sextante con calculadora celestial. Solución de navegación celestial más simple. Use el teléfono como una herramienta Celnav completa (sextante + calculadora). Almanaque náutico perpetuo. Utiliza sensores para capturar altitudes de objetos celestiales. Obtenga dos o más lugares de interés y tendrá una solución (posición astronómica)+.
"PlanetFun" - Modelo del sistema solar 4D (espacio 3D+Tiempo). La cámara 3D de la escena se puede conectar a los sensores del teléfono, creando una experiencia de realidad aumentada. Utiliza datos serios del Almanaque del Planeta (Teoría VSOP 2013 para calcular las Pobresiciones del Planeta).
ver https://github.com/omarreis/vsop2013/tree/master/planetfun
"Navigator HD" - Herramienta completa de navegación celestial, con almanaque perpetuo, pasaje meridiano, líneas de posición, posición astronómica. Libro electrónico con conceptos básicos de navegación celestial.
"OPYC" - Juego de navegación. Dirige el bote con la inclinación del teléfono.
O buscar desarrollador "Omarreis".