14
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Dockerを用いてRaspberryPi3上でROSを使ってみる

Posted at

はじめに

Dockerの勉強がしたかったので、ラズパイでDockerとROSを使ってみることにしました。ラズパイにROSをインストールする方法としては、Raspbian Jessie を使う方法や、ubuntu MATE を使う方法がありますが、ここではRaspbian StretchとDockerを使います。

環境構築

Raspbian Stretchのインストール

Installing operating system images を参考に、SDカードにRaspbianをインストールします。

  1. Raspbian Stretch with desktopをダウンロードします。RaspberryPi公式 からダウンロードするとかなり時間がかかりますが、JAISTのミラー からダウンロードすると早く終わります。(参考)
  2. ダウンロードしたzipファイルを解凍してSDカードに書き込みます。

Dockerのインストール

ラズパイを起動し、Get Docker CE for Debian にしたがってDocker CEをインストールします。(CEはCommunity Editionで無償版です。)

  1. 通常はリポジトリからインストールするそうですが、Raspbianにはまだ対応していないのでcurlでインストールスクリプトを持ってきてインストールするそうです。

    $ curl -fsSL https://get.docker.com -o get-docker.sh
    $ sudo sh get-docker.sh
    
  2. インストールが終わったら、sudoなしでdockerを使用できるように、dockerグループに現在のユーザを追加します。Raspbianの初期設定時のユーザ名はpiなので、次のコマンドを実行します。(ログアウト/ログイン後にusermodの変更が反映されるので、ここで再起動しておきます。)

    $ sudo usermod -aG docker pi
    $ reboot
    
  3. dockerが正常に動作するか確認するため、Hello Worldを実行します。

    $ docker run hello-world
    

    一瞬、「unable to find image 'hello-world:latest' locally」と表示されますが、ローカルにないDockerイメージからコンテナを作成しようとしたためです。ローカルにないイメージは自動的にダウンロードされます。
    2019-01-20-085056_1824x984_scrot.png
    「Hello from Docker!」が表示されました。

ROSを使ってみる

ROSイメージの利用

Getting started with ROS and Docker を参考にROSを動かしてみます。

  1. docker pullコマンドでDockerイメージを持ってきます。ROSのDockerイメージはDockerHubに登録されています。
    また、イメージ名の後ろにコロンとタグをつけることでROSのディストリビューションなどを指定することができます。今回はKineticを使ってみたいと思います。

    $ docker pull ros:kinetic
    
  2. ダウンロードが終わったら、docker runコマンドでイメージからコンテナを起動します。-itオプションをつけると、起動と同時にコンテナ内に入ります。

    $ docker run -it ros:kinetic
    
  3. コンテナ内で、roscoreコマンドを実行してROSのmasterを起動します。

    roscore
    
  4. 先ほど起動したコンテナの名前を取得します(docker runを実行するとき--nameオプションでコンテナ名を指定しないと適当な名前に設定されるそうです)。新しいターミナルを立ち上げてdocker psコマンドを実行すれば確認できます(-lオプションをつけると最後に起動したコンテナのみを表示します)。

    $ docker ps -l
    

    2019-01-24-213442_655x394_scrot.png
    このコンテナの名前はjolly_wingのようです。

  5. コンテナ名が分かったので、新しいターミナルからコンテナ内に入ります。docker execは指定したコマンドをコンテナ内で実行するコマンドですが、-itオプションをつけてbashを実行することで、コンテナ内に入ることができます。

    $ docker exec -it jolly_wing bash
    
  6. 入った直後にrostopic listを実行しようとすると、"bash: rostopic: command not found"のエラーになるので、先に以下のコマンドでROSの環境をセットアップします(もしくはsource /ros_entrypoint.shでもセットアップできるようです)。

    source /opt/ros/kinetic/setup.bash
    

    こうしてからrostopic listを実行すると、次のようにトピックのリストが表示されます。

    2019-01-24-221430_655x394_scrot.png

  7. コンテナから抜けるには、exitコマンドを実行します。

    exit
    

    ちなみに、docker execした方のターミナルでexitコマンドを実行するとコンテナから出た後もコンテナは動いたままです。一方、docker runでコンテナを起動したターミナルでexitコマンドを実行すると、コンテナも停止します。

  8. docker rmコマンドを使えばコンテナを削除できます。まず、現在のコンテナを確認します。docker psコマンドに-aオプションをつけると停止したコンテナも含めてすべてのコンテナの一覧が表示されます。

    $ docker ps -a
    

    2019-02-03-001153_655x394_scrot.png

    $ docker rm jolly_wing
    

    2019-02-03-002354_655x394_scrot.png

    コンテナが削除されました。

ワークスペースの作成

コンテナ内にROSのワークスペース(catkin_ws)を作り自作のROSパッケージを置きたいところですが、Dockerfile のベストプラクティスによるとコンテナはいつでも廃棄できるようにするべきらしく、ソースコードなどはコンテナ内に置かないようです。

Best practices for getting code into a containerを読む限り、外部のソースコードをコンテナ内に取り込む方法はいくつかあるようですが、とりあえずdocker runを実行する際に-vオプションを使うことで、ホスト側のディレクトリをコンテナと共有できるそうです。

Docker HubのDeployment suggestionsにも、-vオプションを使ってROSのログファイルをホスト側に残す方法が記載されていますので、これを参考にホスト側とコンテナ側で共有するワークスペースを作成します。

  1. ホスト側で~/.rosディレクトリと~/catkin_ws/srcディレクトリを作ります。

    $ mkdir ~/.ros
    $ mkdir -p ~/catkin_ws/src
    
  2. 次のコマンドでコンテナを起動します。-vの後に続く/home/pi/catkin_ws/がホスト側、:の後に続く/root/catkin_ws/```がコンテナ側のワークスペースのディレクトリです。

    $ docker run -it -v "/home/pi/.ros/:/root/.ros/" -v "/home/pi/catkin_ws/:/root/catkin_ws/" ros:kinetic
    
  3. コンテナの中に入ったら、Creating a ROS Packageを参考にチュートリアル用のROSパッケージを作ります。

    cd ~/catkin_ws/src
    catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
    

    2019-02-03-005537_655x394_scrot.png

  4. パッケージを作成できたので、catkin_makeでワークスペースをビルドします。

    cd ~/catkin_ws
    catkin_make
    

    ビルドが終わるとbuildディレクトリが生成されます。
    2019-02-03-004948_655x394_scrot.png

  5. コンテナから抜けて、ホスト側のワークスペースにもROSパッケージとbuildディレクトリが追加されているか確認します。

    2019-02-03-005548_655x394_scrot.png

    これで、ホスト側のワークスペースにソースファイルを追加して編集すれば、再度docker runを実行したときに、それをコンテナに取り込むことができます。

おわりに

なんとかラズパイとDockerでROSが動くようにできました。少し手間がかかりますが、DockerfileからDockerイメージを作れるようになればいろいろ便利になりそうです。

14
11
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?