Raspberry Pi 2でロボット製作(環境設定編)

ロボットの環境設定

 以下の記事の続きです。

 基本は以下の参考書と作者の補足ブログに全部書いてありますが、一部はまったところなどを中心に記載していきます。

 また、以下のRaspberry Pi2の基本的な設定は完了している前提ですので、まずは下記の記事の通り基本的なセットアップは完了してからでお願いいたします。以降の記事はWheezyというバージョンをインストールした前提で記載されているので注意下さい。

WebIOPiインストール

 最新のバージョン(0.7.1)がRaspberry Pi 2に対応していないらしいです。作者のブログに補足として対応方法が記載されていました。こういう作者のアフターケアが素晴らしいです。
http://raspibb.blogspot.jp/2014/11/blog-post.html

 まずは普通にWebIOPiをインストールします。作者の本には、ファイルのダウンロードをRaspberry Piで行えと書いてありますが、別に普通のPCでよいです。以下のサイトで最新版(0.7.1)をダウンロードします。

WebIOPi - Browse Files at SourceForge.net

 ダウンロードしたファイル(WebIOPi-0.7.1.tar.gz)をRaspberry Piにファイルを転送します(SFTP等で)。その後、ファイルをraspberry pi上で以下のコマンドで解凍してやりましょう。

$ tar xvzf WebIOPi-0.7.1.tar.gz

 次にパッチを当てます。同じフォルダで以下の要領でパッチを当てれば良いようです。

$ wget https://dl.dropboxusercontent.com/u/69652790/bb/WebIOPi-0.7.1.patched.tgz
$ tar zxf WebIOPi-0.7.1.patched.tgz
$ cd WebIOPi-0.7.1/
$ sudo ./setup.sh

 知らずに普通にインストールしちゃったーという人も、もう一回パッチを当てて setup.shを走らせれば正しくインストールされるようです。パッチといっても2行くらい書き換えるだけみたいなので、ネットで調べて手動でやってもよいかもしれません。お好きな方で。

 後は以下でWebIOPiのコンテンツディレクトリに一般ユーザ(以下はデフォルトのpiの例)が書き込めるように権限を設定してやります

$ sudo chown -R pi /usr/share/webiopi/htdocs

 以下のコマンドでパスワードの設定もお忘れなく

$ sudo webiopi-passwd

 ここまでできたら起動して動作確認しましょう。起動は以下。

$ sudo /etc/init.d/webiopi start

 動作確認のため、Raspberry PiのWebIOPiにアクセスします。例えば IPアドレスが192.168.0.1だった場合は、ブラウザでhttp://192.168.0.1:8000/にアクセス。設定したユーザー名とパスワードを入力するとWebIOPiの画面が表示されます。
 一通り動作確認ができたら以下を実行して自動起動するようにしましょう

$ sudo update-rc.d webiopi defaults

WiringPiとWiringPi2-Pythonのインストール

 Raspberry Piは精度の高いPWMを1ポートだけ使えるのですが、その制御に必要なライブラリがWiringPi及びWiringPi2-Pythonらしいです。作者のブログに記載あるのですが、WibIOPiがpython3で動く関係でWiringPi2もその対応の必要があります。ただ、python3対応はWebIOPiのインストールが終わってないとエラーが出るらしいので、WebIOPiインストールしてからWiringPiとWiringPi2-Pythonをまとめてインストールするのがよいでしょう。

 以下でWiringPiのインストール

$ git clone git://git.drogon.net/wiringPi
$ cd WiringPi
$ ./build

 次にWiringPi2-Pythonのインストール

$ cd
$ sudo apt-get update
$ sudo apt-get install python-dev python-setuptools
$ git clone https://github.com/Gadgetoid/WiringPi2-Python.git
$ cd WiringPi2-Python
$ sudo python setup.py install
$ sudo python3 setup.py install

 最後の行がpython3対応らしいです。

Webiopiのスクリプト修正

 本の通りに/etc/webiopi/config[script]を書き換えたら何故か起動しませんでした。スクリプト単体で起動したら、日本語の行でつまづいているっぽいので、スクリプトの文頭に日本語が大丈夫になるおまじないを追記したら起動するようになりました。以下を一行目に追記してください

# -*- coding: utf-8 -*-

ツイートさせる

 この記事を参考にtwというツイッタークライアントを入れることで、とりあえずRaspberry Piからツイートさせることはできました。偉大なる先人に感謝。


シャットダウンボタン追加

 本の通り/etc/init.d/rc.localにスクリプト置くのも楽なのですが、正しいLinuxの作法に則り以下にしました。


