
TMAGNETOACCELOMETERFUSION วัตถุรวมเอาท์พุทเซ็นเซอร์โทรศัพท์จาก:
เพื่อรับเวกเตอร์ ทัศนคติทางโทรศัพท์ นี่คือทิศทางที่โทรศัพท์ชี้และการหมุนที่สัมพันธ์กับแนวตั้ง วัตถุคำนวณ พิกัดสี่เหลี่ยม ของโทรศัพท์ สิ่งนี้สามารถใช้เพื่อเพิ่มพลังแอพ เพิ่มความเป็นจริง สำหรับอุปกรณ์มือถือ ชื่อหลายชื่อสำหรับพิกัดสี่เหลี่ยม: Azimuth/ระดับความสูง/ม้วนหรือหัวเรื่อง/ระดับความสูง/ม้วนหรือระดับเสียง/ธนาคาร/ม้วน คุณเลือก
phone attitude - rectangular coordinates
-Y Z altitude X
| / heading Y
| / roll Z
/===+===\ ( Y points down, Z points inside the screen )
| | / ||
| |/ ||
| *---|---------- X
| ||
| O ||
-------//
ข้ามแพลตฟอร์ม Delphi วัตถุ Pascal สำหรับ Android และ iOS ไม่มีการรองรับ Windows ในเวลานี้
วัตถุทำอะไร:
เวอร์ชัน iOS ใช้ตัวจับเวลา 100ms เพื่อรับการอ่านเซ็นเซอร์ มันจะดีกว่าที่จะใช้เหตุการณ์การเปลี่ยนแปลงเซ็นเซอร์ แต่ฉันไม่รู้ว่าจะทำอย่างไร
เวอร์ชัน Android ใช้รหัสเซ็นเซอร์ดั้งเดิม (จาก Delphiworlds) ยังใช้ Delphi tlocationsensor การเปลี่ยนแปลงล่าสุดของทั้ง Android และ iOS ต้องได้รับอนุญาตอย่างชัดเจนก่อนที่จะเริ่มเซ็นเซอร์ GPS
โปรดทราบว่าเซ็นเซอร์ iOS GPS มีคุณสมบัติ trueheading ซึ่งสามารถใช้โดยตรงโดยหลีกเลี่ยงทั้งหมดนี้ แต่มันมีปัญหาเมื่อระดับความสูงข้ามขอบเขต 45 องศา GPS trueheading กระโดดหลายองศา ณ จุดนั้น ฉันเดาว่า iOS เปลี่ยนแกนพิกัดสี่เหลี่ยมเมื่อระดับความสูงมากกว่า 45 องศาซึ่งฉันคิดว่าผิด ไม่แน่ใจ
ในเวอร์ชันก่อน D10.3.3 ใช้แฮ็คเพื่อส่งผ่าน int64 ผ่าน JNI บน Android (Delphi Jni มีปัญหาบางอย่าง) นี่คือความคิดเห็นเมื่อคอมไพเลอร์ได้รับการแก้ไข ดูว่าใช้เวอร์ชัน Delphi ก่อนหน้า (เช่นการไม่ลงรอยกันการแฮ็ก) ใน d10.4.1 ดูเหมือนว่าข้อผิดพลาดกลับมาแล้วดังนั้นการแฮ็คจึงถูกนำมาใช้ใหม่: | UPDATE: 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" - ใช้เซ็นเซอร์โทรศัพท์เป็น sextant ด้วยเครื่องคิดเลขบนท้องฟ้า โซลูชันการนำทางท้องฟ้าที่ง่ายที่สุด ใช้โทรศัพท์เป็นเครื่องมือ CELNAV ที่สมบูรณ์ (Sextant + เครื่องคิดเลข) Almanac ทางทะเลตลอดเวลา ใช้เซ็นเซอร์เพื่อจับภาพความสูงของวัตถุท้องฟ้า รับสถานที่ท่องเที่ยวสองแห่งขึ้นไปและคุณมีการแก้ไข (ตำแหน่งทางดาราศาสตร์)+
"PlanetFun" - โมเดลระบบสุริยจักรวาล 4D (พื้นที่ 3D+เวลา) กล้อง Scene 3D สามารถแนบกับเซ็นเซอร์โทรศัพท์สร้างประสบการณ์ความเป็นจริงที่เพิ่มขึ้น ใช้ข้อมูล Planet Almanac ที่ร้ายแรง (Theory VSOP 2013 เพื่อคำนวณ PONET PONSITIONS)
ดู https://github.com/omarreis/vsop2013/tree/master/planetfun
"Navigator HD" - เครื่องมือนำทางท้องฟ้าที่สมบูรณ์พร้อม Almanac Perpetual, Meridian Passage, เส้นตำแหน่ง, ตำแหน่งทางดาราศาสตร์ e-book พร้อมพื้นฐานการนำทางสวรรค์
"Opyc" - เกมล่องเรือ คัดท้ายเรือด้วยความชอบทางโทรศัพท์
หรือค้นหานักพัฒนา "Omarreis"