roscore解析(一)

    xiaoxiao2022-07-06  173

    roscore其实是一个python脚本,其实现的路径在ros/ros_comm/blob/melodic-devel/tools/roslaunch/scripts/roscore,其源码如下:

    import sys from optparse import OptionParser from rosmaster.master_api import NUM_WORKERS NAME = 'roscore' def _get_optparse(): parser = OptionParser(usage="usage: %prog [options]", prog=NAME, description="roscore will start up a ROS Master, a ROS Parameter Server and a rosout logging node", epilog="See http://wiki.ros.org/roscore" ) parser.add_option("-p", "--port", dest="port", default=None, help="master port. Only valid if master is launched", metavar="PORT") parser.add_option("-v", action="store_true", dest="verbose", default=False, help="verbose printing") parser.add_option("-w", "--numworkers", dest="num_workers", default=NUM_WORKERS, type=int, help="override number of worker threads", metavar="NUM_WORKERS") parser.add_option("-t", "--timeout", dest="timeout", help="override the socket connection timeout (in seconds).", metavar="TIMEOUT") parser.add_option("--master-logger-level", dest="master_logger_level", default=False, type=str, help="set rosmaster.master logger level ('debug', 'info', 'warn', 'error', 'fatal')") return parser parser = _get_optparse() (options, args) = parser.parse_args(sys.argv[1:]) #从这里知道roscore 并不支持参数 if len(args) > 0: parser.error("roscore does not take arguments") cle/details/84987748 #原来roscore就只是调用调用roslanch.main import roslaunch roslaunch.main(['roscore', '--core'] + sys.argv[1:]) 通过后续可以知道roslaunch.main 其实主要做了几件事, 1,创建保存log的文件夹。 2,启动roslunch server 3,启动roscores master和resout

    master,顾名思义,它就是大师一般的存在。在ROS 1.0版本中(当前主流版本),master是整个ROS运行的核心,它主要的功能就是登记注册节点、服务和话题的名称,并维护一个参数服务器。没有它你就甭想启动任何一个节点,roscore就是用来启动master的。

    那么,这个核心在干什么呢?

    他在抄名单、给人指路,顺带记录点个人隐私。

    一旦master被启动,ROS的网络中就有了一位在背后默默抄名单的人。比如,节点A启动了,master就在小本本上记下A的名字,节点B也是一样,这时候,A要订阅B的话题,就问master,谁是B?master给A指了指方向,那个角落里翻白眼的就是,这时A找到了B,话题就联系上了,master也就完成了一次指路。

    同样的,master也在记录服务和话题的名称,确保人群里别重名。然后呢,master还在维护一个参数服务器,这个服务器记录各个节点的一些内部数据,比如A节点在程序里写道,请将num这个变量上传到参数服务器,A启动后,master的参数服务器上就有了num,你能够在不关闭A节点的情况下修改num,挺好吧。这就是master。

    Master能不启动吗?可以,此时哪个ROS节点也甭想启动。

    Master能启动了再关吗?可以,此时,已经启动的节点和建立的话题安然无恙,但后续新节点和新话题甭想再建立了。

    Master自己宕机了怎么办?太常见了,习惯就好,重来吧。

    ROS可以不要master吗?可以,ROS2.0已经不要master了,但ROS1.0版本下,master永远是你master。 roscore = ros+core : master (provides name service for ROS) + rosout (stdout/stderr) + parameter server (parameter server will be introduced later)

    那么parameter server是什么呢?

    参数的命名使用常规的ROS命名约定。这意味着ROS参数具有与用于主题和节点的名称空间相匹配的层次结构。这个层次结构是为了防止参数名称冲突。这个层次方案允许参数被单个获取或者作为树获取,比如,对于下列参数:

    /camera/left/name: leftcamera /camera/left/exposure: 1 /camera/right/name: rightcamera /camera/right/exposure: 1.1

    ROS命名约定将~name作为私有名称。这些私有名称主要用于特定于单个节点的参数。前缀在节点的名称前面加上~,将其用作半私有的名称空间——它们仍然可以从系统的其他部分访问,但是通常可以防止意外的名称冲突。

    您可以使用重映射参数来指定命令行上的节点参数,方法是将波浪号~更改为下划线_,例如:

    rosrun rospy_tutorials talker _param:=1.0

    节点中的任何在一个节点中的ROS名称都可以在命令行启动时重新映射。这是ROS的一个强大功能,允许您从命令行以多种配置启动相同的节点。所有资源名称都可以重新映射。ROS的这个特性允许您将复杂的名称分配延迟到系统的实际运行时加载。

    重映射参数可以传递给任何节点,并使用语法名称:=new_name。例如,配置talker节点发布到/wg/chatter而不是chatter:

    rosrun rospy_tutorials talker chatter:=/wg/chatter

    我们在进行匹配之前解决了这些参数。这样做的效果是重新映射一个全名,而在此之前,重新映射只应用于特定的字符串。例如,在foo:=bar之前只匹配特定字符串foo的地方,它也会匹配/<node_namespace>/foo。解析后,将使用直接字符串匹配,因此不能使用它来重新映射名称的部分,即foo:=bar将匹配foo或//foo,但不会匹配foo/baz。唯一的例外是使用searchParam时,它保留了旧的行为。这是因为searchParam本身处理未解析的名称。

    Examples:

    Node Namespace

    Remapping Argument

    Matching Names

    Final Resolved Name

    /

    foo:=bar

    foo, /foo

    /bar

    /baz

    foo:=bar

    foo, /baz/foo

    /baz/bar

    /

    /foo:=bar

    foo, /foo

    /bar

    /baz

    /foo:=bar

    /foo

    /baz/bar

    /baz

    /foo:=/a/b/c/bar

    /foo

    /a/b/c/bar

     参数/camera/left/name的值为leftcamera。您还可以获得/camera/left的值,这个值是一个字典

    name: leftcamera exposure: 1

    你也可以得到for /camera的值,它有一个字典的字典表示参数树:

    左:{name: left tcamera, exposure: 1}

    右:{name: rightcamera, exposure: 1.1}

    left: { name: leftcamera, exposure: 1 } right: { name: rightcamera, exposure: 1.1 }

    参数服务器对参数值使用XMLRPC数据类型,包括:

    32-bit integersbooleansstringsdoublesiso8601 dateslistsbase64-encoded binary data

    您还可以在参数服务器上存储字典(即结构),尽管它们有特殊的含义。参数服务器将ROS名称空间表示为字典。例如,假设您设置了以下三个参数:

    /gains/P = 10.0 /gains/I = 1.0 /gains/D = 0.1

    你可以分别把它们读回去,也就是说检索/gains/P会返回10.0,或者你可以检索/gains,它会返回一个字典:

    { 'P': 10.0, 'I': 1.0, 'D' : 0.1 }

    就像ROS命名层次结构一样,您可以在字典中嵌套字典来表示子名称空间。

    扩展:Private Parameter

    ROS命名约定将~name作为私有名称。这些私有名称主要用于特定于单个节点的参数。前缀在节点的名称前面加上~,将其用作半私有的名称空间——它们仍然可以从系统的其他部分访问,但是通常可以防止意外的名称冲突。

    您可以使用重映射参数来指定命令行上的节点参数,方法是将波浪号~更改为下划线_,例如:

    rosrun rospy_tutorials talker _param:=1.0

    ROS拥有三种通讯协议:

    publishers/subscribersservices/clientsaction-servers/action-clients

    除了以上三种通信机制,还有第四种通信机制,那就是

    parameter server

    可以很方便的通过parameter server保存或读取一些不需要经常变动的常量。 常常用来设置一些配置参数等信息,将这些参数信息写入YAML文件中,一般使用以下方法读取YAML文件的信息(具体操作在第二部分):

        通过命令行进入parameter server加载这个YAML文件    通过launch文件调用它

    总的来说,parameter server不适合用于储存或读取动态的数据,与前面学到的subscriber、service或action-server不同,parameter server不会一直追踪输入的数据,一般情况下,节点只会在启动的时候访问一次parameter server获取信息,如果之后配置参数被修改,parameter server不会实时获取这个变更的数据,只能再下一次调用时才能获取变更后的数据。  

    rosnode = ros+node : ROS tool to get information about a node.

    rosrun = ros+run : runs a node from a given package.

     

    最新回复(0)