[算法][三軸、六軸、九軸傳感器算法分析] 一、分享一個三軸加速計matlab動態可視化腳本

 

 

1、有啥用數組

    這裏用的是LIS3DH三軸加速計,輸出爲X、Y、Z軸的加速度,經過串口鏈接電腦,電腦裏運行matlab腳本經過串口實時獲取數據並作可視化顯示。函數

    這裏雖然是針對LIS3DH的,其實稍做修改便可適用其餘型號的運動傳感器,如:MPU6050,甚至是其餘格式的串口數據。工具

 

2、具體分析spa

    首先經過串口傳來的數據格式爲:6位X軸加速計整數+空格+6位Y軸+空格+6位Z軸+換行.net

printf("%6d %6d %6d\r\n", data.AXIS_X/16, data.AXIS_Y/16, data.AXIS_Z/16);

 

    那麼matlab如何讀取串口並對其數據進行可視化展現的呢?code

serial.mblog

 1 %http://blog.csdn.net/qwertyuj/article/details/12108155%
 2 clc;
 3 
 4 global t;
 5 global x;
 6 global ii;%數組下標
 7 
 8 global m_x;%3軸加速度
 9 global m_y;
10 global m_z;
11 
12 global d_a;%差分
13 
14 t = [0];
15 ii = 0;
16 x = -100;
17 
18 m_x = [0];
19 m_y = [0];
20 m_z = [0];
21 d_a = [0];
22 
23 subplot(1,2,1);%將x,y,z軸加速度圖像繪製在整個1X2界面中的第1格 24 p = plot(t,m_x,t,m_y,t,m_z,'EraseMode','background','MarkerSize',5);%初始化圖像,圖像中有3條線(t,m_x),(t,m_y),(t,m_z) 25 axis([x-200 x+200 -1600 1600]);%設置顯示窗口,前兩個是x軸的最小、最大極限;後兩個是y軸最小、最大極限 26 grid on;%繪製網格(若是不加這句就不繪製網格) 27 subplot(1,2,2);
28 q = plot(t,d_a,'EraseMode','background','MarkerSize',5);%同理,這裏只有一條線
29 axis([x-200 x+200 -1600 1600]);
30 grid on;
31 
32 %%
33 
34 try
35     s=serial('com5');
36 catch
37     error('cant serial');
38 end
39 set(s,'BaudRate', 38400,'DataBits',8,'StopBits',1,'Parity','none','FlowControl','none');%設置串口屬性等 40 s.BytesAvailableFcnMode = 'terminator';
41 s.BytesAvailableFcn = {@callback,p,q};%設置串口回調函數,串口有數據傳輸過來就會轉到回調函數,p、q爲參數 42 
43 fopen(s);%打開串口
44 
45 pause;%按任一按鍵結束
46 fclose(s);
47 delete(s);
48 clear s
49 close all;
50 clear all;

  該文件是主文件,首先聲明各類全局變量(matlab全局變量其餘函數使用時須要用global聲明),而後對這些全局變量初始化,接着實例化兩個繪圖窗口(第一個窗口3條線——分別是x、y、z三軸的加速度隨時間變化曲線;第二個窗口一條線——是差分隨時間變化曲線)。34行以後爲設置串口、打開串口,接下來動態繪圖全部操做均在回調函數中進行了。回調函數

     來看看回調函數it

callback.m io

 1 %%  
 2 function callback(s,BytesAvailable,p,q)  
 3       
 4 global t; %引用全局變量(4-12行) 5 global x; 6 global ii;%數組下標 7 8 global m_x;%3軸加速度 9 global m_y; 10 global m_z; 11 12 global d_a;%差分 13     
14 out = fscanf(s);%讀取串口數據,轉換爲num數據存儲在data中 15 data = str2num(out); 16 
17 t = [t ii];%數組插入最新數據在最後面 18 m_x = [m_x data(1,1)]; 19 m_y = [m_y data(1,2)]; 20 m_z = [m_z data(1,3)]; 21     
22 d_a = [d_a abs(m_x(1,ii+2)-m_x(1,ii+1))+abs(m_y(1,ii+2)-m_y(1,ii+1))+abs(m_z(1,ii+2)-m_z(1,ii+1))]; 23     
24 
25 set(p(1), 'XData',t,'YData',m_x(1,:));%用新數據更新圖 26 set(p(2), 'XData',t,'YData',m_y(1,:)); 27 set(p(3), 'XData',t,'YData',m_z(1,:)); 28 29 set(q(1), 'XData',t,'YData',d_a(1,:)); 30 
31 drawnow %從新繪製圖,並移動兩個圖的窗口,使之呈現運動效果 32 x = x + 1; 33 subplot(1,2,1) 34 axis([x-200 x+200 -1600 1600]); 35 subplot(1,2,2) 36 axis([x-200 x+200 -1600 1600]); 37 ii=ii+1;  38 end 

  每次串口有數據均會觸發回調函數。在回調函數中,首選獲取串口流,並將串口數據流轉換爲data數組。接着用讀取的新的data數據插入到老的數組(17~22行)。第25~29行則是用新的3+1個曲線的數據更新圖。第31行以後的負責移動視窗,使之呈現出數據在滾動的效果。

 

3、最終效果

 

4、樓主講話

好長時間沒寫文章了!就拿這個水水的小工具做爲開篇~ 

相關文章
相關標籤/搜索