launch文件解释
<node pkg="a12_rename03_param" type="param_learn" name="node_learn" ns="node_namespace" output="screen" />
- pkg:节点所在的功能包名称
- type:节点的可执行文件名称,如对
param_learn.cpp
节点,type="param_learn"
- name:节点运行时名称,如在语句
ros::init(argc,argv,"
node_learn");
中 ,name="
node_learn"
,如果在launch文件中将name设为其他名称"param_learn"
,那即便代码里写的是"
node_learn"
,也会被覆盖为"param_learn"
- output:运行信息输出位置,如输出至屏幕:
output="screen"
- ns =“ foo”(可选)。在指定命名空间 “ foo” 中启动节点。
Nodehandle-句柄学习
<node pkg="a12_rename03_param" type="param_learn" name="node_name" ns="node_namespace" output="screen" />
1、句柄可以让你通过构造函数指定命名空间
ros::init(argc, argv, "node_name");
这使得使用该句柄的任何相对名字都是相对<node_namespace>/my_namespace,而不是只相对<node_namespace>
你也可以指定一个父句柄和追加的命名空间
ros::NodeHandle nh1("ns1"); // /node_namespace/ns1
ros::NodeHandle nh2(nh1,"ns2"); // /node_namespace/ns1/ns2
这将把nh2放入到<node_namespace>/ns1/ns2命名空间
2、也可以指定全局名字,使用“/”(全局命名空间)
ros::NodeHandle nh("/my_global_namespace");
这种做法并不推荐,因为这样会使得节点无法被放入别的命名空间。只是有时在代码中使用全局名字有用。
3、私有名字,使用“~”(私有命名空间)
使用私有名字比直接调用有私有名的句柄方法更有技巧,你可以在一个私有命名空间中直接创建一个新的句柄。
ros::NodeHandle nh("~my_private_namespace"); // /node_namespace/node_name/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 // /node_namespace/node_name
launch文件里ns="node_namespace",且 name = "node_name"与ros::init里的node_name一样
<node pkg="a12_rename03_param" type="param_learn" name="node_learn" ns="node_namespace" output="screen" />
// 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
launch文件里没有ns
<node pkg="a12_rename03_param" type="param_learn" name="node_name" output="screen" />
// launch 文件中没有 ns
ros::init(argc, argv, "node_name"); // node name
ros::NodeHandle n; // n 命名空间为: /
ros::NodeHandle n1("sub"); // n1 命名空间为: /sub
ros::NodeHandle n2(n1,"sub2"); // n2 命名空间为: /sub/sub2
ros::NodeHandle pn1("~"); // pn1 命名空间为: /node_name
ros::NodeHandle pn2("~sub"); // pn2 命名空间为: /node_name/sub
ros::NodeHandle pn3("~/sub"); // pn3 命名空间为: /node_name/sub
ros::NodeHandle gn("/global"); // gn 命名空间为: /global
launch文件里没有ns,且name = "node_learn",不是 node_name
<node pkg="a12_rename03_param" type="param_learn" name="node_learn" output="screen" />
// launch 文件中没有 ns,且name = "node_learn",不是 node_name
ros::init(argc, argv, "node_name"); // node name
ros::NodeHandle n; // n 命名空间为: /
ros::NodeHandle n1("sub"); // n1 命名空间为: /sub
ros::NodeHandle n2(n1,"sub2"); // n2 命名空间为: /sub/sub2
ros::NodeHandle pn1("~"); // pn1 命名空间为: /node_learn
ros::NodeHandle pn2("~sub"); // pn2 命名空间为: /node_learn/sub
ros::NodeHandle pn3("~/sub"); // pn3 命名空间为: /node_learn/sub
ros::NodeHandle gn("/global"); // gn 命名空间为: /global
节点句柄相关用法
ros::NodeHandle nh // n 命名空间为: /
ros::NodeHandle map_layer(nh, "static_layer"); // n2 命名空间为: /static_layer
// 将节点句柄 nh 下名为 "unknown_cost_value" 的参数的值从原始的命名空间(可能是全局命名空间)移动到名为 map_layer 的节点句柄的命名空间下。
// 例如:原来是: /unknown_cost_value 变为 /static_layer/unknown_cost_value
move_parameter(nh, map_layer, "unknown_cost_value");