Reposted from: https://blog.csdn.net/jack_20/article/details/70746736
1. The handle allows you to specify the namespace through the constructor
ros::NodeHandle nh(“my_namespace”);
This makes any relative names using the handle relative to <node_namespace>/my_namespace instead of just <node_namespace>
You can also specify a parent handle and additional namespaces
ros::NodeHandle nh1(“ns1”);
ros::NodeHandle nh2(nh1,“ns2”);
This will place nh2 into the <node_namespace>/ns1/ns2 namespace
2. You can also specify a global name
ros::NodeHandle nh("/my_global_namespace");
This practice is not recommended, because it will prevent the node from being placed in other namespaces. It's just that sometimes it's useful to use global names in your code.
3. Private name
Using a private name is more tricky than calling a privately named handle method directly, you can directly create a new handle in a private namespace.
ros::NodeHandle nh("~my_private_namespace");
ros::Subscriber sub = nh.subscribe(“my_private_topic”,…);
The above example will subscribe to <node_name>/my_private_namespace/my_private_topic
Note: The key point of understanding is the part marked in red above, node_namespace and node_name are two different things!
node_name = node_namespace + nodename
Supplementary demo
// ns=="node_namespace" in the launch file
ros::init(argc, argv, “node_name”); // node name
ros::NodeHandle n; //n namespace is /node_namespace
ros::NodeHandle n1("sub"); // n1 namespace is /node_namespace/sub
ros::NodeHandle n2(n1,"sub2");// n2 namespace is /node_namespace/sub/sub2
ros::NodeHandle pn1("~"); //pn1 namespace is /node_namespace/node_name
ros::NodeHandle pn2("~sub"); //pn2 namespace is /node_namespace/node_name/sub
ros::NodeHandle pn3("~/sub"); //pn3 namespace is /node_namespace/node_name/sub
ros::NodeHandle gn("/global"); // gn namespace is /global