2017-02-09 38 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適合一分鐘的間隔數。 –