상세 컨텐츠

본문 제목

ROS2 간단한 service client python 코딩하기

Programming

by 신농해태 2021. 8. 24. 11:15

본문

반응형

1) 패키지 만들기

터미널을 실행시키고

dev_ws/src 이동 후,

패키지를 만들고

ros2 pkg create --build-type ament_python py_srvcli --dependencies rclpy example_interfaces

 

2) 서비스 노드 만들기

dev_ws/src/py_srvcli/py_srvcli 이동하여

service_member_function.py 파일명으로 새 파일을 만들 후

-- 아래 코드를 입력

from example_interfaces.srv import AddTwoInts

 

import rclpy

from rclpy.node import Node

 

class MinimalService(Node):

   def __init__(self):

      super().__init__('minimal_service')

      self.srv = self.create_service(AddTwoInts, 'add_two_ints', self.add_two_ints_callback)

 

   def add_two_ints_callback(self, request, response):

      response.sum = request.a + request.b

      self.get_logger().info('Incoming request\na: %d b: %d' % (request.a, request.b))

 

      return response

 

def main(args=None):

   rclpy.init(args=args)

   minimal_service = MinimalService()

   rclpy.spin(minimal_service)

   rclpy.shutdown()

 

if __name__ == '__main__':

   main()

 

3) entry point 추가하기 

dev_ws/src/py_srvcli 디렉토리로 이동하여

setup.py 파일을 편집기로 열어서

'console_scripts': 부분에

'service = py_srvcli.service_member_function:main', 을 추가

 

4) client node 만들기

dev_ws/src/py_srvcli/py_srvcli 디렉토리로 이동

client_member_function.py 파일명을 새파일을 만들어서

-- 아래 코드 처럼 입력

import sys

 

from example_interfaces.srv import AddTwoInts

import rclpy

from rclpy.node import Node

 

class MinimalClientAsync(Node):

   def __init__(self):

      super().__init__('minimal_client_async')

      self.cli = self.create_client(AddTwoInts, 'add_two_ints')

      while not self.cli.wait_for_service(timeout_sec=1.0):

         self.get_logger().info('service not available, waiting again...')

      self.req = AddTwoInts.Request()

 

   def send_request(self):

      self.req.a = int(sys.argv[1])

      self.req.b = int(sys.argv[2])

      self.future = self.cli.call_async(self.req)

 

def main(args=None):

  rclpy.init(args=args)

 

  minimal_client = MinimalClientAsync()

  minimal_client.send_request()

 

 while rclpy.ok():

   rclpy.spin_once(minimal_client)

   if minimal_client.future.done():

      try:

         response = minimal_client.future.result()

      except Exception as e:

         minimal_client.get_logger().info(

            'Service call failed %r' % (e,))

      else:

         minimal_client.get_logger().info(

            'Result of add_two_ints: for %d + %d = %d' %

            (minimal_client.req.a, minimal_client.req.b, response.sum))

      break

 

   minimal_client.destroy_node()

   rclpy.shutdown()

 

if __name__ == '__main__':

   main()

--  여기까지 입력

 

5) entry point 추가하기 

dev_ws/src/py_srvcli 디렉토리로 이동하여

setup.py 파일을 편집기로 열어서

'console_scripts': 부분을 아래처럼 수정

entry_points={ 

   'console_scripts': [

      'service = py_srvcli.service_member_function:main',

      'client = py_srvcli.client_member_function:main',

   ],

},

 

6) build 및 run 하기

새 터미널을 실행시켜서

dev_ws 로 이동

rosdep install -i --from-path src --rosdistro foxy -y 입력 엔터 하여 종속성 만들기

colcon build --packages-select py_srvcli  입력 엔터하여 build

 

new terminal을 실행

dev_ws 로 이동

. install/setup.bash 입력 엔터

ros2 run py_srvcli service 실행

 

new terminal을 실행

dev_ws 로 이동

. install/setup.bash 입력 엔터

ros2 run py_srvcli client 2 3 실행하면,

 

client 터미널에서 아래처럼 출력

[INFO] [minimal_client_async]: Result of add_two_ints: for 2 + 3 = 5

 

service 터미널에서는 아래처럼 출력

[INFO] [minimal_service]: Incoming request a: 2 b: 3

728x90
LIST

관련글 더보기

댓글 영역