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());
相关推荐
quyunfei 2020-11-19
机器人智力研究 2020-11-18
聊天终结者机器人 2020-11-18
txq0 2020-11-20
zCSDN 2020-11-09
机器人智力研究 2020-11-05
ARMOTO机器人 2020-11-06
txq0 2020-11-06
遇见人工智能 2020-11-03
聊天终结者机器人 2020-11-02
clliuhust 2020-10-30
yatou0 2020-10-29
雨燕 2020-10-29
nodid 2020-10-29
yatou0 2020-10-29
zCSDN 2020-10-27
dhyddy 2020-10-27
聊天终结者机器人 2020-10-26