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
Contents
コードと例は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()
この行で、ゴールを送る前にサーバーが起動し接続されるまで待ちます。
ゴールを生成し、それをアクションサーバーに送ります。
アクションサーバーはゴールを処理し最終的に止まります。 サーバーの終了を受け結果を得るために、サーバーが終わるまで待たなければなりません。
クライアントを実行する
クライアントを実行するには、まずroscoreを起動します。
$ roscore
そして、c++のフィボナッチアクションサーバーを起動し、クライアントが通信できるようにします。
$ rosrun actionlib_tutorials fibonacci_server
最後にクライアントを起動します。 起動したらゴールをアクションサーバーに送り、ゴールが得られるまで待ち、そして終了します。
$ rosrun actionlib_tutorials fibonacci_client.py