我得到一个对象(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消息,文档中没有提到range[x]
可以返回“ inf”的消息。
根据ROS文档,scan->ranges
是一个float数组。这是有道理的,因为dist
当not的字符串表示形式ranges[0]
为not时,将其添加到float()中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];
}
...
(有关Wikipedia上浮点数的IEEE-754表示形式的更多参考资料)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句