ROS2的package.xml和cmake

创建包,相关文件

创建C++包: ros2 pkg create --build-type ament_cmake --node-name node_name package_name

指明依赖项: ros2 pkg create --build-type ament_cmake --node-name node_name package_name --dependencies rclcpp std_msgs

创建python包: ros2 pkg create --build-type ament_python --node-name node_name package_name

如果在创建包时,忘了指定依赖项,需要手动修改package.xmlCMakeLists.txt

比如在package.xml<buildtool_depend> 之后添加

1
2
<depend>rclcpp</depend>
<depend>std_msgs</depend>

CMakeLists.txt添加
1
2
3
4
find_package(rclcpp  REQUIRED)
find_package(std_msgs REQUIRED)

ament_target_dependencies(my_node rclcpp std_msgs)

两个依赖项不能都放进find_package里面,否则报错

工作空间

  • build目录放的是中间文件.例如调用CMake时,每个包都会生成一个子文件夹.

  • install目录是放包的安装文件.默认情况下,每个包会被安装到一个独立的子目录.

  • log目录包含每次执行colcon的各种日志信息.

对比catkin,没有了devel目录


package.xml中包含该功能包的依赖信息,它可以帮助编译工具colcon确定多个功能包编译的顺序。

CMakeList.txt当中,必须有

1
2
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)

ament_cmake是cmake的增强版

find_package(rclcpp_lifecycle REQUIRED)用于生命周期管理,平时可以不添加

例如package名称为project(first_node),必须修改的部分如下

1
2
3
4
5
add_executable(test_node src/test.cpp)
ament_target_dependencies(test_node rclcpp std_msgs)
install(TARGETS test_node DESTINATION lib/install_node)

target_link_libraries(test_node behaviortree_cpp_v3)

  • add_executable不必解释

  • ament_target_dependencies是官方推荐的方式去添加依赖项。它将使依赖项的库、头文件和自身的依赖项被正常找到。如果不添加库名称,include头文件时会找不到

  • install是安装库的语句。它将在工作空间生成文件 install/first_node/lib/install_node/test_node

  • ament_package() 最后一句,不要修改。项目安装是通过ament_package()完成的,并且每个软件包必须恰好执行一次这个调用。ament_package()会安装package.xml文件,用ament索引注册该软件包,并安装CMake的配置(和可能的目标)文件,以便其他软件包可以用find_package找到该软件包。由于ament_package()会从CMakeLists.txt中收集大量信息,因此它应该是CMakeLists.txt中的最后一个调用。

可选项

ament_export_dependencies(${dependencies})

这句会将依赖项导出到下游软件包。这样该库使用者也就不必为那些依赖项调用find_package了。