ros 程式設計習慣
阿新 • • 發佈:2018-11-29
1.設定ros的info,warning,debug,error等編寫的時候要思考,何時該使用,以及在開頭要使用設定rosconsole的級別來對應輸出,以方便除錯。
2.在使用ros_info等的時候要把該節點的名稱或者該類的名稱也加上去,以方便排查錯誤源等,ROS_INFO("[節點名 %s]", e.what());
3.使用ros::NodeHandle nh("~"); 的形式,以及服務server名字均在全域性名稱空間下。
1、控制代碼可以讓你通過建構函式指定名稱空間 ros::NodeHandle nh("my_namespace"); 這使得使用該控制代碼的任何相對名字都是相對View Code<node_namespace>/my_namespace,而不是隻相對<node_namespace> 你也可以指定一個父控制代碼和追加的名稱空間 ros::NodeHandle nh1("ns1"); ros::NodeHandle nh2(nh1,"ns2"); 這將把nh2放入到<node_namespace>/ns1/ns2名稱空間 2、也可以指定全域性名字 ros::NodeHandle nh("/my_global_namespace"); 這種做法並不推薦,因為這樣會使得節點無法被放入別的名稱空間。只是有時在程式碼中使用全域性名字有用。3、私有名字 使用私有名字比直接呼叫有私有名的控制代碼方法更有技巧,你可以在一個私有名稱空間中直接建立一個新的控制代碼。 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 補充demo// launch 檔案中 ns=="node_namespace" ros::init(argc, argv, "node_name"); // node name ros::NodeHandle n; //n 名稱空間為/node_namespace ros::NodeHandle n1("sub"); // n1名稱空間為/node_namespace/sub ros::NodeHandle n2(n1,"sub2");// n2名稱空間為/node_namespace/sub/sub2 ros::NodeHandle pn1("~"); //pn1 名稱空間為/node_namespace/node_name ros::NodeHandle pn2("~sub"); //pn2 名稱空間為/node_namespace/node_name/sub ros::NodeHandle pn3("~/sub"); //pn3 名稱空間為/node_namespace/node_name/sub ros::NodeHandle gn("/global"); // gn 名稱空間為/global
4.backward-cpp除錯程式碼。
5.在使用引數伺服器 param等的時候以及和對應的launch檔案一起結合使用。
6.launch檔案裡面的output輸出指定到對應的log檔案,以及launch檔案裡面的節點node可以指定使用的核心的名字。
7.訊息和服務寫在一個包裡面,便於管理。