ROS使用自定义的msg文件进行节点信息的订阅与发布

一、定义解释

  1. msg:msg文件是一个描述ROS消息字段的简单文本文件。它们用于为消息生成不同语言的源代码。
  2. 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
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值