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

Posted dlonng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ROS 机器人技术 - 解决 ROS_INFO 不能正确输出 string 的问题!相关的知识,希望对你有一定的参考价值。

一、输出「??」

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

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

技术图片

看了下代码发现是自己把节点名称设置为 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 不能直接输出 std::string,需要转成 c_str

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

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

技术图片

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

技术图片

以上是关于ROS 机器人技术 - 解决 ROS_INFO 不能正确输出 string 的问题!的主要内容,如果未能解决你的问题,请参考以下文章

ROS_INFO()是啥函数

ROS消息, 服务, 主题, 订阅 3

技术分享 | 带你解决4个ROS开发常见的问题

ROS 信息打印(INFO DEBUG等)

ROS 信息打印(INFO DEBUG等)

技术分享 | 相较于ROS 1,ROS 2有哪些优越性?