ROS_Service

지토·2021년 11월 10일
0

경희대학교 황효석 교수님의 2021-2 로봇 프로그래밍 수업을 듣고 공부한 것입니다.

두 개의 숫자를 request 로 던져 주면 그 숫자의 합을 response 로 돌려 주는 예제를 만들어 보자.

1. Make Package

  • go to workspace
  • make a new package:
~/catkin_ws/$ catkin_create_pkg ex_service roscpp message_generation message_runtime std_msgs
  • make 'srv' directory
    서비스 파일은 srv 라는 폴더 내에 들어 있어야 함.
$ mkdir srv
$ gedit myservice.srv
int64 a
int64 b
---
int64 result
//you can declare two input arguments and one output argument which are seperated by "---"

ex_service_server.cpp

#include "ros/ros.h"
#include "ex_service/myservice.h"

bool server_callback(ex_service::myservice::Request &req, ex_service::myservice::Response &res)
{
	res.result = req.a + req.b;
    	ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
    	ROS_INFO("sending back response: [%ld]", (long int) res.result);
}
int main(int argc, char **argv){

	ros::init(argc, argv, "ex_service_server");
    	ros::NodeHandle n;
    
    ros::ServiceServer service = n.advertiseService("my_service", server_callback);
    ROS_INFO("my_service: ready");
    ros::spin();
    
    return 0;
}

주석

#include "ex_service/myservice.h"
//따로 myservice.h 파일을 만들지 않아도 빌드할 때 자동적으로 만들어진다. srv 폴더 안에 srv 파일을 넣어 놓으면 됨. 
publisher 의 경우 자기가 원할 때 특정한 정보를 publish 하고 subscriber 는 그게 언제 올 지 모르기 때문에 callback 을 정의하고 응답을 했지만, 

server 의 경우 먼저 요청을 하는 것이 client 이기 때문에 
server 가 callback function 을 구현한다. 

CMakeLists.txt

cmake_minimum_required(VERSION 3.0.2)
project(ex_service)
find_package(catkin REQUIRED COMPONENTS message_generation roscpp std_msgs)

add_service_files(FILES myservice.srv)
generate_messages(DEPENDENCIES std_msgs)

catkin_package(CATKIN_DEPENDS roscpp std_msgs)
include_directorires(include ${catkin_INCLUDE_DIRS})

add_executables(ex_service_server src/ex_service_server.cpp)
add_dependencies(ex_service_server ${${PROJECT_NAME}_EXPORTED_TARGETS}
${catkin_EXPORTED_TARGETS})
target_link_libraries(ex_service_server ${catkin_LIBRARIES}

add_executables(ex_service_client src/ex_service_client.cpp)
add_dependencies(ex_service_client ${${PROJECT_NAME}_EXPORTED_TARGETS}
${catkin_EXPORTED_TARGETS})
target_link_libraries(ex_service_client ${catkin_LIBRARIES}

build

catkin_make
rosrun ex_service ex_service_server
rosrun ex_service ex_service_client 10 20

0개의 댓글