文章目录

  • 1. msg和srv介绍
  • 2. 使用msg
    • 2.1 创建msg
    • 2.2 使用rosmsg
  • 3. 使用srv
    • 3.1 创建srv
    • 3.2 使用rossrv
  • 4. msg和srv的一般步骤
  • 5.获取帮助
  • 6. 复习

1. msg和srv介绍

● msg(消息):msg文件是文本文件,用于描述ROS消息的字段。它们用来为不同编程语言编写的消息生成源代码。
● srv(服务):一个srv文件描述一个服务。它由两部分组成:请求(request)和响应(response)。

msg文件存放在软件包的msg目录下,srv文件则存放在srv目录下。
msg文件每行都有一个字段类型和字段名称,可以使用的类型为:

int8, int16, int32, int64 (以及 uint*)
float32, float64
string
time, duration
其他msg文件
variable-length array[] 和 fixed-length array[C]

ROS中海油一个特殊的数据类型:Header,它含有时间戳和ROS中广泛使用的坐标帧信息。在msg文件的第一行经常可以看到Header header。

下面是一个使用Header、字符串原语和其他两个消息的示例:

Header header
string child_frame_id
geometry_msgs/PoseWithCovariance pose
geometry_msgs/TwistWithCovariance twist

srv文件和msg文件一样,只是他们包含两个部分:请求和响应,这两部分用一条—线隔开,下面是一个srv文件的示例:

在上面的例子中,A和B是请求,Sum是响应。

2. 使用msg

2.1 创建msg

下面,我们将在之前创建的软件包里定义一个新的消息

$ roscd study
$ mkdir msg
$ echo “int64 num” > msg/Num.msg

上面的示例,.msg文件只有一行,当然,你可以通过添加更多元素(每行一个)来创建一个更复杂的文件,如下所示:

string first_name
string last_name
uint8 age
uint32 score

不过还有关键的一步:我们要确保msg文件能被转换为C++、Python和其他语言的源代码。
打开package.xml,确保它包含以下两行且没被注释,如果没有,添加进去:

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

注意,在构建时,其实只需要message_generation,而在运行时,我们只需要message_runtime。在CMakeLists.txt文件中,为已经存在里面的find_package调用message_generation依赖项,这样就能生成消息了。直接将message_generation添加到COMPONENTS列表中即可,如下所示:

#不要直接复制这一大段,只需将message_generation加在括号闭合前即可
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)

你可能注意到了,有时即使没有使用全部依赖项find_package,项目也可以构建。这是因为catkin把你所有的项目整合在了一起,因此如果之前的项目调用了find_package,你的依赖关系也被配置成了一样的值。但是,忘记调用意味着你的项目在单独构建时很容易崩溃。

还要确保导出消息的运行时依赖关系:

catkin_package(

CATKIN_DEPENDS message_runtime …
…)

找到如下代码块:

删除#符号来取消注释后,然后将Message*.msg替换为你的.msg文件名,就像下面这样:

add_message_files(
FILES
Num.msg
)

手动添加.msg文件后,我们要确保CMake知道何时需要重新配置项目。现在必须确保generate_messages()函数被调用:
在ROS Hydro及更新版本中,你需要取消下面几行的注释:

现在,我们可以从msg文件定义中生成源代码文件了。

2.2 使用rosmsg

以上就是创建消息的所有步骤。让我们通过rosmsg show命令看看ROS能否识别它,用法:

$ rosmsg show [message type]

$ rosmsg show study/Num
int64 num

在上面的例子中,消息类型包含两部分:
● study—定义消息的软件包
● Num—消息的名称Num

如果不记得msg在哪个保重,也可以省略包名称,尝试:

$ rosmsg show Num
[study/Num]:
int64 num

3. 使用srv

3.1 创建srv

使用之前创建的包再来创建服务:

$ roscd study
$ mkdir srv

我们将从另一个包复制现有的srv定义,而不是手动创建新的srv。roscp是一个实用的命令行工具,用于将文件从一个包复制到另一个包。用法:

$ roscp [package_name] [file_to_copy_path] [copy_path]

