Pepper ニコニコ超会議 参加作品選抜ハッカソンに参加した時のメモ。
「目の前にいる人にPepperの動きに合わせて面白い動きをしてもらって、その様子をPepperのカメラで動画に撮影する」というアプリをつくっているチームに参加させてもらいました。
自分は動画アップロードサーバーの開発と、Pepper⇔サーバー間のHTTP通信部分を担当しました。外部ライブラリのimport方法がわからなくてちょっと時間をくったので、最終的に動いたやり方を書いておきます。
PepperもPythonもほぼ素人なので、ツッコミもらえるとありがたいです。
Pepperにやらせたかったこと
ローカルPCに起動しているRailsで作った動画アップロードサーバーに、撮影した動画ファイルをマルチパートアップロードしたかっただけです。curlのコマンドなら
curl -F 'item[video]=@/SOMEDIR/FILE.avi' http://localhost:3000/api/items.json
です。
ライブラリを使いたい
urllib2というPythonのライブラリはPepperで使えるらしいのですが、もっと簡単に使えるライブラリがいい。。ググるとPythonでHTTP通信をするのは、Requestsが定番みたいなのでこれを使うことにしました。
> pip install requests
> python
Python 2.7.9 (default, Dec 19 2014, 06:00:59)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.56)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> r = requests.get('https://api.github.com/repos/vmg/redcarpet/issues?state=closed')
>>> print r
<Response [200]>
>>>
使い勝手よさそうです。
Pepperボックス内での利用方法
を参考にしました。import
の前にPATHに追加すればいいみたいです。プロジェクト全体でimport
出来て欲しいんですが、こういうものなんでしょうか...。
ライブラリの配置
Bundlerやnpmのようにプロジェクトで使うパッケージやモジュールを管理する方法がよくわからず、今回は単純にプロジェクト内にディレクトリを作ってコピーしました。。
(mac環境下でpipでインストールしたライブラリは/usr/local/lib/python2.7/site-packages/
にありました)
> cd PEPPER_PROJECT_ROOT
> mkdir lib
> cp -r /usr/local/lib/python2.7/site-packages/requests ./lib/
Choregrapheを開くと
と聞かれるので、「全てにはい(A)」を選びます。
ライブラリのimport
スニペット的にはこんな感じらしいです。
import sys, os
# ライブラリまでのパスを取得
self.folderName = os.path.join(
self.framemanager.getBehaviorPath(self.behaviorId), "../lib")
# パスを追加
if self.folderName not in sys.path:
sys.path.append(self.folderName)
# 読み込み
import requests
ファイルのアップロード
Pepperアプリで撮影した動画ファイル(out.avi)が***html/に保存されているとして、それをhttp://127.0.0.1:3000***に起動しているサーバーにPOSTするコードはこんな感じになりました。[RequestsのQuickstart](http://docs.python-requests.org/en/latest/user/quickstart/#post-a-multipart-encoded-file)のサンプルコードそのままです。
※余談ですが、RailsのWEBrickは
bin/rails s -b 0.0.0.0
と***-b***オプションをつければ、IPアドレスでアクセスできるようになります。
def onInput_onStart(self, p):
import sys, os
# ライブラリまでのパスを取得
self.folderName = os.path.join(
self.framemanager.getBehaviorPath(self.behaviorId), "../lib")
# パスを追加
if self.folderName not in sys.path:
sys.path.append(self.folderName)
# 読み込み
import requests
url = 'http://127.0.0.1:3000/api/items.json'
fileName = os.path.join(
self.framemanager.getBehaviorPath(self.behaviorId), "../html/out.avi")
f = { 'item[video]': open(fileName, 'rb') }
req = requests.post(url, files = f)
jsonData = req.json()
self.log(json.dumps(jsonData, indent = 4));
Pythonカスタムボックスを作成して、上記コードを動かすと
[INFO ] behavior.box :log:287 _Behavior__lastUploadedChoregrapheBehaviorbehavior_1140386960576864__root__videoUpload_1: {
"item": {
"video": "http://localhost:3000/uploads/ce255e08-43c3-4911-be26-b93e2d591528.mp4"
}
}
こんな感じのログが出力され、動作が確認できました。