19
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ROS2独自メッセージの作成

Last updated at Posted at 2019-04-26

ROS2関係トップページへ
ROS2レクチャー:初級 -ROS1 style-
ROS2レクチャー:初級 -class style-

【前:ROS2の最小構成publisher:初級 -ROS1 style-
【前:ROS2の最小構成publisher:初級 -class style-
【次:独自メッセージを用いたROS2 publisher/subscriber:初級 -ROS1 style-
【次:独自メッセージを用いたROS2 publisher/subscriber:初級 -class style-

Eloquent ElusorまでのROS2独自メッセージの作成はこちら

ROSには沢山の種類のメッセージが用意されている.しかし勿論自分独自のメッセージを作りたくなる.C言語でいうstructのように.
ROS(ROS1)では実行ファイル=nodeでありnodeがメッセージを使用するため,nodeのパッケージの中に独自メッセージが付属的に作成された.
ROS2ではメッセージも独立性を持つようで,それ自体がパッケージとして成り立ち,他のパッケージがメッセージに関するパッケージを利用する形となる.
詳しくは当ページの最後の「参考」を参照のこと.

dashingからの変更?[ROS2インストール・初期設定(for dashing用)](https://qiita.com/NeK/items/d2bdd8798de7cdea1932)の「上記ガイド以外でインストールしたもの」に追加したが,lark-parserとnumpyをちゃんとインストールしないとエラーが出るようになった(2019/6)

作成物

データの基本型はAbout ROS 2 Interfacesに一覧がある.
独自メッセージはtopic用とService用がある.ここでは
両方つくる.

topic用メッセージ

int64型のデータを二つ.

service用メッセージ

service用メッセージは送信と受信がある.送信として二つのfloat64型のデータ,送信し処理した結果受信するデータとして二つのfloat64型のデータ.

準備

topic用のメッセージのためにmsgディレクトリをservice用のメッセージのためにsrvディレクトリを作成する.

terminal
$ cd ~/ros2_studies_ws/
$ ros2 pkg create my_messages --build-type ament_cmake
$ cd my_messages
$ mkdir msg
$ mkdir srv

メッセージ作成

topic用メッセージの作成

msgディレクトリ以下に以下のファイルを作成

  • TwoInts.msg
msg/TwoInts.msg
int64 a
int64 b

service用メッセージの作成

srvディレクトリ以下に以下のファイルを作成

  • CalcTwoFloats.srv
srv/CalcTwoFloats.srv
float64 a
float64 b
---
float64 sum
float64 diff

メッセージに関する注意点

メッセージを表すファイル名(***.msgや***.srv)にはいくつかの制限がある.

メッセージファイル名に関する制限

  • 最初の文字が大文字でなければならない
  • _(アンダースコア)を使ってはいけない
  • 単語の区切り(意味の区切り)は大文字で行う

OKな例

  • Test.msg
  • TEST.msg
  • TestMessage.msg

NGな例

  • test.msg
  • test_message.msg

制限の理由とメッセージの利用方法

メッセージファイルはcolcon buildによって他のパッケージで利用できるようにビルドされる.この時,***.msgはコンパイルされてクラスになる.この時,二個目の大文字の前に_(アンダースコア)が挿入され全て小文字のヘッダファイルが作成されて,これをインクルードすることで利用できるようにしている.

  • msgファイル
    • TestMessage.msg
  • コンパイル後に作成されるメッセージ利用のためのクラスヘッダファイル
    • test_message.hpp

この変換をスムーズに行うために上記のような制限が行われる.

このように他のパッケージで利用するためには,メッセージファイル名から上記のように変換したヘッダファイルを読み込むことを覚えておくこと.

package.xmlとCMakeLists.txt

idl(interface description language)という名前を持つライブラリを使用している.interface,つまり他のnodeから使ってもらえるようにするためのもの.

package.xml

package.xml
<package format="3">
  <build_depend>rosidl_default_generators</build_depend>
  <exec_depend>rosidl_default_runtime</exec_depend>
  <member_of_group>rosidl_interface_packages</member_of_group>

1行目:タグを利用するためには"3"にしなければならない.
2~4行目:メッセージをビルド・実行するために必要.

注意点

  • いつの間にか(Foxy Fitzroyから?)rodidl_default_generatorsがbuildtool_dependではなくbuild_dependになっている.
    • buildtool_dependでも大丈夫
    • 公式の説明を見るとそもそもbuild_dependが正しそう?

CMakeLists.txt

CMakeLists.txt
find_package(rosidl_default_generators REQUIRED)

set(msg_files
  "msg/TwoInts.msg"
)
set(srv_files
  "srv/CalcTwoFloats.srv"
)
rosidl_generate_interfaces(${PROJECT_NAME}
  ${msg_files}
  ${srv_files}
)
ament_export_dependencies(rosidl_default_runtime)

ament_export_dependencies(rosidl_default_runtime)は自動判別してくれるようになったのか書かなくても良くなったとは思う
ただ,foxy, galacticのtutorialには書くようにとある.
共有ライブラリとして使用するときに必要となるかな?(ROS2における共有ライブラリ参考)

ビルト・動作確認

terminal
$ cd ~/ros2_studies_ws/
$ colcon build --symlink-install --packages-up-to my_messages
$ . install/local_setup.bash
$ ros2 interface list # 全メッセージのリストが表示される.作成したメッセージが存在するか確認
$ ros2 interface show my_messages/msg/TwoInts # [パッケージ名]/[メッセージ]で中身が見えるので確認
$ ros2 interface show my_messages/srv/CalcTwoFloats # [パッケージ名]/[メッセージ]で中身が見えるので確認

既存メッセージの拡張

ある独自メッセージを作成する場合に,前に作成した独自メッセージをメンバとして用いることが可能.
詳しくは公式チュートリアルのExpanding on ROS2 interfacesの5(Extra Use an existing interface definition参照.

同プロジェクトのメッセージを,あるメッセージの中で使用する場合

普通にメッセージの中に,型 変数名の形で書けばよい.
以下は,TwoInts.msgDoubleTwoInts.msgの中で使う場合.

msg/DoubleTwoInts.msg
TwoInts a
TwoInts b

CMakeLists.txtの中のmsg_filesの中にもちゃんと追加.

CMakeLists.txt
find_package(rosidl_default_generators REQUIRED)

set(msg_files
  "msg/TwoInts.msg"
  "msg/DoubleTwoInts.msg"
)
set(srv_files
  "srv/CalcTwoFloats.srv"
)
rosidl_generate_interfaces(${PROJECT_NAME}
  ${msg_files}
  ${srv_files}
)
ament_export_dependencies(rosidl_default_runtime)

外部のメッセージを,あるメッセージの中で使用する場合

同プロジェクトのメッセージを使用する場合と比べてCMakeLists.txtの書き方が変わる.
以下はThird.msgの中でstd_msg/Headerを使用する場合の例.

msg/Third.msg
std_msg/Header h

CMakeLists.txtの中の

CMakeLists.txt
find_package(std_msg REQUIRED)
find_package(rosidl_default_generators REQUIRED)

set(msg_files
  "msg/TwoInts.msg"
  "msg/Third.msg"
)
set(srv_files
  "srv/CalcTwoFloats.srv"
)
rosidl_generate_interfaces(${PROJECT_NAME}
  ${msg_files}
  ${srv_files}
  DEPENDENCIES std_msgs
)
ament_export_dependencies(rosidl_default_runtime)

find_packageとrosidl_generate_interfacesの中にDEPENDENCIESが加わっていることがわかる.

参考

メッセージについて詳しくは以下のページに詳しい

公式の使用例は以下のとおり.

【前:ROS2の最小構成publisher:初級 -ROS1 style-
【前:ROS2の最小構成publisher:初級 -class style-
【次:独自メッセージを用いたROS2 publisher/subscriber:初級 -ROS1 style-
【次:独自メッセージを用いたROS2 publisher/subscriber:初級 -class style-

19
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?