ROS NodeHandle命令空間問題



NodeHandle

NodeHandle的作用

  1. 自動啟動關閉ros節點。
  2. 創建自己的命名空間。

自動啟動關閉ros節點

具體細節參考: Ros node啟動與關閉

創建自己的命名空間

  1. ros基本組件分為nodes、Parameters、Topics和Services。每個組件都帶有一個命名空間。

  2. Ros命名空間規則如下:

組件名格式是:第一級名字/第二級名字/第三級名字/第四級名字。對於一個具體的Parameters、Topics和Services可以沒有第二和第三級名字。

  1. 通常使用~時,其一般作為本節點內部使用,但是不是強制的,外部只要按照組件名格式還是可以使用組件的。

NodleHandle的構造函數的命名空間

ros::NodeHandle nh("my_namespace");

這使得使用該句柄的任何相對名字都是相對<node_namespace>/my_namespace,而不是只相對<node_namespace>

指定一個父句柄和追加的命名空間

ros::NodeHandle nh1("ns1");
ros::NodeHandle nh2(nh1,"ns2");

這將把nh2放入到<node_namespace>/ns1/ns2命名空間

指定全局名字

使用/(全局命名空間)

ros::NodeHandle nh("/my_global_namespace");

這種做法並不推薦,因為這樣會使得節點無法被放入別的命名空間。只是有時在代碼中使用全局名字有用。

私有名字

使用(私有命名空間),使用私有名字比直接調用有私有名的句柄方法更有技巧,你可以在一個私有命名空間中直接創建一個新的句柄。

ros::NodeHandle nh("~my_private_namespace");
ros::Subscriber sub = nh.subscribe("my_private_topic",....);

以上例子會訂閱<node_name>/my_private_namespace/my_private_topic

區分node_namespace和node_name,彼此關系其實是: node_name = node_namespace + nodename

.launch 文件中 ns=="node_namespace"

//node name
ros::init(argc, argv, "node_name"); 

//命名空間為/node_namespace
ros::NodeHandle n; //n 
// n1命名空間為/node_namespace/sub
ros::NodeHandle n1("sub"); 

// n2命名空間為/node_namespace/sub/sub2
ros::NodeHandle n2(n1,"sub2");

//pn1 命名空間為/node_namespace/node_name
ros::NodeHandle pn1("~"); 

//pn2 命名空間為/node_namespace/node_name/sub
ros::NodeHandle pn2("~sub"); 

//pn3 命名空間為/node_namespace/node_name/sub
ros::NodeHandle pn3("~/sub"); 

//gn命名空間為/global
ros::NodeHandle gn("/global"); 

參考

  1. ROS的官網 NodeHandle 詳細解釋
  2. 消雨匆匆 ROS Nodehandle句柄的理解
  3. 孤峰喬木的博客 ROS基礎 ros beginner實例代碼
  4. 孤峰喬木的博客 ROS基礎


免責聲明!

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



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