ROS-Note:创建ROS消息和服务 Msg Srv

创建ROS消息和服务 Msg Srv

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,它含有时间戳timestamp 和ROS中广泛使用的坐标帧信息coordinate frame information
在msg文件的第一行经常可以看到Header header

以下是使用 Header字符串原语string primitive其他两个 msgs 的 msg 示例:

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

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

int64 A
int64 B
---
int64 Sum

A和B是请求, Sum是响应

使用msg

创建msg

在之前创建的软件包里定义一个新的消息

$ roscd beginner_tutorials
$ mkdir msg
$ echo "int64 num" > msg/Num.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文件
在CMakeLists.txt文件中,为已经存在里面的find_package调用添加message_generation依赖项,这样就能生成消息了。直接将message_generation添加到COMPONENTS列表中即可,如下所示:

find_package(catkin REQUIRED COMPONENTS
   roscpp
   rospy
   std_msgs
   message_generation
)

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

确保导出了运行消息的依赖

catkin_package(
  ...
  CATKIN_DEPENDS message_runtime ...
  ...)

找到如下代码块:

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

删除#符号取消注释,将Message*.msg替换为你的.msg文件名

add_message_files(
  FILES
  Num.msg
)

手动添加.msg文件后,我们要确保CMake知道何时需要重新配置项目
必须确保**generate_messages()**函数被调用
取消以下注释

# generate_messages(
#   DEPENDENCIES
#   std_msgs
# )

使用rosmsg

创建msg后,通过rosmsg show命令看看ROS能否识别它
usage:

$ rosmsg show [message type]

example:

$ rosmsg show beginner_tutorials/Num
		int64 num
		string first_name
		string last_name
		uint8 age
		uint32 score

在上面的例子中,消息类型包含两部分:
beginner_tutorials – 定义消息的软件包
Num – 消息的名称Num
也可以省略包名称

$ rosmsg show Num
		[beginner_tutorials/Num]:
		int64 num
		string first_name
		string last_name
		uint8 age
		uint32 score

使用srv

创建srv

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

$ roscd beginner_tutorials
$ mkdir srv

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

$ roscp [package_name] [file_to_copy_path] [copy_path]

从rospy_tutorials包中复制一个服务:

$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv

确保msg文件能被转换为C++、Python和其他语言的源代码,步骤与上一步msg相同

也需要像之前对消息那样在package.xml中修改服务字段

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

删除#符号来取消注释,然后将Service*.srv替换文件名

add_service_files(
  FILES
  AddTwoInts.srv
)

使用rossrv

通过rossrv show命令看看ROS能否识别它
usage:

$ rossrv show <service type>

example

$ rossrv show beginner_tutorials/AddTwoInts
		int64 a
		int64 b
		---
		int64 sum

也可以在不指定包名的情况下找到服务

$ rossrv show AddTwoInts
		[beginner_tutorials/AddTwoInts]:
		int64 a
		int64 b
		---
		int64 sum
		
		[rospy_tutorials/AddTwoInts]:
		int64 a
		int64 b
		---
		int64 sum

会显示两个服务
第一个是刚刚在beginner_tutorials包中创建的
第二个是之前rospy_tutorials包中已经存在的

msg和srv的一般步骤

重新make一下软件包

$ catkin_make

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

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

获取帮助

-h 获取帮助

总结

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)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值