一、有啥用

这里用的是LIS3DH三轴加速计,输出为X、Y、Z轴的加速度,通过串口连接电脑,电脑里运行matlab脚本通过串口实时获取数据并做可视化显示。

这里虽然是针对LIS3DH的,其实稍作修改即可适用其他型号的运动传感器,如:MPU6050,甚至是其他格式的串口数据。

二、具体分析

首先通过串口传来的数据格式为:6位X轴加速计整数+空格+6位Y轴+空格+6位Z轴+换行

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

那么matlab如何读取串口并对其数据进行可视化展示的呢?

serial.m

 %http://blog.csdn.net/qwertyuj/article/details/12108155%
clc; global t;
global x;
global ii;%数组下标 global m_x;%3轴加速度
global m_y;
global m_z; global d_a;%差分 t = [0];
ii = 0;
x = -100; m_x = [0];
m_y = [0];
m_z = [0];
d_a = [0]; 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;%绘制网格(如果不加这句就不绘制网格)
subplot(1,2,2);
q = plot(t,d_a,'EraseMode','background','MarkerSize',5);%同理,这里只有一条线
axis([x-200 x+200 -1600 1600]);
grid on; %% try
s=serial('com5');
catch
error('cant serial');
end
39 set(s,'BaudRate', 38400,'DataBits',8,'StopBits',1,'Parity','none','FlowControl','none');%设置串口属性等
s.BytesAvailableFcnMode = 'terminator';
41 s.BytesAvailableFcn = {@callback,p,q};%设置串口回调函数,串口有数据传输过来就会转到回调函数,p、q为参数

fopen(s);%打开串口 pause;%按任一按键结束
fclose(s);
delete(s);
clear s
close all;
clear all;

  该文件是主文件,首先声明各种全局变量(matlab全局变量其他函数使用时需要用global声明),然后对这些全局变量初始化,接着实例化两个绘图窗口(第一个窗口3条线——分别是x、y、z三轴的加速度随时间变化曲线;第二个窗口一条线——是差分随时间变化曲线)。34行之后为设置串口、打开串口,接下来动态绘图所有操作均在回调函数中进行了。

     来看看回调函数

callback.m

 %%
function callback(s,BytesAvailable,p,q) 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;%差分

14 out = fscanf(s);%读取串口数据,转换为num数据存储在data中
15 data = str2num(out);

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)];

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))];
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,:));

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;
end

  每次串口有数据均会触发回调函数。在回调函数中,首选获取串口流,并将串口数据流转换为data数组。接着用读取的新的data数据插入到老的数组(17~22行)。第25~29行则是用新的3+1个曲线的数据更新图。第31行之后的负责移动视窗,使之呈现出数据在滚动的效果。

三、最终效果

四、楼主讲话

好长时间没写文章了!就拿这个水水的小工具作为开篇~

[算法][三轴、六轴、九轴传感器算法分析] 1、分享一个三轴加速计matlab动态可视化脚本的更多相关文章

  1. 第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索功能

    第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索功能 Django实现搜索功能 1.在Django配置搜索结果页的路由映 ...

  2. SLAM+语音机器人DIY系列:(三)感知与大脑——2.带自校准九轴数据融合IMU惯性传感器

    摘要 在我的想象中机器人首先应该能自由的走来走去,然后应该能流利的与主人对话.朝着这个理想,我准备设计一个能自由行走,并且可以与人语音对话的机器人.实现的关键是让机器人能通过传感器感知周围环境,并通过 ...

  3. 第三十六个知识点:Index Calculus算法

    第三十六个知识点:Index Calculus算法 我们这篇博客继续描述一种数学攻击,这种数学攻击被叫做Index Calculus(IC)算法. 注意这里Index Calculus算法没有找到合适 ...

  4. NeHe OpenGL教程 第三十六课:从渲染到纹理

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  5. 程序员编程艺术第三十六~三十七章、搜索智能提示suggestion,附近点搜索

    第三十六~三十七章.搜索智能提示suggestion,附近地点搜索 作者:July.致谢:caopengcs.胡果果.时间:二零一三年九月七日. 题记 写博的近三年,整理了太多太多的笔试面试题,如微软 ...

  6. 第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询

    第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询 1.elasticsearch(搜索引擎)的查询 elasticsearch是功能 ...

  7. 为什么我要放弃javaScript数据结构与算法(第六章)—— 集合

    前面已经学习了数组(列表).栈.队列和链表等顺序数据结构.这一章,我们要学习集合,这是一种不允许值重复的顺序数据结构. 本章可以学习到,如何添加和移除值,如何搜索值是否存在,也可以学习如何进行并集.交 ...

  8. 剑指Offer(三十六):两个链表的第一个公共结点

    剑指Offer(三十六):两个链表的第一个公共结点 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...

  9. Java进阶(三十六)深入理解Java的接口和抽象类

    Java进阶(三十六)深入理解Java的接口和抽象类 前言 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太 ...

随机推荐

  1. Linq To Nhibernate 性能优化(入门级)

    最近都是在用Nhibernate和数据库打交道,说实话的,我觉得Nhibernate比Ado.Net更好用,但是在对于一些复杂的查询Nhibernate还是比不上Ado.Net.废话不多说了,下面讲讲 ...

  2. Android自定义View之CircleView

    Android自定义View之CircleView 版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:http://www.cnblogs.com/cavalier-/p/5999 ...

  3. Process类

    public bool Process.Start () 启动(或重用)此 Process 组件的 StartInfo 属性指定的进程资源,并将其与该组件关联. public bool Process ...

  4. win7/win8远程桌面 server 2003 卡的问题

    原因在于从vista开始,微软在TCP/IP协议栈里新加了一个叫做“Window Auto-Tuning”的功能.这个功能本身的目的是为了让操作系统根据网络的实时性能(比如响应时间)来动态调整网络上传 ...

  5. SVN版本控制系统

    SVN 版本控制系统 1.SVN作用 防止代码丢失 : 因为没有哪个项目能够一次性开发完成 代码版本回退 : 你可以在开发过程中找到以前上传到服务器上面的所有版本 多人代码整合 : 公司中多个人开发同 ...

  6. Linux三剑客之sed

    sed sed对文本的处理很强大,并且sed非常小,参数少,容易掌握,他的操作方式根awk有点像.sed按顺序逐行读取文件.然后,它执行为该行指定的所有操作,并在完成请求的修改之后的内容显示出来,也可 ...

  7. MATLAB cvx 工具包使用

    一个例子 m = ; n = ; p = ; A = randn(m,n); b = randn(m,); C = randn(p,n); d = randn(p,); e = rand; cvx_b ...

  8. 浅谈城市规划在移动GIS方面的应用发展

    1.概述 城市建设进程加快,城市规划管理工作日趋繁重,各种来源的数据产生各种层出不穷的问题,严重影响城市规划时的准确性,为此全面合理的掌握好各方面的城市规划资料才能做出更加科学的决策.移动端的兴起为规 ...

  9. 【Visual Lisp】两种出错处理方式

    两种出错处理方式:一种是对出错函数进行重定义,一种是对错误进行捕捉处理. ;;============================================================= ...

  10. 总有一项适合你:联想 Miix2 8寸版触摸屏失灵的各项解决方案

    今天试着自己拆开后盖重新拆了一下排线,果然这个方法才是王道.在搜索攻略的时候看到了下面的帖子,觉得总结的不错,特此转载过来:     白色石头 2015-05-22 10:07● 使用评测   总有一 ...