×

步态分析仪和可穿戴运动传感设备

消耗积分:0 | 格式:zip | 大小:0.14 MB | 2022-12-19

张波

分享资料个

描述

关于。

该项目旨在为医疗保健等不同用途创建一种创新的运动跟踪设备,RSL10 EVK 板通过提供可立即使用的完整解决方案带来新的可能性,从而简化开发。重点是跟踪运动,一种是医疗保健提供者感兴趣的步态分析。如果最终产品未实现,则该产品的工作证明是可行的,并且是可替代现有商业产品的低成本解决方案。

步态分析仪。

个人的步行表现会有所不同,医生已经注意到某些疾病或状况会改变它,例如帕金森、中风、骨科和老年人。有许多关于步态分析的研究及其与这些条件的关联,即有研究表明老年人的步态速度与生存率之间存在关联(Studenski et al., 2011

一个非常典型的步态测试是在走廊中进行的,距离可能会因个人或医疗保健提供者的需要而异。

pYYBAGOYepSAQd5HAAAgspLo3Hs199.png
典型的步态测试
 

便携式应用中的 RSL10 SENSE。

RSL10 SENSE EVK 具有应用程序所需的所有传感器,实际上它比实际需要的传感器多一些,这在某些应用程序中可能是有益的。

以下是一些板载传感器的简要介绍。

poYBAGOYepaAUb2uAABIy2mzsWo975.png
RSL10 感知 EVK。
 

RSL10 SENSE EVK 带有一个纽扣电池连接器,非常适合便携式应用。

夹具。

EVK 板很小,而且由于每个电子设备都很脆弱,并且对不正确处理造成的损坏很敏感,为了最大限度地减少测试过程中可能造成的损坏,我们使用了一个小型 3D 容器。

例如,借助钩环紧固件,3d 外壳可以安装到人鞋中,但其他身体部位也是可能的。

软件。

该设备可以很容易地商业化,但需要在定制软件上进行艰苦的工作,这不是该项目的目标。这里的目的是利用ON和博世公司的最新技术加快步态分析的发展和帮助研究。对于软件,我决定使用MATLAB ,因为它可以轻松连接并具有所有后处理工具来分析它。

使用的固件是 SDK 示例中提供的自定义服务协议固件,即sense_ics_firmware

MATLAB有一个使用非常方便的蓝牙低功耗通信库,你的电脑必须有一个4.0 BLE适配器,你可以通过以下方式连接BLE设备

b = ble(Address);

其中地址是您的 BLE RSL10 地址。就我而言,我通过之前运行blelist命令找到了该地址

pYYBAGOYepiAZC5WAAAkpqwwriA991.png
blelist 命令输出。
 

使用ble命令连接后,可以知道特征

poYBAGOYepuAEJLOAAA2L_5Jehg916.png
ble 命令输出
 

也可以显示特征

poYBAGOYep2AIghWAACxR9OpCj8153.png
RSL10 SENSE 特性
 

为了从传感器查询和接收数据,我们使用上面看到的两个自定义特征,我们通过这样做来设置

rxc = characteristic(b, "E093F3B5-00A3-A9E5-9ECA-40016E0EDC24", "E093F3B6-00A3-A9E5-9ECA-40026E0EDC24");

txc = characteristic(b, "E093F3B5-00A3-A9E5-9ECA-40016E0EDC24", "E093F3B7-00A3-A9E5-9ECA-40036E0EDC24");

我们没有修改固件,真正的产品需要修改,默认配置足以每秒获取 5 个样本,此时可以。

但是为了在 Matlab 中接收数据,实现了一个回调函数,这将在后台运行以处理接收到的数据。我们可以通过这样做来安装回调

subscribe(rxc);
rxc.DataAvailableFcn = @displayCharacteristicData;

其中displayCharacteristicData是函数

function displayCharacteristicData(src,evt)
    global i;
    global dv;
    global gv;
    [data,timestamp] = read(src,'oldest');
    c = char(data);
    cs = split(c, '/');
    packet = char(cs(1));
    switch packet
        case 'A'
            acc = split(cs(2), ',');
            dv(i, 1) = str2double(acc(1));
            dv(i, 2) = str2double(acc(2));
            dv(i, 3) = str2double(acc(3));
            dv(i, 4) = i;
        case 'G'
            gyro = split(cs(2), ',');
            gv(i, 1) = str2double(gyro(1));
            gv(i, 2) = str2double(gyro(2));
            gv(i, 3) = str2double(gyro(3));
            gv(i, 4) = i;
        otherwise
            disp('not implemented response-reception');
        end
end

如果不了解数据是如何查询和接收的,就很难理解上述switch case的原因。

我之前设置了一个 segger RT 查看器控制台来查看调试语句的输出,然后运行 ​​android 演示应用程序,其想法是了解查询和解析是如何完成的。

pYYBAGOYeqCAYsnxAAEGv5bEeqU134.png
从 android 应用程序和自定义服务固件应用程序捕获命令。
 

在下面的代码中可以看到加速度计和陀螺仪命令解析是如何实现的。变量是 4 行的数组,前三行包含加速度和陀螺仪的 X、Y 和 Z 分量,最后一个只是跟踪接收到的样本的索引。

编写示例代码以允许在给定时间段内进行采样,然后停止,在这种情况下,每 200 毫秒请求一次采样。

record_length = 60;
sample_rate = 5;       %samples per second.
rsamples = record_length*sample_rate;
i = 1;
dv = zeros(10,4);
gv = zeros(10,4);


disp('start acquisition loop');
% request data every sampling period
while true
    write(txc, 'A/AO/A');               % accel data
    %     write(txc, 'G/AO/AR');        % gyro data
    if(i > rsamples)
        return;
    else
        pause(1/sample_rate);
        i = i + 1;
    end
end

为了加快采样速度,需要对固件进行修改,因为传感器已经配置为每 1/5 秒中断一次。其摘录如下所示,位于文件 CSN_AO.c 中

retval += BHI160_NDOF_EnableSensor(BHI160_NDOF_S_LINEAR_ACCELERATION,
CSN_AO_SensorCallback, 5);

在这种情况下,5 是每秒的采样率。增加采样率是必要的,但也有必要在不影响数据的情况下测试它的速度,在这种情况下,我们每 200 毫秒向自定义特征发送一个 BLE 查询,但随着速度的加快,这可能会带来一些问题。因此,更好的方法可能是重写自定义特征以在缓冲区中保存一些样本并每 200 毫秒传输一次。在这种情况下,回调函数CSN_AO_SensorCallback是开始修改的关键。

但回到我们的测试,在使用 60 秒运行捕获后,我们得到了一个包含 4 行的数组,每行有 300 个样本。

poYBAGOYeqSAcC1CAAAx3A6sYT8479.png
Matlab 中的变量视图。
 

在绘制了一些运动的加速度计数据后,我用手臂在 RSL10 板上做了一些动作。

pYYBAGOYeqeAK2bGAAB8X9WThiw864.png
手臂上/下运动的 Matlab 加速度计图。
 

数据以样本计数而非物理量表示。我尝试使用以下公式转换为 m/s2。

dvmod = (dv/32768)*4*9.80665/3.2808;

似乎必须进一步缩放原始值才能获得 m/s2,不是 100% 肯定,但如果该值以 ft/s2 为单位,则这些值更有意义。上式中,数字 4 为动态范围。

 

poYBAGOYeqmAdkQ2AABZWQZlauE852.png
走在 m/s2 值。
 

 

步态数据采集。

以类似的方式进行了一次小步行以捕获加速度计和陀螺仪数据。

pYYBAGOYequAUYoqAACAfd2cpM0823.png
加速度计步行捕捉。
 
poYBAGOYeq6AAei_AAB8Oe2N7cQ818.png
陀螺仪步行捕捉。
 

结论。

该项目展示了拥有一个低成本平台来研究步态模式和人体一般运动的可行性。它可以移植,SDK 示例是进一步修改的良好起点。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'步态分析仪和可穿戴运动传感设备',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);