動画ストリーミング

 ロボットのカメラ映像をWiFi経由で飛ばすために、ロボットが動画をストリーミングする設定をします。まずは、本の通り以下のコマンド実行してmjpg streamerをダウンロードします

$ sudo apt-get update
$ sudo apt-get install libjpeg62-dev cmake
$ git clone https://github.com/jacksonliam/mjpg-streamer.git mjpg-streamer
$ cd mjpg-streamer/mjpg-streamer-experimental
$ make
$ cd ..
$ sudo mv mjpg-streamer-experimental /opt/mjpg-streamer

 アンインストールは以下とのこと

$ sudo rm -r /opt/mjpg-streamer

 あとはこのmjpg-streamerを実行するプログラムを用意します。これも親切な本の作者さんが用意してくださっています。作者のブログからダウンロードできる10-02-stream.shというスクリウプトです。スクリプトの中身は以下のような感じです。

#!/bin/bash

if pgrep mjpg_streamer > /dev/null
then
  echo "mjpg_streamer already running"
else
  LD_LIBRARY_PATH=/opt/mjpg-streamer/ /opt/mjpg-streamer/mjpg_streamer -i "input_raspicam.so -fps 15 -q 50 -x 640 -y 480" -o "output_http.so -p 9000 -w /opt/mjpg-streamer/www" > /dev/null 2>&1&
  echo "mjpg_streamer started"
fi

 これもシャットダウンスクリプトと同じ要領で自動起動してやります。具体的には以下ね。

$ sudo cp 10-02-stream.sh /usr/local/bin/stream.sh
$ sudo chmod 755 /usr/local/bin/stream.sh

コピーして、実行権限を与えています

 次に自動起動用のスクリプト作成。

$ sudo vi /etc/init.d/stream

 /etc/init.d/stremの中身は以下のような感じ。コピペして下さい。例外処理とかは全然考えていませんが、自分しか使わないからよいかなという適当な感じです。

### BEGIN INIT INFO
# Provides: stream
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start Stream at boot time
# Description: Start Stream at boot time
### END INIT INFO
#! /bin/sh
# /etc/init.d/stream
DAEMON=/usr/local/bin/stream.sh
NAME=mjpg_streamer
case "$1" in
  start)
        echo -n "Starting mjpg_streamer"
        $DAEMON
        ;;
  stop)
        echo -n "Stopping mjpg_streamer"
        killall $NAME
        ;;
esac
exit 0

 次に実行権限を与えましょう

$ sudo chmod 755 /etc/init.d/stream

以下のコマンドでstream.shがちゃんと起動と終了すること確認。

$ sudo /etc/init.d/stream start
$ sudo /etc/init.d/stream stop

 あとは、以下のコマンドでstream.shが自動起動するようになります。

$ sudo update-rc.d stream defaults

 再起動して$ ps aux | grep streamでそれっぽいプロセスが動いていたら成功。

 スクリプトは以下のサイトを参考にしました。感謝。
init.d スクリプトを書こう

インターネット経由でロボット操作

 本だと、基本ローカルなネットワーク内で操作することのみ紹介していますが。インターネット経由でも操作することができます。やり方記載しますが、ちゃんと設定しないと家庭のネットワークのセキュリティホールになったり、悪意のある人にRaspberry Piをのっとられたりしてしまうのでちゃんと運用するのであればセキュリティの知識は身につけてから実践しましょう。

 といっても、やることはルータWebIOPiで使用しているポート 8000とmjpg-streamerで使用しているポート 9000を解放するだけです。ルータによって設定の仕方は違いますが、例えば以下のような感じです。

 IPアドレスは raspberry piでifconfigコマンド実行して確認してください。毎回確認するのも面倒くさいので、raspberry piのipアドレス固定してもよいかもしれませんね。あとはルータのステータス画面で、グローバルなipアドレスを確認してipアドレス直打ちでRaspberry Piにアクセスしてあげましょう。グローバルなipが100.200.300.400だったら、ブラウザで100.200.300.400:8000にアクセスすればOKです。

 グローバルIPがもらえない環境やセキュリティ上ルータのポート解放したくない場合だと、Weavedというサービスを使って比較的セキュアにWeavedのサーバー経由でRaspberry Pi 2にアクセスことができます(トンネルを掘るような感じかな?)。試しにWeaved経由でやってみたのですが、ポートの関係でカメラ画像は表示することができませんでした。多分うまいやり方あると思うのですが、私にはわかりませんでした。

次回予告

 次はいよいよロボットのアプリ。

 公開しました(2015/10/24追記)