ROS中NodeHandle句柄 理解 | 您所在的位置:网站首页 › ros的节点node是什么 › ROS中NodeHandle句柄 理解 |
写在前面
本文转载自 ROS中NodeHandle问题 https://blog.csdn.net/u012700322/article/details/52244329 ROS Nodehandle句柄 https://blog.csdn.net/jack_20/article/details/70746736 一、ROS中NodeHandle问题 - 原文今天想把写的坐标转换package,改写成在launch文件中传入参数。中间遇到了一个小问题,特此记录一下。 ros::init(argc, argv, "sub"); ros::NodeHandle n; ros::NodeHandle pn("~"); double x; pn.param("/x",p_x, 0.3); ros::init(argc, argv, "sub"); ros::NodeHandle n; //ros::NodeHandle pn("~"); double x; n.param("x",p_x, 0.3);以上两种写法都是正确的。 ros::init(argc, argv, "sub"); ros::NodeHandle n; ros::NodeHandle pn("~"); double x; pn.param("x",p_x, 0.3);但是这种写法是错误的。 这是为什么呢? 这就涉及到NodeHandle的参数范围问题。如下: ros::init(argc, argv, "my_node_name"); ros::NodeHandle nh1("~"); ros::NodeHandle nh2("~foo");nh1的命名空间(namespace)是 /my_node_name,而nh2的namespace是 /my_node_name/foo 这里只是一个例子,一个ros的node只有一个NodeHandle,它提供这个node的对于topic的收发功能. 注: 在ROS中NodeHandle可以参考: http://wiki.ros.org/roscpp_tutorials/Tutorials/AccessingPrivateNamesWithNodeHandle http://wiki.ros.org/roscpp_tutorials/Tutorials/Parameters 二、ROS Nodehandle句柄 - 原文1、句柄可以让你通过构造函数指定命名空间 ros::NodeHandle nh("my_namespace");这使得使用该句柄的任何相对名字都是相对/my_namespace,而不是只相对 你也可以指定一个父句柄和追加的命名空间 ros::NodeHandle nh1("ns1"); ros::NodeHandle nh2(nh1,"ns2");这将把nh2放入到/ns1/ns2命名空间 2、也可以指定全局名字 ros::NodeHandle nh("/my_global_namespace");这种做法并不推荐,因为这样会使得节点无法被放入别的命名空间。只是有时在代码中使用全局名字有用。 3、私有名字 使用私有名字比直接调用有私有名的句柄方法更有技巧,你可以在一个私有命名空间中直接创建一个新的句柄。 ros::NodeHandle nh("~my_private_namespace"); ros::Subscriber sub = nh.subscribe("my_private_topic",....);以上例子会订阅/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 |
CopyRight 2018-2019 实验室设备网 版权所有 |