
TMAGNETOACCELEROTORFUSION 객체는 전화 센서 출력을 결합합니다.
전화 태도 벡터를 얻습니다. 이것은 전화가 가리키는 방향과 수직과 관련하여 회전입니다. 객체는 전화의 직사각형 좌표를 계산합니다. 이것은 모바일 장치의 증강 현실 앱을 전원으로 전력을 공급하는 데 사용될 수 있습니다. 직사각형 좌표의 많은 이름 : 방위각/고도/롤 또는 제목/고도/롤 또는 피치/뱅크/롤. 당신은 선택합니다.
phone attitude - rectangular coordinates
-Y Z altitude X
| / heading Y
| / roll Z
/===+===\ ( Y points down, Z points inside the screen )
| | / ||
| |/ ||
| *---|---------- X
| ||
| O ||
-------//
Android 및 iOS 용 크로스 플랫폼 Delphi Object Pascal. 현재 Windows 지원이 없습니다.
객체가하는 일 :
iOS 버전은 100ms 타이머를 사용하여 센서 판독 값을 얻습니다. 센서 변경 이벤트를 사용하는 것이 좋습니다. 그러나 어떻게 해야할지 모르겠습니다.
Android 버전은 기본 센서 코드 (Delphiworlds)를 사용합니다. Delphi tlocationsEnsor도 사용됩니다. 최근 Android 및 iOS의 변경 사항은 GPS 센서를 시작하기 전에 명시적인 투과를 필요로합니다.
iOS GPS 센서에는 진정한 헤드 특성이 있으며 직접 사용할 수 있으며이 모든 것을 피하십시오. 그러나 고도가 45도 경계를 가로 지르면 문제가 있습니다. GPS TrueHeading은 그 시점에서 몇도를 뛰어 넘습니다. 내 생각에 iOS는 고도가 45도를 초과 할 때 직사각형 좌표가 축을 변경한다고 생각합니다. 확실하지 않습니다.
D10.3.3 이전 버전에서 해킹을 사용하여 Android의 JNI를 통해 Int64를 통과했습니다 (Delphi JNI는 일부 엔디 언 문제가 있음). 이것은 컴파일러가 수정되었을 때 주석을 달았습니다. D10.4.1에서 이전 Delphi 버전 (즉, 해킹에 대한 무의미한 해킹)을 사용하는 경우 버그가 돌아온 것 같습니다. 해킹이 다시 도입되었습니다. | 업데이트 : DEZ20 : D10.4.1 시드니 기준으로 Android 32 비트에는 작업이 필요합니다. 이 문제를 해결하기 위해 소스가 업데이트되었습니다.
tmagnetoaccelerometerfusion은 구성 요소가 아니므로 패키지로 설치할 필요가 없습니다. 런타임에 실행됩니다.
용도에 단위를 추가하십시오 : magnetometeraccelerometerfusion
형태 변수 추가 : fmagaccelfusion : tmagnetoaccelerometerfusion;
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" - 전화 센서를 Celestial Calculator의 육교로 사용하십시오. 가장 간단한 천체 내비게이션 솔루션. 전화를 전체 Celnav 도구 (Sextant + Calculator)로 사용하십시오. 영원한 해상 almanac. 센서를 사용하여 천상의 물체 고도를 캡처합니다. 둘 이상의 광경을 얻으면 (천문학적 위치)+가 있습니다.
"PlanetFun" - 4D 태양계 모델 (3D 공간+시간). 장면 3D 카메라를 전화 센서에 부착하여 증강 현실 경험을 만듭니다. 진지한 행성 Almanac 데이터 (이론 VSOP 2013을 사용하여 행성 포션을 계산)를 사용합니다.
https://github.com/omarreis/vsop2013/tree/master/planetfun을 참조하십시오
"Navigator HD" - 영구적 인 almanac, 자오선 통로, 위치 선, 천문학적 위치를 갖춘 천체 내비게이션 도구를 완료합니다. 천상의 내비게이션 기본 사항이있는 전자 책.
"Opyc" - 세일링 게임. 전화 경사로 보트를 조종하십시오.
또는 "Omarreis"개발자를 검색하십시오.