文件结构介绍
ROS2中同样将其最小构建单元称为功能包package,与ROS1不同的是,ROS2使用colcon作为package的编译工具,ROS2工作空间(本文中为ros2_ws/目录)的文件结构由四个目录组成,分别是build/、install/、src/、log/。
- src/:代码目录,未来编写的代码、脚本,都需要人为的放置到这里;
- build/:编译目录,保存编译过程中产生的中间文件;
- install/:安装目录,放置编译得到的可执行文件、库文件和脚本;
- log/:日志目录,编译和运行过程中,保存各种警告、错误、信息等日志。
功能包package
任何ROS2的代码无论是C++还是Python都要放到package中,这样才能正常的编译和运行。一个package可以编译出来多个目标文件(可执行程序、动态静态库、头文件等等)。
创建一个package需要在ros2_ws/src下,用到ros2 pkg命令,用法是:
ros2 pkg create <package-name> --build-type {cmake,ament_cmake,ament_python} --dependencies <dependencies -name>
其中<package-name>是包名,
--build-type 用来指定该包的编译类型,一共有三个可选项ament_python、ament_cmake、cmake,
--dependencies 指的是这个功能包的依赖,可以依赖多个软件包。
- 创建ROS2的的C++包:
ros2 pkg create --build-type ament_cmake <package_name>
- 创建ROS2的的python包:
ros2 pkg create --build-type ament_python <package_name>
- 例如,新建一个package叫做test_pkg,依赖rclccpp(常用依赖):
ros2 pkg create example_cpp --build-type ament_cmake --dependencies rclcpp
这样就会在当前路径下新建test_pkg软件包,如下图,ros2 pkg完成了软件包的初始化,填充好了CMakeLists.txt和package.xml模板,并且将依赖项填进了这两个文件中。
CMakeLists.txt
CMakeLists.txt的基本语法都还是按照CMake,而colcon在其中加入了少量的宏,总体的结构如下:
cmake_minimum_required() #CMake的版本号
project() #项目名称
find_package() #找到编译需要的其他CMake/Catkin package
add_message_files() #新加宏,添加自定义Message/Service/Action文件
add_service_files()
add_action_files()
generate_message() #新加宏,生成不同语言版本的msg/srv/action接口
add_library() #生成库
add_executable() #生成可执行二进制文件
add_dependencies() #定义目标文件依赖于其他目标文件,确保其他目标已被构建
ament_target_dependencies() #新加宏,它将使依赖项的库、头文件和自身的依赖项被正常找到
target_link_libraries() #链接
install() #指定安装规则
ament_package() #新加宏,安装项目,在CMakeLists.txt文件中的最后一个调用。
colcon提供的ament_package()函数在安装项目时会用到前面编译出来的结果,因此ament_package()语句应放在CMakeLists.txt的最后,安装项目时会在“ROS2工作空间/install/”中新建{PROJECT_NAME}目录,根据install()函数指定的安装规则安装到“ROS2工作空间/install/{PROJECT_NAME}”目录,需要注意的是,ros2 run命令识别可执行程序的目录是“ROS2工作空间/install/{PROJECT_NAME}/lib/{PROJECT_NAME}”目录,因此需要使用ros2 run运行的可执行文件应使用install()函数安装到“lib/{PROJECT_NAME}”目录。
项目安装的结构示例如下图: