SensorManager.getRotationMatrix()
làm những gì được nêu bên dưới, được viết trước khi tôi phát hiện ra điều này. Tôi sẽ để lại lời giải thích thêm bởi vì nếu bạn muốn sửa chữa cho sự khác biệt giữa phía bắc từ tính và thực sự bạn vẫn sẽ cần nó.
Thuật toán thô là lấy ma trận xoay, nhân vectơ [0,0,-1]
với nó, sau đó điều chỉnh điều này theo hệ tọa độ của bạn. Tại sao? docs Android cung cấp cho các hệ thống phối hợp dành cho điện thoại và trên thế giới


Note [0,0,-1]
trong coords thiết bị Android điểm vuông góc lùi ra khỏi màn hình. Nếu bạn nhân ma trận xoay R bằng véc-tơ này, bạn sẽ nhận được [0,0,-1]
trong coords thế giới khi thiết bị nằm trên bàn đối diện như bạn mong muốn. Khi đứng thẳng về phía bắc, bạn sẽ nhận được [0,-1,0]
, cho biết rằng bạn đã chọn một hệ tọa độ nơi x
và y
được đổi chỗ với hệ thống Android, nhưng đó chỉ đơn giản là thay đổi quy ước.
Lưu ý R * [0,0,-1]^T
chỉ là cột thứ ba của R
bị từ chối. Từ đây tôi nhận được mã giả:
getRotationMatrix(R);
Let v = first three elements of third column of R.
swap v[0] and v[1]
Điều này nên nhận được những gì bạn muốn.
Thông tin bổ sung về những gì getRotationMatrix()
đang thực hiện sau.
Bạn cần cả dữ liệu kế trọng số để thiết lập hướng "xuống" và dữ liệu từ kế để xác định hướng "phía bắc". Bạn sẽ phải giả định rằng gia tốc kế chỉ cảm nhận được lực hấp dẫn (thiết bị là tĩnh hoặc di chuyển với tốc độ ổn định). Sau đó, bạn cần phải chiếu vector từ kế lên mặt phẳng vuông góc với vector trọng lực (vì từ trường thường không tiếp xúc với bề mặt trái đất). Điều này cung cấp cho bạn hai trục. Thứ ba là trực giao, vì vậy có thể được tính bằng sản phẩm chéo. Điều này cung cấp cho bạn các vectơ phối hợp đất trong hệ thống thiết bị. Có vẻ như bạn muốn nghịch đảo: tọa độ thiết bị trong tọa độ trái đất. Đối với điều này chỉ cần xây dựng ma trận của hướng cosin và đảo ngược.
Tôi sẽ thêm rằng cuộc thảo luận ở trên giả thiết rằng vector từ kế trỏ về phía bắc. Tôi nghĩ (từ khoa học trung học!nó thực sự hướng về phía nam từ tính, nhưng không có thiết bị nào trong tầm tay nên không thể thử nó. Tất nhiên, từ bắc/nam là khác nhau từ 0 đến 180 độ tùy thuộc vào nơi bạn ở trên trái đất. Bạn có thể truy xuất tọa độ GPS và tính toán mức bù thực tế.
Nếu bạn không quen thuộc với toán cần thiết để làm điều này, tôi có thể giải thích thêm, nhưng nó sẽ phải sau này.
Cảm ơn rất nhiều, đây là thực sự hữu ích. Cả hai bạn đã đưa ra những câu trả lời tốt như vậy, tôi ước có một cách để chọn cả hai. Có vẻ như tôi có thể lấy vector trọng lực chỉ với Sensor.TYPE_GRAVITY - chúng đã làm việc đó cho tôi. Tôi ước nó dễ dàng để có được một vector "phía bắc". – Joey
Tôi đã nhận được nó bằng cách sử dụng lời giải thích của bạn. Hóa ra tôi vượt qua các giá trị được trả lại từ một cảm biến trọng lực và một cảm biến từ trường trực tiếp vào getRotationMatrix() và nó hoạt động mọi thứ. Sau đó, nhân ma trận đó với [0,0, -1] và nhận dv. – Joey