15

ROS 机器人技术 - 解决 ROS_INFO 不能正确输出 string 的问题!

 4 years ago
source link: https://segmentfault.com/a/1190000022862432
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

一、输出「??」

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

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

myi6rmn.png!web

看了下代码发现是自己把节点名称设置为 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 又输出乱码:

yUBj2ii.png!web

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

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

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

732yQnq.png!web

// 3. 错写成大写的 %S 了
ROS_INFO("[%S]: camera_extrinsic_mat", kNodeName.c_str());

eAVFZva.png!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK