(!) 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: このチュートリアルではアクションクライアントライブラリを用いてフィボナッチシンプルアクションクライアントをPythonで書きます。

Tutorial Level: BEGINNER

コードと例はactionlib_tutorialsパッケージにあります。 このチュートリアルを読む前にactionlibパッケージについて読んでみましょう。

コード

以下のコードはactionlib_tutorials/simple_action_client/fibonacci_client.pyです。

fibonacci actionに対するpythonのクライアントを実装しています。

   1 #! /usr/bin/env python
   2 
   3 import roslib; roslib.load_manifest('actionlib_tutorials')
   4 import rospy
   5 
   6 # Brings in the SimpleActionClient
   7 import actionlib
   8 
   9 # Brings in the messages used by the fibonacci action, including the
  10 # goal message and the result message.
  11 import actionlib_tutorials.msg
  12 
  13 def fibonacci_client():
  14     # Creates the SimpleActionClient, passing the type of the action
  15     # (FibonacciAction) to the constructor.
  16     client = actionlib.SimpleActionClient('fibonacci', actionlib_tutorials.msg.FibonacciAction)
  17 
  18     # Waits until the action server has started up and started
  19     # listening for goals.
  20     client.wait_for_server()
  21 
  22     # Creates a goal to send to the action server.
  23     goal = actionlib_tutorials.msg.FibonacciGoal(order=20)
  24 
  25     # Sends the goal to the action server.
  26     client.send_goal(goal)
  27 
  28     # Waits for the server to finish performing the action.
  29     client.wait_for_result()
  30 
  31     # Prints out the result of executing the action
  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"

コードの説明

  11 import actionlib_tutorials.msg

ゴールを送ったりフィードバックを受けとったりするのに必要な、いくつかのメッセージをimportします。 このメッセージはアクションの定義から生成されます。

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

アクションクライアントとサーバーはthe actionlib protocolで定義されたトピックの集合をもって通信します。 アクション名はこれらのトピックの名前空間を記述しており、アクションに定義されたメッセージはこれらのトピックでどんな型のメッセージが受け渡しされるかを記述します。

  20     client.wait_for_server()

この行で、ゴールを送る前にサーバーが起動し接続されるまで待ちます。

  22     # Creates a goal to send to the action server.
  23     goal = actionlib_tutorials.msg.FibonacciGoal(order=20)
  24 
  25     # Sends the goal to the action server.
  26     client.send_goal(goal)

ゴールを生成し、それをアクションサーバーに送ります。

  28     # Waits for the server to finish performing the action.
  29     client.wait_for_result()
  30 
  31     # Prints out the result of executing the action
  32     return client.get_result()  # A FibonacciResult

アクションサーバーはゴールを処理し最終的に止まります。 サーバーの終了を受け結果を得るために、サーバーが終わるまで待たなければなりません。

クライアントを実行する

クライアントを実行するには、まずroscoreを起動します。

$ roscore

そして、c++のフィボナッチアクションサーバーを起動し、クライアントが通信できるようにします。

$ rosrun actionlib_tutorials fibonacci_server

最後にクライアントを起動します。 起動したらゴールをアクションサーバーに送り、ゴールが得られるまで待ち、そして終了します。

$ rosrun actionlib_tutorials fibonacci_client.py

Wiki: ja/actionlib_tutorials/Tutorials/Writing a Simple Action Client (Python) (last edited 2014-10-07 15:09:14 by Moirai)