RAPIROの視点を楽しむ 〜カメラでいろいろ遊ぶ③〜

しばらく会社の調べものを優先していたので、本業(?)のRAPIRO工作がおろそかになってしまいました。。。ちょっと時間ができたので、久しぶりにRAPIROを触ろうと思います。

と、久々にRAPIROを立ち上げてみたら、Raspberry Piの無線LANがうまく起動しなくなってしまいました。具体的には、

  • Wi-Fi子機を挿したままだと起動が途中でストップする
  • 起動後にWi-Fi子機を挿すと、認識されるし、ブラウザでWebページも見れるが、何故かローカルでpingが通らない

などなど。セルフパワーのUSBハブ経由で動かしているから、電力が不十分ということはないと思うのだけれど。

うごうご調べているうちになぜかpingが通るようになったので、結局理由はうやむやに。ただ、調べているうち面白そうな記事を見つけました。

Raspberry Piに固定IPをふるのではなく、Bonjour(ボンジュール)という仕組みを使って機器発見できるようにすると。確かにこれなら、ちょっとややこしかった(未だに理屈がよくわかっていない)固定IP設定をしなくてよくなります。無線LAN設定がどうしようもなくおかしくなったら、ちょっと試してみようと思います。

 

さてさて、せっかく以前Wiiリモコンで制御できるようにしたので、Wiiリモコンで写真&動画撮影&ライブ配信をできるようにしたいと思います。ようやくRAPIROらしい話になってきました。

結論から言うと、写真&動画撮影はうまいこといきましたが、ライブ配信はうまくいきませんでした。そのあたりについては、以下で詳しく述べます。

この前自分がWiiリモコンにRAPIROのモーションを割り振ったときには、次のように割り振っていました。

  • 十字キー上 … #M1 (Forward)
  • 十字キー下 … #M2 (Back)
  • 十字キー右 … #M4 (Left) // RAPIRO視点で操作するため逆にしている
  • 十字キー左 … #M3 (Right) // RAPIRO視点で操作するため逆にしている
  • Aボタン … #M9 (Rush) // 自分が勝手に定義した動作です
  • Bボタン … #M0 (Stop)
  • −ボタン … #M8 (Red) // 左アピール
  • +ボタン … #M6 (Yellow) // 右アピール
  • ホームボタン … #M5 (Green) // 両手アピール
  • 1ボタン … 未割当
  • 2ボタン … 未割当

1ボタンと2ボタンにそれぞれ写真撮影と動画撮影を割り当てようかと思いましたが、この2つは最初のリモコンの接続時に使用するので、ここに割り当てると、繋がった瞬間に撮影が開始されてしまいます。ということで、現在アピールに使用している部分を主にカメラ用に割り当てることにします。

  • −ボタン … 写真撮影
  • +ボタン … 動画撮影
  • ホームボタン … ライブ配信
  • 1ボタン … #M5 (Green) // 最初にこれが動く分にはとりあえず構わない

0. 基本

写真撮影も動画撮影も全部シェル上のコマンドで実現してきたので、pythonからシェルのコマンドを叩く方法を考えます。pythonからシェルのコマンドを叩く方法は、最新の正しいやり方はsubprocessモジュールを使うやり方らしいのですが、うまくいかなかったので(バージョンの問題?)、ここではシンプルにos.system()を使うことにします。「RAPIROをWiiリモコンで制御する」のときに作成したファイル(仮にrapiro_wii.py)に”import os”を追記します。

from datetime import datetime
import os
import serial

ちなみに”from datetime import datetime”も新しく追記していますが、これは写真や動画を撮影してファイルを保存するときに、タイムスタンプをファイル名にするためです。

1. 写真撮影

−ボタンの部分を次のように書くだけでOKです。

  if (buttons & cwiid.BTN_MINUS):
    print 'Minus Button pressed'
    timeStamp = datetime.now().strftime("%Y%m%d%H%M%S")
    photoCommand = "raspistill -w 640 -h 480 -rot 180 -o Photo/" + timeStamp +".jpg -n -t 10"
    os.system(photoCommand)
    time.sleep(button_delay)

2. 動画撮影

+ボタンの部分を次のように書きます。

  if (buttons & cwiid.BTN_PLUS):
    print 'Plus Button pressed'
    timeStamp = datetime.now().strftime("%Y%m%d%H%M%S")
    videoCommand = "raspivid -w 640 -h 480 -rot 180 -o Video/" + timeStamp + ".h264 -n -t 30000 &"
    os.system(videoCommand)
    time.sleep(button_delay)

mp4に変換するコマンド(”$ MP4Box …”)も一緒に書く場合は、raspividの実行後に、撮影時間の分だけsleepを入れた後に記述すれば、h264ファイルの生成後に一緒にmp4ファイルも生成してくれると思います。ただ、それだとsleepの間はリモコンの操作を受け付けてくれない気がします。未確認です。

ちなみに、+ボタンで動画撮影を開始してからRAPIROを前進させたときの映像が以下です。

ロボに乗り込むときには適切に画像補正してやらないとパイロットはたまったもんじゃないなあ、というのが良くわかります。

3. ライブ配信

前回ライブ配信を開始&停止するスクリプトを書いたので、ホームボタンでフラグの状態を切り換えてどちらかのスクリプトを実行する、というのを書いてみたのですが、これがうまいこと動いてくれません。原因はよくわかっていないのですが、Wi-Fiモジュール+カメラモジュールフル稼働で消費電力がオーバー気味なのだとすれば、それを改善する方法は今の自分ではちょっと思いつきそうにないので(ハード改造については自分はからっきしなので)、とりあえず保留です。

 

というわけで、ライブ配信ができればホントにロボに乗ってるような感じが楽しめておもしろいんじゃないかなーと思っていただけに、ちょっと残念な結果になってしまいました。が、一応動画撮影でそれに近い映像を見ることはできたので、とりあえず良しとします。これ以上のこと(カメラで顔認識とか)に深入りしていくと、カメラの安定動作のためにハード改造とかが必要になりそうな予感が若干するので、カメラを使ってどうこうというのは一旦ここまでにします。今後、他にもカメラにチャレンジする人が増えて、色々情報が出揃ってきたら、また再開したいと思います。