2017/09/09

ROSチュートリアル5-msgとservice-

ROSでは,ノード同士がメッセージおよびサービスをやり取りすることでデータのやり取りをします.そこで,今回はメッセージとサービスを作成します.

たいていは作らないでも事足りるので,勉強用です.

勉強しなくてもいけるのでパスでもOK.

メッセージもサービスもノードからノードへのデータの型です.
しかし,メッセージはトピックを介して一方通行にデータを渡しますが,サービスは受け取った場合受け取ったノードが返信を行います.

以下に新しいメッセージやノードの作り方を記します.


メッセージ:
メッセージ(msg)ファイル。ROS メッセージの型を説明するテキストファイル.
Msgディレクトリに保管。

一行ごとに型と名前が記載。
int8, int16, int32, int64 (plus uint*)
float32, float64
string
time, duration
other msg files
variable-length array[] and fixed-length array[C]
からなる。
*ROSの固有の型Headerも含まれることがある.
タイムスタンプと座標フレームの情報を含む


msgの例をいかに示す.

Header header
 string child_frame_id
 geometry_msgs/PoseWithCovariance pose
 geometry_msgs/TwistWithCovariance twist

サービス:
サービス(srv)ファイル。サービスを記述.リクエストとレスポンスという2つの部分で構成.リクエストとレスポンスの部分があること以外はメッセージと同じ。以下の例ではABがリクエスト。Sumがレスポンス。
int64 A
int64 B
---
int64 Sum

1.  メッセージファイルを作成
新しいメッセージを定義し,int64 numと書かれたメッセージファイルを作る
$ cd ~/catkin_ws/src/beginner_tutorials
$ mkdir msg
$ echo "int64 num" > msg/Num.msg

メッセージビルド時には"message_generation"が有効になっていることが必要で、メッセージ実行時には、"message_runtime"の有効化のみ必要なのでpackage.xmlの以下のコメントアウトを外す
<build_depend>message_generation</build_depend>
  <run_depend>message_runtime</run_depend>


CMakeLists.txtfind_package()に以下のようにmessage_generation追加
find_package(catkin REQUIRED COMPONENTS
   roscpp
   rospy
   std_msgs
   message_generation
)

メッセージの実行時依存を有効にする
catkin_package(
  ...
  CATKIN_DEPENDS message_runtime ...
  ...)

以下のブロックを見つける
# add_message_files(
#   FILES
#   Message1.msg
#   Message2.msg
# )

以下に書き換える
add_message_files(
  FILES
  Num.msg
)

以下のコメントアウト解除
# generate_messages(
#   DEPENDENCIES
#   std_msgs
# )

CMakelists.txtの編集を終えたのでメッセージを確認していく
以下のコマンドと出力が正しいか確認
$source ~/catkin_ws/devel/setup.bashを行ってからやったほうがいいかも。

$ rosmsg show beginner_tutorials/Num
表示は
int64 num

2.  サービスの作成
$ roscd beginner_tutorials
$ mkdir srv
ほかのパッケージからコピー(パッケージrospy_tutorials からAddTwoInts.srvにコピー)
$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv

CMakeLists.txtmessage_generationの依存を追加(メッセージのほうで済)

CMakeLists.txtの以下を探す
# add_service_files(
#   FILES
#   Service1.srv
#   Service2.srv
# )

ここをいかに書き換える

add_service_files(
  FILES
  AddTwoInts.srv
)

サービスの確認
$ rossrv show beginner_tutorials/AddTwoInts
表示は
int64 a
int64 b
---
int64 sum

以下の部分を、CMakeLists.txt内から探す。
# generate_messages(
#   DEPENDENCIES
# #  std_msgs  # Or other packages containing msgs
# )

以下に書き換え
generate_messages(
  DEPENDENCIES
  std_msgs
)

catkinワークスペースの中で再度catkin_make
$cd ~/catkin_ws
$catkin_make

$cd -


以上


ところで,rosの2017年のディストリビューション,lunarが出ましたね.

必要なパッケージがある人はlunarにしてもいいと思いますが,そうでもない人は今のパッケージが互換性あるか不明なものも多いと思うので,そうそう急ぐ必要はないかなと.

0 件のコメント:

コメントを投稿