工作空间
一个工作空间可以包含多个功能包.
以一个c++工作空间为例,创建一个工作空间learning_ws,并在learning_ws下创建一个src文件夹.之后,在learning_ws下执行 colcon build ,该目录会包含如下文件
learning_ws/
├──
├── src/ # 存放一个或多个功能包
│ ├── function_package_01/
│ └── function_package_02/
│
├── log/ # 编译和运行过程中存放的信息
├── install/ # 存放编译后得到的可执行文件
│
└── build/ # 存放编译过程中的中间文件功能包
每个机器人可能具备多种功能,例如运动控制、视觉感知和自主导航。虽然我们可以将所有这些功能的源代码合并在一起,但当我们希望与他人共享其中某些功能时,常常会发现代码混杂在一起,难以分离。
功能包(function package)正是为解决这一问题而设计的。我们将不同功能的代码分别放入独立的软件包中,并尽可能降低它们之间的耦合度。在与 ROS 社区的其他开发者共享时,我们只需说明如何使用该功能包,其他人便能快速上手并加以应用。
功能包的创建
ros2 pkg create <package_name> --build-type <build-type> --dependencies <dependencies> --node-name <node_name>各参数介绍:
<package_name>: 创建的功能包名称
<build-type>: 指定功能包使用的构建系统类型. ament_cmake:用于c++项目; ament_python :用于python项目
<dependencies>: 指定当前功能包依赖的其他功能包, c++项目通常依赖 rclcpp ,python项目通常依rclpy,如果用到了标准消息类型(如字符串,整型等),通常依std_msgs .
<node_name>: 编译生成的可执行文件的名称.需要注意的是,这个不是指的ros2的消息节点名称.消息节点名通常在代码中指定.
进入learning_ws/src文件夹,通过以下指令,创建名为hello_demo的c++项目功能包
ros2 pkg create hello_demo --build-type ament_cmake --dependencies rclcpp std_msgs --node-name hello_demo获得如下结构目录
learning_ws/
├──
├── src/ # 存放一个或多个功能包
│ └── hello_demo/
│ ├── include/ # 存放c++头文件
│ ├── src/ # 存放功能包核心源代码
│ ├── CMakeLists.txt
│ └── package.xml # 包含功能包元数据,具体定义了功能包名称,版本号,许可证,依赖等信息.ROS2通过该文件来识别和管理对应功能包
│
├── log/ # 编译和运行过程中存放的信息
├── install/ # 存放编译后得到的可执行文件
│
└── build/ # 存放编译过程中的中间文件功能包编译
在创建功能包后,可以进行编译,对应编译指令有两种:
cd learning_ws
# 编译工作空间中所有功能包
colcon build
# 编译指定1个或多个功能包
colcon build --packages-select <package_name>
# 刷新开发环境
source install/setup.bash需要注意,刷新开发环境后,才能正常使用 ros2 run <package_name> <node_name>,去执行对应功能包下的可执行文件.