2016-11-15 8 views
-1

オブジェクト(msg.data)が数値か文字列のいずれかになります。それが文字列の場合、私はそれを使用したくない、それは私がしたい番号です。これは何回も各秒を実行しているforループの一部であるので、私は、効率を気にオブジェクトが文字列かどうかをチェックする最も効率的な方法

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]; 
} 
... 

、:私はずっといい解決策があると思いますけれども、私は現在、ostringstreamでこの問題を解決しました。

基本的な構造は、特定のトピックに由来するROSメッセージであり、基本的に任意のデータ型を持つことができます。 この場合私はLaserScan messageを使用しますが、range[x]"inf"を返すことはできません。

+3

オブジェクトは常に*文字列です。あなたがしたいことは、文字列を解析することです。 – StoryTeller

+0

私は明確にしようとしました、私のオブジェクトは 'msg.data'であり、これはどのタイプであるのか明確ではありません。 – Jonas

+2

* msg.dataは*どのように宣言されていますか? –

答えて

3

ROSのドキュメントによると、scan->rangesはfloatの配列です。それは文字列表記ranges[0]のときにfloat(dist)に追加するので、意味があります。infではありません。

これは、(コメントで推測されるMSaltersとして)あなたは真の浮動小数点値を持ち、それが実数で無限値でもNaN(数値でもない)値でもないことを確認したいだけです。

ので(でも非正規値が拒否されている)を使用すると、数が有限であるかどうかを判断するためにC分類マクロを使用することができます(ただし、非正規値が許可される)あなたがcmath(またはmath.h)を含ん提供または通常:

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

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

wikipediaの浮動小数点数のIEEE-754表現の詳細参照)

関連する問題