publisher와 subscriber처럼 항상 메시지를 주고 받는게 아니라 client가 service를 request하였을 때만 response해주는 것이다


1. Service Node 작성
$ roscd beginner_tutorials
$ cd src
$ vi add_two_ints_server.cpp

#include "ros/ros.h"
#include "beginner_tutorials/AddTwoInts.h"

bool add(beginner_tutorials::AddTwoInts::Request &req, 
beginner_tutorials::AddTwoInts::Response &res)
{
    res.sum = 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.sum);
    return true;
}

int main(int argc, char **argv)
{
    ros::init(argc, argv, "add_two_ints_server");
    ros::NodeHandle n;

    ros::ServiceServer service = n.advertiseService("add_two_ints", add);
    ROS_INFO("Ready to add two ints.");
    ros::spin();

    return 0;
}


2. Client Node 작성
$ roscd beginner_tutorials
$ cd src
$ vi add_two_ints_client.cpp
#include "ros/ros.h"
#include "beginner_tutorials/AddTwoInts.h"
#include <cstdlib>

int main(int argc, char **argv)
{
    ros::init(argc, argv, "add_two_ints_client");

    if (argc != 3)
    {
        ROS_INFO("usage: add_two_ints_client X Y");
        return 1;
    }

    ros::NodeHandle n;
    ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints");
    beginner_tutorials::AddTwoInts srv;

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

    if (client.call(srv))
    {
        ROS_INFO("Sum: %ld", (long int)srv.response.sum);
    }
    else
    {
        ROS_ERROR("Failed to call service add_two_ints");
        return 1;
    }
    return 0;
}


3. CMakefileLists.txt 수정

아래 두 줄을 추가해 준다.

rosbuild_add_executable(add_two_ints_server src/add_two_ints_server.cpp) rosbuild_add_executable(add_two_ints_client src/add_two_ints_client.cpp)

빌드
rosmake beginner_tutorials


'ROS electric' 카테고리의 다른 글

ROS data 기록하고 재생하기  (0) 2014.01.08
Simple Service와 Client 실행  (0) 2014.01.08
Simple publisher와 subscriber 실행  (0) 2014.01.08
Simple publisher와 subscriber 작성(C++)  (0) 2014.01.08
ROS msg와 srv생성  (0) 2014.01.08
Posted by 신영식
,