ROS学習記録③:サービス通信とコード練習
Service通信とコード練習六、サービス通信 6.1サーバ側作成 6.1.1作成ノード 6.1.2処理要求の論理 6.1.3 Serverエンドによる の実装
6.2サーバ側デバッグ 6.2.1 rosserviceツール(コマンドライン) 6.2.2 rqt_service_callerツール(可視化) 6.3 Client側作成 6.3.1ノード を作成する. 6.3.2サービス を呼び出す 6.3.3 Clientエンド を実現
6.4 Clientエンドデバッグ 6.5 Serviceコマンドラインツール 七、サービス通信練習 六、サービス通信
6.1サーバ側の作成
取付
ワークスペースの下にパッケージを作成する
Clionを使用してディレクトリ
6.1.1ノードの作成
Ctrl+Pの1番目のパラメータ
6.1.2処理要求のロジック
コールバック関数のパラメータは、要求されたデータの戻り値が応答するデータである
6.1.3 Serverエンドの実装
完全なコードは次のとおりです.
6.2サーバ側のデバッグ
6.2.1 rosserviceツール(コマンドライン)
クエリの結果、対応するサービス名
このサービスは、クエリーのサービス名によって呼び出されます.
6.2.2 rqt_service_callerツール(可視化)
コマンド呼び出しツール
6.3 Client側作成
6.3.1ノードの作成
6.3.2サービスの呼び出し
6.3.3 Clientエンドインプリメンテーション
完全なコードは次のとおりです.
6.4 Clientエンドデバッグ
既存のserverでclientをデバッグ
6.5 Serviceコマンドラインツール
すべてのサービスを問い合わせる
サービス詳細の照会
サービス転送のデータ型のクエリー
シミュレーションクライアント側呼び出しサービス
サービス要求パラメータのクエリー
七、サービス通信練習
6.1サーバ側の作成
取付
pyserial
pip install pyserial
ワークスペースの下にパッケージを作成する
cd ros_ws/first_ws/src
catkin_create_pkg hello_service rospy roscpp rosmsg
Clionを使用してディレクトリ
hello_service
を開き、scripts
ディレクトリの下にPythonファイルserver_node
を新規作成します.6.1.1ノードの作成
rospy.init_node('server_node')
Ctrl+Pの1番目のパラメータ
serviceName
をサービス名とし、1つのuriアドレスの2番目のパラメータservice_class
がサービスに必要なデータ型である3番目のパラメータhandle
がサービス要求のコールバックである6.1.2処理要求のロジック
def callback(request):
if not isinstance(request, AddTwoIntsRequest): return
a = request.a
b = request.b
#
c = a + b
#
response = AddTwoIntsResponse()
response.sum = c
return response
コールバック関数のパラメータは、要求されたデータの戻り値が応答するデータである
6.1.3 Serverエンドの実装
完全なコードは次のとおりです.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 15/9/20 12:38 AM
# @Author : Chenan_Wang
# @File : server_node.py
# @Software: CLion
"""
client: 10 20
server: 10 + 20
"""
import rospy
from rospy_tutorials.srv import AddTwoInts, AddTwoIntsRequest, AddTwoIntsResponse
def callback(request):
if not isinstance(request, AddTwoIntsRequest): return
a = request.a
b = request.b
#
c = a + b
#
response = AddTwoIntsResponse()
response.sum = c
return response
if __name__ == '__main__':
#
rospy.init_node('server_node')
# server server
# server
#
service_name = '/hello/server'
# service_class,
# handle, ,
server = rospy.Service(service_name, AddTwoInts, callback)
rospy.spin()
6.2サーバ側のデバッグ
6.2.1 rosserviceツール(コマンドライン)
rosservice list
コマンドを使用すると、現在実行されているすべてのサービスを検索できます.rosservice list
クエリの結果、対応するサービス名
/hello/server
が得られます.このサービスは、クエリーのサービス名によって呼び出されます.
rosservice call /hello/server "a:1 b:3"
rosservice call
はサービスの呼び出しを担当します.最初のパラメータは呼び出すサービスの名前で、後のパラメータは呼び出すときに入力するパラメータです.6.2.2 rqt_service_callerツール(可視化)
コマンド呼び出しツール
rosrun rqt_service_caller rqt_service_caller
6.3 Client側作成
6.3.1ノードの作成
rospy.init_node('client_node')
6.3.2サービスの呼び出し
# servers , ,
rospy.wait_for_service(service_name)
#
client = rospy.ServiceProxy(service_name, AddTwoInts)
# server
request = AddTwoIntsRequest()
request.a = 17
request.b = 8
response = client.call(request)
6.3.3 Clientエンドインプリメンテーション
完全なコードは次のとおりです.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 15/9/20 2:21 AM
# @Author : Chenan_Wang
# @File : client_node.py
# @Software: CLion
import rospy
from rospy_tutorials.srv import AddTwoInts, AddTwoIntsRequest, AddTwoIntsResponse
if __name__ == '__main__':
#
rospy.init_node('client_node')
# client
#
service_name = '/hello/server'
client = rospy.ServiceProxy(service_name, AddTwoInts)
# servers , ,
rospy.wait_for_service(service_name)
# server
request = AddTwoIntsRequest()
request.a = 17
request.b = 8
response = client.call(request)
if isinstance(response, AddTwoIntsResponse):
print response.sum
rospy.spin()
6.4 Clientエンドデバッグ
既存のserverでclientをデバッグ
source devel/setup.bash
rosrun hello_service server_node.py
source devel/setup.bash
rosrun hello_service client_node.py
6.5 Serviceコマンドラインツール
すべてのサービスを問い合わせる
rosservice list
サービス詳細の照会
rosservice info
サービス転送のデータ型のクエリー
rosservice type
シミュレーションクライアント側呼び出しサービス
rosservcie call
サービス要求パラメータのクエリー
rosservice args
七、サービス通信練習