基于ROS代码元信息的机器人软件架构实时模拟方法及装置
文献发布时间:2023-06-19 19:07:35
技术领域
本发明提供一种机器人软件架构实时模拟方法,具体涉及基于ROS代码元信息的机器人软件架构实时模拟方法。
背景技术
机器人应用覆盖范围广、场景复杂,其开发往往受到具体生成环境影响,需要针对现场环境对软件架构作有针对性的修改。而通常受成本限制,机器人应用开发者无法在所有环境中测试自己开发的机器人应用,因此通过软件来模拟机器人软件架构就显得尤为重要。
同时由于机器人的规格和应用场景十分宽泛且在不停变化,因而为机器人编写通用的软件并不容易。同时,不同的机器人会有完全不同的硬件,因此提高机器人软件的代码复用率也十分困难。除此之外,机器人软件必须包括从底层的驱动程序、逻辑抽象到具体应用的所有层次,这远超单一开发者的开发能力。
因此,机器人技术研究者设计了许多框架来管理机器人软件,因而诞生了许多机器人软件系统用于学术研究和产业界。机器人领域的问题非常宽泛,单一解决方案无法应对所有问题,每种框架都为达到某一特定目的而设计。
ROS(Robotic Operating System,下文简称“ROS”)也是这些框架其中之一。ROS最初是斯坦福人工智能实验室为了支持斯坦福智能机器人STAIR而建立的交换庭(switchyard)项目,设计来解决开发大规模服务机器人应用的问题。但最终的框架在其它机器人领域也有通用性。它提供一系列程序库和工具以帮助软件开发者创建机器人应用软件。它提供了硬件抽象、设备驱动、函数库、可视化工具、消息传递和软件包管理等诸多功能。ROS遵循BSD开源许可协议。其开源许可证和活跃的社区使其在许多机器人领域得到了广泛采用。
ROS是专为机器人软件开发所设计出来的一套架构。它是一个开源的元级操作系统(后操作系统),提供类似于操作系统的服务,包括硬件抽象描述、底层驱动程序管理、共用功能的执行、程序间消息传递、程序发行包管理,它也提供一些工具和库用于获取、建立、编写和执行多机融合的程序。
要模拟机器人软件架构就需要获取ROS代码的更多元信息。一个典型的ROS应用的元信息可以分为两个层级,文件系统级别和计算图级别。目前已有的机器人开源代码库只提供了对ROS包进行了静态分析后的信息,但是ROS灵活的框架导致ROS程序的计算图级别信息无法使用静态分析获取。
ROS的计算图级别信息相较于文件系统级别信息则不那么容易获取。这些信息通常是ROS程序根据运行时环境及参数动态生成。在不运行节点的情况下,要想获取它们的元信息,只能查阅文档或直接查看源代码。但是这种查阅静态文件的方式对于开发者有很高的要求,耗时且易出错,需要开发者对自己的代码及第三方代码都十分熟悉。
发明内容
本发明的目的是提供一种基于ROS代码元信息的机器人软件架构实时模拟方法,用以实时模拟机器人软件架构。
本发明的技术方案如下:一种基于ROS代码元信息的机器人软件架构实时模拟方法,包括以下步骤:
从机器人软件获取至少一个roslaunch配置文件,解析节点信息,所述节点信息包括:节点名称;
从文件系统中找到与节点名称对应的可执行文件,生成静态机器人软件架构;
根据所述配置文件启动节点;
根据所述配置文件中的参数与节点信息运行ROS应用程序,生成ROS计算图;
从所述ROS计算图中提取计算图级元信息,包括服务与话题;
生成节点、服务与话题之间的联系,生成动态机器人软件架构;
结合所述静态机器人软件架构和所述动态机器人软件架构模拟出机器人软件架构。
所述从机器人软件获取至少一个roslaunch配置文件,解析节点架构,包括:
如果读取了多个roslaunch配置文件,则依次解析节点信息,合并相同的节点名称,忽略重复的节点。
所述节点信息还包括节点特征,所述节点特征包括:节点发布的话题类型,节点订阅的话题类型,节点提供的服务类型。
所述根据所述配置文件启动节点,包括:
遍历所述配置文件中获取的节点信息,判断ROS主节点是否启动;
如果否,先启动主节点,再依次启动其他节点。
所述生成节点、服务与话题之间的联系,生成动态机器人软件架构,包括:
基于遍历的节点信息以及在ROS主节点注册的对应话题与服务,从而生成节点与话题、服务之间的联系,并生成节点的特征,进而实时模拟动态机器人软件架构。
本发明还提供一种基于ROS代码元信息的机器人软件架构实时模拟装置,包括:
ROS元信息提取器模块,用于从机器人软件获取至少一个roslaunch配置文件,解析节点信息,所述节点信息包括:节点名称和节点特征;从文件系统中找到与节点名称对应的可执行文件;
机器人软件架构模拟器模块,用于读取所述ROS元信息提取器模块提取的信息,根据所述配置文件启动节点;根据所述配置文件中的参数与节点信息运行ROS应用程序,生成ROS计算图;从所述ROS计算图中提取计算图级元信息,包括服务与话题;生成节点、服务与话题之间的联系,模拟机器人软件架构。
所述ROS元信息提取器模块还用于:如果读取了多个roslaunch配置文件,则依次解析节点信息,合并相同的节点名称,忽略重复的节点。
所述机器人软件架构模拟器模块还用于:
遍历所述配置文件中获取的节点信息,判断ROS主节点是否启动;
如果否,先启动主节点,再依次启动其他节点。
所述机器人软件架构模拟器模块还用于:
基于遍历的节点信息以及在ROS主节点注册的对应话题与服务,从而生成节点与话题、服务之间的联系,并生成节点的特征,进而实时模拟动态机器人软件架构。
本发明技术方案的优点:
通过结合静态分析获取的文件系统级别信息与动态分析获取的计算图级别信息可以获取更完整的ROS代码元信息,进而极大程度上改进机器人软件架构的模拟效果,降低开发者负担,减少开发周期。
附图说明
图1是本发明的机器人软件架构实时模拟架构。
具体实施方式
机器人软件架构由静态架构与动态架构两部分组成。静态架构可由传统静态架构方法获取得到,ROS应用程序由多个节点组成,这些节点以点对点方式与充当名称服务器和参数数据库的ROS主节点通信。该网络设计称为ROS计算图,可以在运行时重新配置。节点可以在任意时间启动并加入或离开网络,而不会中断或影响整个网络的功能。在正在运行的应用程序上启用此类高度动态的修改机制可大大加快开发速度并提高系统的容错能力。但同时,ROS节点通过话题或服务隐式连接,这导致动态生成的话题和服务难以通过静态分析获取。
另一方面,一个完整的ROS程序通常包含多个节点。为了便于一次启动和配置多个节点,ROS附带了工具roslaunch。roslaunch的配置文件使用XML格式,用于描述ROS应用程序的全部或部分内容。此配置主要包括必需的节点及其命名空间(namespace)层次结构,配置,启动参数以及可用主机上的分布。执行时,roslaunch根据配置启动各个节点,没有特定的顺序。
这种配置格式可以看作是ROS应用程序的基本架构描述语言,因为它模拟了应用程序中组件的组成和配置,以及命名空间和主机等结构元素。然而,这个配置文件是不完整的:它没有明确地为通信渠道建模。服务和话题这两种ROS中的主要通信形式,没有用声明的方式描述,而是由节点在运行时动态地创建。
本发明提出的机器人软件架构实时模拟方法,首先通过静态分析获取文件系统级信息,并在此基础上通过动态分析运行时ROS计算图,从而提取缺少的主题和服务信息,进而结合静态分析和动态分析进行实时模拟机器人软件架构。实践表明,当节点的生命周期遵循通用结构且话题和服务不依赖于运行环境或传感器数据时,可以取得较好结果,通过模拟获取的计算图级信息与实际生产中的信息基本一致。当不满足以上条件时,通过执行roslaunch,以最大程度模拟运行环境,也可以取得令人满意的效果。
机器人软件架构实时模拟工具分为两个模块,“ROS元信息提取器”和“机器人软件架构模拟器”。
ROS元信息提取器模块基于roslaunch开发,一方面通过静态分析,从ROS包的文件系统中获取roslaunch配置文件及文件系统级元信息;另一方面根据配置文件中的参数与结构信息运行ROS应用程序,生成ROS计算图,并通过动态分析从ROS计算图中提取计算图级元信息,包括服务和话题两种。在此基础上实时将获取的ROS元信息传递给机器人软件架构模拟器。
机器人软件架构模拟器模块读取由ROS元信息提取器生成的ROS元信息,从而生成节点与话题、服务之间的联系,进而实时模拟机器人软件架构,包括静态架构和动态架构两部分。
如图1所示,本发明的具体实施方式如下:
1.ROS元信息提取器模块
ROS元信息提取器将首先读取roslaunch配置文件,解析节点架构,从文件系统中找到节点对应的可执行文件,并根据roslaunch配置文件启动这些节点。在这过程中,如果ROS主节点尚未启动,那么将首先启动ROS主节点,再依次启动其它节点。
如果读取了多个roslaunch配置文件,那么ROS元信息提取器将依次解析,合并相同的命名空间,忽略重复的节点,之后再依次启动节点。在启动完所有节点后,生成ROS计算图,并通过动态分析从ROS计算图中提取计算图级元信息,包括服务和话题两种。在此基础上实时将获取的ROS元信息传递给机器人软件架构模拟器。
2.机器人软件架构模拟器模块
机器人软件架构模拟器模块读取由ROS元信息提取器生成的ROS元信息,从而生成节点与话题、服务之间的联系,进而实时模拟机器人软件架构,包括静态架构和动态架构两部分。静态架构中,遍历配置信息中获取的节点;动态架构中,软件架构模拟器与ROS主节点通信,基于遍历的节点信息及其在ROS主节点注册的对应话题与服务,从而生成节点与话题、服务之间的联系,并生成节点的特征,进而实时模拟机器人软件架构。
节点特征包括三项:节点发布的话题类型,节点订阅的话题类型,节点提供的服务类型。这里选取的都是类型,也就是相同类型的话题将只保留一个。这样做的目的是简化模型。
使用Python编写动态分析工具,并添加包清单文件,从而符合ROS包规范,以便在ROS社区分发。该工具目前用于辅助机器人开源代码库的计算图级信息提取,同时也可独立运行用于分析ROS代码。
程序需要导入四个ROS相关模块:roslaunch、rospy、rosgraph、rosservice。
roslaunch模块用于解析roslaunch配置文件并根据配置文件启动节点;
rospy用于在记录运行状态并输出信息到日志文件;
rosgraph封装了用于和ROS主节点通信的方法,从而获取节点和话题信息;
rosservice用于获取服务信息。
另外还需要从xmlrpc.client模块中导入ServerProxy类,用于获取节点所在进程相关信息。ROS主节点只记录了ROS计算图有关的内容,但没有记录进程相关信息,如Pid等。这里使用ServerProxy类,获取进程信息。这些信息并不直接用于动态分析,而是用于调试。
程序逻辑根据设计,核心功能分为三个函数:
meta_extractor(launchfile)
analyze_graph(launch)
gen_features(nodes,topics,services)
meta_extractor(launchfile)接受roslaunch配置文件作为参数,中间调用analyze_graph(launch),最终返回(nodes,topics,services)三元组,返回结果分别是节点、话题、服务的完整名称索引。
analyze_graph(launch)接受launch作为参数,包含解析后的roslaunch配置文件信息。之后调用rosgraph.Master(),生成ROS主节点代理,从而通信获取节点、话题、服务信息,最终返回nodes,topics,services,返回结果分别是节点、话题、服务的实例列表。
gen_features(nodes,topics,services)接受ROS元信息提取器返回结果,包括静态信息与动态信息;对每个节点,删去重复的话题类型和服务类型,返回feature_dict,包含节点-节点特征键值对。
下面通过实例对本发明做进一步说明。
实施例1:根据ROS机器人示例程序实时模拟机器人软件架构
这里以ROS官方提供的教程包rospy_tutorials中的talker_listener.launch为例,展示生成结果。
talker_listener.launch的计算图中只包含两个节点,talker.py和listener.py。talker.py每秒向话题chatter发布信息,listener.py订阅话题chatter,并向屏幕打印收到的消息。
1.ROS元信息提取器将首先读取roslaunch配置文件talker_listener.launch,遍历解析节点信息;
2.机器人软件架构模拟器模块基于遍历获取的节点信息生成静态机器人软件架构;
3.启动ROS主节点;
4.根据talker_listener.launch配置文件中的参数启动静态软件架构中的节点;
5.机器人软件架构模拟器模块读取由ROS元信息提取器生成的配置信息,从配置信息中获取所有节点的完整名称;
6.与ROS主节点通信,通过配置信息中获取的节点名称遍历所有节点及其在ROS主节点注册的对应话题与服务;
7.生成节点与话题、服务之间的联系,即动态机器人软件架构;
8.结合2中的静态架构与7中的动态架构,即实现了实时模拟机器人软件架构。
- 一种基于高精度GNSS实时协同定位的ROS机器人导航方法
- 一种基于空间光调制器像差可调的模拟眼的实时动态模拟装置及其实时动态模拟方法