三轴加速度传感器和六轴惯性传感器_[算法][三轴、六轴、九轴传感器算法分析] 1、分享一个三轴加速计matlab动态可视化脚本...
一、有啥用
這里用的是LIS3DH三軸加速計(jì),輸出為X、Y、Z軸的加速度,通過(guò)串口連接電腦,電腦里運(yùn)行matlab腳本通過(guò)串口實(shí)時(shí)獲取數(shù)據(jù)并做可視化顯示。
這里雖然是針對(duì)LIS3DH的,其實(shí)稍作修改即可適用其他型號(hào)的運(yùn)動(dòng)傳感器,如:MPU6050,甚至是其他格式的串口數(shù)據(jù)。
二、具體分析
首先通過(guò)串口傳來(lái)的數(shù)據(jù)格式為:6位X軸加速計(jì)整數(shù)+空格+6位Y軸+空格+6位Z軸+換行
printf("%6d %6d %6d\r\n", data.AXIS_X/16, data.AXIS_Y/16, data.AXIS_Z/16);
那么matlab如何讀取串口并對(duì)其數(shù)據(jù)進(jìn)行可視化展示的呢?
serial.m
1 %http://blog.csdn.net/qwertyuj/article/details/12108155%
2 clc;3
4 globalt;5 globalx;6 global ii;%數(shù)組下標(biāo)7
8 global m_x;%3軸加速度9 globalm_y;10 globalm_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軸加速度圖像繪制在整個(gè)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]);%設(shè)置顯示窗口,前兩個(gè)是x軸的最小、最大極限;后兩個(gè)是y軸最小、最大極限
26 grid on;%繪制網(wǎng)格(如果不加這句就不繪制網(wǎng)格)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');%設(shè)置串口屬性等40 s.BytesAvailableFcnMode = 'terminator';41 s.BytesAvailableFcn = {@callback,p,q};%設(shè)置串口回調(diào)函數(shù),串口有數(shù)據(jù)傳輸過(guò)來(lái)就會(huì)轉(zhuǎn)到回調(diào)函數(shù),p、q為參數(shù)42
43 fopen(s);%打開(kāi)串口44
45 pause;%按任一按鍵結(jié)束46 fclose(s);47 delete(s);48 clear s49 close all;50 clear all;
該文件是主文件,首先聲明各種全局變量(matlab全局變量其他函數(shù)使用時(shí)需要用global聲明),然后對(duì)這些全局變量初始化,接著實(shí)例化兩個(gè)繪圖窗口(第一個(gè)窗口3條線——分別是x、y、z三軸的加速度隨時(shí)間變化曲線;第二個(gè)窗口一條線——是差分隨時(shí)間變化曲線)。34行之后為設(shè)置串口、打開(kāi)串口,接下來(lái)動(dòng)態(tài)繪圖所有操作均在回調(diào)函數(shù)中進(jìn)行了。
來(lái)看看回調(diào)函數(shù)
callback.m
1 %%
2 function callback(s,BytesAvailable,p,q)3
4 global t; %引用全局變量(4-12行)
5 global x;
6 global ii;%數(shù)組下標(biāo)
7
8 global m_x;%3軸加速度
9 global m_y;
10 global m_z;
11
12 global d_a;%差分13
14 out = fscanf(s);%讀取串口數(shù)據(jù),轉(zhuǎn)換為num數(shù)據(jù)存儲(chǔ)在data中
15 data = str2num(out);16
17 t = [t ii];%數(shù)組插入最新數(shù)據(jù)在最后面
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,:));%用新數(shù)據(jù)更新圖
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 %重新繪制圖,并移動(dòng)兩個(gè)圖的窗口,使之呈現(xiàn)運(yùn)動(dòng)效果
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
每次串口有數(shù)據(jù)均會(huì)觸發(fā)回調(diào)函數(shù)。在回調(diào)函數(shù)中,首選獲取串口流,并將串口數(shù)據(jù)流轉(zhuǎn)換為data數(shù)組。接著用讀取的新的data數(shù)據(jù)插入到老的數(shù)組(17~22行)。第25~29行則是用新的3+1個(gè)曲線的數(shù)據(jù)更新圖。第31行之后的負(fù)責(zé)移動(dòng)視窗,使之呈現(xiàn)出數(shù)據(jù)在滾動(dòng)的效果。
三、最終效果
四、樓主講話
好長(zhǎng)時(shí)間沒(méi)寫(xiě)文章了!就拿這個(gè)水水的小工具作為開(kāi)篇~
總結(jié)
以上是生活随笔為你收集整理的三轴加速度传感器和六轴惯性传感器_[算法][三轴、六轴、九轴传感器算法分析] 1、分享一个三轴加速计matlab动态可视化脚本...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: win10下载东西黑屏怎么办啊 Win1
- 下一篇: 47_pytorch循环神经网络(学习笔