Làm thế nào Ardupilot chạy được EKF với 24 states?
Bài này nói về phương pháp xử lý bộ EKF của ardupilot.
Bộ EKF này đóng vài trò navigation cũng như AHRS.
Phần cứng ardupilot phần lớn là STM32F4, với lượng flash giới hạn, khả năng xử lý cũng giới hạn. Do đó phương pháp tối ưu hóa của họ là làm hoàn toàn trên matlab, sau đó sinh code, kể cả phép nghịch đảo ma trận.
Github ở đây: https://github.com/priseborough/InertialNav
Dĩ nhiên việc nghịch đảo ma trận 24*24 trên vi điều khiển là một việc khá là mệt, do đó để giảm thiểu khối lượng tính toán, tác giả bộ lọc sử dụng phương pháp phần chia các vector measurement theo từng trục đo và thực hiện nhiều bước fusion.
Phương pháp này làm giảm nhẹ gánh nặng phải nghịch đảo ma trận lớn, tuy nhiên cũng làm cho bộ lọc mất ổn định hơn.
24 trạng thái được ước lượng là:
4 Quaternion, 3 Gyroscope bias, 3 Accelerometer bias, 3 giá trị Magnet North East Down, 3 giá trị Magnet Bias, 3 giá trị tọa độ North East Down, 3 giá trị vận tốc North East Down.
Thay vì dùng thư viện ma trận, tác giả Ardupilot chọn phương pháp viết các phương trình trạng thái ra, tuyến tính hóa bằng hàm Jacobian của Matlab, sau đó dùng hàm subexpr để Optimize lại phương trình.
Tuy còn nhiều cái chưa hiểu lắm, nhưng mà cơ bản là bằng cách này tác giả không cần thực hiện phép nghịch đảo 24*24, và code hoàn toàn tự sinh ra.
File sinh các phươn trình này là file
Trừ giá trị gyro đi bias, cái này thì y chang như EKF mình hay làm :3
Dưới đây là phương trình prediction, giá trị quaternion mới = 1/2*quaternion cũ * gyro
Phương trình sau đó là tích phân giá trị gia tốc để ra được vận tốc theo 3 trục NED, gia tốc này được lấy có lẽ từ giá trị accelerometer chiếu lên NED, với hệ máy bay thì chỉ cần thế này, còn xe cộ thì chắc là phải trừ đi g để ra được gia tốc ngoại lực.
Magnetometer được đối xử khá là đặc biệt khi mình nó có 3 trục và 6 trạng thái cần ước lượng.
Thay vì phương pháp chọn 1 trục magnet như mình làm, tác giả ước lượng magnet theo giá trị ở cả 3 trục NED, không biết là lúc đầu calib lại hay là dựa trên bản đồ từ, nhưng ưu điểm là cách này giúp ước lượng declination và inclination tốt hơn
Phần này mình chưa hiểu rõ lắm cách xử lý yaw của bộ lọc.
Tóm lại là các phương trình EKF như vậy
Bước tuyến tính hóa:
Bước này dùng công cụ symbolic để tính ra được jacobian của ma trận
Hàm OptimiseAlgebra sẽ tìm các biến chung trong phương trình symbolic để thay thế, từ đó giảm khối lượng tính toán.
Tiếp theo là phần tuyến tính hóa ma trận quan sát:
Tác giả tiếp tục tính Jacobian để tìm ra ma trận H dựa trên phương trình trạng thái.
Như vậy thay vì dùng giấy tính, việc thiết kế EKF này có thể hoàn toàn tự động luôn, vì có hàm sinh code C ở cuối.
Có một số điểm mình chưa hiểu lắm:
- Trong các bước fusion này, mình chưa hiểu rõ vai trò correction của accelerometer đóng góp vào đo đạc góc lắm.
- Tương tự như vậy với magnetometer, phương pháp cập nhật yaw cũng chưa rõ lắm, vì trong các phương trình measurement không thấy đề cập đến cách cập nhật yaw. Có thể vì phần code này chỉ dành cho mục đích navigation chăng?.
- Chắc chắn phải có GPS hay một sensor absolute nào đó tác động vào để correct lại hết chứ nhỉ? :v
Các phần code có thể tham khảo từ model simulink của bộ lọc trong github đã có link ở trên
Test thư viện ma trận tự viết và thư viện CMSIS
Câu trả lời dĩ nhiên là xài thư viện rồi :3, tuy nhiên làm sao? và hiệu quả của thư viện ma trận ra sao so với khi tự code
Code thanh ghi với STM32
Đây là một bài hướng dẫn cách nhấp nháy led và một số vấn đề khá thú vị về STM32.
Computer Vision cơ bản (P5)
Bài này sẽ tập trung nói về HOG, và machine learning trong computer vision, như mình đã luôn nói thì sự học là vô bờ, những kiến thức được nhắc đến ở đây chỉ là phần nhỏ, rất rất nhỏ trong lĩnh vực Computer Vision.
Computer Vison cơ bản (P4)
Bài này chúng ta sẽ bàn đến một số thuật toán nâng cao, một số thuật toán xử lý hình thái ảnh các bạn có thể tham khảo ở link trong các bài trước.
Đây là blog của tớ :3
Mình là một sinh viên năm 3 Bách Khoa khoa điện điện tử, sở thích là được ngủ nướng và đọc truyện cả ngày, ngoài ra tớ còn có ước mơ là từ năm 30 tuổi mỗi năm được đi một nước, hy vọng đến năm 90 tuổi vẫn đi chơi được :v.
So sánh 3 thuật toán sensor fusion trên IMU
Mình viết cái Kalman đã lâu, nhưng gần đây nghỉ Tết mới có thời gian coi lại và phát hiện ra một rổi bug :3 thế là viết lại, và sau khi viết lại + ăn ngủ, chơi Civilization, đây là kết quả so sánh 3 thuật toán - complementary, madgwick và kalman trong điều kiện gần-như-được-soft-mounting-trên-drone (nói chung là thêm mấy cái đệm cao su thôi :)) ) và kéo throttle ầm ầm lên cho có tí nhiếu
Quaternion Based Extended Kalman Filter for IMU
Đây là phần cuối trong series 3 bài quaternion :3 delay cả mùa hè cho một bài khá có tâm :3 hy vọng bài viết này sẽ hữu dụng cho ai muốn tìm hiểu về quaternion và Kalman Filter
Kiến trúc Mobilenet
Thực sự mấy hôm nay thử cài lại mobilenet mà khó khăn quá :( viết note tổng hợp lại vậy :( (hong phải lấy keras ra đâu :3)
1.Depthwise Separate Convolutional
Xe tự lái có chọi lại ninja Lead ??? :D ???
1.Xe tự lái là cái chi chi :#
Search google là biết rùi đó :)))))))))))))))))))
Text classification tiếng Việt và ứng dụng trong chatbot
1.Thư viện NLP underthesea
Convolutional neural networks có gì đó sai sai :3
Nay được nghỉ Mác, ngồi nhà chán nên viết :3 với cũng chưa thấy bài nào nói về CNN có gì sai bằng tiếng Việt, có gì viết sau này làm blog :))) *Bài được tham khảo (chưa thể nói là dịch từ https://towardsdatascience.com/what-is-wrong-with-convolutional-neural-networks-75c2ba8fbd6f)
1.CNN là gì?
CNN là một loại mạng neuron phổ biến và có hiệu quả rất cao, được ứng dụng rất nhiều trong xử lý ảnh,….
Facenet là gì, có ăn được hem :3
Hết nghỉ hè rồi :( quyết định viết gì đó cho đỡ chán