نوشتن یک service و client ساده (Python)
در این آموزش قصد داریم تا نحوه نوشتن یک نود service و client به زبان Python آموزش دهیم.
در آموزشهای قبلی یاد گرفتید که چگونه میتوان یک service و client ساده (C++)را ایجاد نمود.مفاهیم دقیقا همانها است لذا از ذکر دوباره آنها خودداری می کنیم.
توجه در صورتی که هنوز با مفاهیم service و Client در ROS آشنا نیستید آموزش گام دوازدهم نوشتن یک service و client ساده (C++) را مشاهده نمایید.
ساخت یک نود سرویس
همانند آموزش قبلی در اینجا نیز ما یک نود سرویس به نام “add_two_ints_server” ایجاد خواهیم کرد که دو عدد را بهعنوان ورودی را دریافت میکند و جمع آنها را در خروجی برمیگرداند.
ابتدا مسیر فعلی خود را به مسیر بستهای که در آموزشهای مراحل قبل ایجاد کردهاید تغییر دهید.
شما باید ساخت سرویس را که در گامهای قبلی آموزش داده شد را بهدرستی انجام داده باشید.
وارد پوشه Scripts موجود در بسته خود شوید (در صورتی که پوشه ای با این نام ندارید، آن را ایجاد کنید.) و در آن یک فایل به اسم add_two_ints_server.py ایجاد کنید (right-click > New Document > Empty Document) و کدهای زیر را کپی و در آن پیست کنید.
#!/usr/bin/env python
from beginner_tutorials.srv import AddTwoInts,AddTwoIntsResponse
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)
def add_two_ints_server():
rospy.init_node('add_two_ints_server')
s = rospy.Service('add_two_ints', AddTwoInts, 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
توجه : هر فایل پایتون که ایجاد کردین به منظور اینکه قابلیت اجرا شدن در کنار ROSCore را داشته باشد باید از دستور بالا استفاده نمایید. تنها کافی است مسیر پوشه تا رسیدن به نام فایل خود را در انتهای دستور chmod +x قرار دهید.
توضیح کدها:
دستورات بالا همانطور که میدانید بخش اول آنها مربوط به افزودن وابستگی ها است. تابع اصلی ما add_two_ints_server است. این تابع ابتدا این فایل را مقدار دهی اولیه می کند تا توسط ROS شناخته شود. سپس توسط دستور rospy.Service سرویسی با نام add_two_ints را ایجاد می کند. که تایپ آن (اگر به یاد داشته باشید، قبلاً آن را ایجاد کردیم.) AddTwoInts است. تمام درخواست ها به تابع handle_add_two_ints فرستاده می شوند.
ساخت یک نود client
فایلی با نام add_two_ints_client.py در پوشه scripts بسته beginner_tutorials ایجاد کنید. کدهای زیر را داخل فایل ایجاد شده قرار دهید.
#!/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')
try:
add_two_ints = rospy.ServiceProxy('add_two_ints', AddTwoInts)
resp1 = add_two_ints(x, y)
return resp1.sum
except rospy.ServiceException, e:
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 قابل اجرا نمایید.
chmod +x scripts/add_two_ints_client.py
توضیح کدها:
دستورات بالا نیز در ابتدا وابستگیها را فراخوانی می کند. این فایل از دو تابع با نام های add_two_ints_client(x, y) و ()usage تشکیل شده و یک بخش اصلی main دارد. در بخش main ابتدا ورودی های نود را به مقادیر x و y انتساب می دهد. و سپس تابع add_two_ints_client(x, y) را با این ورودی ها فراخوانی می کند. درون تابع add_two_ints_client نیز به منظور منتظر ماندن برای سرور add_two_ints، از دستور زیر استفاده می شود.
rospy.wait_for_service('add_two_ints')
حال یک هندلر برای ارتباط با سرویس ایجاد می کنیم. برای این منظور از دستور زیر استفاده می شود.
add_two_ints = rospy.ServiceProxy('add_two_ints', AddTwoInts)
حال از این هندلر که ایجاد کردیم مانند یک تابع عادی با مقادیر ورودی x و y به صورت زیر استفاده می کنیم. و در نهایت نتیجه را باز می گرداند.
resp1 = add_two_ints(x, y)
return resp1.sum
حال به منظور بیلد کردن نودهایی که ایجاد کردیم دستورات زیر را در ترمینال بزنید.
cd ~/catkin_ws
catkin_make
نحوه اجرای یک service و client ساده (Python)
ابتدا هسته ros را با دستور roscore اجرا نمایید. سپس یک ترمینال جدید باز کنید. حال ابتدا سرور را اجرا نمایید. به منظور اجرای سرور دستور زیر را وارد نمایید.
rosrun beginner_tutorials add_two_ints_server.py
با اجرای این دستور خروجی مشابه زیر مشاهده خواهید کرد.
حال به منظور اجرای client دستور زیر را وارد نمایید. فرض کنید که ما میخواهیم اعداد ۵ و ۶ را با یکدیگر جمع کنیم. برای این منظور دستور زیر را باید در ترمینال وارد کنید
rosrun beginner_tutorials add_two_ints_client 5 6
در ترمینال مربوط به سرور خروجی مشابه زیر باید مشاهده نمایید.
request: x=5, y=6sending back response: [11]