ROS学习笔记(十二)- 创建一个ROS msg 和 srv

1 介绍msg和srv

  • msg:描述ROS message的简单文本,用来生成不同语言的消息源代码。
  • srv:一个srv描述一个service。它有请求和回复两部分组成。
    msg文件存储在msg目录下,srv文件存储在srv目录下。
    msg只是一种字段类型的简单文本和每行一个字段名,可以用的字段是:
  • int8, int16, int32, int64 (plus uint*)
  • float32, float64
  • string
  • time, duration
  • other msg files
  • variable-length array[] and fixed-length array[C]
    在ROS里还有一种特殊的类型:Header,header包含一个时间戳和一个坐标框架信息,通常只在ROS里用。你会频繁地在msg的第一行看到 Header header。
    下面是一个msg例子,包含一个Header,一个字符串和两条其他msg。
  Header header
  string child_frame_id
  geometry_msgs/PoseWithCovariance pose
  geometry_msgs/TwistWithCovariance twist

srv跟msg差不多,不过它包含两部分,一部分是请求,一部分是应答,用"-----"分隔开:

int64 A
int64 B
---
int64 Sum

2 使用msg

2.1 建立一个msg

在之前的包里面建立一个新的msg.

$ roscd beginner_tutorials
$ mkdir msg
$ echo "int64 num" > msg/Num.msg

进不去就输入:
export ROS_PACKAGE_PATH=~/catkin_ws/src:$ROS_PACKAGE_PATH

source ~/catkin_ws/devel/setup.bash
现在msg就有一行了,我们可以写的更复杂一些,一个占一行:

string first_name
string last_name
uint8 age
uint32 score

还有一步,这一步确保其可以转成C++,Python或者其他语言:
打开package.xml,确保里面有以下两行:

<build_depend>message_generation</build_depend>
 <run_depend>message_runtime</run_depend>

我们现在要编译,所以我们需要message_generation,运行的时候需要message_runtime。
打开 CMakeLists.txt,在find_package 里面加入*message_generation *:

# Do not just add this to your CMakeLists.txt, modify the existing text to add message_generation before the closing parenthesis
find_package(catkin REQUIRED COMPONENTS
   roscpp
   rospy
   std_msgs
   message_generation
)

其实即使你没有配置,有时候也能正常编译,这是因为catkin会自动用以前的项目的配置,不过如果隔离编译就不行了。
确保运行时出口的依赖关系:

catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES beginner_tutorials
  CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
#  DEPENDS system_lib
)

找到下列代码:

# add_message_files(
#   FILES
#   Message1.msg
#   Message2.msg
# )

去掉注释,改成:

add_message_files(
   FILES
   Num.msg
 )

现在我们需要确保CMake知道我们添加了.msg文件。
找到下面的代码:

# generate_messages(
#   DEPENDENCIES
#   std_msgs
# )

去掉“#”号。
后面要做的内容下个教程再说。

3 使用rosmsg:

使用rosmsg show确保ROS能够看见它。
用法:
$ rosmsg show [message type]
例如:
$ rosmsg show beginner_tutorials/Num
我们将会看到:
int64 num
在前面的例子里,消息由两部分构成:

  • beginner_tutorials -- 消息定义的地方
  • Num--消息的名称
    如果你忘了包里有什么msg:
    $ rosmsg show Num
    你可以看到:
[beginner_tutorials/Num]:
int64 num

4 使用srv

4.1 创建一个srv

使用刚刚创建的package创建一个srv

$ roscd beginner_tutorials
$ mkdir srv

我们将会从另一个package里面拷一个而不是完全的手工创建,使用roscp指令。
用法:
$ roscp [package_name] [file_to_copy_path] [copy_path]
现在我们从小海龟那里拷一个:
$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv
接下来一步,我们要确保把srv文件转化成C++源代码或者其他程序源码。
打开CMakeLists.txt,去除以下程序的井号:

# add_service_files(
#   FILES
#   Service1.srv
#   Service2.srv
# )

然后替换成自己的srv文件:

add_service_files(
  FILES
  AddTwoInts.srv
)

现在,就做好了从我们服务定义生成源文件的准备。具体的做法在后面的教程里有。

4.2 使用rossrv

使用rossrv show确保ROS能够看到它。
用法:
$ rossrv show <service type>
例如:
$ rossrv show beginner_tutorials/AddTwoInts
你会看到:

int64 a
int64 b
---
int64 sum

其实可以不写包名,它会自动显示所以此名称的srv.

5 msg和srv的共同步骤

这一节和上一节都省略了一些前面做过的内容,如果需要查看可以参考官网。官网本节链接
首先,改变CMakelists.txt的内容:

# generate_messages(
#   DEPENDENCIES
# #  std_msgs  # Or other packages containing msgs
# )

解除注释,添加包含着你依赖的.msg文件的包:

generate_messages(
  DEPENDENCIES
  std_msgs
)

现在我们的包里已经有了一些新消息,我们需要重新make我们的包:

# In your catkin workspace
$ roscd beginner_tutorials
$ cd ../..
$ catkin_make install
$ cd -

.msg生成的不同语言的源码存放位置如下,懒得翻译了:
Any .msg file in the msg directory will generate code for use in all supported languages. The C++ message header file will be generated in *~/catkin_ws/devel/include/beginner_tutorials/. *The Python script will be created in ~/catkin_ws/devel/lib/python2.7/dist-packages/beginner_tutorials/msg. The lisp file appears in ~/catkin_ws/devel/share/common-lisp/ros/beginner_tutorials/msg/.
与此相似的是,.srv文件的源码,C++就在和message相同的文件夹,别的在在msg文件夹旁边的srv文件夹。
message的完整设计说明 Message Description Language .

如果你变异的C++node要用你的新消息, 你需要声明一个新的依赖 catkin msg/srv build documentation.

6 获取帮助

我们很难记住每个命令的使用要求,我们可以使用帮助功能来获知,即在命令后面加上-h即可。

7 复习

我们现在列举一些我们用过的命令:

  • rospack=ros+pack:提供有关ROS package的信息。
  • roscd=ros+cd:changes directory 改变路径到一个ROS package或stack
  • rosls=ros+ls:lists 列举ROS package中的文件
  • roscp=ros+cp:copies 从一个ROS package复制文件到另一个
  • rosmsg=ros+msg:提供关于ROS message定义的信息
  • rossrv=ros+srv:提供关于ROS service定义的信息
  • catskin_make:makes(compiles)一个ROS package
  • rosmake=ros+make:在没有使用一个catkin工作空间的情况下makes(compiles)一个ROS package
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容