您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關解決ROS_INFO不能正確輸出string的問題,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
項目調(diào)試一個節(jié)點,打印 ROS 信息時發(fā)現(xiàn)設置的節(jié)點名稱都是問號:
ROS_INFO("[%s]: camera_extrinsic_mat", kNodeName);
看了下代碼發(fā)現(xiàn)是自己把節(jié)點名稱設置為 const,但是沒有正確初始化 const
變量,導致輸出了「??」,C++ 語法都忘記了,太菜了,以下是第一種初始化 const 的方法:
// 1. 先在類中定義
private:
const std::string kNodeName;
// 2. 構(gòu)造函數(shù)初始化列表后初始化
ClassName(): kNodeName("node_name")
第二種方法是加上 static 關鍵字:
// 1. 在類中定義靜態(tài) const 變量
private:
static const std::string kNodeName;
// 2. 在類外進行 const 初始化
const std::string ClassName::kNodeName = "node_name";
我用的第二種方式,因為這樣的 const 看起來比較直觀,在構(gòu)造函數(shù)初始化列表中賦值不容易被看到,以下是我修改后的代碼:
// 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);
總結(jié)下 const 變量在類中的用法:
正確初始化 const 變量后,發(fā)現(xiàn) INFO 又輸出亂碼:
找了下資料發(fā)現(xiàn)是因為 ROS_INFO
不能直接輸出 std::string
,需要轉(zhuǎn)成 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());
看完上述內(nèi)容,你們對解決ROS_INFO不能正確輸出string的問題有進一步的了解嗎?如果還想了解更多知識或者相關內(nèi)容,請關注億速云行業(yè)資訊頻道,感謝大家的支持。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。