Tính toán cao độ, ngáp và cuộn từ dữ liệu mag, acc và con quay hồi chuyển


19

Tôi có một bảng Arduino với cảm biến tự do 9 độ, từ đó tôi phải xác định cao độ, ngáp và cuộn của bảng.

Dưới đây là ví dụ về một bộ dữ liệu từ cảm biến 9-DOF:

Gia tốc kế (m / s)

  • = -5,85AccX
  • = 1,46AccY
  • = 17,98AccZ

Con quay hồi chuyển (RPM)

  • = 35,14GyrX
  • = -40,22GyrY
  • = -9,86GyrZ

Từ kế (Gauss)

  • = 0,18MagX
  • = -0,04MagY
  • = -0,15MagZ

Làm cách nào tôi có thể tính toán cao độ, ngáp và cuộn từ những dữ liệu này?


1
Nguyên tắc cơ bản: từ việc phát hiện trọng lực trong gia tốc kế của bạn, bạn biết đường nào đi xuống; từ việc phát hiện từ trường của trái đất trong từ kế của bạn, bạn biết đường nào là hướng Bắc. Dựa trên điều này và giả sử không có gia tốc đáng kể nào khác hoặc từ trường mạnh, bạn có thể xác định thái độ của chính mình.
Welf

1
Dữ liệu con quay hồi chuyển cung cấp tốc độ quay, nhưng không phải là một vị trí tuyệt đối. Nó có thể được tích hợp để ước tính sự thay đổi từ một thái độ đã biết, nhưng điều này thường gây ồn và dễ bị trôi nếu không được sử dụng cùng với các cảm biến khác.
Welf

1
cũng đề cập đến các bộ lọc kalman, vì các số tĩnh cần được xử lý khá nhiều, để đưa ra các ước tính đáng tin cậy về độ lăn và độ ngáp. Cũng lưu ý rằng, vị trí của cảm biến rất quan trọng (bạn cần tính đến nó).
Gürkan Çetin

Câu trả lời:


15

Cao độ, cuộn và ngáp được định nghĩa là xoay quanh trục X, Y và Z. Dưới đây là một hình ảnh để minh họa định nghĩa.

Sân bóng và Yaw

Trong một dự án trước đây, tôi đã sử dụng Gia tốc kế ADXL345 từ Thiết bị analog để tính toán cuộn và cường độ. Dưới đây là các phương trình được sử dụng để tính toán cuộn và cao độ. Tôi đã làm cho một số mã nguồn có sẵn để sử dụng công cộng.

accelerationX = (signed int)(((signed int)rawData_X) * 3.9);
accelerationY = (signed int)(((signed int)rawData_Y) * 3.9);
accelerationZ = (signed int)(((signed int)rawData_Z) * 3.9);
pitch = 180 * atan (accelerationX/sqrt(accelerationY*accelerationY + accelerationZ*accelerationZ))/M_PI;
roll = 180 * atan (accelerationY/sqrt(accelerationX*accelerationX + accelerationZ*accelerationZ))/M_PI;

Mã nguồn đầy đủ có thể được tìm thấy ở đây .

Dựa trên các định nghĩa trên

yaw = 180 * atan (accelerationZ/sqrt(accelerationX*accelerationX + accelerationZ*accelerationZ))/M_PI;

Lưu ý: M_PI = 3.14159265358979323846 nó không đổi được xác định trong math.h

Dưới đây là một số tài liệu tham khảo bao gồm mã nguồn cơ sở Arduino có thể giúp bạn.


Người giới thiệu:


2
Câu trả lời hay, đáng để nói thêm rằng vị trí và hướng của cảm biến trong xe sẽ rất quan trọng và dữ liệu phải được xử lý thêm, để cho kết quả đáng tin cậy. (được lọc hoặc kết hợp với dữ liệu tần số thấp đáng tin cậy hơn, chẳng hạn như GPS)
Gürkan etin

