我得到一个数字或字符串的对象(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];
}
...
我关心效率,因为这是每秒运行多次的for循环的一部分。
基本结构是来自某个主题的ROS消息,基本上可以包含任何数据类型。
在这种情况下,我使用的是LaserScan message,文档中未提及range[x]
可以返回“inf”。
答案 0 :(得分:3)
根据ROS文档,scan->ranges
是一个浮点数组。这是有道理的,因为当dist
的字符串表示不是ranges[0]
时,您将其添加到浮点数(inf
)。
这意味着(正如MSalters在评论中猜到的那样),你有一个真正的浮点值,你只想确保它是一个实数,既不是无限值也不是NaN(非数字)值。 / p>
因此,如果您包含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];
}
...
(关于wikipedia上浮点数的IEEE-754表示的更多参考资料)