现在我们可以从rospy_tutorials包中复制一个服务:

$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv

还有关键的一步:我们要确保msg文件能被转换为C++、Python和其他语言的源代码。如果没做过上面的教程,请先打开package.xml,确保它包含以下两行且没有被注释。如果没有,添加进去:

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

如前所述,在构建时,其实只需要message_generation,而在运行时,我们只需要message_runtime。

如果没做过上面的教程,在CMakeLists.txt文件中,为已经存在里面的find_package调用添加message_generation依赖项,这样就能生成消息了。直接将message_generation添加到COMPONENTS列表中即可,如下所示:

#不要直接复制这一大段,只需将message_generation加在括号闭合前即可
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)

(别被名字迷惑,message_generation对msg和srv都适用)
此外,你也需要像之前对消息那样在package.xml中修改服务字段,因此请看上面描述的所需附加依赖项。

删除#符号来取消注释,然后将Service*.srv替换为你的.srv文件名,就像下边这样:

add_service_files(
FILES
AddTwoInts.srv
)

3.2 使用rossrv

以上就是创建服务的所有步骤。通过rossrv show命令查看ROS能否识别它,用法:

rossrv show

示例:
跟rosmsg类似,也可以在不指定报名的情况下这样找到这样的服务:

4. msg和srv的一般步骤

如果没做过上面的教程,请先修改CMakeLists.txt

取消注释,然后添加任意你的消息用到的包含.msg文件的软件包(本例中为std_msgs),如下所示:

generate_messages(
DEPENDENCIES
std_msgs
)

现在我们已经创建了一些新消息,需要重新make一下软件包

#In your catkin workspace
$ roscd study
$ cd …/…
$ catkin_make
$ cd -

msg目录中的任何.msg文件都将生成所有支持语言的代码。C++消息的头文件将生成在/catkin_ws/devel/include/study/。Python脚本将创建在/catkin_ws/devel/lib/python3.0/dist-packages/study/msg。而Lisp文件则出现在~/catkin_ws/devel/share/common-lisp/ros/study/msg/。

类似地,srv目录中的任何.srv文件都将生成支持语言的代码。对于C++,头文件将生成在消息的头文件的同一目录中。对于Python和Lisp,会在msg目录旁边的srv目录中。

5.获取帮助

我们已经接触到不少ROS工具了,但很难记住每个命令所需的参数,这时可通过ROS工具自己的帮助命令,尝试:

$ rosmsg -h


同样也可以获得子命令的帮助:

6. 复习

总结一下到目前为止我们接触过的一些命令:

rospack = ros+pack(age) : provides information related to ROS packages
roscd = ros+cd : changes directory to a ROS package or stack
rosls = ros+ls : lists files in a ROS package
roscp = ros+cp : copies files from/to a ROS package
rosmsg = ros+msg : provides information related to ROS message definitions
rossrv = ros+srv : provides information related to ROS service definitions
catkin_make : makes (compiles) a ROS package
rosmake = ros+make : makes (compiles) a ROS package (if you’re not using a catkin workspace)

