티스토리 뷰


ROS python 프로그래밍

=서비스 통신=


Created Date: 2018.04.01
Modified Date: 2018.04.01
revision 1

키워드:ROS,ptyhon,service,파이썬,서비스
개발 환경:ROS kinetic kame + Ubuntu 16.04 + laptop


※국내 ROS 관련 파이썬 자료가 별로 없어서 작성합니다.

※전에 작성한 토픽 통신 게시글을 보지 않아도 서비스 통신을 실행 할 수 있게 독립적으로 작성했습니다.

※이번엔 catkin_make가 필요합니다.

-2개의 정수의 합을 클라이언트가 요청하면 서비스가 응답합니다.




1. 패키지 작성

cd ~/catkin_ws/src

catkin_create_pkg ros_service_tutorial rospy std_msgs


2. 서비스 파일 작성

roscd ros_service_tutorial

mkdir srv

gedit srv/AddTwoInts.srv



int64 a
int64 b
---
int64 sum



rossrv show ros_service_tutorial/AddTwoInts 로 작성된 서비스 파일을 확인해 볼 수 있습니다.


3. package.xml 수정


<build_depend>message_generation</build_depend>

<exec_depend>message_runtime</exec_depend>



<!-- asdf --> 로 되어있는 주석만 제거해 주시면 됩니다. 찾기 힘드시면 ctrl+f 명령어로 찾습니다.


4. CMakeLists.txt 작성

find_package(catkin REQUIRED COMPONENTS
   rospy
   std_mesgs
   messge_generation
)

add_service_files(
   FILES
   AddTwoInts.srv
)

generate_messages(
   DEPENDENCIES
   std_msgs
)


이 부분도 # 으로 주석이 되어있는데 제거해주시고 몇 요소만 위처럼 추가/수정 해주시면 됩니다.


5. 서버 작성

roscd ros_service_tutorial

mkdir scripts

gedit scripts/add_two_ints_server.py



#!/usr/bin/env python

from ros_service_tutorial.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)

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


5. 클라이언트 작성


gedit scripts/add_two_ints_client.py


#!/usr/bin/env python

import sys
import rospy
from ros_service_tutorial.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 scripts/add_two_ints_client.py


5. 패키지 빌드

cd ~/catkin_ws

catkin_make

source ~/.bashrc


6. 서비스 통신 실행

roscore

rosrun ros_service_tutorial add_two_ints_server.py

rosrun ros_service_tutorial add_two_ints_client.py 1 3




[참고자료]




End.

written by Starshirts


이 저작물은 크리에이티브 커먼즈 저작자표시 4.0 국제 라이선스에 따라 이용할 수 있습니다.




댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함