Pynote

Python、機械学習、画像処理について

ROS - C++ によるサービス定義ファイル (*.srv) の利用方法

試した環境

手順

フォルダ構成

service_cpp/
├── srv
│   └── AddTwoInts.srv
├── package.xml
└── CMakeLists.txt

パッケージの雛形を作成する。

依存パッケージとして roscpp を指定し、service_cpp というパッケージを作成する。

$ cd ~/catkin_ws/src
$ catkin_create_pkg service_cpp roscpp

すると、パッケージの雛形が作成される。

service_cpps
├── CMakeLists.txt
├── include
│   └── service_cpps
├── package.xml
└── src

サービス定義ファイルを作成する。

int64 型の a、b という変数をリクエストとし、int64 型の sum という変数をレスポンスとするサービスを作成する。

AddTwoInts.srv

int64 a
int64 b
---
int64 sum

catkin_make を行うと、サービス定義ファイルに対応したコードが自動生成される。

CMakeLists.txt を編集する
# srv フォルダにあるサービス定義ファイルを記載する。
add_service_files(FILES
    AddTwoInts.srv
)

# サービス定義ファイルからコードを生成する設定を行う。
generate_messages()
サービス定義ファイルからコードを生成する。
$ catkin_make

すると、~/catkin_ws/devel/include に以下の3つのファイルが生成される。

$ ls ~/catkin_ws/devel/include/service_cpp/
AddTwoInts.h  AddTwoIntsRequest.h  AddTwoIntsResponse.h
自動生成されたファイルを利用する。

devel/include は include ディレクトリに自動的に追加されるので、

#include "service_cpp/AddTwoInts.h"

とすればよい。AddTwoIntsRequest.h 及び AddTwoIntsResponse.h は、AddTwoInts.h 内で include されている。

自動生成されたファイルの仕様
  • サービスオブジェクトの型
    • service_cpp::AddTwoInts
  • リクエストオブジェクトの型
    • service_cpp::AddTwoIntsRequest
    • service_cpp::AddTwoIntsRequest::Ptr // boost::shared_ptr
    • service_cpp::AddTwoIntsRequest::ConstPtr // boost::shared_ptr
    • service_cpp::AddTwoInts::Request
  • レスポンスオブジェクトの型
    • service_cpp::AddTwoIntsResponse
    • service_cpp::AddTwoIntsResponse::Ptr // boost::shared_ptr
    • service_cpp::AddTwoIntsResponse::ConstPtr // boost::shared_ptr
    • service_cpp::AddTwoInts::Response

AddTwoInts.h

namespace service_cpp
{
struct AddTwoInts
{
    Request request;
    Response response;

};
} // namespace service_cpp

AddTwoIntsRequest.h

namespace service_cpp
{
struct AddTwoIntsRequest
{
    AddTwoIntsRequest()
        : a(0), b(0)
    {
    }

    int64_t a;
    int64_t b;

};

AddTwoIntsResponse.h

namespace service_cpp
{
struct AddTwoIntsResponse
{
    AddTwoIntsResponse()
        : sum(0)
    {
    }

    int64_t sum;
};