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());

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章