最近はDockerコンテナでサーバアプリケーションを動かしたりしていますが、ロボットのアプリケーションにも適用できるんじゃないかと思ってやってみたら意外に便利でしたので、事例を紹介します。
Dockerについて
そもそもロボットは、音声認識やROSなどLinux上で複数のソフトウェアを統合したりソースコードを引っ張ってこないといけなかったりと、環境構築、ローカル環境との同期がことさらめんどくさいです。
そこで、Linuxコンテナ(LXC)を活用するためのツールであるDockerを使うことで、コンテナ内部で動かすアプリケーション環境の管理が簡単になります。
Dockerを使うメリットとしては
- よくあるインストール手順書とかは必要なく、同じ構成の環境を一発でどこでも構築可能
- 構成が大きく変わるロボット内のソフトウェア・アップデートも簡単にできる
一方、デメリットは
- RaspberryPiなどのARM系のチップではDockerを動かすのは厳しい
- コンテナなので、性能はちょっと落ちる(?)
という感じでしょうか。
Dockerではイメージの構成をDockerfileというインストールコマンドが書かれたbashスクリプトのようなもので記述します。
また、複数のサーバを内部で動かす場合は、Docker Composeで構成を管理することができます。
Dockerの環境を構築する場合は、Docker Machineを利用するか、ローカル環境の場合はDocker Toolboxを利用すると、Dockerの環境構築が楽にできます。
Dockerにはdeviceパラメータ、Docker Composeにはdevicesというコンフィグレーションがあり、USBデバイスやサウンドデバイスをホストからコンテナにマッピングすることができます。しかし、1コンテナしかそのデバイスを使うことができないので、複数コンテナで運用する場合はどのコンテナでデバイスを触るかをちゃんと計画しないといけません。
試しにロボット聴覚HARKをDockerで動かす
HARKという、音声認識や音源定位、音源分離などを行えるオープンソースなソフトウェアがあります。私も触り始めたところなのですが、まずインストールが面倒なのでDocker化してしまいましょう。
https://github.com/SociableThings/docker-lumiere に、以下で紹介しているDockerfileの他に、起動スクリプトなど実際に動作する状態で置いています。
ロボット上でDockerなどをインストールしてから、Docker ComposeでDockerコンテナを立ち上げます。
まずはHARKのコンテナを定義する Dockerfile
から。HARK Installation Instructionsを参考にして書いていきます。
FROM ubuntu:14.04
ENV HOME /root
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && apt-get install -yq --no-install-recommends wget software-properties-common
# Add HARK repository
RUN echo "deb http://winnie.kuis.kyoto-u.ac.jp/HARK/harkrepos trusty non-free\ndeb-src http://winnie.kuis.kyoto-u.ac.jp/HARK/harkrepos trusty non-free" > \
/etc/apt/sources.list.d/hark.list
RUN wget -q -O - http://winnie.kuis.kyoto-u.ac.jp/HARK/harkrepos/public.gpg | sudo apt-key add -
RUN add-apt-repository ppa:chris-lea/node.js
RUN apt-get update
RUN apt-get install -yq --no-install-recommends supervisor
RUN apt-get install -yq --no-install-recommends vim-tiny alsa-utils
RUN apt-get install -yq --no-install-recommends xfce4 xfce4-goodies
RUN apt-get install -yq --no-install-recommends x11vnc xvfb
RUN apt-get install -yq nodejs harkfd hark-binaural hark-designer julius-4.2.3-hark-plugin harktool4
RUN apt-get autoclean \
&& apt-get autoremove \
&& rm -rf /var/lib/apt/lists/*
# Change hark setting
#RUN sed -i 's/sudo\ forever\ start\ app\.js/sudo\ forever\ start\ app\.js\ allowremote/g' /usr/bin/hark_designer
RUN cd /usr/bin/hark-designer && npm install
WORKDIR /usr/share/hark-designer/userdata/networks
ADD scripts/startup.sh /root/startup.sh
ADD config/supervisord.conf /root/supervisord.conf
ADD config/.vimrc /root/.vimrc
ADD config/julius /root/julius
EXPOSE 5900
EXPOSE 3000
VOLUME /usr/share/hark-designer/userdata/networks
ENTRYPOINT ["bash", "/root/startup.sh"]
HARK本体とHARK Designer、音声認識用のJulius、X-Windowのxfceを入れてます。(本当はJuliusなどを別コンテナにしたら良いんだと思うんですが、今回は1つのイメージにまとめます)
そして、このDockerfileをビルドしたりdevicesのマッピングを定義したdocker-compose.yml
は以下となります。
hark:
build: .
ports:
- "5900:5900"
- "3000:3000"
volumes:
- networks:/usr/share/hark-designer/userdata/networks
devices:
- "/dev/snd:/dev/snd"
サウンドデバイスをそのままHARKのコンテナにマッピングしています。
最後に、コンテナを立ち上げます。
$ docker-compose build
$ docker-compose up
HARKはHARK DesignerというHARKの構成をブラウザ上で記述することができるようになっています。
さきほどのコンテナのポート3000番にアクセスすると、そのHARK Desginerが立ち上がります。ローカルのPCからアクセスしてみましょう。
$ open http://{RobotのIP}:3000
開いた!やった!
Dockerだとロボットのソフトウェアのデプロイも簡単にできてすごく良いですね!