본문 바로가기

Robotics

8일차 - ROS Service 프로그래밍

반응형

Service Demo 패키지 생성

이번에는 service를 이용하는 패키지를 만들어보도록 하겠습니다. client에 인자로 전달된 두 int64 값을 server가 더하여 반환하는 데모입니다.

catkin_create_pkg ros_tutorials_service roscpp std_msgs message_generation

package.xml 수정

<?xml version="1.0"?>
<package format="2">
  <name>ros_tutorials_service</name>
  <version>0.0.1</version>
  <description>request/response service</description>
  <license>Apache License 2.0</license>
  <maintainer email="root@to.do">someone</maintainer>

  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>message_generation</build_depend>
  <build_depend>roscpp</build_depend>
  <build_depend>std_msgs</build_depend>

  <build_export_depend>roscpp</build_export_depend>
  <build_export_depend>std_msgs</build_export_depend>

  <exec_depend>roscpp</exec_depend>
  <exec_depend>std_msgs</exec_depend>
  <exec_depend>message_runtime</exec_depend>

  <export></export>
</package>

CMakeLists.txt 수정

cmake_minimum_required(VERSION 3.0.2)
project(ros_tutorials_service)

find_package(catkin REQUIRED COMPONENTS
  message_generation
  std_msgs
  roscpp
)

add_service_files(FILES SrvTutorial.srv)
generate_messages(DEPENDENCIES std_msgs)
catkin_package(
  LIBRARIES ros_tutorials_service
  CATKIN_DEPENDS std_msgs roscpp
)

include_directories(${catkin_INCLUDE_DIRS})

add_executable(srv_server src/server.cpp)
add_dependencies(srv_server ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(srv_server ${catkin_LIBRARIES})

add_executable(srv_client src/client.cpp)
add_dependencies(srv_client ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(srv_client ${catkin_LIBRARIES})

서비스 파일 작성

먼저 서비스 파일이 위치할 srv 폴더를 생성한 뒤, 서비스 파일을 생성합니다.

roscd ros_tutorials_service
mkdir srv
vi srv/SrvTutorial.srv

서비스를 선언합니다.

int64 a
int64 b
---
int64 result

srv_server

add_executable(srv_server src/server.cpp)

CMakeLists.txt에서 선언한대로 srv_server 노드를 위한 코드 src/server.cpp를 작성합니다.

#include "ros/ros.h"
#include "ros_tutorials_service/SrvTutorial.h"

// 서비스 요청이 있을 경우, 아래의 처리를 수행
// 요청 = req / 응답 = res
bool add(ros_tutorials_service::SrvTutorial::Request &req, ros_tutorials_service::SrvTutorial::Response &res) {
  // add and save result
  res.result = req.a + req.b;
  // print info
  ROS_INFO("request: %ld + %ld", (long int)req.a, (long int)req.b);
  ROS_INFO("response: %ld", (long int)res.result);
  return true;
}

int main(int argc, char** argv) {
  ros::init(argc, argv, "service_server");
  ros::NodeHandle nh;
  // service name = ros_tutorial_srv
  // callback = add
  ros::ServiceServer ros_tutorials_service_server = nh.advertiseService("ros_tutorial_srv", add);
  ROS_INFO("ready srv server");
  // 요청이 들어오면 add 호출
  // 아니면 대기합니다.
  ros::spin();
  return 0;
}

srv_client

add_executable(srv_client src/client.cpp)

CMakeLists.txt에서 선언한대로 srv_client를 위한 src/client.cpp 코드를 작성합니다.

#include <cstdlib>
#include "ros/ros.h"
#include "ros_tutorials_service/SrvTutorial.h"

int main(int argc, char** argv) {
  ros::init(argc, argv, "service_client");
  if (argc != 3) {
    ROS_INFO("cmd: rosrun ros_tutorials_service service_client arg0 arg1");
    ROS_INFO("arg0: double number, arg1: double number");
    return 1;
  }

  ros::NodeHandle nh;
  ros::ServiceClient client = nh.serviceClient<ros_tutorials_service::SrvTutorial>("ros_tutorial_srv");

  ros_tutorials_service::SrvTutorial srv;
  srv.request.a = atoll(argv[1]);
  srv.request.b = atoll(argv[2]);

  if (client.call(srv)) {
    ROS_INFO("send srv: %d + %d", (long int)srv.request.a, (long int)srv.request.b);
    ROS_INFO("receive srv: %d", (long int)srv.response.result);
  } else {
    ROS_ERROR("Failed to call service ros_tutorial_srv");
    return 1;
  }
  return 0;
}

srv_client 노드는 인자로 int64 숫자 2개를 넘겨주지 않으면 사용법을 출력하고 종료됩니다.

빌드 및 실행

catkin_ws로 돌아와 catkin_make 명령어를 통해 패키지를 빌드합니다. 이후 아래 명령어를 실행하여 server/client를 테스트합니다.

# one shell
rosrun ros_tutorials_service srv_server
# another shell
rosrun ros_tutorials_service srv_client 1 2

아래와 같이 표시되어야 합니다.

반응형

'Robotics' 카테고리의 다른 글

9일차 - 파라미터 사용법  (0) 2020.07.09
9일차 - Action Demo 패키지 생성  (0) 2020.07.09
8일차 - ROS Topic 프로그래밍  (0) 2020.07.08
7일차 - ROS2 camera demo  (1) 2020.07.08
6일차 - ROS tools  (0) 2020.07.06