ROS2 msg 파일 및 srv 파일 인터페이스 python으로 만들기
1. msg 메세지 srv 서비스 패키지 만들기
1) package 만들기
터미널창을 새롭게 실행하여 dev_ws/src 이동
ros2 pkg create --build-type ament_cmake tutorial_interfaces 입력 엔터
python은 .msg와 .srv를 만들 수 없습니다.
dev_ws/src/tutorial_interfaces 로 이동하여
mkdir msg
mkdir srv
2) msg, srv 만들기
dev_ws/src/tutorial_interfaces/msg 로 이동
Num.msg 이름으로 새 파일을 만들고 편집기로 열어서
int64 num 을 첫줄에 입력 후 저장
tutorial_interfaces/srv 로 이동
AddThreeInts.srv 이름으로 새 파일을 만들고 편집기로 열어서
int64 a
int64 b
int64 c
---
int64 sum 을 첫줄에 입력 후 저장
3) CMakeLists.txt 을 편집기로 열어서
find_package(rosidl_default_generators REQUIRED)
rosidl_generate_interfaces(${PROJECT_NAME}
"msg/Num.msg"
"srv/AddThreeInts.srv"
)
내용을 추가
4) package.xml 을 편집기로 열어서
<build_depend>rosidl_default_generators</build_depend>
<exec_depend>rosidl_default_runtime</exec_depend> <member_of_group>rosidl_interface_packages</member_of_group>
내용을 추가
5) tutorial_interfaces 빌드하기
터미널창을 새로 열어서 ~/dev_ws 로 이동
colcon build --packages-select tutorial_interfaces 입력 엔터
6) msg, srv 최종 생성 확인하기
터미널창을 새로 열어서 ~/dev_ws 로 이동
. install/setup.bash 입력 엔터
ros2 interface show tutorial_interfaces/msg/Num 입력 엔터 실행
int64 num 결과값이 출력됨
ros2 interface show tutorial_interfaces/srv/AddThreeInts 입력 엔터 실행
int64 a
int64 b
int64 c
---
int64 sum 결과값이 출력됨
2. 만들어진 인터페이스 사용하기
앞에서 만든 py_srvcli 디렉토리의 service client package를 이용함
1) service 소스 코드 수정하기
service_membet_function.py 를 편집기로 열어서 아래처럼 수정
from tutorial_interfaces.srv import AddThreeInts # CHANGE
import rclpy
from rclpy.node import Node
class MinimalService(Node):
def __init__(self):
super().__init__('minimal_service')
self.srv = self.create_service(AddThreeInts, 'add_three_ints', self.add_three_ints_callback) # CHANGE
def add_three_ints_callback(self, request, response):
response.sum = request.a + request.b + request.c # CHANGE
self.get_logger().info('Incoming request\na: %d b: %d c: %d' % (request.a, request.b, request.c)) # CHANGE
return response
def main(args=None):
rclpy.init(args=args)
minimal_service = MinimalService()
rclpy.spin(minimal_service)
rclpy.shutdown()
if __name__ == '__main__':
main()
2) client 소스 코드 수정하기
client_membet_function.py 를 편집기로 열어서 아래처럼 수정
from tutorial_interfaces.srv import AddThreeInts # CHANGE
import sys
import rclpy
from rclpy.node import Node
class MinimalClientAsync(Node):
def __init__(self):
super().__init__('minimal_client_async')
self.cli = self.create_client(AddThreeInts, 'add_three_ints') # CHANGE
while not self.cli.wait_for_service(timeout_sec=1.0):
self.get_logger().info('service not available, waiting again...')
self.req = AddThreeInts.Request() # CHANGE
def send_request(self):
self.req.a = int(sys.argv[1])
self.req.b = int(sys.argv[2])
self.req.c = int(sys.argv[3]) # CHANGE
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_three_ints: for %d + %d + %d = %d' % # CHANGE
(minimal_client.req.a, minimal_client.req.b, minimal_client.req.c, response.sum)) # CHANGE
break
minimal_client.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
3) 빌드하기
package.xml 을 편집기로 열어서 아래 줄을 추가
<exec_depend>tutorial_interfaces</exec_depend>
colcon build --packages-select py_srvcli
4) 실행하기
새창을 열고 dev_ws로 이동한후
. install/setup.bash 입력 엔터
ros2 run py_srvcli service
새창을 열고 dev_ws로 이동한후
. install/setup.bash 입력 엔터
ros2 run py_srvcli client 2 3 1