创建ROS消息和服务---ROS学习第8篇相关推荐

  1. ROS学习笔记10(创建一个ROS消息和服务)

    这篇教程主要介绍怎样创建和编译一个msg消息和srv服务文件,同时介绍rosmsg,rossrv,roscp等命令工具. 文章目录 1 msg和srv文件长什么样 2 msg使用 2.1 创建一个ms ...

  2. [ROS](12)ROS通信 —— 参数服务器(Parameter Server)通信

      文章只是个人学习过程中学习笔记,主要参考ROS教程1 2 . [ROS](01)创建ROS工作空间 [ROS](02)创建&编译ROS软件包Package [ROS](03)CMakeLi ...

  3. OPENSTACK-2-管理OSP内部通信-管理消息交换服务

    1.确认机器的状态正常,登陆到director机器. 2.添加用户和密码,后面认证使用. 3.对用户进行授权,开放所有权限. 4.设定用户角色为管理员. 5.查看配置文件信息,这里的用户与密码要与前面 ...

  4. 创建ROS消息(msg)和服务(srv)

    一.msg和srv介绍 msg(消息):msg文件就是文本文件,用于描述ROS消息的字段.它们用于为不同编程语言编写的消息生成源代码. srv(服务):一个srv文件描述一个服务.它由两部分组成:请求 ...

  5. 【一学就会的ROS基础入门教程 】03-1 ROS基础编程:ROS工作空间的创建、话题topic的发布与接收、以及话题消息的自定义使用

    [一学就会的ROS基础入门教程 ]03-1 ROS基础编程:ROS工作空间的创建.话题topic的发布与接收.以及话题消息的自定义使用 文前白话 1.创建工作空间与功能包 关于工作空间的介绍 创建开发 ...

  6. ROS wiki系列|通过ROS wiki-tutorials学习服务和参数

    依旧是上一期指路:ROS wiki系列|通过ROS wiki-tutorials学习话题 前面讲了节点和话题,我们接下来讲服务和参数,走你~ 同样甩上我们今天的教程页面链接:Understanding ...

  7. ros入门--中科院软件所ros学习笔记

    视频链接: 中科院软件所-机器人操作系统入门(ROS入门教程)_哔哩哔哩_bilibili 中科院软件所-机器人操作系统入门(ROS入门教程)_哔哩哔哩_bilibili 另外有一个不错的 学习网址: ...

  8. ROS wiki系列|通过ROS wiki-tutorials学习节点

    前面几期我们讲的都是一些入门相关的内容-- ROS wiki系列|ROS wiki初探(自用) ROS wiki系列|Documentation-ROS部分讲解 ROS wiki系列|ROS入门基础概 ...

  9. [ROS](11)ROS通信 —— 服务(Service)通信编程之srv(C++)(Python)

      文章只是个人学习过程中学习笔记,主要参考ROS教程1 2 3. [ROS](01)创建ROS工作空间 [ROS](02)创建&编译ROS软件包Package [ROS](03)CMakeL ...

最新文章

  1. python建站与java建站有何不同_详解模板建站和定制建站的不同之处
  2. Github Pages+Hexo+阿里云域名绑定
  3. 计算机系统的搭建步骤,电脑搭建Node.js开发环境的操作教程[多图]
  4. 步进电机的单双极驱动
  5. Nuget Tips
  6. 某个元素的距离页面的左边距_如何提高办公写作效率?先设置好页面上的这4类数据,准没错...
  7. (一)开机demo测试及测试流程
  8. 【DPDK峰会回顾】支撑双十一的高性能负载均衡是如何炼成的
  9. 评委移动端的[评委描述信息]如何添加修改?
  10. Maple 全面基础
  11. python-docx原有图片居中
  12. 使用HTML语言和CSS开发商业站点_利用CSS3制作网页动画
  13. 个人电脑php漏洞怎么修复,PHP版 6.0 漏洞 要怎么修复
  14. 实时获取Android手机CPU占用率
  15. windows10 安装 cuda8.0 cudnn6.0 tensorflow-gpu1.3.0 pycharm jupyter 及路径
  16. C/C++是程序员必须掌握的语言吗?
  17. 新年贺词大全 喜欢你就顶啦~
  18. 计算机插u盘抖动,电脑插入U盘后发现读取速度不稳定如何解决
  19. 中国三大运营商支撑系统一览
  20. 字符串输出时最后出现乱码

热门文章

  1. 马走日poj java超时_简单搜索poj 2243(水
  2. sortable 拖拽时互换目标的位置_报表如何实现行列互换效果?
  3. @PreAuthorize 权限控制的原理
  4. 009_调色盘和高亮样式
  5. 012_Vue计算属性
  6. 026_元素执行函数
  7. spark rdd map java_如何在spark RDD(JavaRDD)中获取记录的文件名
  8. python中使用函数的优点_Python基础之函数基本用法与进阶详解
  9. ssh 用密码连接不上、查看openSSH 的版本、CentOS - 升级openSSH,修复安全漏洞
  10. linux 编译文件mm,Linux编译C++文件,说没有找到头文件,怎么啊?新手,不太会用...