MoriKen's Journal

MoriKen's Journal

アラサー社会人博士による徒然日記。技術についてつらつら。だけだとコンテンツが貧弱なので、会社公認で大学院博士課程に進学した経緯や、独学でTOEICを475→910にしたノウハウを共有します。最近アメリカ MBA(経営学)大学院もはじめました。

【ROS2】Launch で複数のノードを起動/監視する(公式文書和訳)

Sponsored Link

ROS 2 公式文書(英語) 日本語訳シリーズです。

本ブログの日本語翻訳版のトップページは以下のリンクを参照下さい。

www.moriken254.com

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でも使用されている概念の詳細が記載されています。

機能の追加の文書化/サンプルは近日公開予定です。それまでは、ソースコードを参照してください。

翻訳元文書

index.ros.org

関連記事

www.moriken254.com

www.moriken254.com

www.moriken254.com