2021SC@SDUSC
ROS源码阅读(3)
总结roscore
首先我们在/ros_catkin_ws/install_isolated/bin/roscore这里找到了命令roscore所启动的文件,然后我们就进入这个文件,在最后一行的函数roslaunch.main跳转到下一个位于/ros_catkin_ws/install_isolated/lib/python3/dist-packages/roslaunch/init.py的文件,最后整个roscore的流程都在这个函数完成并结束,其中有几个比较重要的函数以及roscore所做的事情。按从上到下,由内到外的顺序来说
1.option参数
(options, args) = parser.parse_args(argv[1:])
这行代码得到的options记录了启动roscore的几乎全部参数,在后续就是链接整个roscore的重要参数数组
2.validate_args
args = rlutil.resolve_launch_arguments(args)
_validate_args(parser, options, args)
这两行代码做的是对参数进行检查,验证arg,这个在上一篇中讲过
3.write_pid_file
write_pid_file(options.pid_fn, options.core, options.port)
这个函数会将该roscore的进程号写入.ros/roscore-11311.pid在启动roscore时,可以新启终端打开这个文件看到pid
4.get_or_generate_uuid
下面是三种可能的run_id来源:
# - if we're a child process, we get it from options_runid
# - if there's already a roscore running, read from the param server
# - generate one if we're running the roscore
5.configure_logging
configure_logging(uuid)
这个函数是用来根据runid来生成logfile的,每次运行程序都要先有logfile,logfile是用来记录程序运行时状态的
6.check_log_disk_usage
rlutil.check_log_disk_usage
这个是检查logfile文件大小的,不超过1GB就肯定会通过检查,进入下一步的
7.ROSLaunchParent
p = roslaunch_parent.ROSLaunchParent
这个代码是给ROSLaunchParent初始化,因为需要一个parent负责加载启动文件、分配机器,然后启动远程进程
8.start
p.start()
这个就是启动roscore里所有服务器的地方,这里面包括先启动 XMLRPC 服务器 和 process monitor,在这里有一个很重要的概念就是remote event和remote runner,看起来是由parentlaunch里的ROSLaunchListeners来监听管理的,但我实在是不太懂这个remote的含义,或许在之后使用的时候会明白,那就到时候再回来补充吧。然后启动launch,然后根据注释可以看到,每次调用launch()之后会调用spin_once或者spin。然后启动 core:包括“master + core nodes defined in core.xml”
最后,roscore的整个过程就结束了,从头看下来能对roscore了解个大概,但是对各个节点与rosmaster的通信机制,以及在实际工作中rosmaster会承担什么作用的部分仍需要实际去看tutriols才能看到,所以后续就是去看位于/home/username/ros_catkin_ws/src/ros_tutorials/rospy_tutorials的实际工作的教程代码