每个机器人可能有很多功能,比如移动控制、视觉感知、自主导航等。这里的,每一个功能的代码都独立的放在一个文件下,就定义为一个功能包。每个功能包都能独立的运行
那如果说我不要分开放可以吗?当然可以
ros 中的功能包定义 类似于其他传统系统服务里的微服务概念,比如你要开发一个电商系统,系统里有用户服务,商品服务,订单服务,评价服务等等。
如何在ROS2中创建一个功能包呢?我们可以使用这个指令:
ros2 pkg create --build-type <build-type> <package_name>
创建功能包命令详解:
比如在终端中分别创建C++和Python版本的功能包:
cd ~/dev_ws/src
创建C++ 功能包示例
ros2 pkg create --build-type ament_cmake learning_pkg_c
创建Python 功能包示例
ros2 pkg create --build-type ament_python learning_pkg_python
在创建好的功能包中,我们可以继续完成代码的编写,之后需要编译和配置环境变量,才能正常运行:
cd ~/dev_ws
colcon build # 编译工作空间所有功能包
source install/local_setup.bash
功能包并不是普通的文件夹,那如何判断一个文件夹是否是功能包呢?我们来分析下刚才新创建两个功能包的结构。
首先看下C++类型的功能包,其中必然存在两个文件:package.xml和CMakerLists.txt。
package.xml文件的主要内容如下,包含功能包的版权描述,和各种依赖的声明。
CMakeLists.txt文件是编译规则,C++代码需要编译才能运行,所以必须要在该文件中设置如何编译,使用CMake语法。
C++功能包需要将源码编译成可执行文件,但是Python语言是解析型的,不需要编译,所以会有一些不同,但也会有这两个文件:package.xml和setup.py。
package.xml文件的主要内容和C++版本功能包一样,包含功能包的版权描述,和各种依赖的声明。
setup.py文件里边也包含一些版权信息,除此之外,还有“entry_points”配置的程序入口,在后续编程讲解中,我们会给大家介绍如何使用。