解决ROS_INFO不能正确输出string的问题

今天就跟大家聊聊有关解决ROS_INFO不能正确输出string的问题,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

十多年的蒲县网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。全网整合营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整蒲县建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。成都创新互联公司从事“蒲县网站设计”,“蒲县网站推广”以来,每个客户项目都认真落实执行。

 

一、输出「??」

项目调试一个节点,打印 ROS 信息时发现设置的节点名称都是问号:

ROS_INFO("[%s]: camera_extrinsic_mat", kNodeName);
 
解决ROS_INFO不能正确输出string的问题  

看了下代码发现是自己把节点名称设置为 const,但是没有正确初始化 const 变量,导致输出了「??」,C++ 语法都忘记了,太菜了,以下是第一种初始化 const 的方法:

// 1. 先在类中定义
private:
 const std::string kNodeName;

// 2. 构造函数初始化列表后初始化
ClassName(): kNodeName("node_name")
 

第二种方法是加上 static 关键字:

// 1. 在类中定义静态 const 变量
private:
 static const std::string kNodeName;
 
// 2. 在类外进行 const 初始化
const std::string ClassName::kNodeName = "node_name";
 

我用的第二种方式,因为这样的 const 看起来比较直观,在构造函数初始化列表中赋值不容易被看到,以下是我修改后的代码:

// 1. lidar_camera_fusion.h
private:
 static const std::string kNodeName;

// 2. lidar_camera_fusion.cpp
const std::string LidarCameraFusion::kNodeName = "lidar_camera_fusion";

// 3. ROS_INFO
ROS_INFO("[%s]: camera_extrinsic_mat", kNodeName);
 

总结下 const 变量在类中的用法:

  • 构造函数参数初始化列表中初始化 const 变量
  • 将 const 变量声明为 static 类型,然后在类的外部初始化
 

二、输出乱码

正确初始化 const 变量后,发现 INFO 又输出乱码:

解决ROS_INFO不能正确输出string的问题  

找了下资料发现是因为 ROS_INFO 不能直接输出 std::string,需要转成 c_str

// 3. ROS_INFO
ROS_INFO("[%s]: camera_extrinsic_mat", kNodeName.c_str());
 

第二个乱码的原因是因为把 %s 错写成大写的 %S 了,改回来即可:

解决ROS_INFO不能正确输出string的问题  
// 3. 错写成大写的 %S 了
ROS_INFO("[%S]: camera_extrinsic_mat", kNodeName.c_str());

看完上述内容,你们对解决ROS_INFO不能正确输出string的问题有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。


名称栏目:解决ROS_INFO不能正确输出string的问题
链接分享:http://pwwzsj.com/article/jcpegi.html