2021SC@SDUSC
1. 本周工作目标
在上周完成了代码的下载、编译之后,这周要正式建立代码的阅读环境了。结合实际情况,本周的工作目标如下:
-
建立VSCode代码调试环境
-
通过调试初步阅读ROS Master的源码
2. 建立VSCode阅读环境
对于这种“相对小众又灵活”的调试需求,最适合的工具就是VSCode了。这里选用的调试解决方案是:在Windows宿主中启动VSCode,用SSH连接虚拟机进行调试。
网上有很多类似的配置教程,这里略过了详细的配置了。配置过程中遇到的一个bug是,在宿主机中总是没法通过ssh连接到虚拟机,这时可以考虑在宿主机中“禁用+重启”VMNet8虚拟适配器。

3. 调试和阅读ROS Master的源码
首先了解到一个重要的内容就是每次启动roscore的时候会首先在所有进程启动之前,进行参数检查,校对,之后会通过下面代码将本次运行的参数都记录在options这个全局变量中。
(options, args) = parser.parse_args(argv[1:])

而在在整个程序运行过程中,每执行一步都要记录入logfile,在roslaunch.py有一句话“scripts using roslaunch MUST call configure_logging”,所以在启动其他节点时会首先建立log file文件:
logfile_dir = os.path.dirname(log_filename)
此时如果在标准目录下没有这个文件就会使用一个函数循环创建目录,最后到创建文件
makedirs_with_parent_perms(logfile_dir)
而创建logfile所用的所有信息都来自参数检查之后的options中
接下来进行了log file文件的大小检查,调用get_disk_usage方法,其中主要计算方式是in bytes (du -b) or (du -A) * 1024,具体可查“du”,保证使用大小小于1Gb,就会输出:
Checking log directory for disk usage. This may take a while. Press Ctrl-C to interrupt Done checking log file disk usage. Usage is <1GB.
然后启动一个roslaunch父节点要load config, start XMLRPC servers and process monitor,在下面,就将核心配置的概念与正在启动的配置分开。这样就可以开始迁移到一个模型,其中配置是launch()方法的参数,而不是运行程序的中心内容。
然后launch启动了监听,将ProcessMonitor事件连接到侦听器聚合器。在创建远程运行程序时,我们同样会连接远程事件。(这个’‘远程运行程序’‘有待继续了解)运行启动需要根据使用情况,调用方应调用spin_一次,或在launch()后根据需要调用spin。来保证时刻可以使用launch来启动节点
接下来,构建ROS网络,包括参数服务器和core服务,“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,所以这里会用到xmlrpc服务器来获得core.xml记录的信息
接下来启动所有其他没启动的核心服务:
for node in config.nodes_core
用这个记录所有的服务来逐个启动
最后就是spin回调函数了,spin()必须从主线程运行,对于roslaunch来说非常重要,因为它可以获取进程监视器需要在主线程中运行的作业。
p.spin()
最后整个roscore的内容就结束了,可以看出来,roscore这个命令首先启动launch,然后启动了master以及其他核心服务器,用spin回调函数来保证时刻保持服务的可使用,然后这里面更多看到的是安全性检查:刚进来就写了整整一个包的命令行参数检查,接下来就是写log,目的也是为了记录程序是否正确运行,后面是磁盘用量检查,整个就保证程序可以稳健的运行。
5. 总结
这周建立了VSCode源码阅读环境,并大致阅读了ROS Master的源码。
本文介绍了如何在VSCode中建立ROS源码阅读环境,重点是调试和阅读ROS Master的源码过程,包括参数检查、日志记录、XMLRPC服务器的使用以及ROS网络的构建,强调了spin回调函数的重要性。

8855

被折叠的 条评论
为什么被折叠?



