今回はJetsonNanoでROSを自動起動する方法について説明していきます。
JetsonNanoにROSを入れ、例えばロボットを動かすときなどに毎回ターミナルでROSを起動するのは面倒かと思います。
そこで今回はJetsonNanoの電源を入れたらROSも自動で起動する方法を説明していきます。
ROSCOREのサービスを登録する
まずは必要なものをインストールします。
1 |
sudo apt install screen |
次にホームディレクトリで「.bash_profile」を作成して開きます。
1 |
sudo nano .bash_profile |
「.bash_profile」が開いたら以下の内容を書き込んで保存します。「.bashrc」は、端末でログインしたときに読み込まれるbashの設定ファイルです。自動起動するときには読み込まれないので「.bash_profile」が読み込まれたら「.bashrc」も読み込まれるようにします。
「setup.bash」はROSのワークスペースを作成したときにできるファイルです。こちらは自分の環境に合わせてパスを変更する必要があります。
1 2 |
source ${HOME}/.bashrc source ${HOME}/workspace/catkin_ws/devel/setup.bash |
つぎに「systemd」のサービスを追加していきます。今回はこちらの機能を利用してROSを起動していきます。以下を実行して「roscore.service」ファイルを作成して開きます。
1 |
sudo nano /etc/systemd/system/roscore.service |
ファイルには以下の内容を書き込みます。今回はネットワークを利用しないので一部コメントアウトしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[Unit] Description=ROSCORE launcher #After=networking.service #Requires=networking.service [Service] User=jetbot ExecStart=/usr/bin/screen -S roscore -ADm bash -l -c 'roscore' Type=simple Restart=always RestartSec=1s [Install] WantedBy=multi-user.target |
保存して閉じます。次にこのサービスを有効にしておきます。まずはデーモンをリロードしておきます。
1 |
sudo systemctl daemon-reload |
次にROSCOREサービスを有効にしておきます。
1 |
sudo systemctl enable roscore |
サービスを開始します。
1 |
sudo systemctl start roscore |
これでROSCOREが起動します。少々待ってからステータスを確認します。
1 |
sudo systemctl status roscore |
active(running)と表示されていたらroscoreがちゃんと起動しています。これでJetsonNanoを再起動したときにroscoreも起動するようになります。
ROSのlaunchファイルを用意する
次にROSのlaunchファイルのほうも自動で実行されるようにしていきます。まずはROSで実行するlaunchファイルを事前に用意しておきます。
launchファイルを作成する方法についてはこちらの記事が参考になります。
launchファイルをサービスとして登録する
launchファイルが用意できたらサービスとして登録していきます。今回は「rover.service」という名前のファイルを用意して登録します。
1 |
sudo nano /etc/systemd/system/rover.service |
ファイルが開いたら以下の内容を書き込みます。こちらはroscoreが起動してから実行してほしいので「After=roscore.service」と「Requires=roscore.service」を定義しておきます。
また今回は「jetbot_ros」がパッケージ名、「roslaunch jetbot_ros rover.launch」がlaunchファイルを実行するときのコマンドとなっていますので、こちらは実行したいlaunchファイルに合わせて変更する必要があります。編集が完了したら保存します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[Unit] Description=rover launcher After=roscore.service Requires=roscore.service [Service] User=jetbot #ExecStartPre=/bin/bash -l -c 'rostopc list' ExecStart=/usr/bin/screen -S jetbot_ros -ADm bash -l -c 'roslaunch jetbot_ros rover.launch' Type=simple Restart=always RestartSec=1s [Install] WantedBy=multi-user.target |
サービスを追加したらデーモンを再起動します。
1 |
sudo systemctl daemon-reload |
サービスを有効にします。
1 |
sudo systemctl enable rover |
サービスを開始します。
1 |
sudo systemctl start rover |
多少待ったらステータスを確認します。active(running)になってたらサービスが起動できたことが確認できます。
1 |
sudo systemctl status rover |
これでJetsonNanoを再起動するとroscoreとlaunchファイルが自動で実行されるようになります。
ターミナルは起動しないので、例えばトピックとして登録している場合は以下のコマンドでトピックが表示されているか確認したらいいと思います。
1 |
rostopic list |
サービスを停止、無効にする
上記までのサービスが不要になってきたら以下の手順を実行します。
まず、サービスを停止したいときは以下を実行します。
1 |
sudo systemctl stop rover |
次にサービスを無効にしたいときは以下を実行します。
1 |
sudo systemctl disable rover |
これでサービスが無効になりましたので、いつも通りターミナルからroscoreとlaunchファイルを実行することもできます。
参考記事
今回はこちらの記事を参考にさせていただきました。ありがとうございます。
以上、今回は「JetsonNanoでROSを自動起動する方法」について説明させていただきました。
コメントを残す