# Low-pass filter import random RC = 0.05 # time constant (inertion) DT = 0.02 # sampling time A = DT/( RC + DT) #A = 0.45 xk_1 = 0 print "Measured;Filtered" for i in xrange(0, 200): xm = random.randint(0, 2) # Both are equals: #xk = A*xm + (1-A)*xk_1 xk = xk_1 + A * (xm - xk_1) print "%d;%f" % (xm, xk) xk_1 = xkWith RC (tau) we can control inertia of the filter
![]() |
RC=0.5 |
![]() |
RC=0.05 |
Here is the example how looks low-pass filter with tilt angles (F-16 seems to be more stable):
HMC6343 demo 1 from bapcyk on Vimeo.
If you try to filtering tilt angles then you can see funny effect: turning of 3D model! It's happens due to error in sensor data which filter try to smooth, see image:
Near the scale edges error seems to be small, but angles may be, for ex., 10°, 350°, and filter will smooth their to 10°, 20°, 30°... 340°. And you can see rotation of the model on the screen.
One of the approach to avoid this problem is to normalize angles. For example, 10°, 350° may be converted to 10°, -10°. After such normalization angles great then 360° should be normalized to canonical range. Algorithm is easy:
absdiff = abs(v1 - v0) if absdiff > 180.: d = 360. - absdiff if v0 > v1: v1 = v0 + d else: v1 = v0 - dAnd after filtering to avoid values great then 360° we can use something like this:
if abs(v) >= 360.: v = v % 360.
Комментариев нет:
Отправить комментарий
Thanks for your posting!