ROS官网初级教程学习总结(10-16)

Posted NodYoung

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ROS官网初级教程学习总结(10-16)相关的知识,希望对你有一定的参考价值。

教程网址:http://wiki.ros.org/cn/ROS/Tutorials
本博客为10-16小节。

创建ROS消息和ROS服务

消息(msg)和服务(srv)介绍

  • 消息(msg): msg文件就是一个描述ROS中所使用消息类型的简单文本。它们会被用来生成不同语言的源代码。msg文件存放在package的msg目录下。
  • 服务(srv): 一个srv文件描述一项服务。它包含两个部分:请求和响应。srv文件则存放在srv目录下。
    示例:
    下面是一个msg文件的样例,它使用了Header,string,和其他另外两个消息类型。
  Header header
  string child_frame_id
  geometry_msgs/PoseWithCovariance pose
  geometry_msgs/TwistWithCovariance twist

srv文件分为请求和响应两部分,由’—’分隔。

int64 A
int64 B
---
int64 Sum

其中 A 和 B 是请求, 而Sum 是响应。

使用 msg

创建一个 msg

创建完.msg文件后,为了确保msg文件被转换成为C++、Python和其他语言的源代码,package.xml要包含一下两条语句:

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

然后在 CMakeLists.txt文件中,利用find_packag函数,增加对message_generation的依赖,这样就可以生成消息了。

# Do not just add this line to your CMakeLists.txt, modify the existing line
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
# )

去掉注释符号#,用你的.msg文件替代Message*.msg。
最后,我们要确保CMake知道在什么时候重新配置我们的project。 确保添加了如下代码:
generate_messages()

使用 rosmsg

通过rosmsg show命令,检查ROS是否能够识消息。
$ rosmsg show [message type]

使用 srv

创建一个srv

从其他的package中复制一个服务:
$ roscp [package_name] [file_to_copy_path] [copy_path]
同msg文件类似,你也需要在package.xml和CMakeLists.txt文件中做一些修改。

使用 rossrv

同样可以通过rosmsg show命令,检查ROS是否能够识该服务。
$ rossrv show <service type>

msg和srv都需要的步骤

在CMakeLists.txt中找到如下部分:

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

去掉注释并附加上所有你消息文件所依赖的那些含有.msg文件的package(这个例子是依赖std_msgs,不要添加roscpp,rospy),结果如下:

generate_messages(
  DEPENDENCIES
  std_msgs
)

重新编译我们的package。所有在msg路径下的.msg文件都将转换为ROS所支持语言的源代码。生成的C++头文件将会放置在~/catkin_ws/devel/include/beginner_tutorials/。 Python脚本语言会在 ~/catkin_ws/devel/lib/python2.7/dist-packages/beginner_tutorials/msg 目录下创建。

获得帮助

$ rosmsg -h
同样也可以获得子命令的帮助:
$ rosmsg show -h

编写简单的消息发布器和订阅器 (C++)

编写发布器节点

mkdir -p ~/catkin_ws/src/beginner_tutorials/src 这个文件夹将会用来放置 beginner_tutorials package 的所有源代码。

编写订阅器节点

编译节点

修改CMakeLists.txt文件,添加:

include_directories(include $catkin_INCLUDE_DIRS)

add_executable(talker src/talker.cpp)
target_link_libraries(talker $catkin_LIBRARIES)

add_executable(listener src/listener.cpp)
target_link_libraries(listener $catkin_LIBRARIES)

这会生成两个可执行文件, talker 和 listener, 默认存储在~/catkin_ws/devel/lib/ 中.

然后要为可执行文件添加对生成的消息文件的依赖:
add_dependencies(talker beginner_tutorials_generate_messages_cpp)
这样就可以确保自定义消息的头文件在被使用之前已经被生成。

运行catkin_make

写一个简单的消息发布器和订阅器 (Python)

Writing the Publisher Node

The Code

create a ‘scripts’ folder to store our Python scripts:mkdir scripts && cd scripts
编写.py并改变其为可执行文件:$ chmod +x talker.py

The Code Explained

Writing the Subscriber Node

类似

Building your nodes

Go to your catkin workspace and run catkin_make:

测试消息发布器和订阅器

启动发布器

运行roscore
如果使用catkin,确保你在调用catkin_make后,在运行你自己的程序前,已经source了catkin工作空间下的setup.sh文件
启动a publisher called “talker”:

$ rosrun beginner_tutorials talker      (C++)
$ rosrun beginner_tutorials talker.py   (Python) 

启动订阅器

运行一个名为”listener”的订阅器节点:

$ rosrun beginner_tutorials listener     (C++)
$ rosrun beginner_tutorials listener.py  (Python) 

编写简单的服务器和客户端 (C++)

编写Service节点

编写Client节点

编译节点

CMakeLists.txt添加如下代码:

add_executable(add_two_ints_server src/add_two_ints_server.cpp)
target_link_libraries(add_two_ints_server $catkin_LIBRARIES)
add_dependencies(add_two_ints_server beginner_tutorials_gencpp)
add_executable(add_two_ints_client src/add_two_ints_client.cpp)
target_link_libraries(add_two_ints_client $catkin_LIBRARIES)
add_dependencies(add_two_ints_client beginner_tutorials_gencpp)

然后运行catkin_make命令将生成两个可执行程序”add_two_ints_server”和”add_two_ints_client”,这两个可执行程序默认被放在~/catkin_ws/devel/lib/share/。你可以直接调用可执行程序,或者使用rosrun命令去调用它们。

编写简单的Service和Client (Python)

Writing a Service Node

The Code

Don’t forget to make the node executable:
chmod +x scripts/add_two_ints_server.py

The Code Explained

Writing the Client Node

The Code

The Code Explained

Building your nodes

run catkin_make

Try it out!

In a new terminal, run

$ cd ~/catkin_ws
$ . devel/setup.bash
$ rosrun beginner_tutorials add_two_ints_server.py

In a new terminal, run

$ cd ~/catkin_ws
$ . devel/setup.bash
$ rosrun beginner_tutorials add_two_ints_client.py 4 5

## 测试简单的Service和Client
### 运行Service

$ rosrun beginner_tutorials add_two_ints_server     (C++)
$ rosrun beginner_tutorials add_two_ints_server.py  (Python)

### 运行Client

$ rosrun beginner_tutorials add_two_ints_client 1 3     (C++)
$ rosrun beginner_tutorials add_two_ints_client.py 1 3  (Python)

以上是关于ROS官网初级教程学习总结(10-16)的主要内容,如果未能解决你的问题,请参考以下文章

ROS官网初级教程学习总结(17-20)

ROS官网初级教程学习总结(17-20)

ROS官网初级教程学习总结(1-4)

ROS官网初级教程学习总结(1-4)

ROS官网初级教程学习总结(5-9)

ROS官网初级教程学习总结(5-9)