ฉันพยายามเอาหัวจับเซ็นเซอร์การวางแนว Android มาระยะหนึ่งแล้ว ฉันคิดว่าฉันเข้าใจแล้ว จากนั้นฉันก็รู้ว่าฉันไม่ได้ทำ ตอนนี้ฉันคิดว่า (หวังว่า) ฉันจะมีความรู้สึกที่ดีขึ้นอีกครั้ง แต่ฉันก็ยังไม่ 100% ฉันจะพยายามอธิบายความเข้าใจที่ขาด ๆ หาย ๆ ของฉันและหวังว่าผู้คนจะสามารถแก้ไขฉันได้หากฉันทำผิดในบางส่วนหรือเติมช่องว่างใด ๆ
ฉันจินตนาการว่าฉันยืนอยู่ที่ 0 องศาลองจิจูด (เส้นเมริเดียนที่สำคัญ) และละติจูด 0 องศา (เส้นศูนย์สูตร) สถานที่นี้อยู่ในทะเลนอกชายฝั่งแอฟริกา แต่อดทนกับฉัน ฉันถือโทรศัพท์ไว้ข้างหน้าเพื่อให้ด้านล่างของโทรศัพท์ชี้ไปที่เท้าของฉัน ฉันหันหน้าไปทางทิศเหนือ (มองไปทางกรีนิช) ดังนั้นด้านขวามือของโทรศัพท์จึงชี้ไปทางตะวันออกไปทางแอฟริกา ในแนวนี้ (อ้างอิงจากแผนภาพด้านล่าง) ฉันมีแกน X ชี้ไปทางตะวันออกแกน Z ชี้ไปทางทิศใต้และแกน Y ชี้ไปที่ท้องฟ้า
ตอนนี้เซ็นเซอร์บนโทรศัพท์ช่วยให้คุณสามารถกำหนดทิศทาง (ไม่ใช่ตำแหน่ง) ของอุปกรณ์ในสถานการณ์นี้ ส่วนนี้ทำให้ฉันสับสนมาตลอดอาจเป็นเพราะฉันต้องการเข้าใจว่าบางอย่างทำงานอย่างไรก่อนที่ฉันจะยอมรับว่ามันได้ผล ดูเหมือนว่าโทรศัพท์จะวางแนวโดยใช้เทคนิคสองอย่างร่วมกัน
ก่อนที่ฉันจะไปถึงจุดนั้นลองนึกภาพว่ากำลังกลับมายืนบนผืนดินในจินตนาการที่ละติจูด 0 องศาและลองจิจูดในทิศทางที่กล่าวมาข้างต้น ลองนึกภาพว่าคุณถูกปิดตาและรองเท้าของคุณติดอยู่กับวงเวียนสนามเด็กเล่น หากมีคนผลักคุณไปด้านหลังคุณจะตกลงไปข้างหน้า (ไปทางทิศเหนือ) และยื่นมือทั้งสองข้างออกเพื่อหักการล้มของคุณ ในทำนองเดียวกันถ้ามีใครผลักคุณไหล่ซ้ายคุณจะล้มทับด้วยมือขวา หูชั้นในของคุณมี "เซ็นเซอร์ความโน้มถ่วง" (คลิป youtube)ซึ่งช่วยให้คุณตรวจจับได้ว่าคุณล้มไปข้างหน้า / ข้างหลังหรือล้มซ้าย / ขวาหรือล้มลง (หรือขึ้น !!) ดังนั้นมนุษย์จึงสามารถตรวจจับการจัดตำแหน่งและการหมุนรอบแกน X และ Z เดียวกันกับโทรศัพท์ได้
ลองนึกภาพตอนนี้มีคนหมุนคุณ 90 องศาบนวงเวียนเพื่อให้คุณหันหน้าไปทางทิศตะวันออก คุณกำลังหมุนรอบแกน Y แกนนี้แตกต่างกันเนื่องจากเราไม่สามารถตรวจจับได้ทางชีวภาพ เรารู้ว่าเราทำมุมด้วยจำนวนหนึ่ง แต่เราไม่รู้ทิศทางที่สัมพันธ์กับขั้วเหนือแม่เหล็กของดาวเคราะห์ แต่เราต้องใช้เครื่องมือภายนอก ... เข็มทิศแม่เหล็ก สิ่งนี้ช่วยให้เราตรวจสอบได้ว่าเรากำลังหันหน้าไปทางใด เช่นเดียวกับโทรศัพท์ของเรา
ตอนนี้โทรศัพท์ยังมีมาตรความเร่ง 3 แกน ฉันไม่มีความคิดว่ามันใช้งานได้จริง แต่วิธีที่ฉันนึกภาพคือการจินตนาการว่าแรงโน้มถ่วงเป็น 'ฝน' ที่ตกลงมาจากท้องฟ้าคงที่และสม่ำเสมอและจินตนาการถึงแกนในรูปด้านบนเป็นท่อซึ่งสามารถตรวจจับปริมาณฝนที่ไหลผ่านได้ เมื่อวางโทรศัพท์ในแนวตั้งฝนจะไหลผ่านท่อ Y หากโทรศัพท์ค่อยๆหมุนเพื่อให้หน้าจอหันไปทางท้องฟ้าปริมาณฝนที่ไหลผ่าน Y จะลดลงเป็นศูนย์ในขณะที่ระดับเสียงผ่าน Z จะเพิ่มขึ้นเรื่อย ๆ จนกว่าปริมาณฝนสูงสุดจะไหลผ่าน ในทำนองเดียวกันถ้าตอนนี้เราวางโทรศัพท์ไว้ที่ด้านข้างท่อ X จะเก็บฝนได้มากที่สุด ดังนั้นขึ้นอยู่กับการวางแนวของโทรศัพท์โดยการวัดปริมาณน้ำฝนที่ไหลผ่านท่อ 3 ท่อคุณสามารถคำนวณการวางแนวได้
โทรศัพท์ยังมีเข็มทิศอิเล็กทรอนิกส์ซึ่งทำหน้าที่เหมือนเข็มทิศปกติโดย "เข็มเสมือน" จะชี้ไปที่ทิศเหนือแม่เหล็ก ผสาน Android ข้อมูลจากทั้งสองเซ็นเซอร์เพื่อที่เมื่อใดก็ตามที่SensorEvent
การTYPE_ORIENTATION
จะสร้างvalues[3]
อาร์เรย์มี
ค่า [0]: Azimuth - (เข็มทิศแบริ่งทางตะวันออกเฉียงเหนือของแม่เหล็ก)
ค่า [1]: ทางลาด, การหมุนรอบแกน x (เป็นโทรศัพท์ เอนไปข้างหน้าหรือข้างหลัง)
ค่า [2]: หมุน, หมุนรอบแกน y (โทรศัพท์เอนไปทางซ้ายหรือขวา)
ดังนั้นฉันจึงคิดว่า (เช่นฉันไม่รู้) เหตุผลที่ Android ให้แอซิมัท (แบริ่งเข็มทิศ) มากกว่าการอ่านมาตรความเร่งตัวที่สามคือแบริ่งของเข็มทิศมีประโยชน์มากกว่า ผมไม่แน่ใจว่าทำไมพวกเขาเลิกใช้ชนิดของเซ็นเซอร์นี้เป็นตอนนี้ดูเหมือนว่าคุณจำเป็นต้องลงทะเบียนผู้ฟังที่มีระบบสำหรับของประเภทSensorEvent
อาร์เรย์TYPE_MAGNETIC_FIELD
ของเหตุการณ์จะvalue[]
ต้องSensorManger.getRotationMatrix(..)
ถูกส่งผ่านไปยังSensorManager.getOrientation(..)
วิธีการเพื่อให้ได้เมทริกซ์การหมุน (ดูด้านล่าง) ซึ่งจะถูกส่งผ่านไปยังเมธอด มีใครรู้บ้างว่าทำไมทีม Android ถึงเลิกใช้งานSensor.TYPE_ORIENTATION
? มันเป็นสิ่งที่มีประสิทธิภาพหรือไม่? นั่นคือสิ่งที่บอกเป็นนัยในความคิดเห็นหนึ่งของคำถามที่คล้ายกันแต่คุณยังต้องลงทะเบียนผู้ฟังประเภทอื่นในการพัฒนา / ตัวอย่าง / เข็มทิศ / src / com / ตัวอย่าง / android / เข็มทิศ / CompassActivity.javaตัวอย่าง
ตอนนี้ฉันต้องการพูดคุยเกี่ยวกับเมทริกซ์การหมุน (นี่คือจุดที่ฉันไม่แน่ใจที่สุด) ดังนั้นข้างบนเรามีตัวเลขสามตัวจากเอกสาร Android เราจะเรียกมันว่า A, B และ C
A = SensorManger.getRotationMatrix (.. ) รูปเมธอดและแสดงถึงระบบพิกัดของโลก
B = ระบบพิกัดที่ใช้โดย SensorEvent API
C = SensorManager.getOrientation (.. ) รูปวิธีการ
ดังนั้นความเข้าใจของฉันก็คือ A หมายถึง "ระบบพิกัดของโลก" ซึ่งฉันคิดว่าหมายถึงวิธีที่ตำแหน่งบนโลกถูกกำหนดให้เป็นคู่ (ละติจูดลองจิจูด) โดยมีตัวเลือก (ระดับความสูง) X คือ"อีส"ประสาน, Y เป็น"Northing"ประสาน Z ชี้ไปที่ท้องฟ้าและแสดงถึงระดับความสูง
ระบบประสานงานโทรศัพท์แสดงในรูป B ได้รับการแก้ไข แกน Y ชี้ไปที่ด้านบนเสมอ เมทริกซ์การหมุนกำลังคำนวณอย่างต่อเนื่องโดยโทรศัพท์และอนุญาตให้มีการทำแผนที่ระหว่างทั้งสอง ฉันคิดถูกหรือเปล่าว่าเมทริกซ์การหมุนเปลี่ยนระบบพิกัดของ B เป็น C ดังนั้นเมื่อคุณเรียกSensorManager.getOrientation(..)
เมธอดคุณจะใช้values[]
อาร์เรย์ที่มีค่าตรงกับรูป C เมื่อโทรศัพท์ชี้ไปที่ท้องฟ้าเมทริกซ์การหมุนคือเมทริกซ์เอกลักษณ์ (เมทริกซ์เทียบเท่าทางคณิตศาสตร์ของ 1) ซึ่งหมายความว่าไม่จำเป็นต้องมีการแมปเนื่องจากอุปกรณ์ถูกจัดตำแหน่ง กับระบบพิกัดของโลก
ตกลง. ฉันคิดว่าฉันหยุดตอนนี้ดีกว่า อย่างที่ฉันเคยพูดไปก่อนหน้านี้ฉันหวังว่าผู้คนจะบอกฉันว่าฉันทำอะไรผิดพลาดหรือช่วยเหลือผู้คน (หรือทำให้คนสับสนยิ่งกว่านั้น!)