EnsekiTT Blog

EnsekiTTが書くブログです。

【7Days自由研究】Visual SLAMとROSを使えるようになる話 Day-1

つまりなにするの?

単眼カメラを使ったVisualSLAMの技術をいろいろ試して、ロボットについて知見を得よう。と思った夏休み。
f:id:ensekitt:20170814165141p:plain

7Days自由研究とは?

7回構成でいままで触ったことのない技術に触れて自分のできることを増やして見ようと思った。
なので、ここで書いた内容は初見で試行錯誤したエンジニアのメモであり、エキスパートによるベストプラクティスで構成されているわけではないことに注意が必要。

サクセスクライテリア

  • ミニマムサクセス:

バーチャルマシン上でVisualSLAMのサンプルを動かしてみる

  • フルサクセス:

Webカメラの動画を使ってリアルタイムにVisualSLAMによる位置姿勢表示を試してみる

  • エクストラサクセス:

精度はどうあれ、お外を歩き回って位置・姿勢がログに残るようにする

続きを読む

ESP-WROOM-32を使ってHello worldした話

つまりなにしたの?

ESP-WROOM-32の開発環境を構築してHello worldのコードを実行してその結果を標準出力から確認した。

ESP-WROOM-32ってなんぞ

ESP-WROOM-32はWifiとかBluetoothが乗ったリッチな基板で、計算リソースも結構ある。
f:id:ensekitt:20170522230022p:plain

用意したもの

akizukidenshi.com

  • USBマイクロBケーブル
  • (USB Type-Cから普通のUSBに変換するアダプタ)

環境の用意

公式セットアップドキュメント
Get Started — ESP-IDF Programming Guide audio-weekly-170503-47-g55fb4c5 documentation
ほぼこれに従っている。

続きを読む

Pythonで受信したデータを複数プロセスに分配してみた話

Pythonで受信したデータを複数プロセスに分配してみた話

つまりなにしたの?

TCPで受信したデータを複数プロセスに分配してそれぞれで処理をする

Python3.6を対象にやってみた
https://docs.python.jp/3/library/multiprocessing.html

用意したもの

manage.py : プロセスの起動を行う
tcp_recv.py : TCPの受信用(サーバとして動作する)
process.py : TCPの内容が分配されて、この中で処理が実行される
tcp_send.py : TCPの送信用(クライアントとして動作する)
github.com
↑ぜんぶはこちら

続きを読む

DeepLearning界のHerokuと名高いFloydと遊んでみた話

つまりなにしたの?

Floyd Zero Setup Deep LearningというDeepLearningのサービスで自前のデータを使って学習できるようにした。

最初にやること

FloydにSignupする→メール認証まで通す
Floyd Zero Setup Deep Learning

環境を用意する

pyenv virtualenvでFloyd用の場所を作っておく。(ココは必須ではない)

pyenv install 3.5.2
pyenv virtualenv 3.5.2 floyd
mkdir floyd_env
cd floyd_env
pyenv local floyd

Floyd-cliをインストールする

$ pip install floyd-cli

Floyd loginすると

$ floyd login
Authentication token page will now open in your browser. Continue? [Y/n]:
Please paste the token here:
Login Successful

Floydが用意してくれた例で遊ぶ

f:id:ensekitt:20170509214438p:plain
動作確認できました。でも実行されたコードを良く見てみると、TensorFlowがよしなに揃えたデータセットだった。
データセットは手元にあるんだ!これをどうにかしたい!ってときのためにチュートリアルがこの記事の真の目的

続きを読む

GWにポモドーロテクニックを実践してみたらまるで生産性がなかった話

どうだったのか?

8時間働いても集中してる生産時間は3時間もないってことに気づいて本当に危機感を持った。

f:id:ensekitt:20170509080833j:plain*1

続きを読む

GWでノージョブ時間が長かったので、Heroku上のWebアプリからCeleryにジョブキューを投げた話

つまりなにしたの?

HerokuにホスティングしたFlaskウェブアプリから
Herokuに同じくホスティングしているCeleryにジョブキューを発行した。

(2dyno構成が必要になるので立ち上げっぱなしにするとHerokuの無料枠を半月で使い切るので注意)

できたもの

github.com
ここのHerokuボタンから実行できますが、2つ目のDynoは起動されないのでManageAppから立ち上げて上げる必要があります。
f:id:ensekitt:20170507141821p:plain

たまに動いているやつ。
JobQueue
(ログを見ないとキューが処理されていることが確認できない残念仕様)

続きを読む

PythonからCeleryにジョブをキューに突っ込んで実行した話

つまりなにしたの?

Pythonコマンドラインからジョブキューを発行した。
そして、これらをHerokuで動かす(よていやりました*1

環境:

Celery

Celeryは、分散されたメッセージ受け渡しよる非同期タスクキュー/ジョブキューで、リアルタイム操作に向けだけど、スケジューリングにも対応している便利なやつです。
僕は機械学習の学習フェーズなどの時間のかかるタスクを順番に実行したい場合に使っています。Cronでもいいけど、定期的に発行すると一定期間以上学習に時間がかかることがあると破綻するためです。
また、キュー方式だと溜まっているタスクを把握しやすいことも嬉しいことの一つです。

Flask

FlaskはPythonで記述されたマイクロフレームワークです。簡単なウェブアプリならさくっと作れます。(先日までTornadoを使ってましたがドキュメントのわかりやすさでFlaskに移り住みました。)

Heroku

Herokuはsalesforceの提供するPaaS(Platform as a Service)です。ほぼUbuntuのOSにRuby on railsをサポートするものでしたが、最近はいろんなプログラミング言語(今回はPython)を使うことができるようになっています。また、データベースもPostgreSQLにかぎらずRedisも使えます。今回はそんなPythonとRedisを活用します。

環境を整える。

Redisをインストールする
brew install redis
Celeryをインストールする

(virtualenv環境を用意することを推奨します)

pip install celery 
Flaskをインストールする

(virtualenv環境を用意することを推奨します)

pip install flask
ワーカーのコードを書く
from celery import Celery
import time
app = Celery('tasks', broker='redis://localhost:6379/0')

@app.task
def task(message):
    time.sleep(10) #時間のかかるタスクのフリをする
    return "Hello {0}".format(message) 

動かしてみる

Redisを起動する
redis-server /usr/local/etc/redis.conf
ワーカーを起動する
celery -A job worker --loglevel=info
キューを渡す
% python
Python 3.5.2 (default, Feb  4 2017, 18:33:41)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from jobqueue import task
>>> task.delay("World.")
ワーカーを起動したコンソールでは
[2017-05-05 16:47:03,008: INFO/MainProcess] Received task: jobqueue.task[84a31de4-a00a-46b5-87e7-a631518f212d]
[2017-05-05 16:47:03,011: INFO/PoolWorker-4] Task jobqueue.task[84a31de4-a00a-46b5-87e7-a631518f212d] succeeded in 0.0006478669820353389s: 'Hello World.'

こんなんが表示されることが確認できる。

次回はHerokuで動かしてみます。