
Objek Tmagnetoaccelerometerfusion menggabungkan output sensor telepon dari:
untuk mendapatkan vektor sikap telepon . Ini adalah arah yang ditunjuk ponsel dan rotasi dalam kaitannya dengan vertikal. Objek menghitung koordinat persegi panjang ponsel. Ini dapat digunakan untuk memberi daya aplikasi realitas augmented untuk perangkat seluler. Banyak nama untuk koordinat persegi panjang: azimuth/altitude/roll atau heading/elevation/roll atau pitch/bank/roll. Anda memilih.
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 untuk Android dan iOS. Tidak ada dukungan Windows saat ini.
Apa yang dilakukan objek:
Versi iOS menggunakan timer 100ms untuk mendapatkan pembacaan sensor. Akan lebih baik menggunakan acara perubahan sensor, tetapi saya tidak tahu bagaimana melakukannya.
Versi Android menggunakan kode sensor asli (dari Delphiworlds). Delphi tlocationsor juga digunakan. Perubahan terbaru untuk Android dan iOS membutuhkan permisi eksplisit sebelum memulai sensor GPS.
Perhatikan bahwa Sensor GPS iOS memiliki properti TrueHeading, yang dapat digunakan secara langsung, menghindari semua ini. Tetapi memiliki masalah ketika ketinggian melintasi batas 45 derajat. GPS Trueheading melompat beberapa derajat pada saat itu. Dugaan saya adalah bahwa iOS mengubah sumbu koordinat persegi panjang ketika ketinggian lebih dari 45 derajat, yang menurut saya salah. Tidak yakin.
Dalam versi sebelum D10.3.3 menggunakan peretasan untuk melewati INT64 melalui JNI di Android (Delphi JNI memiliki beberapa masalah Endian). Ini dikomentari ketika kompiler diperbaiki. Perhatikan jika menggunakan versi Delphi sebelumnya (yaitu membatalkan komentar peretasan) pada d10.4.1 Tampaknya bug sudah kembali, jadi peretasan itu diperkenalkan kembali: | UPDATE: DEZ20: Pada D10.4.1 Sydney, pekerjaan di sekitar diperlukan untuk Android 32 bit. Sumber diperbarui untuk memperbaikinya.
Tmagnetoaccelerometerfusion bukan komponen sehingga tidak perlu menginstalnya sebagai paket. Ini dipasang saat run-time.
Tambahkan Unit untuk Penggunaan: Magnetometeraccelerometerfusion
Tambahkan Variabel Formulir: FMAGACCFUSION: TMAGNETOACCELEROMETERFUSION;
Di FormCreate:
fMagAccelFusion := TMagnetoAccelerometerFusion.Create(Self);
// fMagAccelFusion.OnAccelerometerChange := FusionSensorAccelChanged; // optional sensor events
// fMagAccelFusion.OnMagnetometerChange := FusionSensorMagChanged;
fMagAccelFusion.OnHeadingAltitudeChange:= FusionSensorHeadingAltitudeChanged; // combined sensor change handler
Menerapkan pawang sensor:
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: Mulai sensor. Untuk Android, Anda harus meminta izin untuk menggunakan sensor dan mulai ketika izin diberikan. Di iOS memulai sensor dari formactivate tidak berhasil. Sebaliknya saya mulai dari timer. Perhatikan bahwa aplikasi sampel tidak memulai sensor dengan cara ini. Pengguna harus mulai secara manual menggunakan menggunakan kotak centang.
Tambahkan System.Missions ke Penggunaan
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;

Aplikasi untuk iOS dan Android. Cari toko aplikasi untuk:
"Camsextant" - Gunakan sensor telepon sebagai sextant dengan kalkulator surgawi. Solusi navigasi surgawi paling sederhana. Gunakan telepon sebagai alat Celnav lengkap (sextant + kalkulator). almanak bahari abadi. Menggunakan sensor untuk menangkap ketinggian objek surgawi. Dapatkan dua atau lebih pemandangan dan Anda memiliki perbaikan (posisi astronomi)+.
"PlanetFun" - Model Tata Surya 4D (ruang 3D+waktu). Kamera 3D adegan dapat dilampirkan ke sensor telepon, menciptakan pengalaman augmented reality. Menggunakan data almanak planet yang serius (Teori VSOP 2013 untuk menghitung pósitions planet).
Lihat https://github.com/omarreis/vsop2013/tree/master/planetfun
"Navigator HD" - Alat navigasi selestial lengkap, dengan almanak abadi, pasal meridian, garis posisi, posisi astronomi. E-book dengan dasar-dasar navigasi selestial.
"Opyc" - Game Berlayar. Mengarahkan kapal dengan kecenderungan telepon.
Atau mencari pengembang "Omarreis".