ros2基础入门

创建功能包

一个完整的机器人往往由多个功能模块组成,需要多个功能包进行组合。ROS2开发者约定了Workspace(工作空间)这个概念来管理多个功能包。

首先创建工作空间,在开发过程中,所有的功能包都放在src目录下,并在src同级目录也就是ros2_ws目录下运行colcon进行构建,此事构建出的buildinstalllog等目录和src保持同级。

1
2
mkdir -p ros2_ws/src
cd ros2_ws/src

src目录下创建C++功能包

1
2
ros2 pkg create <pkg_name> --build-type ament_cmake --license Apache-2.0
cd <pkg_name>/src

ros2 pkg create是用于创建功能包的命令,其中<pkg_name>是功能包的名字,后面的--build-type ament_cmake表示指定功能包的构建类型为ament_cmake即C++,最后的--license Apache-2.0用于声明功能包的开源协议。

创建好功能包后,在功能包的src目录下添加cpp_node.cpp(举例,根据实际情况取不同名字)

1
2
3
4
5
6
7
8
9
10
11
#include "rclcpp/rclcpp.hpp"

int main(int argc, char **argv)
{
rclcpp::init(argc, argv);
auto node = std::make_shared<rclcpp::Node>("cpp_node");
RCLCPP_INFO(node->get_logger(), "你好 C++ 节点!");
rclcpp::spin(node);
rclcpp::shutdown();
return 0;
}

代码编写完成后,还需要在CMakeLists.txt文件中注册节点,添加依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
...
find_package(ament_cmake REQUIRED)
// 查找rclcpp头文件和库
find_package(rclcpp REQUIRED)
// 添加可执行文件cpp_node
add_executable(cpp_node src/cpp_node.cpp)
// 为cpp_node添加依赖
ament_target_dependencies(cpp_node rclcpp)
// 将cpp_node添加到install目录
install(TARGETS
cpp_node
DESTINATION lib/${PROJECT_NAME})
...

构建功能包前还需要在清单文件packages.xml中添加对relcpp的依赖声明

1
<depend>rclcpp</depend>

最后使用colconb build构建功能包,该命令可以构建当前及子目录下所有功能包。若构建时当前目录下不存在buildinstalllog这三个目录,则会自动创建,并将构建中间文件、结果和日志放入对应目录中。构建完成后,再查看 install/demo_cpp_pkg/lib/demo_cpp_pkg/目录就可以看到cpp_node 可执行文件 了。

1
colcon build

依次输出两条指令,就可以运行该文件

1
2
source install/setup.bash
ros2 run demo_cpp_pkg cpp_node

功能包结构

  • include

    该目录用于存放 C++ 的头文件,如果要编写头文件,一般 都放置在这个目录下。

  • src

    代码资源目录,可以放置节点或其他相关代码。

  • CMakeLists.txt

    该文件是 C/C++ 构建系统 CMake 的配置文件,在该文件中添加指令,即可完成依赖查找、可执行文件添加、安装等工作。

  • LICENSE

    该文件是功能包的许可证。创建该功能包时使用了 –license Apache-2.0 参数,这个文件內容就是 Apache-2.0 的协议内容

  • package.xml

    该文件是功能包的清单文件,每个 ROS2 的功能包都会包含这个文件。

当然,除了上面这些文件和文件夹,在实际开发中还可以添加其他目录和文件,比如用 于放置地图的 map 目录、用于放置参数的 config 目录等。