可参考:
https://blog.csdn.net/u013453604/article/details/72903398?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-4.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-4.control
https://blog.csdn.net/lewif/article/details/79866229
1. 什么是msg文件和srv文件
1.1 msg文件
msg是一个简单的txt文件,每行定义一个信息域。其格式为:类型 名称
类型 包括:
int8, int16, int32, int64 (plus uint*)
float32, float64
string
time, duration
other msg files
可变长度array[ ] and 固定长度array[C]
Header(包含一个timestamp和坐标系信息)
事例:
int32 A
int32 B
int32 C
1.2 srv文件
srv文件与msg文件的内容相似,区别在于其包括请求和响应两部分(两部分用- - -分隔)。
事例:
int32 A //请求
int32 B //请求
int32 C //请求
------
int32 sum //响应
2. 创建和编译msg文件和srv文件
2.1 创建msg文件
顾上一章,创建了一个名为work的工作空间,其下有devel目录、build目录以及src目录。在src目录下包含myros的功能包和CMakeList.txt文件。此时myros功能包包括include目录、src目录、CMakeList.txt文件和package.xml文件。msg目录就要创建在myros功能包下。
$ cd work/src/myros //切换到相关目录下
$ mkdir msg //创建目录
$ vim msg/num.msg //进入编辑模式,如果在msg目录下不存在num.msg文件则创建并进入编辑,存在则进入编辑。
在num.msg中输入:
int32 A
int32 B
int32 C
//可根据自己的需求编写
编写完成后,需要确保.msg文件能够被编译为C++
(一)在package.xml文件中
去掉如下两行的注释符,或者直接在后添加这两行:
<build_depend>message_generation</build_depend>
<build_export_depend>message_generation</build_export_depend>
<exec_depend>message_runtime</exec_depend>
// 构建阶段我们须要 “message_generation”, 而在运行时我们须要 “message_runtime”
(二)在CMakeList.txt文件中
首先: 找到 find_package()
在其中加入: message_generation
此时:
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
message_generation
)
然后: 找到 add_message_files()
添加要进行处理的.msg,即指定msg文件;
在其中加入或者修改Message1.msg为 num.msg
此时:
add_message_files(
FILES
num.msg
)
接下来: 找到 generate_messages()
在这里指定生成消息文件时的依赖项,本文只是添加了简单的依赖std_msgs,如果你在创建msg时使用了geometry_msgs,sensor_msgs时,添加到其内部即可;
此时:
generate_messages(
DEPENDENCIES
std_msgs
)
最后: 找到 catkin_package()
设置运行依赖:去掉 CATKIN_DEPENDS roscpp std_msgs前的注释,添加message_runtime
此时:
catkin_package(
CATKIN_DEPENDS roscpp std_msgs message_runtime
)
经过以上几个步骤,就可以实现msg文件的编写及添加工作;
已知本文的msg所处的package是myros;
那么如果想要在其他的package包(假设名称为A)中运行(前提是在同一个工作空间下),那么你只需要在A的CmakeLists.txt中的find_package(myros)即可;
然后在对应的.h或.cpp中添加:include “myros/.msg的名称 h”
2.2 编译msg文件
1.在终端:
$ cd work/ //切换到当前工作空间
$ catkin_make
$ source devel/setup.bash //source 环境变量
$ rosmsg show myros/num // rosmsg show 包名/.msg文件名 或者 $ rosmsg show num
2.若编辑正确,那么在终端会输出与num.msg相同的内容。
2.3 创建srv文件
其创建方式与msg文件相似,都是创建在功能包目录下。
$ cd work/src/myros //切换到相关目录下
$ mkdir srv //创建目录
$ vim srv/ber.srv //进入编辑模式
在ber.srv中输入:
int32 A
int32 B
int32 C //请求
------
int32 sum //响应 response
编写完成后,需要确保.srv文件能够被编译为C++
(一)在package.xml文件中 (在创建.msg文件时已经完成了,故不再做这个步骤)
去掉如下两行的注释符,或者直接在后添加这两行:
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
// 构建阶段我们须要 “message_generation”, 而在运行时我们须要 “message_runtime”
(二)在CMakeList.txt文件中
首先: 找到 find_package() (在创建.msg文件时已经完成了,故不再做这个步骤)
在其中加入: message_generation
此时:
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
message_generation //添加message_generation依赖
)
然后: 找到 add_service_files()
在其中加入或者修改 Service2.srv为 ber.srv
此时:
add_service_files(
FILES
ber.srv
# Service2.srv
)
接下来: 找到 generate_messages(),去掉部分注释 (在创建.msg文件时已经完成了,故不再做这个步骤)
此时:
generate_messages(
DEPENDENCIES
std_msgs
)
最后: 找到 catkin_package(),去掉 CATKIN_DEPENDS roscpp std_msgs前的注释,添加message_runtime (在创建.msg文件时已经完成了,故不再做这个步骤)
此时:
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES myros
CATKIN_DEPENDS roscpp std_msgs message_runtime
# DEPENDS system_lib
)
2.4 编译srv文件
1.在终端:
$ cd work/ //切换到当前工作空间
$ catkin_make
$ source devel/setup.bash //source 环境变量
$ rossrv show myros/ber // rosmsg show 包名/.srv文件名 或者 $ rosmsg show ber
2.若编辑正确,那么在终端会输出与ber.srv相同的内容。