工作空间与功能包
一、创建工作空间
工作空间是一个存放项目开发相关文件的文件夹,也是开发过程中存放所有资料的大本营
mkdir -p 002_ws/src
可以使用 colcon build
编译工作空间,编译后会自动生成build、log、install文件夹。
注意:一定要在ws下生成噢
- src,代码空间,未来编写的代码、脚本,都需要人为的放置到这里;
- build,编译空间,保存编译过程中产生的中间文件;
- install,安装空间,放置编译得到的可执行文件和脚本;
- log,日志空间,编译和运行过程中,保存各种警告、错误、信息等日志
二、创建功能包
每个机器人可能有很多功能,比如移动控制、视觉感知、自主导航等,如果我们把这些功能的源码都放到一起当然也是可以的,但是当我们想把其中某些功能分享给别人时,就会发现代码都混合到了一起,很难拆分出来。
举个例子,我们手上有很多红豆、绿豆、黄豆,假设都放在一个袋子里,如果只想把黄豆都拿出来,是不是得在五颜六色的豆子里一颗一颗都找出来,数量越多,你就越头疼;如果我们把不同颜色的豆子放在不同的三个袋子里,需要拿出某种豆子的时候,不就立刻可以找出来了么。
功能包就是这个原理,我们把不同功能的代码划分到不同的功能包中,尽量降低他们之间的耦合关系,
创建example_cpp功能包,使用ament-cmake作为编译类型,并为其添加rclcpp依赖。
cd chapt2_ws/src
ros2 pkg create example_cpp --build-type ament_cmake --dependencies rclcpp
- pkg create 是创建包的意思
- build-type 用来指定该包的编译类型,一共有三个可选项ament_python、ament_cmake、cmake
- dependencies 指的是这个功能包的依赖,ros2的C++客户端接口rclcpp
三、示例
打开终端,进入chapt2_ws/src运行上面的指令,创建完成后的目录结构如下:
cd 002_ws:
进入example_cpp中,然后创建node_01.cpp
#include "rclcpp/rclcpp.hpp"/*创建一个类节点,名字叫做Node03,继承自Node.
*/
class Node03 : public rclcpp::Node
{public:// 构造函数,有一个参数为节点名称Node03(std::string name) : Node(name){// 打印一句RCLCPP_INFO(this->get_logger(), "大家好,我是%s.",name.c_str());}private:};int main(int argc, char **argv)
{rclcpp::init(argc, argv);/*产生一个node_03的节点*/auto node = std::make_shared<Node03>("node_01");/* 运行节点,并检测退出信号*/rclcpp::spin(node);rclcpp::shutdown();return 0;
}
CMakeLists.txt中增加
add_executable(node_01 src/node_01.cpp)
ament_target_dependencies(node_01 rclcpp)install(TARGETSnode_01DESTINATION lib/${PROJECT_NAME}
)
然后进入002_ws下,进行编译
source环境
source install/setup.bash
为了将你刚刚编译生成的新ROS2包(可执行文件、库、环境变量等)“注入”或“激活”到当前的终端环境中,使得系统能够找到并使用它们。
想象一下你的系统是一个巨大的图书馆(System Library),而你的ROS2工作空间是你刚写完的一本新书(Your New Package)。
colcon build 就像是印刷和装订这本书。
这本书现在正放在你家的工作台上(即你的dev_ws/install目录里)。
source install/setup.bash 就像是把这本新书的信息登记到图书馆的中央目录系统中,并把它摆上书架。
如果不执行source,图书馆的目录里就没有你这本书的信息。即使书已经印好了(编译成功了),有人来图书馆问“有没有《My Awesome ROS2 Package》这本书?”,管理员(系统)也会回答:“没有”(Package ‘my_package’ not found)。
然后运行节点
ros2 run example_cpp node_01