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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM