前言
由于ROS使用中package.xml和CMakeLists中依赖的作用的不同,且缺一不可,就导致我们需要两边写依赖,为了简化依赖的填写,eth开发了一个包叫catkin_simple来规范化依赖填写并简化CMakeLists的填写。
将对catkin的find_package部分移到package.xml的依赖中,通过读取.xml来自动填写find_package(catkin ...)。这是由于CMakeLists填写依赖范围>package.xml的依赖(.xml会自动递归子包依赖)然后冗余填写.xml依赖也不要紧。自动链接catkin相关库和头文件寻找
具体使用
下载
1 | cd catkin_ws/src |
添加依赖
在需要使用catkin_simple的功能包的package.xml中添加编译工具依赖,catkin_simple只是帮你写CMakeLists的而不是功能包
1 | <buildtool_depend>catkin</buildtool_depend> |
使用示例
find_package
例如原本在CMakeLists中有如下一段内容
1 | find_package(catkin REQUIRED COMPONENTS |
那么还需要在package.xml中也写上如下内容
1 | <build_depend>roscpp</build_depend> |
而在package.xml中加入了catkin_simple之后,则CMakeLists中上述部分可以直接改为如下
1 | find_package(catkin_simple REQUIRED) |
其中catkin_simple()会自动查看package.xml并补齐对应的包
cs_add_library
例如原本在CMakeLists中有如下一段内容
1 | add_library(my_controller src/controller.cpp) |
那么使用catkin_simple之后可以改写为如下
1 | cs_add_library(my_controller src/main.cpp) |
cs_add_executable
例如原本在CMakeLists中有如下一段内容
1 | add_executable(my_node src/main.cpp) |
那么使用catkin_simple之后可以改写为如下
1 | cs_add_executable(my_node src/main.cpp) |
cs_export
例如原本在CMakeLists中有如下一段内容
1 | # 声明这是一个catkin功能包 |
那么使用catkin_simple之后可以改写为如下
1 | # 写在末尾 |
action/msg/srv的创建
如果想要在功能包中自定义消息、服务或者actoin,通常需要以下操作
创建目录:
msg/
srv/
action/放文件:
msg/xxx.msg
srv/xxx.srv
action/xxx.actionpackage.xml 加:
message_generation message_runtime 如果文件里用了别的消息类型,比如 std_msgs/Header,
package.xml 也要加 std_msgs。手动修改CMakeLists添加如下内容
add_message_files(…)
generate_messages(…)
add_dependencies(…)
如果package.xml 里有:
1 | <build_depend>message_generation</build_depend> |
那么运行:
1 | catkin_simple() |
会自动去找这些目录:
msg/
srv/
action/
如果里面有文件:
msg/.msg
srv/.srv
action/*.action
它会自动调用相关生成命令,而不用手动写:
add_message_files(…)
add_service_files(…)
add_action_files(…)
generate_messages(…)
注意事项
- 在 find_package期间如果没有找到不会有任何提示.
- 存在过度链接,因为所有依赖项的所有库都被随意链接到所有目标。
- 假设头文件在 include 下