2019年5月28日火曜日

ItemSenseサーバをセットアップしてみた

Impinj社ItemSenseサーバをセットアップしてみました。公式ドキュメント通り進めるだけですが、備忘録を兼ねてメモしておきます。

今回使ったもの

  • Windows 10 Pro
  • Hyper-V
  • Ubuntu 16.04
  • itemsense-2.0.3+34-setup.run

Hyper-Vの有効化

PCのOSがWindows 10 Pro以上だと、Hyper-Vが使用可能です。Hyper-Vの有効化はここにやり方が書いてあります。

Ubuntuのセットアップ

ItemSenseの動作環境がUbuntu 16.04かCentOS 7となっています。今回は筆者の好みの問題でUbuntu 16.04にしました。公式サイトからisoファイルをダウンロードしてください。今回、"64-bit PC (AMD64) desktop image"を使用しましたが、"64-bit PC (AMD64) server install image"の方がよかったかもしれません。

次に仮想マシンを新規作成します。今回は第2世代を使いました。その際、「セキュアブートを有効にする」のチェックを外す必要があるそうです。あとはダウンロードしたisoを指定して、起動するだけです。Ubuntu自体のセットアップは割愛。キーボードレイアウトの設定くらいでほとんど設定項目ありませんでした。

前提条件となるソフトウェア

セットアップ後、追加で下記をインストールしました。
  • ssh 1:7.2p2-4ubuntu2.8
  • curl 7.47.0-1ubuntu2.13
  • docker.io 18.09.2-0ubuntu1~16.04.1
  • docker-compose 1.24.0
docker-composeのみ、リポジトリのバージョンが古かったので、公式サイトからダウンロードしました。
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose 
hash -r 

いざ、ItemSenseインストール

あとはスクリプトを動かすだけです。

sudo ./itemsense-2.0.3+34-setup.run install

お使いのブラウザからubuntu 16.04環境のIPアドレス:3010にアクセスすると、初回はInstance IDの入力を求められるので、入力します。すると、今度はusername / passwordを求められますので、admin / admindefault を入力してください。ログインできます。


とりあえず、ここまで。



2019年5月22日水曜日

タグの読みすぎ問題を考える

RFIDを使っていると、タグの読みすぎ問題というのが発生します。タグは読むためにあんだろーが!読めないより読めたほうがいいに決まってんじゃねーか!というのは御尤もなわけですが、特にハンディリーダなど使っていると読みたくないタグまで読んでしまっていやーなんやこれ想定外やなこれは聞いてないでー、という状況が発生します。

例えば


こういうところで、ダンボールにはタグが付いていて、出庫処理をするのに手前の3個のダンボールだけ読みたいとするじゃないですか。しかし後ろにもダンボールがあってこっちにもタグが貼ってあるわけですね。


この状態でハンディリーダを使って読み取りすると、読みたくない方のタグまで漏れなく読んでくれるわけです。これがタグの読みすぎ問題と言われるものです。もちろん読みたくないタグが近くに無いような状況を作ればいいのですがそういう状況を作れない(場所がない)場合が多いと思います。

この問題を解決するのに2つのアプローチがあります。1つは電波強度を落とすという方法、もう1つはタグの電波受信強度(RSSIと呼ばれるもの)を利用するという方法になります。(実はもう1つあって、読みたいタグが最初からわかってる場合はそれだけ読むようにするというのもありますがこちらは運用とかも絡んでくるので今回は外します)

電波強度を落とす方法は、リーダから出す電波の強度を落として遠くのタグを読みにくくすることで近くのタグだけ読ませようというやり方、受信強度を利用する方法はリーダからの出力は最大にしておいて、タグからの受信電波強度を見て、あるしきい値以下の強度だったら読まなかったことにするということでこちらも近くのタグだけ選別しようというやり方です。

で、果たしてどちらの方法が人にやさしいというか人間の感覚にフィットするのかというのが気になりましたので試してみました。

利用したのはこちらのリーダ


AT-S100ちゃんです。今流行りのスレッド型になります。出力は1Wでアンテナは円偏波です。

1番上のダンボールの写真のアングルから、ダンボールから50cm、1m、1.5m離れた場所でリーダを普通に1振りしてどんなもんかを計測します。読みたいダンボールは3個、後ろの読みたくないダンボールは3個、合計6個のタグを読み取りします。

まずは電波強度を変えるやり方、MAXの30dBmから3dBmずつ落として読み取ります。電波強度を変える方は単純に遠くのタグを読めなくする方法なので、読み取りできた枚数が3枚になるポイントを探ります(もちろんその3枚が手前のダンボールのタグである必要があります)。

結果がこちら(数値は読み取ったタグの個数です)

出力\距離 0.5m 1m 1.5m
30dBm 6 6 6
27dBm 6 5 5
24dBm 6 5 5
21dBm 6 5 5
18dBm 4 4 4
15dBm 3 3 3
12dBm 3 1 0

今回のパターンでは、15dBmにすると読みたいタグだけ読んでくれてることがわかります。

次に受信強度(RSSI)を見るやり方、こちらはリーダの出力は最大の30dBmにしておいて、手前のタグたちのRSSIと後ろのタグたちのRSSIを見てしきい値を設けられるかがポイントになります。手前3個でのRSSI値の最小値と、後ろ3個のRSSI値の最大値に差があればあるほどしきい値を設けやすくなります。

距離\RSSI 手前3個で最小のRSSI 後ろ3個で最大のRSSI
0.5m -52.3 -63.0
1m -58.3 -66.8
1.5m -61.8 -67.9
単位:dB

0.5mのときはRSSI値に結構差がありますので、-58あたりをしきい値にしていれば概ね大丈夫のようです。距離が離れていくと差が縮んでいくので、1.5mのときは一応しきい値-64くらいでやれそうですがちょっと危ないかなーという感じですね。

結果としては読み取りたいタグとリーダの距離が近い場合は受信強度を見る方法もありですが、必ずこの距離で読んでくださいねーとかそれを制限するのもちょっと難しそうなのでやはり出力を調整する方法が現実的のようです。


2019年5月13日月曜日

AR と RFID

ARのライブラリもかなりよくなってきたのではないだろうかとふと思い立ち、ちょっと試してみることにしました。以前は ARToolkit を使って車両認識をARマーカを使ってやってみよう!みたいなことをやってましたが、今回は RFID と組み合わせてみます。

RFID のハンディリーダは便利なのですが、当然のことながらタグは読めてもタグの位置まではわかりません。GPS と連動すれば位置はわかりますが、どの棚の何段目みたいのはわかりません。そこでこれを AR を使ってうまいことできないだろうかということでやってみました。

利用するライブラリはスマホでも使えるように Google の ARCore を使用しました。ついでに開発を端折るためにサンプルプログラムの augmented_image を改修して試してみることにします。

ARCore は平面の検出などかなり高度なことができるライブラリで、その中でもマーカを認識する機能と、スマホの動きをトラッキングするモーショントラッキングの機能を使います。これを使うことで、マーカの認識と、マーカーとスマホの相対位置がわかるようになります。

マーカを柱など固定されたところに貼っておいて、そのマーカとの相対位置でタグの位置を識別することで、マーカから見てどの辺りにタグがあるのかがわかるようになります。マーカは移動しない固定された位置(壁など)に貼りますから、そこからの相対位置が分かればタグの絶対位置がわかるだろうというそういう都合のいい理論です。

利用するハンディはこちらです。


ブラスターにハンディのアタッチメントを付けたものです。画像認識にスマホのカメラを使いますので、必然的にこういうリーダしか使えないというのがこれにした理由でもあります。

仮想的な倉庫としてこんな感じ


一番左にマーカ、ダンボールの中にタグが入っていて、わかりやすいように 0001~0004の4桁をエンコードしてあります。

実際に動かしてみたのがこちら。ちなみにデモ用にリーダの出力はかなり抑えてあります。


ちょっとわかりづらいですが、タグを読み取ったところでIDの看板みたいのを表示しています。


これでマーカとの相対位置はわかりますのでタグの位置管理的なことが可能になりますね。