前言
为了实现便于替换、复用与合作使用,在完成大型的项目时通常会使用模块化设计,即将不同功能的实现分别封装在单独的文件中,而不是在一个文件中实现所有功能,而这通常也伴随着自定义头文件的使用
CPP
除了上述理由,在cpp中使用cmake编译时,如果使用自定义头文件.h提前将类的结构,成员,函数入口等信息声明出来,则可以减轻编译的压力,而不必在更冗长.cpp文件中去寻找。
具体而言,在ROS1的项目构成中,一个cpp文件通常以.h和.cpp成对的形式出现。例如如下结构
1 | ros_pkg\ |
然后.h文件写法示意如下
1 |
|
而.cpp文件写法示意如下
1 |
|
其中构造函数名后面的 : 变量(值) 表示给类成员变量提前和直接赋值,是cpp的特殊语法
Python
在ros1项目中python自定义库文件的使用需要遵循一定的方法,需要手动进行一些设置,因为ros1在设计时(2007)主要是为了cpp而设计的,许多python功能需要手动添加。而在ros2中就有了python的自动支持。
如果不进行这些操作,rosrun无法正常使用(当然直接python运行则可以)
以以下这个功能包agent为例,一般的python文件都放在scripts下,而需要被引用的库文件需要在src下新建一个同名文件夹。
1 | agent/ |
其中有一个与cmakelist同级的setup.py文件,有如下内容
1 | from distutils.core import setup |
库文件夹及其下每一个文件夹都要有一个__init__.py,其中可以有以下内容
- 留空,单纯表示该文件夹是一个python包
- 加入一些一启动就需要执行的逻辑
- 将一些类提高层级
最后需要在CMakeLists.txt中加入catkin_python_setup()然后编译,即可成功使用,可以在其他功能包中使用这些库文件。