ROS与C++入门教程(记录步骤)(三)
ROS与C++入门教程(记录步骤)5、创建ROS服务和消息5、创建ROS服务和消息msg(消息):msg文件就是文本文件,用于描述ROS消息的字段。它们用于为不同编程语言编写的消息生成源代码。srv(服务):一个srv文件描述一个服务。它由两部分组成:请求(request)和响应(response)。...
ROS与C++入门教程(记录步骤)
5、创建ROS服务和消息
-
msg(消息):msg文件就是文本文件,用于描述ROS消息的字段。它们用于为不同编程语言编写的消息生成源代码。
-
srv(服务):一个srv文件描述一个服务。它由两部分组成:请求(request)和响应(response)。
5.1、使用msg
5.1.1、创建msg
下面,我们将在之前创建的软件包里定义一个新的消息:
$ roscd beginner_tutorials
$ mkdir msg
$ echo "int64 num" > msg/Num.msg
我们要确保msg文件能被转换为C++、Python和其他语言的源代码。
打开package.xml, 确保它包含以下两行且没有被注释。如果没有,添加进去:
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
打开CMakeLists.txt文件,为已经存在里面的find_package调用添加message_generation依赖项,如下所示:
# 不要直接复制这一大段,只需将message_generation加在括号闭合前即可
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
确保导出消息的运行时依赖关系:
catkin_package(
...
CATKIN_DEPENDS message_runtime ...
...)
找到如下代码块:
# add_message_files(
# FILES
# Message1.msg
# Message2.msg
# )
删除#符号来取消注释,然后将Message*.msg替换为你的.msg文件名,就像下边这样:
add_message_files(
FILES
Num.msg
)
在ROS Hydro及更新版本中,你需要取消下面几行的注释:
# generate_messages(
# DEPENDENCIES
# std_msgs
# )
像这样:
generate_messages(
DEPENDENCIES
std_msgs
)
在ROS Groovy及早期版本中,只需要取消这一行的注释:
generate_messages()
现在,你可以从msg文件定义中生成源代码文件了。如果现在就想这样做,请直接跳到msg和srv的一般步骤。这里不建议跳过,看此教程也不允许跳过,后面还会执行上述操作,没有快多少!!!
5.1.2、使用msg
可以通过下面方法判断ROS是否识别
用法:
$ rosmsg show [message type]
这里是:
$ rosmsg show beginner_tutorials/Num
可以看到:
int64 num
如果不记得msg在哪个包中,也可以省略包名称。尝试:
$ rosmsg show Num
可以看到
[beginner_tutorials/Num]:
int64 num
5.2、使用srv
5.2.1、创建srv
让我们使用之前创建的包再来创建服务:
$ roscd beginner_tutorials
$ mkdir srv
我们将从另一个包复制现有的srv定义,而不是手动创建新的srv。roscp是一个实用的命令行工具,用于将文件从一个包复制到另一个包。
代码公式用法:
$ roscp [package_name] [file_to_copy_path] [copy_path]
在这里我们是使用:
$ 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>
如果没做过上面的教程,在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中修改服务字段,因此请看上面描述的所需附加依赖项。
# add_service_files(
# FILES
# Service1.srv
# Service2.srv
# )
删除#符号来取消注释,然后将Service*.srv替换为你的.srv文件名,就像下边这样:
add_service_files(
FILES
AddTwoInts.srv
)
现在,你可以从srv文件定义中生成源代码文件了。
5.2.2、使用srv
以上就是创建服务的所有步骤。让我们通过rossrv show命令看看ROS能否识别它。
公式
$ rossrv show <service type>
这里使用
$ rossrv show beginner_tutorials/AddTwoInts
效果:
int64 a
int64 b
---
int64 sum
int64 sum
跟rosmsg类似, 你也可以在不指定包名的情况下找到这样的服务:
$ rossrv show AddTwoInts
[beginner_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum
[rospy_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum
5.3、msg和srv的一般步骤
如果没做过上面的教程,即均跳过,请先修改下CMakeLists.txt:
# generate_messages(
# DEPENDENCIES
# # std_msgs # Or other packages containing msgs
# )
取消注释,然后添加任意你的消息用到的包含.msg文件的软件包(本例中为std_msgs),如下所示:
generate_messages(
DEPENDENCIES
std_msgs
)
)
现在我们已经创建了一些新消息,所以需要重新make一下软件包:
# In your catkin workspace
$ roscd beginner_tutorials
$ cd ../..
$ catkin_make
$ cd -
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目录中。
5.4、复习命令:
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)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)