Chia sẻ Đọc dữ liệu từ cảm biến MPU6050 dùng bộ lọc Kalman (code for PIC)

#31
e ko hiểu lắm về cách kết hợp accelerometer với gyro, ai có thể giải thích rõ hơn giúp e đc ko, thank!
 

phamsang9x93

Học sinh phổ thông
#32
float kalmanCalculate(float newAngle, float newRate, int16 looptime)
{
float dt = (float)(looptime)/1000;
x_angle += dt * (newRate - x_bias);

//! P_00 += - dt * (P_10 + P_01) + Q_angle * dt;
P_00 += dt * (dt*P_11 - P_01 - P_10 + Q_angle);
//! P_01 += - dt * P_11;
P_01 -= dt * P_11;
//! P_10 += - dt * P_11;
P_10 -= dt * P_11;
//! P_11 += + Q_gyro * dt;
P_11 += Q_gyro * dt;

S = P_00 + R_angle;

K_0 = P_00 / S;
K_1 = P_10 / S;

y = newAngle - x_angle;

x_angle += K_0 * y;
x_bias += K_1 * y;

P_00 -= K_0 * P_00;
P_01 -= K_0 * P_01;
P_10 -= K_1 * P_00;
P_11 -= K_1 * P_01;

return x_angle;
}

chỗ float dt = (float)(looptime)/1000; thì giá trị looptime lấy ở đâu ra vậy bạn?
 

yenninh86

Học sinh phổ thông
#33
uhm... vì con 16F877A mạnh quá nên mình chỉ có thể làm vậy thôi... còn Y và Z sẽ viết tương tự... ^^" nhưng nếu bạn add thêm Y vào chẳng hạn.. :::^^::: thì ROM, RAM gì nó cũng tràn hết trụi... ^^"
hihihi, nếu dùng bộ lọc kalman thì không thể tính dc trục z của con này đâu nha. pải dùng DMP mới tính dc. hơi rắc rối một chút nhưng chịu khó thì oke. up file tính toán sử dụng bộ lọc klman, chương trình của mình viết trên stm32f4 disc
 

Đính kèm

tam762410

Sinh viên đại học
#34
Lấy matlab bụp một phát là xong khỏi cần tính toán chi cho mệt.. Chỉ cần xác định ma trận A, H,Q,R là được.... Trong simulink có hổ trợ cho ta một khối kalman filter lấy ra mà xài.
 

yenninh86

Học sinh phổ thông
#35
Lấy matlab bụp một phát là xong khỏi cần tính toán chi cho mệt.. Chỉ cần xác định ma trận A, H,Q,R là được.... Trong simulink có hổ trợ cho ta một khối kalman filter lấy ra mà xài.
lí thuyết thì xám xịt còn cây đời mãi mãi xanh tươi
 

8051topic

Sinh viên đại học
#36
Hi bạn yenninh86 , bạn có thể cho mình 1 project demo thử đo góc có lọc Kalman được không a5h, mình không hiểu mấy cái P, Q, R lắm a5h! hihi

Thank bạn!
 

tam762410

Sinh viên đại học
#37
Hi bạn yenninh86 , bạn có thể cho mình 1 project demo thử đo góc có lọc Kalman được không a5h, mình không hiểu mấy cái P, Q, R lắm a5h! hihi

Thank bạn!
Bạn đọc lại lý thuyết bộ lọc kalman thì sẽ hiểu.. Thông thường Q và R là tự mò.. Mò sao cho đáp ứng tốt thì lấy.... Nhưng nếu thấy nuốt khó trôi cái kalman này bạn cũng có thể sử dụng bộ lọc bù nó cũng cho thể cho kết quả tương tự..(
MPU-6050 Data with a Complementary Filter - YouTube )..
Thân chào bạn...
 

tam762410

Sinh viên đại học
#38
e ko hiểu lắm về cách kết hợp accelerometer với gyro, ai có thể giải thích rõ hơn giúp e đc ko, thank!
Tại sao phải kết hợp cả ACC và Gyro ?..
Đơn giản đó là do đặc điểm tính chất của nó...
Acc : anh này có đặc điểm là rất manh động.. Điều này thấy khá rõ khi bạn tính góc từ Acc. Bạn lắc mạnh cảm biến rồi sẽ thấy.. Bạn một góc chừng 20 độ nó có thể đưa ra cho bạn một góc là 7 8 chục.. Kinh hoàng. Đợt trước làm xe tự cân bằng muốn khóc vì em này...!!.. Nhưng bù lại góc tính từ Acc sẽ không bị trôi..!..
Còn Gyro chị này thì không manh động như anh Acc... Quá tuyệt..!... Nhưng chị này có một điểm xấu là để chỉ nằm yên góc tính từ Gyro vẫn bị thay đổi.. Tăng hay giảm thì không biết.. Để em MPU nằm yên chừng 5 phút góc tính sẽ bị lệch một khúc.... Này mà đưa vào PID gì gì đó thì banh xác..
Vì thế cần kết hợp cả Acc và Gyro để đưa ra góc chính xác nhất. Tránh hiện tượng trôi và manh động...
Ví dụ trong code kalman của mấy sư huynh trên kia thì float newAngle: là góc tính từ Acc đó bạn....

Theo mình là vậy, thân chào bạn...:D..
 

chiefpro

Học sinh trung cấp
#39
Mấy bác cho em hỏi cách chống nhiễu khi đọc giá trị vận tốc và gia tốc góc, làm sao mình calib lại tín hiệu để khi để yên cảm biến thì vận tốc theo các trục đều bằng 0 ? Cảm ơn mấy bác nhiều.
 

tam762410

Sinh viên đại học
#40
Mấy bác cho em hỏi cách chống nhiễu khi đọc giá trị vận tốc và gia tốc góc, làm sao mình calib lại tín hiệu để khi để yên cảm biến thì vận tốc theo các trục đều bằng 0 ? Cảm ơn mấy bác nhiều.
Đơn giản lắm bạn ạ.. Nhưng giá trị Acc thì khỏi cần calib.. Chúng ta chi cần calib giá trị Gyro thôi...
Để calib giá trị Gyro khởi tạo chương trình bạn để chị MPU nằm yên, cắm xâm phạm đến chỉ.... Bạn đọc giá trị Gyro của từng trục khoảng vài trăm lần sau đó lấy giá trị trung bình... Giá trị trung bình đó chính là Offset của từng trục..

Mổi lần lấy giá trị về bạn chỉ cần - Offset đi là bạn đã calib được em MPU6050 xinh đẹp...
Thân chào bạn....... :D...
 

Quảng cáo Google