代码版本:
/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 | $ type roscore |
核心代码为:1
2import 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
13def _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的一部分。