服务端与客户端

C++ 实例

src/server.cc

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

bool add(echo_hello::AddTwoInts::Request& request,
        echo_hello::AddTwoInts::Response& response) {
    response.sum = request.a + request.b;
    ROS_INFO("request: a=%ld, b=%ld", (long)request.a, (long)request.b);
    ROS_INFO("send response: sum=%ld", (long)response.sum);
    return true;
}

int main(int argc, char* argv[]) {
    ros::init(argc, argv, "server");
    ros::NodeHandle handle;

    ros::ServiceServer server = handle.advertiseService("neo", add);
    ROS_INFO("Server's on");

    ros::spin();

    return 0;
}

src/client.cc

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

#include <cstdlib>

int main(int argc, char* argv[]) {
    ros::init(argc, argv, "client");
    if(3 != argc) {
        ROS_INFO("usage: client A B");
        return 1;
    }

    ros::NodeHandle handle;
    ros::ServiceClient client = handle.serviceClient<echo_hello::AddTwoInts>("neo");

    echo_hello::AddTwoInts message;
    message.request.a = atoll(argv[1]);
    message.request.b = atoll(argv[2]);

    // 阻塞的
    if(client.call(message)) {
        ROS_INFO("sum: %ld", (long)message.response.sum);
    } else {
        ROS_ERROR("Failed to call service");
        return 1;
    }

    return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.3)
project(echo_hello)

find_package(catkin REQUIRED COMPONENTS
    rospy
    roscpp
    std_msgs
    message_generation
)

add_service_files(FILE
    AddTwoInts.srv
)

catkin_package(
)

include_directories(
    ${catkin_INCLUDE_DIRS}
)

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

add_executable(client src/client.cc)
add_dependencies(client
    ${${PROJECT_NAME}_EXPORTED_TARGETS}
    ${catkin_EXPORTED_TARGETS}
)
target_link_libraries(client
    ${catkin_LIBRARIES}
)
Python2 实例

scripts/server.py

#!/usr/bin/env python2

import rospy
from echo_hello.srv import *

def add(request):
    response = request.a + request.b
    print("request: a=%s, b=%s" % (request.a, request.b))
    print("send response: sum=%s" % (response))
    return AddTwoIntsResponse(response)

def server():
    rospy.init_node('server')
    server = rospy.Service('neo', AddTwoInts, add)

    print 'Server\'s on'
    rospy.spin()

if __name__ == '__main__':
    server()

scripts/client.py

#!/usr/bin/env python2

import sys

import rospy
from echo_hello.srv import *

def client(a, b):
    rospy.wait_for_service('neo')
    try:
        proxy = rospy.ServiceProxy('neo', AddTwoInts)
        response = proxy(a, b)
        return response.sum
    except rospy.ServiceException, e:
        print "Service call failed: %s" % e

def usage():
    return "usage: %s A B" % sys.argv[0]

if __name__ == '__main__':
    if 3 == len(sys.argv):
        a = int(sys.argv[1])
        b = int(sys.argv[2])
    else:
        print usage()
        sys.exit(1)

    print("sum: %s" % client(a, b))