前文给节点命名(“hello_ros”和"publish_velocity")以及给话题命名(“turtle1/cmd_vel”和“turtle1/pose”)等的都是计算图源名称的例子。
接下来一起看看不同的计算图源名称。
node、topic、service、参数等统称计算图源。而每个计算图源由一个叫计算图源名称(graph resource name)的短字符串标识。
事实上,计算图源名称在 ROS 命令行和代码中是广泛存在的,前面我们已经多次接触它们。例如,前面学习的 rosnode info 命令行工具和 ros::init 函数都将节点名作为其参数,rostopic echo 命令行工具和 ros::Publisher 构造函数则都要求提供话题名作为参数,这些都是计算图源名称的具体实例
例如我们已经遇到过的:
/teleop_turtle
/turtlesim
/turtle1/cmd_vel
/turtle1/pose
/run_id
/count_and_log/set_logger_level
- “/”表示全局名称。
- 每个斜杠代表以及命名空间
- 描述资源本身的基本名称(base name)。上述的cmd_vel、pose等都是。
让ROS为计算图源提供一个默认命名空间,替代中间命名空间层过多的全局名称的做法。具有此特征的名称称为相对名称。例子如下:
teleop_turtle
turtlesim
cmd_vel
turtle1/pose
run_id
count_and_log/set_logger_level
/turtle1 + cmd_vel => /turtle1/cmd_vel
默认命名空间 相对名称 全局名称
默认命名空间单独为每个节点设置的。如果不设置命名空间,ROS会将全局命名空间作为默认命名空间(ns属性)。
_ _ns:=default-namespace
Export ROS_NAMESPACE=default-namespace
以一个波浪字符开始(~),解析方式同相对名称一样。唯一不同是私有名称以它们的节点名作为默认命名空间。
例如:
/sim1/pubvel + ~max_vel => /sim1/pubvel/max_vel
节点命名空间 相对名称 全局名称
私有名称的关键字“private”仅仅表示其他节点不会使用它们所在的命名空间,也就是仅在命名空间层面上有意义。对于其他节点来讲,只要知道私有名称解析后的全局名称,都可以通过其全局名称访问这些计算图源。它不等于C++中的私有变量。
之前介绍的三种是基本变量类型。ROS 还提供了另一种被称为匿名名称的命名机制,匿名并不是指没有名字,而是指非用户指定而又没有语义信息的名字
使用处理器时间生成匿名名称
// This program starts with an anonymous name, which
// allows multiple copies to execute at the same time ,
// without needing to manually create distinct names
// for each of them.
#include
int main ( int argc, char **argv )
{
ros::init ( argc, argv, "anon",
ros::init_options::AnonymousName );
ros::NodeHandle nh ;
ros::Rate rate (1) ;
while (ros::ok( ))
{
ROS_INFO_STREAM( "This␣ message␣ is␣ from␣ "
<< ros::this_node::getName ( ));
rate.sleep( );
}
}
即便是多次启动也不会导致命名冲突。因为会得到唯一性名称。
下一章roslaunch工具。