暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

项目经验分享:精简ROS2节点和检测过程

开源之夏 2021-08-06
1676

点击蓝字 关注我们


暑期2021项目研发正在火热进行中,开源之夏公众号面向广大社区及项目承担学生征稿,欢迎大家热情分享:

发送投稿文章至官方联络邮箱:

summer@iscas.ac.cn

添加公众号小编微信投稿:


本期分享来自ROS社区的戈振鹏同学(精简ROS2节点和检测过程)的项目经验。


简介

项目名称

精简ROS2节点和检测过程

任务简介

Navigation2(Nav2)是基于ROS2的移动机器人导航功能软件栈,旨在为移动机器人提供高性能的导航功能,是ROS社区最流行的机器人开源项目之一。我的任务是为尽可能使用Callback Group和Executor等技术替换在Nav2中使用的内部Node,因为Node的系统开销是比较大的,减小Nav2中Node的使用,可以提高Nav2性能。

ROS2项目简介

ROS (Robot Operating System) 是一个致力于机器人软件开发的开源项目,包含了从机器人驱动软件到最先进的算法等一系列用于机器人开发的功能库和开发工具。ROS2相对第一代ROS,进行了全面重构来支持工业级别应用,其中采用了DDS中间件,具有更灵活的通信机制,支持实时通信,更适合应用于机器人上。

Navigation2项目简介

Navigation2项目的目的是为移动机器人寻找到一种安全的方法从A点移动到B点,涉及到路径规划,机器人定位,移动机器人控制,机器 人决策等算法。Nav2基于ROS2开发,相比于第一代Navigation,具有更高实时性,并且采用行为树作为其决策控制,采用插件化设 计,使得Nav2具备了重配置(Reconfiguration)的能力,可以方便的进行二次开发。


这篇文章将分享我参与开源项目Navigation2的经验。


熟悉Navigation

为了更好的理解任务,需要先了解其对应的开源项目。对我而言,由于之前没有使用过Navigation2,可能会觉得无从下手,由于Navigation2已经具有很好的文档,阅读文档是入门项目的最快方式。于是我按照文档一步一步把环境配置好,运行简单的demo,可以对项目有个直观的了解,接着顺着demo,去了解Nav2的架构,模块设计等内容,这样可以对项目有一个整体的把握。


理解任务

熟悉了Navigation2,就需要了解任务,根据任务描述,了解该项任务是一项针对Navigation2的优化。由于Navigation2是开源项目,所以可以通过提issue的方式,获得来自全世界开发者的建议。而这个任务正是来源于其中的一个issue。


这个issue是很早提出来的,并且有多人参与讨论,讨论了需求,讨论了不同解决方案,但是一直都没有找到一个很好的解决方案,今年由于 上游软件ROS2发布的新版本Galactic,增加了Executor对Callback Group的支持,使得该issue能够很好的解决,这也是我即将要采用的方 案。通过阅读该issue,以及该相关issue已经提交的PR,让我对任务有了更清晰的认识,包括为啥需要减小Node的使用,Node使用是怎样 增加系统开销的,以及怎么去减小Node的使用。


制定计划

在申请项目时,我们需要写计划书,当时的计划相对比较笼统,在申请成功之后,在导师Steven的指导下,制定了一个更为具体的计划列表,由于Nav2是模块化设计,每个模块就是一个package,所以可以将我的任务按模块拆分,这样只需要一个模块一个模块完成即可。

Slack:

Nav2社区采用Slack进行沟通,所以,我和导师之间也使用Slack作为通讯工具,并且单独使用一个Thread跟踪我和导师之间的所有消息,类似GitHub中的issue一样,这样可以方便的跟踪我的任务。在做一个项目时,有一个手段去跟踪问题以及任务进度是非常不错的,这样可以随时回头进行回顾,并有清晰的思路知道下一步要做什么。

在寻找所有需要修改的点时,我得到了一个初步的列表,由于刚开始接触项目,事实上有些地方我还不确定是否需要修改,在这个过程中,导师对我的帮助非常大,我在Slack向导师提问后,导师给了我详细的回复,包括是否需要修改,以及为什么不需要修改等内容。


在做完计划表后,将其发布在相应的issue上。在GitHub开源项目中,使用issue来记录来自开发者的建议或Bug报告等,在issue下进行讨论方案可行性,实施计划等,这样就可以被其他开发者跟踪,可以在issue页面中,按照时间线了解事情的来龙去脉,方便其他开发者快速参与进来。


执行计划

制定计划后,就需要执行计划,万事开头难,找一个简单的子任务开始,会给后续工作带来更大的信心。虽然对于任务已经有了初步了解,但是我还是不清楚哪个更简单,这时,导师Steven给我一个建议,让我从 waypoint follower server 这个模块开始做,相比于其他模块,这个模块更容易上手,并且已经有类似的实现可以参考。


顺着导师的建议,我很快地完成了第一个子任务,并提交了第一个PR (pull request),提Issue和PR是参与开源项目的主要方式,通过提交PR,我们可以向开源项目贡献自己的代码,首先开源项目负责人会对PR中的代码进行review,提出相应的修改建议,然后我们需要根据修改意见进行修改,如果项目负责人approve这次PR,提交的代码就会被合并到开源项目主线中去。

由于之前很少参与开源项目,所以第一个PR花了我不少时间,但是也学习了如何为开源项目提PR的完整流程,这为我后续的工作铺平了道路。除此之外,导师Steven还指导我如何进行代码测试,因为该项目集成了CI测试,可以在review代码之前,自动检测提交的代码是否有格式,编译等错误,而作为代码贡献者,我们需要保证提交内容可以通过CI。


在完成计划的过程中,主要是以提交PR的方式完成的,这一过程并不是一帆风顺的。事实上,几乎每一次提交PR,reviewer都会提出不同的建议,然后进行相关讨论,在讨论过程中,会有一些点之前没有考虑到的,那么我们需要进行修改,甚至有些时候,经过讨论之后才发现这个需求或实现是不合理的,这个时候就会关闭该次PR,尽管做了无用的工作,PR没有被采纳,但是其中的讨论也让我收获良多。


由于时区差的原因,我在Slack上向导师Steven提问,导师并不能马上回复我,一般需要等到第二天才能回复。这个有不好的一面,也有好的一面,虽然沟通不是那么方便,但这也迫使我遇到问题首先尝试自己解决,并且将问题进行总结,避免无效问题,毕竟等待回复是非常耗时的。到目前为止,我已经完成了我第一阶段的大部分内容。


我的分享就这么多了,如果大家对机器人软件开发感兴趣,可以关注我的GitHub:https://github.com/gezp (点击阅读原文直达)



文章转载自开源之夏,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论