2017-02-09 37 views
0

我想实现的目标是尝试增加Tizen智能手表心跳传感器返回值的精度。 值是Float64数字,因为语言是Javascript。 我试图用这样的功能:提高Tizen设备上心跳传感器返回值的精度

function strip(interval) { 
return (parseFloat(interval).toPrecision(4)); 
} 

,但没有成功。也许我做错了什么,比如做一些编程错误,我真的不知道。显然,IDE编译并构建了没有问题的安装包,但是我看不到包含或不包含此功能的其他内容。 我会在下面发布我的整个代码。请检查何时创建功能strip。我使用了escamotage if (interval !== 0) { interval_screen = interval; },因为我不想打印零。请注意,我希望流式传输到ROS主题HeartRateInterval的变量保持为Float;这就是为什么我也使用了parseFloat函数。 谢谢! 代码:

document.addEventListener('tizenhwkey', function(e) { 
    if(e.keyName === "back") 
     window.webapis.motion.stop("HRM"); 
     tizen.application.getCurrentApplication().exit(); 
}); 

function Connect(){ 

var ip; 
var connection=false; 
var interval_screen = 0; 
if (document.getElementById("ip").value==="") 
{ 
    ip="10.42.0.1"; 
} 
else 
{ 
    ip=document.getElementById("ip").value; 
} 

var ros = new ROSLIB.Ros({ 
    url : 'ws://' + ip +':9090' 
    }); 

ros.on('connection', function() { 
    connection=true; 
    document.getElementById("Connection_status").setAttribute("color","green"); 
    document.getElementById("Connection_status").innerHTML = 'Connected'; 
    tizen.power.request("SCREEN", "SCREEN_DIM"); 
}); 

ros.on('error', function(error) { 
    document.getElementById("Connection_status").setAttribute("color","orange"); 
    document.getElementById("Connection_status").innerHTML = 'Error'; 
}); 

ros.on('close', function() { 
    document.getElementById("Connection_status").setAttribute("color","red"); 
    document.getElementById("Connection_status").innerHTML = 'Unconnected'; 
    connection=false; 
    tizen.power.release("SCREEN"); 
}); 

    var RatePub = new ROSLIB.Topic({ 
    ros : ros, 
    name : '/HeartRateData', 
    messageType : 'std_msgs/Float64' 
}); 

var IntervalPub = new ROSLIB.Topic({ 
    ros : ros, 
    name : '/HeartRateInterval', 
    messageType : 'std_msgs/Float64' 
}); 

window.webapis.motion.start("HRM", onchangedCB); 

function onchangedCB(hrmInfo) 
{ 
    var rate = hrmInfo.heartRate; 
    document.getElementById("mytext").innerHTML = 'Heart Rate= ' + rate + ' bpm'; 

    var interval = hrmInfo.rRInterval/1000; 
    function strip(interval) { 
    return (parseFloat(interval).toPrecision(4)); 
    } 
    if (interval !== 0) { 
    interval_screen = interval; 
    } 
    document.getElementById("mytext1").innerHTML = 'RR Interval= ' + interval_screen + ' s'; 

    var Float64 = new ROSLIB.Message({ 
      data:rate 
     }); 

     if(connection===true) 
      { 
      RatePub.publish(Float64); 
      } 
     else 
     { 
      document.getElementById("mytext").innerHTML = 'Heart Rate = 0 bpm'; 
     } 

    var Float64 = new ROSLIB.Message({ 
      data:interval 
     }); 

     if(connection===true) 
      { if (interval !== 0) { 
      IntervalPub.publish(Float64); 
      } 
      else { 

      } 
      } 
     else 
     { 
      document.getElementById("mytext1").innerHTML = 'RR Interval = 0 s'; 
     } 

     }} 
+0

我试着在'var interval = hrmInfo.rRInterval/1000;'之后直接使用'interval.toPrecision(4);'但没有任何变化。我也尝试'parseFloat(interval).toPrecision(4);'具有相同的结果。 @RC NL – Marcofon

回答

0

我失去了一些东西在这里,但我无法找到你实际调用新的功能? 为什么你在onchangedCB函数内部创建它?

它看起来好像您预计该函数将被调用,因为您在那里声明它并调用参数与区间变量相同。哪些不会工作(就我所知,在任何编程语言中)。

然后,我会尝试直接调用该函数parseFloat(interval).toPrecision 而不是将它放在另一个函数中。

但是我更感兴趣的是: here hrmInfo.rRInterval/1000 原始值是千分之一。

删除该部门(如此var interval = hrmInfo.rRInterval;),看看实际上是否有更多的数字,其中小数点将是。

我不能从你的例子中弥补,但如果价值通常是像每分钟120。而且你想知道是否有更精确的值,那么现在的值应该看起来像1200054,如果它始终都是120000,那么创建该事件的系统不会发出更精确的度量。

+0

谢谢您的回复!是的,实际上它没有被调用。当然这是错误之一。我会尝试直接调用它。我需要这个部门,因为它不是每分钟(bpm)的心脏跳动,而是两次连续跳动之间的时间。而且,由于传感器以毫秒为单位给出数值,但我需要它们在几秒钟内,我必须将它们分开。 – Marcofon

+0

你好,你认为有可能传感器的精度不能提高吗?我也有一个来自传感器的数据的奇怪行为;似乎只有偶数值才被打印出来,我不知道为什么。 – Marcofon

+0

可能很难说,没有记录和挖掘数据。 如果我结合了您提供的有关此设备和代码的信息。 说:on onchangedCB被触发以提供心率的更新,并且hrmInfo.heartRate已经是标准化为BPM的心率,那么hrmInfo.rRInterval可能不会帮助您,除非您知道在这些间隔之间实际测量的是什么。 如果你想'改善'阅读你需要2个变量,可能导致该BPM。 (间隔+跳动此间隔)乘以bij适合一分钟的间隔数。 –