2021SC@SDUSC
roscore源码阅读
首先,我们打开位于"/home/quzhijiu/ros_catkin_ws/install_isolated/bin/roscore"的python文件,这就是roscore启动位置的第一个文件。
前面一段注释是作者对代码的一些信息描述,比如版权之类的内容,从import开始下面就是代码正文了。
NAME = 'roscore'
这个全局变量就是命个名。
def _get_optparse(){...}
接下来是一个函数,是用来给命令行命令添加参数的,其中的parser.add_option函数就是用来添加参数的。
(options, args) = parser.parse_args(sys.argv[1:])
if len(args) > 0:
parser.error("roscore does not take arguments")
这个第一行首先将输入的参数分开,如果给出的参数在上面的函数中有定义的话,就会改变options,否则就会添加到args中,如果args参数值的字符数大于0就输出error信息。
这部分是python的parser模块,详情可见:optparse模块OptionParser
我们跟着最后一行代码进入下一个文件init.py,在这个文件里我们首先进入def main(argv=sys.argv),输入的参数是[‘roscore’, ‘–core’] + sys.argv[1:],是一个字符串数组,赋值给main函数的argv的参数中
args = rlutil.resolve_launch_arguments(args)
这一行直接进入一连串处理参数的函数中,对命令后面没有定义得参数是进行一通解析,重映射,还对package和launchfile进行了查找匹配,把完全不着边的参数进行error警告。
但实际上最后即使匹配到了,也不会干任何事情,因为他在处理的时候来了这么一行:
if args:
parser.error("Input files are not allowed when launching core")
在接下来的代码中就启动了ROSMaster
在其中的一个文件parent的注释中可以看到:
ROSLaunch有一个用于运行远程服务的客户机/服务器体系结构进程。当用户运行roslaunch时,会创建一个“父级”roslaunch进程,负责管理本地进程。此父进程还将在上启动“子”进程远程机器。然后,父级可以调用此子级上的方法进程来启动远程进程,子进程可以调用方法对父级提供反馈。
并在最后用parent的回调函数spin()持续运行所有的server,保证在整个进程结束时才会终止spin
本文档总结,在这篇文章,我对启动roscore之后干的事情进行了探究,发现了很多很新的思想,而最令我感到震撼的是,一个框架项目的函数之多,但文件分工明确,丝毫不会乱套,这也就是电脑在运行,如果是人在运行,那必然会被眼花缭乱的函数跳转转懵的。



