Go Down

Topic: Guide to gyro and accelerometer with Arduino including Kalman filtering (Read 313 times) previous topic - next topic

psyoptica

Thanks for clearing it up. Will definitely have to get a converter circuit then..

brianb00

I see a lot of experience embedded in this thread, so I have a question about any noticed issues with the LSM303DLM or DLH regarding bad readings in abrupt changes in orientation. Abrupt is defined as peak accelerations of about 3 g's in all directions.  I am experiencing abrupt / large heading changes in a tilt compensated compass implemented with this device.  In relatively "flat" conditions I don't see failures, but in severe conditions, especially sharp pitch (dx/dt) and sharp roll (dy/dt) I seem to get non linear readings. I say I seem, because as of yet I have not captured the case live as trials are expensive to duplicate in my moving platform. 

My question is two fold:

1) Has anyone experienced big non linear results in the accelerometers ?
2) Has anyone noticed big non linear results in the magnetometer that are somehow induced with strong acceleration ?

My application is using a 9DOF IMU and I have wrapped the sensors in filters that limit rate of change of data as well as do a variety of selectable filter algorithms.

Regards,
Brian

doantrungnghia05

#417
Mar 28, 2013, 03:30 pm Last Edit: Mar 28, 2013, 03:32 pm by doantrungnghia05 Reason: 1
Hi Lauszus,

I have read your codes about the gyro sensor and it's very helpfull. So thank you about it. Now i try to modify your code to my quadrotor project but it stills have some problem about "gyro drift". I know that i have to use the Kalmal filter but my board just only has 3 angular rate sensors (the gyro sensor as i think) and have no accelerometer, so i don't know how to use the Kamal filter. Could you take a look at my problem in here:
http://arduino.cc/forum/index.php/topic,156912.0.html

And could you show me some simple equation like the Complementary Filter which can aplly to my board.

Regards,
Nghia

Lauszus

@brianb00
I haven't got much experience with magnetometers, sorry.

@doantrungnghia05
The Kalman I filter I wrote can't be used without an accelerometer. The easiest thing would be to use a digital high-pass filter.

doantrungnghia05

#419
Mar 29, 2013, 02:13 am Last Edit: Mar 29, 2013, 02:15 am by doantrungnghia05 Reason: 1

@brianb00
I haven't got much experience with magnetometers, sorry.

@doantrungnghia05
The Kalman I filter I wrote can't be used without an accelerometer. The easiest thing would be to use a digital high-pass filter.


Thank Lauszus, here is my board, i bought it because in the internet many people use this board and they also buid their quad fly, but they just assembly these things like: motors, rf-controller, ...together without writing any code for the uController.

1.Kk_board datasheet: http://www.kkmulticopter.com/downloads/resources/KKmulticontroller%20v.5.5.pdf

2.The angular rate sensor use in kk board: (ENC series) http://www.murata.com/products/catalog/pdf/s42e.pdf

http://www.youtube.com/watch?v=MRSKs7iZbRQ

My code is C++ for atmega168pa and i know this forum is about adruino, but i think my code is very cleary and easy to understand. Here is it:

Code: [Select]
/************************************************************************/
/*  MAIN FUNTION                                                       */
/************************************************************************/
int main(void)
{
CLKPR=0x80;
CLKPR=0x00;

//----------- system init --------------------
sei();
usart_init();
adc_sensor_init();
led_init();
motor_control_init();
motor_start();
DDRB|=(1<<PINB3);// measure loop time for cheking
//-----------------------------------------------------------
//---------- update the zero value ---------
adc_sensor_get_value();
roll_zero=roll_adc;//~=824
yaw_zero=yaw_adc;//~=816
pitch_zero=pitch_adc;//~=846
roll_angle=360;
yaw_angle=360;
pitch_angle=360;
//----------------------------------------------------------
timer2_start();//start measure system time by timer2
_delay_ms(2000);
led_on();
while(1)
   {
//--------------   get value in 3 sensors -----------------------
PORTB^=(1<<PINB3);// toogle this pin per main loop
adc_sensor_get_value();//

//-------- just process roll gyro--------------------------------------------------------------
if(roll_adc<roll_zero)
{
roll_rate=(roll_zero-roll_adc)/sensitivity;//tinh toc do goc theo phuong roll [degree/s]
roll_angle-=roll_rate*dtime/1000;//tra ve gia tri degree theo phuong roll [degree]
}

if(roll_adc>roll_zero)
{
roll_rate=(roll_adc-roll_zero)/sensitivity;//tinh toc do goc theo phuong roll [degree/s]
roll_angle+=roll_rate*dtime/1000;//tra ve gia tri degree theo phuong roll [degree]
}
//---------------------------------------------------------------------------------------------

usart_clr();
usart_print_nb(roll_angle);//print roll_angle to computer screen

//----------------------- creat fixed_loop_time= 25ms per loop---------------------------------
loop_usefull_time=sys_time-last_time;
if(loop_usefull_time<fixed_loop_time)
{
for(i=0;i<(fixed_loop_time-loop_usefull_time);i++)
{
_delay_ms(1);
}
}
dtime=sys_time-last_time;//dtime=time per main loop (ms)
last_time=sys_time;//update the last_time value for the next loop
//------------------------------------------------------------------------------------------
   }
}

ISR(TIMER2_OVF_vect)//when the timer2 over flow we have: sys_time=sys_time +1(ms)
{ // so we can caculate the dtime( time per main loop)
sys_time+=1;  
TCNT2=130;
}

In my board, the three gyro sensors also have the high-pass filter as you say, but it still drifs.
Could you take a look at my "gyro drift" problem and show me how to fix it ?

Regrard,
Nghia

Go Up