경희대학교 황효석 교수님의 2021-2 로봇 프로그래밍 수업을 듣고 공부한 것입니다.
두 개의 숫자를 request 로 던져 주면 그 숫자의 합을 response 로 돌려 주는 예제를 만들어 보자.
~/catkin_ws/$ catkin_create_pkg ex_service roscpp message_generation message_runtime std_msgs
$ 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 "---"
#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 을 구현한다.
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}
catkin_make
rosrun ex_service ex_service_server
rosrun ex_service ex_service_client 10 20