ROS Nodehandle handle use

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

Guess you like

Origin blog.csdn.net/Feizhai2/article/details/112686901