
Объект tmagnetoacceleromometerfusion объединяет вывод датчика телефона:
Чтобы получить вектор по отношению к телефону . Это направление, на которое указывает телефон, и вращение по отношению к вертикали. Объект вычисляет прямоугольные координаты телефона. Это может быть использовано для питания приложений с дополненной реальностью для мобильных устройств. Многие имена для прямоугольных координат: азимут/высота/рулон или заголовок/высота/рулон или шаг/банк/рулон. Вы выбираете.
phone attitude - rectangular coordinates
-Y Z altitude X
| / heading Y
| / roll Z
/===+===\ ( Y points down, Z points inside the screen )
| | / ||
| |/ ||
| *---|---------- X
| ||
| O ||
-------//
Кросс -платформ Delphi Object Pascal для Android и iOS. В это время нет поддержки Windows.
Что делает объект:
Версия iOS использует таймер на 100 мс для получения чтения датчиков. Было бы лучше использовать события изменения датчика, но я не знаю, как это сделать.
Версия Android использует собственный датчик (из Delphiworlds). Delphi tlocationsensor также используется. Недавние изменения как в Android, так и в iOS требуют явного разрешения перед запуском датчика GPS.
Обратите внимание, что датчик iOS GPS обладает истинным свойством, которое можно использовать напрямую, избегая всего этого. Но у него есть проблема, когда высота пересекает границу 45 градусов. GPS TrueHeading поднимается на несколько градусов в этот момент. Я предполагаю, что iOS меняет прямоугольную координаты оси, когда высота составляет более 45 градусов, что, я думаю, неверно. Не уверен.
В версиях перед D10.3.3 использовался взломан для передачи Int64 через JNI на Android (Delphi JNI имел некоторую проблему с энджином). Это было прокомментировано, когда компилятор был исправлен. Следите за использованием предыдущих версий Delphi (т. Е. Не понадобится взлом) на D10.4.1, кажется, что ошибка вернулась, поэтому взлом был вновь введен: | ОБНОВЛЕНИЕ: DEZ20: с D10.4.1 SYDNEY, для Android 32 бит необходима работа. Источник обновлен, чтобы исправить это.
Tmagnetoacceleromometerfusion не является компонентом, поэтому нет необходимости устанавливать его в качестве пакета. Это инстинктивно во время выполнения.
Добавить блок к использованию: Magnetometometeraccelerometerfusion
Добавить переменную формы: fmagaccelfusion: tmagnetoaccelerometeroterfusion;
На FormCreate:
fMagAccelFusion := TMagnetoAccelerometerFusion.Create(Self);
// fMagAccelFusion.OnAccelerometerChange := FusionSensorAccelChanged; // optional sensor events
// fMagAccelFusion.OnMagnetometerChange := FusionSensorMagChanged;
fMagAccelFusion.OnHeadingAltitudeChange:= FusionSensorHeadingAltitudeChanged; // combined sensor change handler
Реализовать обработчик датчика:
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] );
....
...
На Formactivate: начало датчики. Для Android вы должны попросить разрешения использовать датчики и начать, когда разрешаются разрешения. На iOS начальные датчики от Formactivate не работали. Вместо этого я начал с таймера. Обратите внимание, что образец приложения не запускает датчики таким образом. Пользователь должен вручную начать с помощью флажести.
Добавить System.permissions в использование
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;

Приложения для iOS и Android. Поиск приложений для:
«Camsextant» - используйте датчики телефона в качестве секстанта с небесным калькулятором. Простейшее небесное навигационное решение. Используйте телефон в качестве полного инструмента Celnav (Sextant + Calculator). Вечный морской альманац. Использует датчики для захвата небесных объектов. Получите два или более достопримечательностей, и вы получите исправление (астрономическое положение)+.
«Planetfun» - модель солнечной системы 4D (3D пространство+время). 3D -камера сцены может быть прикреплена к датчикам телефона, создавая опыт дополненной реальности. Использует серьезные данные Almanac (Theory VSOP 2013 для расчета Planet Poositions).
См. https://github.com/omarreis/vsop2013/tree/master/planetfun
"Navigator HD" - Полный навигационный инструмент на навигации с вечным альманаком, проходом Меридиана, Линии позиции, астрономическим положением. Электронная книга с небесными основами навигации.
«Опик» - Парусная игра. Управляйте лодкой с наклонностью телефона.
Или поиск разработчика "Omarreis".