【ROS】软件包后期添加依赖
- 前言
- 整体思路
- 修改 package.xml
- 1. 构建依赖(build_depend)
- 2. 构建导出依赖(build_export_depend)
- 3. 运行依赖(exec_depend)
- 如何修改
- 修改 CMakeLists.txt
- 修改 find_package
- 其他修改
前言
在创建 ROS 软件包时,通常会一次性添加好所需的依赖项。但在开发过程中,常常会临时需要用到新的消息类型或功能包,这时就需要给已有的软件包手动添加新的依赖项。
我们不能像最初创建时那样用命令添加,而是要通过修改配置文件来完成。下面就以 nav_msgs
为例,讲解如何添加新的依赖包。
整体思路
要为已有的 ROS 软件包添加依赖项,首先需要知道这些依赖是在哪里声明的。
在 ROS 的功能包中,依赖项主要出现在两个文件中:package.xml
和 CMakeLists.txt
。
package.xml
用来声明该功能包需要哪些依赖项;CMakeLists.txt
用来在编译时实际使用这些依赖。
前者相当于告诉ROS系统“我需要什么”,后者是“怎么用这些东西”。
因此,我们只需要修改这两个文件,就可以为已有的软件包成功添加新的依赖项。接下来将分别讲解如何修改 package.xml
和 CMakeLists.txt
。
修改 package.xml
在 package.xml
中,依赖项一般分为三类:
- 构建依赖(build_depend)
- 构建导出依赖(build_export_depend)
- 运行依赖(exec_depend)
我们需要先搞清楚这三类依赖的区别:
1. 构建依赖(build_depend)
构建依赖指在构建当前功能包时需要用到的依赖。
包括:
- 构建
.msg
、.srv
等自定义消息时引用的外部消息类型 - 源代码中
#include
引用了外部消息包的头文件
例如,如果你在 .msg
文件中用到了 nav_msgs/Odometry
,或者在 .cpp
中使用了 #include <nav_msgs/Odometry.h>
,就需要添加:
<build_depend>nav_msgs</build_depend>
2. 构建导出依赖(build_export_depend)
指:当别的功能包依赖你的包时,是否也需要依赖某个外部包才能正常构建。
例如:
- 如果你的头文件中暴露了
nav_msgs::Odometry
作为参数或成员类型 - 其他包引用了你的头文件,但这些头文件中依赖了
nav_msgs
这时,其他包在构建时也必须能访问 nav_msgs
,所以你需要在 package.xml
中添加:
<build_export_depend>nav_msgs</build_export_depend>
如果 nav_msgs
只是你包的内部实现用到(只出现在 .cpp
中),对外接口没有暴露,就不需要写。
3. 运行依赖(exec_depend)
运行依赖是指:在程序实际运行时,是否真的需要用到某个消息类型或功能包。
简单来说:
- 如果你在运行程序时用到了某个消息类型(比如发布或订阅
nav_msgs/Odometry
),或者调用了某个包的功能(比如导航、路径规划等),那么就需要在exec_depend
中添加对应的依赖。 - 如果某个包只是构建时使用,比如消息生成工具(如
message_generation
),但运行时不会实际调用这个包的功能,就不需要加到运行依赖中。
如何修改
一般来说,如果你的功能包不会被其他功能包引用或调用,那你只需要添加构建依赖和运行依赖就可以了,不用考虑构建导出依赖。
例如:
<build_depend>nav_msgs</build_depend>
<exec_depend>nav_msgs</exec_depend>
这种情况适用于功能包只在内部使用 nav_msgs
,没有对外暴露相关接口的场景。
修改 CMakeLists.txt
修改 find_package
在 find_package(catkin REQUIRED COMPONENTS)
中添加你新加入的依赖项,表示当前功能包在构建时需要这些依赖。
例如,如果你添加了 nav_msgs
作为依赖,就需要在 find_package
中加上:
find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgsstd_srvsmessage_generationnav_msgs # 添加你的依赖项
)
这样,ROS 构建系统就会知道在构建这个包时需要 nav_msgs
,以确保功能包能够正确编译。
其他修改
如果你添加的依赖项是用于定义自定义消息包,那么除了修改 find_package
,你还需要调整以下配置:
- 消息生成器配置:确保在
CMakeLists.txt
中添加消息生成器相关设置,包括:add_message_files
:指定自定义的消息文件。add_service_files
:指定自定义的服务文件。generate_messages
:生成消息类型。
如果你使用 C++ 进行开发,那么除了消息生成器的配置外,还需要修改编译和链接相关的规则,包括:
- 设置头文件目录路径:使用
include_directories
来指定头文件路径。 - 添加可执行文件构建规则:使用
add_executable
来指定需要构建的可执行文件。 - 设置编译依赖关系(构建顺序):使用
add_dependencies
来确保构建时的依赖顺序。 - 设置目标文件的链接库:使用
target_link_libraries
来链接所需的库文件。
根据需求进行适当的修改,确保项目能够正确编译和链接。