2021SC@SDUSC
1. 本周工作目标
这周使用VSCode,来阅读一下navigation仓库里许多功能包的代码。结合实际情况,本周的工作目标如下:
-
下载仓库,清点重点的包
-
阅读nav_core功能包
2. 下载仓库,分析重点的包
首先git clone下载仓库,然后用vscode打开,发现里面有很多包:

然后用一个静态代码分析工具understand初步分析这个文件夹里包裹的依赖情况,生成依赖图如下:

可以看见,最核心的包是costmap_2d和nav_core,相对独立的包是map_server,amcl和navigation等。看代码时就优先从这些包开始看起。
3. nav_core包阅读
于是我选择了nav_core包进行阅读。
先观察包结构:

发现这个代码包里面主要是.h文件,没有cpp文件。猜测主要是由接口构成的包。
然后观察CMakelist.txt:

发现这个包需要传入传出的信息有geometry_msgs和tf2_ros等,也和本包“导航”的功能有关。
然后我们打开.h文件,阅读代码:

发现果然如我们所猜测的一样,这个包里面主要是接口。所有的接口都定义在namespace nav_core下,利用C++的名称空间机制隔离了重名的类,然后定义了类的纯虚函数,相当于定义了几个导航接口,规范、隔离实现和调用。
那么,具体这个包里定义了多少接口呢?每个接口的作用又是什么呢?我再次利用understand工具,画出UML图辅助分析:

整理得到以下表格:
| 文件名 | 接口类名 | 标志成员 | 作用 |
|---|---|---|---|
| base_global_planner.h | nav_core::BaseGlobalPlanner | initialize makePlan | 全局路径规划。各个全局规划器都需要实现这个接口。 |
| base_local_planner.h | nav_core::BaseLocalPlanner | initialize computeVelocityCommands isGoalReached setPlan | 局部路径规划。如果机器人没有到达设定的目标,那么就要对局部路径进行规划。 |
| parameter_magic.h | 无类名 | loadParameterWithDeprecation warnRenamedParameter | 检查参数名称,对过时参数进行警告。 |
| recovery_behavior.h | nav_core::RecoveryBehavior | initialize runBehavior | 机器人恢复行为定义。如果路径被堵塞了,那么机器人将执行恢复行为尝试修正。 |
这就是这个包里大部分的内容。
4. 总结
本周对navigation仓库进行了一个大致分析,并对nav_core包进行了源码的阅读。nav_core包里主要是一些接口的定义,相对来说代码量不大,容易阅读。
本文详细记录了对ROS中navigation仓库的nav_core包进行源码阅读的过程,包括工作目标、仓库分析、包结构观察、接口定义等内容,通过接口的UML图和表格总结了nav_core包的核心功能。

1498

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



