ROS 2 公式文書(英語) 日本語訳シリーズです。
本ブログの日本語翻訳版のトップページは以下のリンクを参照下さい。
ROS 2 launch システム
ROS 2 の launch システムでは、ユーザが独自のシステム構成をファイルとして記述することで、その通りに実行できるようにします。
内容としては、実行プログラム、実行場所、渡す引数、その他ROS 固有の規則を含めた様々な構成情報を、対象とするシステムに合わせてコンポーネント毎に指定でき、システム全体の起動・再利用を容易にします(いちいち複数のターミナルで一つずつノードを起動する必要がなくなります)。
また、起動されたプロセスの状態を監視し、それらのプロセスの状態変化を報告/対応する役割も担っています。
ROS 2 Bouncy リリースでは、Python で書かれた起動ファイルにより、ノードの起動/終了、イベントのトリガ、アクションの実行が可能となるフレームワークが含まれています。このフレームワークを提供するパッケージはlaunch_ros
です。これは、その下にある ROS 固有ではない launch フレームワークを使用します。
設計文書(レビュー中)には、ROS 2 の起動システムの設計の目的が詳しく記載されています(現在すべての機能が利用できるわけではありません)。
ROS 2 の起動概念の例
この例の起動ファイルは2つのノードを起動します。そのうちの1つは管理対象ライフサイクルを持つノード(「ライフサイクルノード」)です。 launch_ros
によって起動されたライフサイクルノードは、状態間を遷移するときに自動的にイベントを発行します。その後、イベントは起動フレームワークを介して処理されます。
具体的には、他のイベントを発生させること(例:launch_ros
を通して起動されたライフサイクルノードが自動的にイベントハンドラを持つ他の状態遷移を要求すること)や他のアクションをトリガーすること(例:他ノードの起動)があります。
前述の例では、さまざまな遷移要求がtalker
ライフサイクルノードに要求されます。例えば、その遷移イベントはライフサイクルtalker
が適切な状態に達したときにlistener
ノードを起動する、といったことが挙げられます。
使い方
起動ファイルはスタンドアロンスクリプトとして書くことができますが、ROS での典型的な使い方は ROS 2 ツールから launch ファイルが呼び出す方法です。
たとえば、こちらの launch ファイルはros2 launch
によって起動できるように設計されています。
ros2 launch demo_nodes_cpp add_two_ints.launch.py
- add_two_ints.launch.py
# Copyright 2018 Open Source Robotics Foundation, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Launch a add_two_ints_server and a (synchronous) add_two_ints_client.""" import launch import launch_ros.actions def generate_launch_description(): server = launch_ros.actions.Node( package='demo_nodes_cpp', node_executable='add_two_ints_server', output='screen') client = launch_ros.actions.Node( package='demo_nodes_cpp', node_executable='add_two_ints_client', output='screen') return launch.LaunchDescription([ server, client, # TODO(wjwwood): replace this with a `required=True|False` option on ExecuteProcess(). # Shutdown launch when client exits. launch.actions.RegisterEventHandler( event_handler=launch.event_handlers.OnProcessExit( target_action=client, on_exit=[launch.actions.EmitEvent(event=launch.events.Shutdown())], )), ])
ドキュメント
こちらの launch ドキュメントには、launch_ros
でも使用されている概念の詳細が記載されています。
機能の追加の文書化/サンプルは近日公開予定です。それまでは、ソースコードを参照してください。