【ROS2関係トップページへ】
【前:ROS2におけるコンポーネントの作成】
ROS2におけるコンポーネントの作成などで使用したコンポーネントの利用方法について.
コンポーネントの使い方
詳しくは公式tutorialのComposing multiple nodes in a single processのRun the demosを参考のこと.
共有ライブラリのように使用
main関数のあるターゲットを作成し,普通の共有ライブラリと同じように使用する.
簡単なコマンド一覧
ros2 component -h
や ros2 component load -h
などで詳しい情報を見ることが出来る.
システムが見えているコンポーネント一覧を表示
$ ros2 component types
コンポーネントをスタンドアロンで実行
$ ros2 component standalone [パッケージ名] [名前空間::クラス名]
例では以下の通り.
$ ros2 component standalone minimal_comp minimal_comp::MinimalCompNode1
rclcpp_componentsによる実行
コンポーネントマネージャをterminal1で実行.terminal2でloadすることでterminal1で次々ロード・実行される.single threadなコンポーネントマネージャの実行の仕方は以下の通り.
$ ros2 run rclcpp_components component_container
multi threadなコンポーネントマネージャを実行したい場合は以下のようにする.
詳しくはgithubのrclcpp_componentsのソースを見ると分かりやすい.
$ ros2 run rclcpp_components component_container_mt
terminal2でコンポーネントマネージャを確認してみる.
$ ros2 component list
/ComponentManager
コンポーネントマネージャにnodeを追加する場合は以下のようにする.
$ ros2 component load [コンテナノード名] [パッケージ名] [名前空間::クラス名]
例では以下の通り.
$ ros2 component load /ComponentManager minimal_comp minimal_comp::MinimalCompNode1
実行するとコンポーネントマネージャを実行したterminal1に実行結果が出てくる.
コンテナノードのノード名・名前空間の変更
コンテナは普通のノードなのでノード名・名前空間を変えることができる.その場合コンポーネントのロードにも影響がある.
詳しくは公式tutorialのComposing multiple nodes in a single processのRemapping container name and namespaceを参考のこと.
YAMLファイルの読み込み
2020/7/24現在.模索中.以下ではできません.
ros2 component standalone
や ros2 component load
でyamlの設定ファイルを読み込む方法.-r __params:=[yamlファイルの指定]
かな?(参考)
./yaml/test.yaml
を読み込む場合,例えば以下の通り.
$ ros2 component load /ComponentManager minimal_comp minimal_comp::MinimalCompNode1 -r ./yaml/test.yaml
rclcpp_components_register_nodes詳細
公式githubの関係ページでは使用方法が以下のようになっている.
# usage: rclcpp_components_register_node(
# <target> PLUGIN <component> EXECUTABLE <node>)
#
# :param target: the shared library target
# :type target: string
# :param PLUGIN: the plugin name
# :type PLUGIN: string
# :param EXECUTABLE: the node's executable name
# :type EXECUTABLE: string
# :param RESOURCE_INDEX: the ament resource index to register the components
# :type RESOURCE_INDEX: string
つまり,以下の書き方が正しいかもしれない.ちなみに,PLUGIN書いても書かなくても同じように動いた.
rclcpp_components_register_nodes([target名]
PLUGIN "namespace::クラス名"
)
なお,デフォルトでついてくるジョイスティックを動かす用のjoyパッケージでは以下のようになっている.
rclcpp_components_register_node(joy
PLUGIN "joy::Joy"
EXECUTABLE joy_node)
このようにEXECUTABLEを指定することで実行するための名前を付けられるようである.
実際,以下のコマンドで起動できる.
$ ros2 run joy joy_node
ただ,EXECUTABLEについては自分のところでは出来ていない(2020/07/23).