roscore code reading

代码版本:
/rosdistro: indigo
/rosversion: 1.11.21

参考资源链接

配置文件

/opt/ros/indigo/etc/ros/roscore.xml
这里配置随roscore一起启动的node。

启动的node or process

  • /rosout/rosout: a rosout logging node
  • ros master
  • ros parameter server
  • rosmaster
  • process monitor
  • parent xml-rpc server

roscore启动逻辑

1
2
$ type roscore
roscore is hashed (/opt/ros/indigo/bin/roscore)

核心代码为:

1
2
import roslaunch
roslaunch.main(['roscore', '--core'] + sys.argv[1:])

这里传入的roscore没有作用,--core参数真正指定了启动roscore。配置文件名 roscore.xml 也是在代码中写死,根据版本号等信息拼接出来完整的配置文件路径。

如果没有预先执行roscore,我们用roslaunch *.launch 启动node也会自动roscore相关的进程组件。分析代码,可以把处理逻辑总结为:roslaunch启动 *.launch 文件中配置的node,启动前先检查环境,如果没有启动roscore则先启动,如果已经启动了,则判断命令行参数中有没有 --core,如果有则报错,如果没有继续执行 *.launch 中的操作。

roslaunch command demo:

1
$ roslaunch package_name file.launch

roslaunch 启动逻辑

核心代码逻辑位于 ros_comm/tools/roslaunch/src/roslaunch/parent.py ROSLaunchParent::start()

start infrastructure

load ros launch file

代码文件 ros_comm/tools/roslaunch/src/roslaunch/config.py

首先加载 roscore.xml 文件,然后加载命令行中执行的 launch file。参考代码注释:

1
2
3
# load the roscore file first. we currently have
# last-declaration wins rules. roscore is just a
# roslaunch file with special load semantics

start process monitor

代码文件 ros_comm/tools/roslaunch/src/roslaunch/pmon.py

ProcessMonitor 是一个继承自Python::Thread的类。其中另一个类Process 代表launch启动的一个进程,封装了进程的一些启动参数,是否是关键节点,如果异常退出是否重启等信息。然后将 Process instance 注册到 ProcessMonitor instance 进行监控。

start roslaunch runner and XMLRPC server

代码文件 ros_comm/tools/roslaunch/src/roslaunch/server.py

这里启动了一个xmlrpc server,实现在class ROSLaunchParentNode,并注册了一些方法。启动后立即创建一个client去连接server,确认启动成功。

initialize the actual runner and launch

代码文件 ros_comm/tools/roslaunch/src/roslaunch/launch.py

这里创建一个ROSLaunchRunner instance,这个实例负责启动 launch file 中配置的node。在调用 launch() 启动时,会检测roscore环境是否启动,如果没有则启动:

1
2
3
4
5
6
7
8
9
10
11
12
13
def _setup(self):
"""
Setup the state of the ROS network, including the parameter
server state and core services
"""

...

# start up the core: master + core nodes defined in core.xml
# 启动 ros master
self._launch_master()
# 启动 roscore 包含的 nodes
self._launch_core_nodes()

在启动时,XmlLoader对象用于解析launch file和roscore.xml,并对 core nodes 和 normal nodes分组管理,接口中有参数指定要解析的xml配置文件是否属于roscore的,由调用方负责传入,如果是,其中包含的nodes放入 core nodes中管理。
启动 core nodes 时,如果node已经存在,则跳过。启动 normal nodes 时,如果node已经存在,则杀死已存在的node,再启动新node。

ros master 则是通过rosmaster --core ...方式启动。

Summary

  • roscore代表着启动整套基础环境。
  • parameter server并不是一个单独存在的Server,而是rosmaster的一部分。