ros::init(argc,argv,"scout_odom");
ros::NodeHandle n;
ros::init()函数是初始化节点,其中scout_odom为初始化的节点名
第二句是创建了ros::NodeHandle类的对象(该对象名为n)(这一句相当于Starting the node)。
(注意二者的顺序不能颠倒)
对于ros::nodehandle 创建的句柄:
1、句柄可以让你通过构造函数指定命名空间
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命名空间
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 + node_name
补充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
参考:http://wiki.ros.org/roscpp/Overview/NodeHandles
参考:https://blog.csdn.net/jack_20/article/details/70746736?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160587958619725225064381%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=160587958619725225064381&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_click~default-1-70746736.pc_first_rank_v2_rank_v28&utm_term=ros%3A%3Anodehandle&spm=1018.2118.3001.4449