2016-11-15 88 views
-1

我得到一個對象(msg.data)是一個數字或一個字符串。如果它是一個字符串,我不想使用它,如果它是我想要的數字。目前,我解決了這個問題與ostringstream,但我覺得有辦法更好的解決方案:最有效的方法,如果對象是一個字符串

void scan_cb(const sensor_msgs::LaserScan::ConstPtr& scan) 
{ 
float dist = 0.0f; 

std::ostringstream s; 
s << scan->ranges[0]; // can be string (always "inf") or a float 
if(s.str() != "inf"){ 
    dist += scan->ranges[0]; 
} 
... 

我在乎效率,因爲這是運行的每個許多次循環的一部分。

的基本結構是一個ROS消息,從某一主題的到來,並且可以具有基本上任何數據類型。 在這種情況下,我使用LaserScan message,文件沒有提到range[x]可以返回「INF」

+3

你對象是*始終*字符串(上wikipedia浮點數的IEEE-754表示更多的參考資料)。你想要做的是解析字符串。 – StoryTeller

+0

我試圖澄清,我的對象是'msg.data',它不清楚這是什麼類型。 – Jonas

+2

* * msg.data是怎麼聲明的? –

回答

3

根據ROS文檔,scan->ranges是浮動的陣列。這是有道理的,因爲你把它添加到一個浮動(dist)當字符串表示的ranges[0]inf

這意味着(作爲MSalters在其評論中猜測),你有一個真正的浮點值,你只是想確保它是一個實數,既不是一個無限值,也不是一個NaN(非數值)值。

所以只要你有cmath(或math.h),你可以使用C分類宏數來確定是否是有限的(但低於正常值是允許的)或正常(甚至低於正常數值被拒絕):

void scan_cb(const sensor_msgs::LaserScan::ConstPtr& scan) 
{ 
float dist = 0.0f; 

if(isfinite(scan->ranges[0])){ 
    dist += scan->ranges[0]; 
} 
... 

相關問題