ROS學習篇(二)編寫簡單的Service和Client (Python)
阿新 • • 發佈:2019-02-08
一、寫一個伺服器(service)節點
首先我們得確保運行了之前的教程中的creating the AddTwoInts.srv教程。
進去工作空間中
roscd beginner_tutorials
在py指令碼資料夾scripts中新建add_two_ints_server.py檔案
touch scripts/add_two_ints_server.py
程式碼+註釋
#!/usr/bin/env python
from beginner_tutorials.srv import *
import rospy
def handle_add_two_ints(req) :
print "Returning [%s + %s = %s]"%(req.a, req.b, (req.a + req.b))
return AddTwoIntsResponse(req.a + req.b) #因為我們已經將服務的型別宣告為AddTwoInts,所以它會為您生成AddTwoIntsRequest物件(可以自由傳遞)。
def add_two_ints_server():
rospy.init_node('add_two_ints_server') #宣告節點為add_two_ints_server
s = rospy.Service('add_two_ints' , AddTwoInts, handle_add_two_ints)#使用AddTwoInts(之前教程中建立的)服務型別宣告一個名為add_two_ints的新服務。所有請求都傳遞給handle_add_two_ints函式。
print "Ready to add two ints."
rospy.spin() #此語句保證直到節點被關閉,程式碼才會停止執行
if __name__ == "__main__":
add_two_ints_server()
執行如下語句使以上新建節點可執行 ,不執行會在執行節點時出現找不到節點的錯誤。
chmod +x scripts/add_two_ints_server.py
二、寫一個客戶端(client)節點
在py指令碼資料夾scripts中新建add_two_ints_client.py檔案
touch scripts/add_two_ints_client.py
程式碼+註釋
#!/usr/bin/env python
import sys
import rospy
from beginner_tutorials.srv import *
def add_two_ints_client(x, y):
rospy.wait_for_service('add_two_ints') #在客戶端中我們不需要建立node,這是一種便捷方法,可以阻止名為add_two_ints的服務可用。
try:
add_two_ints = rospy.ServiceProxy('add_two_ints', AddTwoInts)#建立一個用於呼叫服務的控制代碼,可以像呼叫函式一樣,呼叫控制代碼
resp1 = add_two_ints(x, y) #因為我們已經將服務的型別宣告為AddTwoInts,所以它會為您生成AddTwoIntsRequest物件(可以自由傳遞)。
return resp1.sum
except rospy.ServiceException, e: #如果呼叫失敗,可能會丟擲rospy.ServiceException
print "Service call failed: %s"%e
def usage():
return "%s [x y]"%sys.argv[0]
if __name__ == "__main__":
if len(sys.argv) == 3:
x = int(sys.argv[1])
y = int(sys.argv[2])
else:
print usage()
sys.exit(1)
print "Requesting %s+%s"%(x, y)
print "%s + %s = %s"%(x, y, add_two_ints_client(x, y))
執行如下語句使以上新建節點可執行
chmod +x scripts/add_two_ints_client.py
三、執行節點
首先回到工作空間,並且編譯
cd catkin_ws
catkin_make
source
source devel/setup.bash
執行節點
rosrun beginner_tutorials add_two_ints_server.py
會出現Ready to add two ints.字樣,然後開啟新的終端執行client節點
rosrun beginner_tutorials add_two_ints_client.py
會打印出實用資訊如下:
/home/m-tan/catkin_ws/src/beginner_tutorials/scripts/add_two_ints_client.py [x y]
然後執行
rosrun beginner_tutorials add_two_ints_client.py 4 5
輸出:
Requesting 4+5
4 + 5 = 9
執行伺服器的終端輸出:
Returning [4 + 5 = 9]
至此,已經完成了ROS的伺服器和客戶端教程。