一、有啥用

这里用的是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. 关于RPC

    简单的说,RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果. RPC 会隐藏底层的通讯细节(不需要直接处理Socket通讯 ...

  2. UrlPager免费分页控件2.0版发布!

    UrlPager是一个ASP.NET WebForm应用程序中通过url进行分页的分页控件,支持使用url路由来生成自定义的分页url.与AspNetPager不同,UrlPager需.NET Fra ...

  3. MATLAB寻找数组前k个大值

    有时候我们需要寻找数组的前k个大值并按照顺序输出, 在C语言可以通过快速排序等算法,快速求得,这里用matlab写了一个比较简单实用的程序(适用于数组长度不是特别大的情况). function [va ...

  4. CSS无序列实现表宽度自适应的表格

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. ExtJS入门实例

    一.去官网下载EXTJS包extjs5,这里采用的是5.0版本! 二.解压extjs包,找到 ext-all.js基础包(\ext-5.0.0\build): ext-all-debug.js基础包, ...

  6. 开园第一篇 - 论移动开发环境 IOS与Android的差异

    首先,在真正写技术之前做个自我简介.本人08年开始学c语言 一年后,转vc++.开始接触MFC MFC做了两年.转眼11年了我考上了一个不知名的大专.搞C++发现没有市场了因为当时酷狗腾讯的软件已经日 ...

  7. CodeForces 743C Vladik and fractions (数论)

    题意:给定n,求三个不同的数满足,2/n = 1/x + 1/y + 1/z. 析:首先1是没有解的,然后其他解都可以这样来表示 1/n, 1/(n+1), 1/(n*(n+1)),这三个解. 代码如 ...

  8. C# 实现 任意多边形切割折线算法

    1.    内容简介 本文旨在解决任意多边形切割折线,获取切割之后的折线集合. 本文实现的算法内容包括:判断两条线段是否相交,如若相交,获取交点集合.对线上的点集,按斜率方向排序.判断点是否在多边形内 ...

  9. Java Environment Setting

    As a non-Java developer, I am quit stuck in Java environment setting because I am not familiar with ...

  10. IOS竖屏应用单个页面横屏的解决办法

    昨天朋友问我,怎么实现在竖屏的应用里,显示一个横屏的应用,由于也没做过 就说不知道了,但是我觉得会有这样的API ,因为我手机里就安装有这种类型的软件 今天早上起来,就想做一个Demo出来,惯例的是查 ...