创建包,相关文件
创建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.xml
和 CMakeLists.txt
比如在package.xml
的 <buildtool_depend>
之后添加1
2<depend>rclcpp</depend>
<depend>std_msgs</depend>
在CMakeLists.txt
添加1
2
3
4find_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
2find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)ament_cmake
是cmake的增强版
find_package(rclcpp_lifecycle REQUIRED)
用于生命周期管理,平时可以不添加
例如package
名称为project(first_node)
,必须修改的部分如下1
2
3
4
5add_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了。