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
리눅스에 완전히 적응하는 자주 사용하는 터미널 명령어 (0) | 2021.08.27 |
---|---|
ROS2 msg 파일 및 srv 파일 인터페이스 python으로 만들기 (0) | 2021.08.25 |
ROS2 C++ 간단한 publisher 과 subscriber 만들어보기 (0) | 2021.08.23 |
ROS2 패키지 만들기 (0) | 2021.08.23 |
ROS2 파일 런치하여 한번에 실행하기 (0) | 2021.08.21 |
댓글 영역