Show EOL distros: 

ros_control: control_toolbox | controller_interface | controller_manager | controller_manager_msgs | controller_manager_tests | hardware_interface | joint_limits_interface | realtime_tools | transmission_interface

Package Summary

The controller manager.

ros_control: combined_robot_hw | combined_robot_hw_tests | controller_interface | controller_manager | controller_manager_msgs | controller_manager_tests | hardware_interface | joint_limits_interface | realtime_tools | transmission_interface

Package Summary

The controller manager.

ros_control: combined_robot_hw | controller_interface | controller_manager | controller_manager_msgs | hardware_interface | joint_limits_interface | realtime_tools | transmission_interface

Package Summary

The controller manager.

ros_control: combined_robot_hw | controller_interface | controller_manager | controller_manager_msgs | hardware_interface | joint_limits_interface | realtime_tools | transmission_interface

Package Summary

The controller manager.

controller_manager は、 hardware_interface::RobotHW インスタンス(hardware_interface パッケージ参照)によって表されるロボットメカニズムを制御するためのhard-realtime互換性があるループを提供します。controller_manager はコントローラーをロード、アンロード、起動、停止を行うためのインフラストラクチャを提供します。

コントローラをロードする際、controller_manager はそれぞれのコントローラー固有のパラメータに対するルートとして、コントローラーネームを使用します。パラメータに関して、type がどのプラグインをロードするかを特定することが特に重要です。

コントローラーのライフサイクル

非リアルタイム操作(Non real-time operations)

  • ロード(load)
  • アンロード(unload)

リアルタイム操作(Real-time safe operations)

  • 起動(start)
  • 停止(stop)

controller state.png

コントローラーマネージャーは、コントローラーと対話するためのインフラストラクチャを提供します。コントローラーをlaunch ファイルから実行するか、コマンドラインから実行するか、ROSノードから実行するかによって、コントローラーマネージャーは異なるツールを提供します。

コマンドラインからの実行

controller_manager

controller_manager スクリプトを使って、コマンドラインから controller_manager とやりとりすることができます。特定のコントローラーとやりとりするには以下のように実行します。複数コントローラーを指定することが可能です。

 $ rosrun controller_manager controller_manager <command> <controller_name1> <controller_name2> ...

次のコマンドが利用可能です:

  • load: コントローラーの構築&ロード、プラグインの初期化、要件のチェック

  • unload: コントローラーの解体&アンロード

  • start: コントローラーの起動、リソースのコンフリクト処理

  • stop: コントローラーの停止

  • spawn: load & start

  • kill: stop & unload

コントローラーの状態を得るには:

 $ rosrun controller_manager controller_manager <command>

次のコマンドが利用可能です:

  • list: すべてのコントローラーを実行順にリストアップし、各コントローラの状態を表示します。

  • list-types: コントローラーマネージャが把握している type を全て表示します。コントローラーがこのリストにない場合、それをスポーンすることはできません。

  • reload-libraries: プラグインとして利用可能なコントローラーライブラリを全てロードし直します。コントローラーを開発しているときに、毎回ロボットを再起動せずに新しいコントローラーのコードのテストができるので便利です。ただし、すでに動作していたコントローラーはいずれも kill されます。

  • reload-libraries --restore: restoreオプションを加えることで、すでに動作していたコントローラーは kill されたあと、後述のloadサービスやswitchサービスが呼ばれて再びもとの状態の戻されます(InitializedはInitializedに、runnigはrunningに等)。参考1, 参考2, 参考3

spawner

先ほどのcontroller_manager スクリプトを使って同様のことができますが、spawner スクリプトも用意されています。 以下のように実行することでコントローラーをロード、起動することができます。(stoppedオプションをつけた場合はロードのみ)

  $ rosrun controller_manager spawner [--stopped] <controller_name1> <controller_name2> ...

(Ctrl-c)でkillすると全てのコントローラーは停止、アンロードされます。プロセスが終了すると自動的にコントローラーもアンロードされるため、launchファイルからの利用ではspawnerスクリプトが用いられます。

unspawner

同様にunspawner スクリプトも用意されています。 以下のように実行することで起動中のコントローラーを停止することができます。(アンロードまではされません)

  $ rosrun controller_manager unspawner <controller_name1> <controller_name2> ...