(@Zubair) "yaw = 180 * atan (Gia tốcZ / sqrt (Gia tốcXaccelutionsX + Gia tốcZaccelutionsZ)) / M_PI;" 'M_PI' đó là gì ??
Wasabi

@Wasabi M_PI = 3.14159265358979323846. Nó là hằng số được định nghĩa trong thư viện math.h.
Mahendra Gunawardena

8

Vì vậy, câu trả lời dài hơn của tôi dưới đây giả định rằng bảng sẽ trải qua quá trình tăng tốc và trong thời gian này, bạn vẫn cần có thể đo độ cao, lăn và ngáp của mình trong một khoảng thời gian ngắn. Nếu bảng sẽ đứng yên cho tất cả các phép đo thì câu trả lời của Mahendra Gunawardena sẽ hoạt động hoàn hảo cho bạn. Nếu điều này đang đi vào một thiết bị như máy bay mô hình hoặc máy bay mô hình hoặc đa hướng hoặc bất cứ thứ gì di chuyển xung quanh, bạn có thể muốn tiếp tục đọc. Bài này là về cách sử dụng cả ba cảm biến mặc dù một phương pháp gọi là phản ứng tổng hợp cảm biến. Cảm biến nhiệt hạch cho phép bạn có được điểm mạnh của từng cảm biến và giảm thiểu ảnh hưởng của từng điểm yếu của cảm biến.

Đặc điểm cảm biến và nền

Trước tiên hãy hiểu rằng một gia tốc kế đo tất cả các lực được tác dụng lên nó, không chỉ là lực hấp dẫn. Vì vậy, trong một thế giới hoàn hảo với gia tốc kế ở vị trí đứng yên mà không có bất kỳ rung động nào, bạn hoàn toàn có thể xác định được cách nào sử dụng một số lượng giác cơ bản như thể hiện trong câu trả lời của Mahendra Gunawardena. Tuy nhiên vì một gia tốc kế sẽ nhận tất cả các lực, bất kỳ rung động nào cũng sẽ gây ra tiếng ồn. Cũng cần lưu ý rằng nếu bảng đang tăng tốc, bạn không thể chỉ sử dụng lượng giác đơn giản vì lực gia tốc được báo cáo không chỉ là lực hấp dẫn của trái đất mà còn là lực khiến bạn tăng tốc.

Một từ kế là đơn giản hơn sau đó là một gia tốc kế. Chuyển động sẽ không gây ra vấn đề với nó nhưng những thứ như sắt và các nam châm khác sẽ kết thúc ảnh hưởng đến đầu ra của bạn. Nếu các nguồn gây ra nhiễu này không đổi thì sẽ không khó xử lý nhưng nếu các nguồn này không ổn định, nó sẽ tạo ra vô số tiếng ồn có vấn đề cần loại bỏ.

Trong ba cảm biến, con quay hồi chuyển được cho là đáng tin cậy nhất và chúng thường rất tốt trong việc đo tốc độ quay. Nó không bị ảnh hưởng bởi những thứ như nguồn sắt và gia tốc về cơ bản không ảnh hưởng đến khả năng đo tốc độ quay của chúng. Họ làm rất tốt việc báo cáo tốc độ mà thiết bị đang quay, tuy nhiên vì bạn đang tìm kiếm một góc tuyệt đối, bạn phải tích hợp tốc độ để có được vị trí. Làm điều này sẽ thêm lỗi của phép đo cuối cùng vào lỗi của các phép đo mới vì tích hợp về cơ bản là tổng các giá trị trong một phạm vi, ngay cả khi lỗi cho một phép đo chỉ giảm 0,01 độ mỗi giây, trong 100 lần đo, vị trí của bạn có thể giảm 1 độ, bằng 1000 lần đo, bạn có thể giảm 10 độ. Nếu bạn đang thực hiện hàng trăm phép đo một giây, bạn có thể thấy điều này gây ra vấn đề. Điều này thường được gọi là trôi con quay.

