Help us understand the problem. What is going on with this article?

ROS2に関する基本情報

ROS2関係トップページへ

ROS2の構造

用語

ノード:node
ROS2における機能単位.ROS2では通信を通して他のnodeと情報交換を行い,なんらかの仕事を行う.そのためnodeは通信を伴うpublisher/subscriberやservice/client,parameterになる.通信を伴わないスタンドアロンのものもありだが,それならROS系でない方が実装が簡単.
ターゲット:target
実行単位.ROSではtarget=nodeだったが,ROS2ではtarget≠nodeである.ROS風にも実装できるが推奨されない.nodeをクラス化しtargetで実体化するか,クラス化したnodeを共有ライブラリとしてtargetで使用する.これによりnodeの再利用性を高めるとともにnodeの制御を柔軟に行えるようになる.
ライブラリ:library
nodeを共有ライブラリ化したもの.nodeの再利用性を高めるため共有ライブラリにすることが推奨されているが,その手順は少々煩雑である.ちなみにlibraryはROSでのnodeletに相当するらしい.
パッケージ:package,プロジェクト:project
関係の深いターゲット,ライブラリを集めたもの.関係の深いターゲット,ライブラリを集めたもの.ROS2としての呼び名はpackage.ただROS2では様々な言語を使用でき,projectという呼び名を使っているものもあるので併記.ros2のコマンド(ros2 pkg create)で作成する.
ワークスペース:workspace
使用するパッケージを集めたトップディレクトリ.使用状況に応じてパッケージをまとめて実行する単位となる.コンパイル・ビルドはパッケージのディレクトリでなくてもよい.そのため普通はワークスペースにてサブディレクトリとなるパッケージ群を一度に or 選択してコンパイル・ビルドする.ros2のコマンドで作成するのではなく普通にmkdirなどで作成する.

全体設定とワークスペースごとの設定について

ROS2では全体設定と個別設定がある.
全体設定は/opt以下のsetup.bashである(個人設定参照).
個別設定は,ワークスペースごとの設定である.個別設定により,ワークスペースごとの独立したROS2実行環境を持てる.個別設定の行い方は以下のとおり.

terminal
$ cd 対象のワークスペース
$ . install/setup.bash

. install/setup.bashはsource install/setup.bashと同じ.
ドットコマンドと直接スクリプトを実行した時の違いが分かりやすい.

ROS2における実装方法

ROS2での実装スタイルを大別すると以下となる.

  • ROS風node
    • 従来のROS風の書き方.非推奨だがものによってはROS風になる.
  • クラス化したnode
    • ROS2風への第一歩.一番はnodeを共有ライブラリとして実装する方法だが,そこに至るまでの入り口となる.
  • 共有ライブラリ化したnode
    • ROS2で推奨している実装方法.
  • コンポーネント化したnode

ROS風node

ROS風の実装方法だと,main関数の頭から,

  1. ROS2システムのための初期化
  2. nodeに関する設定.初期化やnodeの実行に必要な処理などを行う部分.
  3. nodeを実行.下図ではwhileをつかって「ループして実行してます!」と表現しているけど,ROS/ROS2の通常ではspin()を使う.
  4. 終了処理.nodeの実行が正しく終わったらちゃんと終了させないとね.

という流れとなる.

ROS風PG.png

クラス化したnode

ROS2ではターゲットとnodeを分離することが推奨されている.これによりnodeの再利用を高めるとともに,一つのターゲットで複数のnodeを使用できるようになる(それにより実行順番など細かな制御も可能になる).
nodeの実行はROS2システムのspin関数により制御されるので,クラスとしてはnodeの準備・設定についてのコードを書くことになる.おそらく標準的なプログラムでは,コンストラクタの中にすべての準備・設定を書くことになる.これによりターゲットの中では,nodeを宣言するのみでよくなり,下記のようなコード一行となる.

node(クラス名"My")の実行に関する部分の例
rclcpp::spin(std::make_shared<My>());


spin関数とnodeの実行・制御・管理について
nodeには様々な機能があるが,主にはcallback関数の形で実現されており,これにより定期的な処理やイベントに対する処理が行われる.そのためプログラムの基本な流れは,callback関数を使用するための準備・設定を行い,ROSシステムによってcallback関数の実行・制御管理が行われる.spin関数はnodeの様々なcallback関数を実行・制御・管理するもので,基本的にはctrl-cなどで終了されるまで実行・制御・管理を行い続ける.rclcppのAPIにあるとおり,spin関数は3種類あり状況に応じて使用する.普通はspinで大丈夫.その他のexecutorsは,多数のnodeを個別に実行・制御・管理したり非同期処理のための便利道具を提供するときに使うものだと思われる.要調査.

ROS2クラス化PG.png

共有ライブラリ化したnode

最も推奨されている実装方法は,クラス化したnodeを共有ライブラリとして作成し,他のパッケージからの利用を簡単にするやり方である.
実現の手順は少々煩雑であるが,考え方としては「クラスをライブラリにしようよ」だけ.

ROS2ライブラリ化PG.png

nodeの「設定」と「実行」

上記では,nodeを宣言し「設定」を行ってspin関数により「実行」する,と書いた.厳密にはspin関数で「実行」されるまでnodeが動いていないかというと違う.nodeがクラスであればメンバ関数を使えるし,ROSパラメータの設定なども行える.「設定」と「実行」とは以下の通り(2019/7/13書きかけ)

  • 設定
    • ROSの特徴的な機能を使うための設定を行う.
      • 特徴的な機能とは,publisher/subscriber, service/client, parameterなどとなる.
      • 特徴的な機能はメッセージやトピックに関するcallback関数により実現されている.
        • つまりcallback関数に関する設定が主となる.
  • 実行
    • メッセージやトピックに関する待ち受けを行い,必要に応じてcallback関数を呼び出すことを「実行」と呼んでいる.
    • つまりそれ以外のnodeに関する処理は随時実行される.
      • spin関数がなくても実行される.
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした