RaspberryPiを使って事業部のリアルカンバンを毎日撮る作業を自動化した話

この記事はeureka Advent Calendar 2018 24日目の記事です。


メリークリスマス!!エウレカの自称カイゼンマスター@futaboooです。今日は12/24のクリスマスイブですね。みなさんはいかがお過ごしでしょうか。私は家で1人ケンタッキーのクリスマス向けセットを注文するかどうかずっと悩んでいます。

さて、今回の記事では普段業務のルーチンワークとして行っている事業部のリアルカンバンの状況を写真に撮ってSlackに投稿するという作業を自動化した話をします。

なぜリアルカンバンの状況を写真に撮ってSlackに投稿する作業が必要だったのか

エウレカでは今年の4月からPairs日本版の着手中なプロダクトバックログアイテムの管理にリアルカンバンを使うようになっています。リアルカンバンについてはこれまでの記事も参考にしてください。

リアルカンバンを使った管理に変えた後、自分たちがうまくやれているのか?というのを判断するためのひとつの指標としてリードタイムを使っています。リードタイムとは開発着手からリリースしてユーザーの手元に届くまでの時間と言い換えても差し支えありません。

リードタイムをある一定の値の範囲に抑え続けることで安定した開発ができていると判断することが可能になります。安定した開発ができれば日々のカイゼンを通してさらにリードタイムを短くしていくことも可能です。

しかしカンバンがリアル(物理的)であることがリードタイムを計測する上での最大のボトルネックとなっていました。デジタルであればいつ着手していつリリースしたのかをなんらかのトリガーを設定することで可能になりますが、リアルではそうもいきませんでした。

そこで毎日リアルカンバン前での朝会が終わった後に、いつどの付箋がどこに移動したのかを後々振り返ることができるようにするために写真を撮ってSlackに投稿するようになりました。

繰り返しやる作業を自動化する

やってる作業は単純だし脳みそを使うわけでもないので手動で毎朝やっててもなにか問題があるわけではなかったのですが、やはりめんどくさい気持ちがあったので自動化しました。

現在リアルカンバンの向かい側にはRaspberry Piにカメラモジュールをつけた状態で固定しておいています。下記のような感じです。


自動化した手順を説明していきます。

写真を撮る

Raspberry Pi 3のModel Bを使い、Amazonで買った専用のカメラモジュールをつけています。

https://www.amazon.co.jp/dp/B00FGKYHXA

Raspberry PiにはRaspbianと呼ばれるOSを入れて使っています。細かいインストールの方法などはたくさん公開されている記事が存在しているのでここでは省略します。

Raspbianを使ってCamera撮影を行うには設定で許可する必要があります。

設定画面を表示させます。

$ sudo raspi-config

Interfacing Optinsを選択します。

P1 Cameraを選択肢、Enableにしたあと再起動を行います。

これで下記のコマンドで写真撮影が可能になります。

$ raspistill -o image.jpg

Slackに投稿する

SlackのAPIでfiles.uploadを使用して特定のチャンネルに画像を投稿します。

APIの実行には管理画面からTokenの発行とPermissionの設定が必要になるので事前にやっておきます。 Raspberry Pi上にはさっき撮った画像が保存されているはずなので下記を実行すれば特定のチャンネルに画像の投稿が完了するはずです。

$ curl -F file=@image.png -F "initial_comment=Raspberry Piで撮ったよ" -F channels=[your channel ids] -H "Authorization: Bearer [your access token]" https://slack.com/api/files.upload

[your channel ids]と[your access token]は適宜用意したものに変更してください。

写真を撮ってSlackに投稿するのを定期的に実行する

cronを使います。 設定はこちらの記事を参考におこないました。

実際にはcrontabには下記のように設定することで写真の撮影とSlackへの投稿を順番に行うShellScriptを実行するようにしています。

$ crontab -l
05 02 * * 1-5 sudo sh /home/pi/image-upload.sh

実行しているShellScriptがこちらです。

#!/bin/bash
cd /home/pi
DATE=$(date +“%Y-%m-%d-%H%M”)
raspistill -q 100 -h 1200 -o /home/pi/$DATE.jpg
curl -F file=@$DATE.jpg -F “initial_comment=${DATE}” -F channels=[your channel ids] -H "Authorization: Bearer [your access token]" https://slack.com/api/files.upload
rm /home/pi/$DATE.jpg

これで毎日11:05(JST)にSlackの特定のチャンネルにリアルカンバンの写真が投稿されるようになりました。


今後の課題

自動化したもののいくつか課題があります。

  • カメラの画質が低いことで付箋の内容までは把握できない
  • カメラの位置が悪いことでまれに撮影に失敗する

カメラの画質が低いことで付箋の内容までは把握できない

Raspberry Piにつけているカメラモジュールは2592x1944なので、遠くから撮影した場合に付箋の文字が認識できるほど細かくは撮影できません。 カメラをもっと高画質なものに変更することでこの問題は比較的簡単に解決ができそうです。

もともとはどの付箋が動いたのかさえ分かればよかったのですが、Slackに毎日投稿される画像を見ていたメンバーからリアルカンバンの前に移動しなくても何がどこにあるのか分かるようにしてほしいという要望が上がってきており、確かにできたら便利だなーと感じているので対応したいと思っています。

カメラの位置が悪いことでまれに撮影に失敗する

リアルカンバンとRaspberry Piのカメラとの間に物理的に距離があります。タイミングによってリアルカンバンの前に人が立っていたりすると見事に写り込んでしまいます。

ブラインドが閉まってる時に撮影してしまったのがこちらです。残念な感じになってます。

今の所Slackに投稿された写真に映り込みがあった場合はRaspberry PiにSSHして直接ShellScriptを実行することでなんとかなっています。

Rasbperry Piにはセンサーをつけることもできるので、センサーを付けて撮影タイミングを図るか、投稿される前の画像を何かしらの方法でチェックしてカンバンの撮影が問題なく行われた結果なのかチェックするような方法を考えています。

機能追加

現在はSlackへの投稿をRaspberry Piから直接行っていますが、前日の画像との差分画像を出力させたり、上記課題の2点目である映り込みを検知させたりする処理を行うサーバーを用意し、事前処理を行った上でSlackに投稿するように変更中です。Raspberry Pi内で実行しても良かったのですが、画像処理は潤沢なリソースがあるサーバーでやらせるほうがいいと思い別で用意しています。

普段Androidメインで開発はしているので、あまり触らない技術を使ってみようとGolang・Docker・GKEあたりを使って開発中です。

おわりに

Slackへの画像投稿を自動化した話をしました。最後の機能追加の部分では試しにGKEを動かしっぱなしにしてみたところ1100円/Dayかかったので構成を考え直したい気持ちでいっぱいです。ただ画像をSlackに投げたいだけなのに明らかなオーバースペックです。

単純ですが繰り返し行う作業の自動化は時間を生み出すことができるようになるので今後も積極的にやっていきたいと思います。

デジタルとアナログをつなぐことでアナログの良さとデジタルの良さを融合した新しい仕組みを作る楽しさに目覚めたので、今後もなにか作っていきたいと思います。