(!) Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of your OS & ROS, and also add appropriate tags.

编写一个简单的行为客户端(Python)

Description: 本教程涵盖了使用action_client库和Python创建一个Fibonacci简单行为库。

Tutorial Level: BEGINNER

本教程中的代码和示例可以在actionlib_tutorials包中找到。你也许需要在开始本教程之前阅读actionlib包。

代码

以下的代码可以在actionlib_tutorials存储库找到,和实现一个简单的python行为客户端用于fibonacci行为.

   1 #! /usr/bin/env python
   2 
   3 import rospy
   4 from __future__ import print_function
   5 
   6 # 加载SimpleActionClient
   7 import actionlib
   8 
   9 # 加载fibonacci行为消息,包含
  10 # 目标消息和结果消息
  11 import actionlib_tutorials.msg
  12 
  13 def fibonacci_client():
  14     # 创建SimpleActionClient,传递行为类型
  15     # (FibonacciAction) 到构造函数。
  16     client = actionlib.SimpleActionClient('fibonacci', actionlib_tutorials.msg.FibonacciAction)
  17 
  18 # 等待,直到行为服务器挂起或运行。
  19     # 监听目标。
  20     client.wait_for_server()
  21 
  22     # 创建一个目标发送到行为服务器。
  23     goal = actionlib_tutorials.msg.FibonacciGoal(order=20)
  24 
  25     # 发送目标到行为服务器。
  26     client.send_goal(goal)
  27 
  28     # 等待服务器完成处理行为。
  29     client.wait_for_result()
  30 
  31     # 打印运行行为结果。
  32     return client.get_result()  # A FibonacciResult
  33 
  34 if __name__ == '__main__':
  35     try:
  36         # Initializes a rospy node so that the SimpleActionClient can
  37         # publish and subscribe over ROS.
  38         rospy.init_node('fibonacci_client_py')
  39         result = fibonacci_client()
  40         print("Result:", ', '.join([str(n) for n in result.sequence]))
  41     except rospy.ROSInterruptException:
  42         print("program interrupted before completion", file=sys.stderr)

代码解释

  11 import actionlib_tutorials.msg

指定的行为服务器生成消息用于发送目标、接收反馈等等。这一行加载生成的消息。

  16     client = actionlib.SimpleActionClient('fibonacci', actionlib_tutorials.msg.FibonacciAction)

行为客户端和服务器通过一组话题通信,内容在actionlib通信协议。行为名称描述命名空间包含这些话题,并且指定的行为消息描述什么消息需要在这些话题中传递。

  20     client.wait_for_server()

在行为服务器开启后发送目标,否则无用。这一行等待直到我们连接到行为服务器。

  22     # 创建一个目标发送到行为服务器。
  23     goal = actionlib_tutorials.msg.FibonacciGoal(order=20)
  24 
  25     # 发送目标到行为服务器。
  26     client.send_goal(goal)

创建一个目标并且发送到行为服务器。

  28     # 等待服务器完成处理行为。
  29     client.wait_for_result()
  30 
  31     # 打印运行行为结果。
  32     return client.get_result()  # A FibonacciResult

行为服务器将处理目标并且最终终止。我们想要从终止中得到结果,但我们需要等待直到服务器完成目标。

运行客户端

在运行客户端之前,我们假设roscore和行为服务器已经从之前的界面中启动。

开启客户端。它将运行,发送一个目标到服务器,等待目标完成,然后退出。

$ rosrun actionlib_tutorials fibonacci_client.py

Wiki: cn/actionlib_tutorials/Tutorials/Writing a Simple Action Client (Python) (last edited 2017-03-19 05:06:57 by Playfish)