(Ctrl-c)でkillすると全てのコントローラーは再び起動します。launchファイルから一時的にコントローラーを停止したい場合などに便利です。

controller_group

New in melodic

controller_manager allows developers to switch controllers at run time, but it is not so convenient when you want to switch from a group of controllers to another for some special purposes. The controller_group script makes this easy if such groups are defined in ROS parameter controller_groups. It knows all controllers involved, and then controllers that need to be stopped and started when it switches from one group to another. Therefore, different groups can share some controllers.

An example of controller_groups parameter:

    controller_groups:
      production:
        - prod_controller_1
        - prod_controller_2
      development:
        - devel_controller_1
        - devel_controller_2
        - shared_controller_3
      diagnostics:
        - diag_controller_1
        - diag_controller_2
        - shared_controller_3

To run the controller_group script::

 $ rosrun controller_manager controller_group <command> <args>

The following commands are available:

  • list: list all group definitions found in controller_groups parameter

  • spawn <group>: Load and start all the controllers included in the group named <group>. This is usually used in a ROS launch file

  • switch <group>: Switch to the group named <group>. This means stopping those running controllers that are defined in other groups but not in this group, and starting the controllers defined in this group that are not running.

launch ファイルからの実行

launch ファイルの中からコントローラーを制御する際にcontroller_managerを用いることができますが、launch ファイルが終了してもコントローラーは起動したままになっている可能性があります。launch ファイルが終了した場合にコントローラーがアンロードされた状態になっていることを保証するためにはspawnerを利用すると良いでしょう。launchファイルの実行状態とコントローラーの起動状態が対応するので便利です。

 <launch>
   <node pkg="controller_manager"
         type="spawner"
         args="controller_name1 controller_name2" />
 </launch>

もし、コントローラーを起動せずロードまでにとどめたい場合は以下のようにしてください。

 <launch>
   <node pkg="controller_manager"
         type="spawner"
         args="--stopped controller_name1 controller_name2" />
 </launch>

GUIからの実行

rqt_controller_managerはGUIでコントローラーの状態確認および制御(ロード、アンロード、起動、停止)を可能にするrqt プラグインです。 rqt のプラグインメニューから、またはスタンドアローンの実行可能プログラムとして始められることができます:

rosrun rqt_controller_manager rqt_controller_manager

ROS API

他のROSノードにあるコントローラーと対話するために、コントローラーマネージャーは5つのサービスコールを提供します。

controller_manager

Services

controller_manager/load_controller (controller_manager_msgs/LoadController)
  • the service request contains the name of the controller to load, and the response contains a boolean indicating success or failure.
controller_manager/unload_controller (controller_manager_msgs/UnloadController)
  • the service request contains the name of the controller to unload, and the response contains a boolean indicating success or failure. A controller can only be unloaded when it is in the stopped state.
controller_manager/switch_controller (controller_manager_msgs/SwitchController)
  • the service request contains a list of controller names to start, a list of controller names to stop and an int to indicate the strictness (BEST_EFFORT or STRICT). STRICT means that switching will fail and result in a no-op if anything goes wrong (an invalid controller name, a controller that failed to start, etc. ). BEST_EFFORT means that even when something goes wrong with on controller, the service will still try to start/stop the remaining controllers. The service response contains a boolean indicating success or failure. The list of controllers to stop or start can be an empty list, if you are only stopping or only starting controllers.
controller_manager/list_controllers (controller_manager_msgs/ListControllers)
  • the service returns all the controllers that are currently loaded. The response includes the following information: controller name, state (running or stopped), type, hardware interface and claimed resources.
controller_manager/list_controller_types (controller_manager_msgs/ListControllerTypes)
  • the service returns all the controller types that are known to the controller_manager. Only the controller types that are known can be constructed.
controller_manager/reload_controller_libraries (controller_manager_msgs/ReloadControllerLibraries)
  • the service reloads all the controller libraries that are available as plugins. This is convenient when you are developing a controller, and you want to test your new controller code without restarting the robot every time. This service only works when there are NO controller loaded.

Wiki: ja/controller_manager (last edited 2022-09-14 15:24:22 by Hirotaka Yamada)