一、定义解释
- msg:msg文件是一个描述ROS消息字段的简单文本文件。它们用于为消息生成不同语言的源代码。
- srv:一个srv文件描述了一个service。其由两个部分组成,包括一个请求和一个响应。
msg文件只是一个简单的文本文件,每一行包括一个字段类型和一个字段名称。字段可以使用下述类型:
bool mw
sensor_msgs/Image image
string imgtime
bool mydictflag
srv文件就像msg文件一样,但它包括两个部分:一个请求和一个响应。这两个部分通过一行 ‘—’ 线进行区分,这里有一个srv文件的例子:
string chexing
string chepai
sensor_msgs/Image image
string TypeFlag
float32 distance
string chezhou
---
bool response
二、使用msg
首先,在前述博客:ROS 新建py项目并添加话题发布_SxxLikeC的博客-CSDN博客_ros 创建项目创建的foresight包中定义一个新的msg。
比如我的工作空间名叫ros_workspace,package名叫foresight,那么:
cd ros_workspace/src/foresight
mkdir msg
mkdir srv
编辑msg
bool mw
sensor_msgs/Image image
string imgtime
bool mydictflag
还有一步操作,我们需要确保msg文件转换成C++源码、Python源码,或者其他语言格式。
打开ros_workspace包中的package.xml文件,确保下述两行内容没有被注释掉:
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
注意:上述内容是我们在编译期间是需要 “message_generation”,在运行期间,我们仅需要"message_runtime"。
打开CMakeLists.txt文件,在其中的find_package中加入message_generation依赖,简单修改为如下形式:
find_package(catkin REQUIRED COMPONENTS
roscpp
rosmsg
rospy
std_msgs
message_generation
)
同时,确保导出了message runtime 的依赖。
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES foresight
CATKIN_DEPENDS roscpp rosmsg rospy std_msgs message_runtime
# DEPENDS system_lib
)
同时,找到下述内容,去除其注释,并修改为下述形式:
add_message_files(
FILES
ImageMW.msg
)
通过手工添加.msg文件,我们能够确保CMake能够知道何时在你添加其他.msg文件之后重新配置项目。
现在,我们必须确保generate_messages()函数被调用了,找到下述内容并去除注释:
## Generate added messages and services with any dependencies listed here
generate_messages(
DEPENDENCIES
std_msgs # Or other packages containing msgs
)
现在我们已经准备好能够从msg定义中生成源文件
三、使用rosmsg命令查看
上述就是在ROS中创建一个msg所需要的全部操作,接下来,我们需要确保在ROS中能够通过rosmsg命令看到他们,命令用法如下:
$ rosmsg show [message type]
比如,对于我们创建的 foresight中名称为ImageMW的msg。命令变为下述形式:
rosmsg show foresight/ImageMW
输出结果为:
bool mw
sensor_msgs/Image image
std_msgs/Header header
uint32 seq
time stamp
string frame_id
uint32 height
uint32 width
string encoding
uint8 is_bigendian
uint32 step
uint8[] data
string imgtime
bool mydictflag
四、使用srv
编辑srv
string chexing
string chepai
sensor_msgs/Image image
string TypeFlag
float32 distance
string chezhou
---
bool response
这里也还有一个更多的步骤,即我们需要把srv文件转换成C++, Python或者其他语言。
首先,打开ros_workspace包中的package.xml文件,确保下述两行内容没有被注释掉(与上述的msg过程类似):
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
如前所述的,在编译期间,我们需要message_generation,而在运行期间,我们使用message_runtime。
接着,在CMakeLists.txt文件,找到其中的find_package并在其中加入message_generation依赖,简单修改为如下形式(如果在之前的msg介绍中已经添加则不用处理了):
find_package(catkin REQUIRED COMPONENTS
roscpp
rosmsg
rospy
std_msgs
message_generation
)
同样,我们还需要在package.xml文件中进行同样的操作,来对services进行处理,类似于messages去除下述代码的注释,来增加需要的依赖。
修改为如下形式,替换为我们自己的GPUMatch.srv文件:
## Generate services in the 'srv' folder
add_service_files(
FILES
GPUMatch.srv
)
五、使用rossrv命令查看
上述就是在ROS中创建一个srv所需要的全部操作,接下来,我们需要确保在ROS中能够通过rossrv命令看到他们,命令用法如下:
$ rossrv show <service type>
例如,我们通过下述命令来查看foresight/GPUMatch中的内容。
rossrv show foresight/GPUMatch
返回下述内容:
string chexing
string chepai
sensor_msgs/Image image
std_msgs/Header header
uint32 seq
time stamp
string frame_id
uint32 height
uint32 width
string encoding
uint8 is_bigendian
uint32 step
uint8[] data
string TypeFlag
float32 distance
string chezhou
---
bool response
六、msg和srv的通用步骤
去除CMakeLists.txt文件中的下述内容注释(如果上述步骤中我们已经做过,则可以跳过)。
# generate_messages(
# DEPENDENCIES
# # std_msgs # Or other packages containing msgs
# )
现在,我们需要重新编译一下foresight这个包,来生成新的messages。
# In your catkin workspace
$ roscd foresight
$ cd ../..
$ catkin_make