2016-11-15 91 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]; 
} 
... 

相关问题