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 신영식
,

1. Publisher 실행

$ roscore
$ rosrun beginner_tutorials talker

2. Subscriber 실행

$ rosrun beginner_tutorials listener


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

Simple Service와 Client 실행  (0) 2014.01.08
Simple Service와 Client 작성(c++)  (0) 2014.01.08
Simple publisher와 subscriber 작성(C++)  (0) 2014.01.08
ROS msg와 srv생성  (0) 2014.01.08
ROS editor (rosed)  (0) 2014.01.08
Posted by 신영식
,

1. Publisher Node 작성

$ roscd beginner_tutorials
$ cd src
$ vi talker.cpp

#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>

int main(int argc, char **argv)
{
    ros::init(argc, argv, "talker");
    ros::NodeHandle n;
    ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
    ros::Rate loop_rate(10);

    int count = 0;

    while (ros::ok())
    {
        std_msgs::String msg;

        std::stringstream ss;
        ss << "hello world " << count;
        msg.data = ss.str();

        ROS_INFO("%s", msg.data.c_str());

        chatter_pub.publish(msg);

        ros::spinOnce();

        loop_rate.sleep();
        ++count;
    }
    return 0;
}

요약 : ROS system 초기화, publish할 메시지를 chatter topic에 advertise, 1초에 10번씩 loop돌면서 message를 보낸다


2. Subscriber Node 작성

$ roscd beginner_tutorials
$ cd src
$ vi listener.cpp

#include "ros/ros.h"
#include "std_msgs/String.h"

void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
    ROS_INFO("I heard: [%s]", msg->data.c_str());
}

int main(int argc, char **argv)
{
    ros::init(argc, argv, "listener");
    ros::NodeHandle n;
    ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
    ros::spin();

    return 0;
}

요약 : ROS System 초기화, chatter topic으로부터 subscribe, message들어올때마다 spin하면서 chatterCallback함수 수행


3. CMakeList.txt 수정

rosbuild_add_executable(talker src/talker.cpp)
rosbuild_add_executable(listener src/listener.cpp)

위 내용을 CMakeList.txt에 추가해주자

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

Simple Service와 Client 작성(c++)  (0) 2014.01.08
Simple publisher와 subscriber 실행  (0) 2014.01.08
ROS msg와 srv생성  (0) 2014.01.08
ROS editor (rosed)  (0) 2014.01.08
roslaunch 사용하기  (0) 2014.01.08
Posted by 신영식
,