package.xml
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
<depend>std_msgs</depend>
这个标签推荐写消息依赖。这个例子假设std_msgs是唯一的依赖项。确定在这个标签里提及所有的消息包的依赖项。
为了生成actions,增加一个依赖项:
<depend>actionlib_msgs</depend>
CMakeLists.txt
对于Cmake,找到一个message_generation和任何所依赖的消息,服务和动作的catkin包:
find_package(catkin REQUIRED COMPONENTS message_generation std_msgs)
为了编译动作,包括actionlib_msgs在依赖中:
find_package(catkin REQUIRED
COMPONENTS
actionlib_msgs
message_generation
std_msgs)
接下来,列出消息的定义:
add_message_files(DIRECTORY msg
FILES
YourFirstMessage.msg
YourSecondMessage.msg
YourThirdMessage.msg)
类似的,如果有一个服务要生成的话:
add_service_files(DIRECTORY srv
FILES
YourService.srv)
生成动作,添加:
add_action_files(DIRECTORY action
FILES
YourStartAction.action
YourStopAction.action)
然后,用下面指令生成所有的消息,服务,动作目标:
generate_messages(DEPENDENCIES std_msgs)
确认catkin_package()指令声明了消息,服务和动作所依赖的包:
catkin_package(CATKIN_DEPENDS message_runtime std_msgs)
一个好的ROS实践收集了所有的消息,服务和动作到一个独立的包内,其中不包括其他的API。那简化了包的依赖图。
然而,可以用消息包提供脚本和程序。如果这样做了,消息生成目标需要在依赖此消息的程序运行之前编译消息包。每个使用消息头的目标都需要声明一个依赖:
add_dependencies(your_program ${${PROJECT_NAME}_EXPORTED_TARGETS})
如果编译目标使用了从其他catkin包导入的消息或者服务头是,做类似的声明:
add_dependencies(your_program ${catkin_EXPORTED_TARGETS})
因为catkin是自动安装消息,服务和动作目标的,所以不需要额外的install()命令安装它们。