ROSの開発をやっていると、ターミナルでsshでログインしてroslaunch を実行したりして
ノードを立ち上げるケースが多いかと思います。
開発中だったらその都度それでも良いかと思うのですが、いざ試験を実施するときに、
いちいちsshでログインして。。。と立ち上げるノードが複数デバイスにあったり、
ノードを再起動させたい場合プロセスkillしたりなどなどするのはメンドクサイと思っています。
このようなケースで自分が使っているのがdockerコンテナでよく使っている supervisor です。
supervisor を使用することでOS起動時、docker コンテナ起動時にノードを立ち上げたり、
ブラウザから停止・再起動を行うことができます。
環境としては、以下で使用したdocker環境 をベースに説明したいと思います。
supervisorをブラウザから制御する
supervisor をブラウザから制御するには以下を設定する必要があります。
[inet_http_server]
port = 0.0.0.0:9001
username = user
password = 123
コンテナの外からだったり、別PC上から制御するケースを想定して、0.0.0.0 を設定しています。
ブラウザから上記で設定したURL にアクセスすると、ログインのダイアログが表示されますので、
usernameとpassword を入力すると、以下のような画面が表示されます。
今回の例では、supervisorにrosbridge_server を設定しているので、rosbridge_serverのノードの再起動・停止などを
ブラウザ上からコントロールすることができます。
使用しているdocker環境 では、roscore は別コンテナで起動していますが、roscore を別コンテナで事前に立ち上げなくても、通常のroslaunch と同様にroscore が起動していない or
ROS_MASTER_URI が設定されていなければ、roscoreも自動で立ち上がり、ブラウザ上でノードを停止すればroscoreも終了します。
ノードを立ち上げるsupervisorのスクリプトは以下になります。
[program:rosbridge_server]
priority=20
directory=/tmp
command=/usr/local/bin/rosbridge_server
user=root
stopsignal=TERM
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/%(program_name)s.log
stderr_logfile=/var/log/supervisor/%(program_name)s.log
実際にノードを立ち上げるスクリプトは以下になります。
# !/bin/bash
set -e
source /opt/ros/kinetic/setup.bash
exec roslaunch rosbridge_server rosbridge_websocket.launch
起動させるデバイス・ノードが数多くあり、それらをいちいちブラウザ上で操作するのがメンドクサイというレベルになると、
この方法でも辛さがでてくるので、そういったケースになると、次のステップはansible で制御かなーとか思っています。
ここまでお付き合いしていただきありがとうございます。