Cảm biến nhiệt hạch

Giờ đây, vẻ đẹp của việc tất cả các cảm biến này hoạt động cùng nhau là bạn có thể sử dụng thông tin từ gia tốc kế và từ kế để loại bỏ trôi con quay hồi chuyển. Điều này kết thúc cho phép bạn cung cấp cho bạn độ chính xác và tốc độ của con quay hồi chuyển mà không có lỗ hổng chết người của con quay hồi chuyển.

Kết hợp dữ liệu từ ba cảm biến này có thể được thực hiện theo nhiều cách, tôi sẽ nói về việc sử dụng bộ lọc bổ sung vì đơn giản hơn nhiều so với bộ lọc kalman và bộ lọc kalman sẽ ngốn nhiều tài nguyên hơn trên các hệ thống nhúng. Thông thường, một bộ lọc bổ sung là đủ tốt, đơn giản để thực hiện (giả sử bạn không sử dụng thư viện dựng sẵn) và cho phép bạn xử lý dữ liệu nhanh hơn.

Bây giờ vào quá trình. Các bước đầu tiên bạn cần làm là tích hợp đầu ra con quay hồi chuyển để chuyển đổi tốc độ góc thành vị trí góc. Nhiều khả năng bạn cũng sẽ phải áp dụng bộ lọc thông thấp trên gia tốc kế và từ kế để xử lý nhiễu ở đầu ra. Một bộ lọc FIR đơn giản như bộ lọc dưới đây hoạt động ở đây. Với một số lượng giác, bạn có thể tìm thấy cao độ và lăn với gia tốc kế và ngáp với từ kế.

filteredData = (1-weight)*filteredData + weight*newData

Trọng lượng chỉ là một hằng số có thể được điều chỉnh tùy thuộc vào mức độ tiếng ồn bạn phải xử lý, tiếng ồn càng cao thì giá trị trọng lượng sẽ càng nhỏ. Bây giờ kết hợp dữ liệu từ các cảm biến có thể được thực hiện bằng dòng mã sau đây.

fusedData = (1-weight)*gyroData + weight*accelMagData

Cần lưu ý rằng dữ liệu là một vectơ của cao độ, cuộn và ngáp. Bạn chỉ có thể sử dụng ba biến để làm điều này thay vì mảng nếu bạn muốn. Đối với tính toán này, con quay hồi chuyển cung cấp một vị trí theo độ trong cao độ, cuộn và ngáp, từ kế cung cấp một góc cho ngáp trong khi gia tốc kế cung cấp các số riêng cho cao độ và cuộn.

Nếu bạn vẫn muốn biết thêm thông tin, bạn có thể google "cảm biến hợp nhất với bộ lọc bổ sung", có rất nhiều bài viết về điều này.


3

Từ dữ liệu cảm biến gia tốc, bạn chỉ có thể tính toán cao độ và cuộn. Tài liệu dưới đây từ Freescale giải thích với nhiều thông tin bạn cần:

AN3461 - Cảm biến nghiêng sử dụng gia tốc kế ba trục

Dựa trên những câu nói của tài liệu,

tanϕxyz=GpyGpz

tanθxyz=GpxGpysinϕ+Gpzcosϕ=GpxGpy2+Gpz2

tương đương với:

roll = atan2(accelerationY, accelerationZ)

pitch = atan2(-accelerationX, sqrt(accelerationY*accelerationY + accelerationZ*accelerationZ))

Tất nhiên, kết quả chỉ xảy ra khi các phép quay xảy ra theo một thứ tự cụ thể (Rxyz):

  1. ϕ
  2. θ
  3. ψ

Rxyzψ


1
Anh, chào mừng đến với Engineering SE! Trang web này hỗ trợ latex, xem câu trả lời của bạn đã trở nên đẹp như thế nào. :-)
peterh - Phục hồi Monica
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.