sora_sakakiのブログ

VIVE Base Station 1.0の信号仕様と実際の信号

ふと思いいたってVIVE Base Stationを作ることになった。
本当は2.0が作りたいけどとりあえず1.0のほうが資料が多かったので、調査と試作にあたっての実物の信号を計測した。
本当はモックを試作したけど動かなかった。

VIVE Base Station 1.0の仕様

この分野には若干の先人がいる

note.com
www.youtube.com
github.com
github.com

この辺から情報を調べた。また、公式の情報は参照していない。

位置特定の仕組み

Base Station 1.0の仕組みは以下の動画がわかりやすい。

www.youtube.com

あるBase StationからみたX方向の角度を把握する流れは次のようになっている。

  1. 部屋全体を照らす高輝度LEDを一瞬光らせる(走査開始の信号)
  2. X or Y方向に等速回転する線レーザー(Line Lensで直線に引き伸ばされたレーザー)で部屋全体を走査する

これをX, Yの順で交互に実施する。
この結果、走査開始の信号を受信してから、レーザー光を受信するまでの時間を計測すれば、X方向/Y方向のBase Stationからの角度がわかる。
そして、2つのBase Stationは対角に設置されているため、2つのBase Stationからの角度が分かれば空間内の位置が特定できるという算段らしい。

X方向だけで見るとこんな感じ。

あるトラッカーの位置を特定するプロセスを整理すると

  1. Base Station 1からのX方向の角度を走査
  2. Base Station 1からのY方向の角度を走査
  3. Base Station 2からのX方向の角度を走査
  4. Base Station 2からのY方向の角度を走査

という流れになる。

このレーザーはそれぞれ60Hzで回転しており、またXとYは180度ズレて回転している。なので走査周期は120Hzとなる。そのため、物体の位置は30Hzで更新されていることがわかる。

またこの挙動の把握には以下の資料も非常に参考になった。

github.com

走査開始信号の仕様

この詳細はこのページに情報がある。この辺になると読めばいいじゃんと思わなくもないが、日本語資料が無く、また分かりにくい点もあったので解説する。

github.com


走査開始信号は、立ち上がりが走査レーザーが0度であることを通知する信号である。他方で、光っている長さに3bitの情報が含まれている。

Name skip data axis length (ticks) length (µs)
j0 0 0 0 3000 62.5
k0 0 0 1 3500 72.9
j1 0 1 0 4000 83.3
k1 0 1 1 4500 93.8
j2 1 0 0 5000 104
k2 1 0 1 5500 115
j3 1 1 0 6000 125
k3 1 1 1 6500 135

このbitについて説明すると

  • skip: レーザーが出ているか。0でON、1でOFF
  • data: データ転送に使う。0/1の1bit情報
  • axis: レーザーの方向。0でX、1でY

skipについて補足すると、一般にBase Station 1.0では2つのBase Stationを利用する。そのため、片方のBase Stationがレーザーを飛ばしているときは、もう片方のBase Stationはレーザーを止めないとどちらのレーザーかわからなくなるためその際に利用されている。

そのためあるBase Stationの出力信号は送信データの内容に依存して

  1. j0 or j1
  2. k0 or j1
  3. j2 or j3
  4. k2 or k3

の順番で送られることとなる。

データ仕様

ザーッと書いていく。
正直文字だけだとわかりにくいので最後に実際に手元のBase Station 1.0から受信した実データを置いておくので安心してほしい。

図をもっと使ったほうがわかりやすいけど気が向いたら....

OOTX(Omnidirectional Optical Transmitter) Frameの仕様

前章と同じく以下を参照する。

github.com

OOTXとは、前章の走査開始信号におけるdata bitで送信される内容である。

構造は以下の通り。

Preamble Payload Length S Payload CRC32
  • Preamble(18bit)
    • 18bitで0x001
    • Preamble以外では、16bitに1bitの間隔でSync Bit(1の値)が挟まる。そのためPreamble以外で17bitの0が続くことがないため、これで先頭を判断する
  • Payload Lenght(16bit)
    • そのまま、Payload Length
    • Base Station 1.0ではBase Station Info Block以外に送信するデータがないため、0x21で固定
    • このPayload LengthにはPadding byteを含まない
  • S(1bit)
    • Sync Bit
  • Payload(34bytes+17bits)
    • ペイロード。後述のBase Station Info Blockの内容となっている。
    • ペイロードはデータが必ずSync Bitで終わることを保証するために、偶数bytesである必要がある。そこで、ペイロードが奇数bytesの場合はPadding byteを挟むことになっている。
    • Padding byteは0x00
    • ペイロード内部も16bitごとにSync Bitを挟むこととなっている。
  • CRC32(2bytes + 2bits)
    • PayloadのCRC32
    • Padding byteもSync BitもPayload Lengthも含まない

Base Station Info Block

github.com

ここを参照した。

0x00 uint16 fw_version Firmware version (bit 15..6), protocol version (bit 5..0)
0x02 uint32 ID Unique identifier of the base station
0x06 float16 fcal.0.phase "phase" for rotor 0
0x08 float16 fcal.1.phase "phase" for rotor 1
0x0A float16 fcal.0.tilt "tilt" for rotor 0
0x0C float16 fcal.1.tilt "tilt" for rotor 1
0x0E uint8 sys.unlock_count Lowest 8 bits of the rotor desynchronization counter
0x0F uint8 hw_version Hardware version
0x10 float16 fcal.0.curve "curve" for rotor 0
0x12 float16 fcal.1.curve "curve" for rotor 1
0x14 int8 accel.dir_x "orientation vector"
0x15 int8 accel.dir_y "orientation vector"
0x16 int8 accel.dir_z "orientation vector"
0x17 float16 fcal.0.gibphase "gibbous phase" for rotor 0 (normalized angle)
0x19 float16 fcal.1.gibphase "gibbous phase" for rotor 1 (normalized angle)
0x1B float16 fcal.0.gibmag "gibbous magnitude" for rotor 0
0x1D float16 fcal.1.gibmag "gibbous magnitude" for rotor 1
0x1F uint8 mode.current Currently selected mode (default: 0=A, 1=B, 2=C)
0x20 uint8 sys.faults "fault detect flags" (should be 0)
  • Protocol Version
    • 6固定
  • ID
    • Base Stationの裏に書いてあるシリアルID
  • phase/tilt/curve/gibbous phase/gibbous magnitude
    • レーザー補正用のパラメータだと思われる
  • accel
    • 加速度センサー。Base Stationの向きを特定するのに使っていると思われる
  • mode
    • Base Stationのモード
  • fault detect flags
    • 何か壊れてたらbitを立てる

実測

今回はArduinoを使って実測した。

実測条件

回路図

コード

Read signals of base station 1.0 · GitHub


BaseStation

  • Base Station 1.0
  • 机の上に静置した状態で実施
  • モードはbで起動
  • b/cの2台で使っている環境からbだけ引っぺがしてきたものを使った

セットアップ


データ概要

実データはこのような感じとなった。

多いところで合わせて前後1点ずつの3点、その次は2点、3点と交互に線で区切ったところで分けて処理している。これはArduinoの時間解像度が4usで、このグラフが1usでプロットしているため離散的に飛んでしまうためである。それぞれのデータは10usごとに存在しているため、きれいに集まっている3点の枠と半々くらいに散っている2点の枠がある。

値としてはそれぞれ上からk3, j3...と順に並ぶ。

データの中身を見るために、0-1のみを識別してセルを色塗りした。(緑: 0, 白: 1)

このようにPreambleを見つければあとはデータ復元ができる。

見ていくと、データは上位bitから送信されていることがわかる。(はじめは下位bitから送信していると思っていた。)複数bytesのデータはリトルエンディアンとなっている。

データの妥当性は、CRC32を計算すると確認できる。

実際にダンプしたデータを16進数で書き起こすとこのようになっている。

gist.github.com

実測の所感

正直Arduinoの時間解像度が4usだったので、10usを区別はできたが結構ギリギリだった。また、センサーの都合か全体的に信号が遅延して見えた。今回は信号間隔が10usであることを前提に分離している。

結果的にCRC含めてデータの整合性が確認できたので、データ収集できたが、おすすめはできないと思う。

次はオシロスコープを買って実際に生成している波形を見て、直したい。

ニキシー管時計を作った話

ニキシー管時計

ニキシー管時計を作った。そのレポート。

仕様

  • 24時間表記、時分秒表記
  • CD61を使用
  • Arduino leonardo制御
  • 12V電源にて駆動
  • MC340963にて昇圧
  • 74141互換IC(K155ID1)使用

コンセプト

ふとニキシー管時計を作りたくなったため、楽に作れることをコンセプトに作った。特にトランス昇圧にトラウマがあったので(昔大型の電解コンデンサを吹っ飛ばした)DC-DC昇圧で、ラフに。調べてみると電流量的にICを使った簡単な昇圧回路で必要電源を作成できそうだったので、それを元に作成した。

昇圧回路

ss1.xrea.com

こちらを参考にほぼそのままの回路で作成。LHL13NB221Kがなかったので、RCH110NP-221Kを使用した点だけがdiff。

制御回路

Arduinoで直接180Vを駆動するわけにもいかないものの、おそらくモーターみたいに電源を別系に分ける必要まではないと思ったので、トランジスタ制御とかでできるかな?とおもったけどそもそもI/Oが全然たりない。

ので、あきらめて2進数をI/OにばらすことができるK155ID1を適当に購入した。ニキシー管の数使用した。計6個。

また、I/Oが足りず一部は下位3bitのみ使っていたりするものの、プルアップされているのか不安定になっているのか、何もつながないと1が入力されている扱いになるため、使わないbitはGNDへ落とす。

回路図

念のため回路図。ただ1ニキシー管分だけ。

回路図

基本的に33kの抵抗を挟んでいるだけの構成。これを6本分用意した。

一つだけ、ドットを付けるため、直でGNDに落としたけど、これはさらに流す電流が少ないらしいので、50kを挟んでGNDへ落とした。

パターン

一番気を使ったところ。久しぶりに作ることもあって飛ばすのは控えめにした。プリント基板にするわけではないけど、PCBEを使って引いた。

パターン

じつは当初4桁のみの予定だったので、2桁分はパターンがないけど、4桁で動作確認終わっていたので気合いで作った。

完成!!

完成!!

というわけで、土日の2日間で作れたので、興味ある人おすすめです!

ゲート式量子コンピュータが今熱い!〜NISQの紹介〜

mstdn.maud.io Advent Calendar 2018 19日目の記事です(遅刻1日)。昨日はumezouさんでした。

本記事は量子コンピュータに詳しくないWebエンジニア向けに某所で発表したものを記事に落とし込んだものです。

Preskillの2018年の論文、J. Preskill, Quantum Computing in the NISQ era and beyond, Quantum 2, 79 (2018) を元ネタとしていますので、そっちを読んだ方が多分ワクワクします。

目次

まとめ

量子コンピュータの概要と一般論

量子コンピュータとは

量子コンピュータとは量子現象を用いて計算するコンピュータのことです。物理法則を直接的に活用するという意味で、今広く使われているデジタルコンピュータよりアナログコンピュータ(OPアンプとか)のほうが近いかもしれません。

量子コンピュータと呼ばれるものは量子現象をどういう演算に活用するかという観点で現在以下の2種類が存在します。

ゲート式量子コンピュータは汎用量子コンピュータとも呼ばれ古くから知られているものです。暗号を破るなどでSFなどに登場するものもこちらのことです。

他方、量子アニーラは2012年にD-Waveが発表し注目を集め急速に発展した量子コンピュータです。こちらは最適化問題に特化した専用計算機のようなもので国内のWeb系ベンチャーなどで「量子コンピュータやってます!」というときの量子コンピュータはこちらです。

今回は「ゲート式量子コンピュータ」についての記事になります。

以下量子コンピュータと言った時はゲート式量子コンピュータの意味で使います。

量子コンピュータについてよく知られている(と私が思っている)こと

やばい計算ができるらしい

一番知られているものとしては、やはり高速な素因数分解を用いた既存の暗号の解読でしょう。これはかなりインパクトがあることです。
また、ムーアの法則が限界に来ていることから古典コンピュータの限界を超える方法として話題に挙げている記事などもあり、全般的に計算機として古典コンピュータより速いのではと考えている方もいるかもしれません。

実現が遠そう

他方、実現は遠いのではないかと感じている方も多いのではないでしょうか。ニュースでは3量子ビットや16量子ビット、72量子ビットなどの成功記事が話題となっています。とはいってもD-Waveが2048量子ビットを実現しているし、それと比べると実現が遠いように見えます。

量子コンピュータの実際

以上の印象を踏まえて、実際の量子コンピュータはどうなのでしょうか。

量子コンピュータは古典コンピュータより必ずしも速いわけではない

量子コンピュータは古典よりも必ずしも速いわけではありません。古典でできる計算が全てエミュレーションできると証明はされているものの、古典より速いかどうかは証明されていません。

他方、量子力学の性質によっていくつかの問題は古典コンピュータより速い

どんな場合も速いわけではないですが、前述の素因数分解やまた量子力学のシミュレーションなど古典より速いとされているものは存在します。

量子コンピュータの実用化には原理的に難しい問題を孕んでいる

量子コンピュータの実現が遠そうという印象はその通りです。なぜ量子コンピュータの実現は難しいのでしょうか?それは原理的な問題が存在します。

量子性がはっきりと確認できる環境というのは、ご存知の通り非常にミクロな領域になります。また、そのようなミクロな領域での現象なので非常に雑音などに対して弱い現象とも言えます。そのため、量子状態を保持するためには外界から遮断された環境が必要です。

しかし、量子状態を変化させたり確認するためには干渉する必要があります。状態を変えるということは外界からなんらかの影響を与えて望む変化を起こすことになるためです。当然干渉するためには外界からの遮断が破れてしまい、その際に量子状態が変わってしまったり破れてしまうことが発生するわけです。また、量子ビット同士も干渉しあう必要があります。

つまり、量子状態を保持するためには外界から遮断する必要があるにも関わらず、それを制御するためには外界から影響を与えないといけないという原理的な問題が量子コンピュータの実用化の上で大きな障壁になっているわけです。

なぜ量子コンピュータが強力とされているか

そのように原理的に困難な量子コンピュータですが、なぜ盛んに研究が続いているのでしょうか?それはその困難を乗り越えてでも量子コンピュータが強力だと信じられているからです。

どのような点が強力なのでしょうか。いくつか存在します。

  1. 古典では困難だが、量子コンピュータで容易に解ける問題が知られている
    1. 素因数分解アルゴリズムなどのことです
  2. 古典では扱えない複雑さを扱える
    1. 古典的にはいかなる方法を使っても簡単に表現できないとわかっている情報が量子ビットで簡単に表現できることが知られている
  3. 量子コンピュータを古典で効率的にシミュレートする方法がわかっていない

特に、3番目の「効率的にシミュレートする方法がわかっていない」点が重要です。効率的にシミュレートできないということは、そこに古典を超えるなんらかの優位性が存在すると考えられます。

また、関連していくつか言及すると

古典的に難しい問題と量子的に難しい問題には違いがある

前述のように古典で難しく量子では容易な問題が知られていますが、他方巡回セールスマン問題のようなNP-困難な問題は古典的にも量子的にも難しいようです。
古典はともかく量子が得意とする問題はまだまだ研究の途中なので、それが明らかになってくると古典と量子の計算傾向の違いや使い分けなどが見えてくるかもしれません。

量子が得意なものとして多粒子量子系のシミュレーションがある

古典では量子系のシミュレーション、特に多粒子の量子系のシミュレーションは困難を極めます。古典的には計算が複雑すぎるためです。

しかし、当然ですが量子コンピュータは量子系そのものなので量子系のシミュレーションに向いています。

これは余談ですが、ファインマンは35年前に古典でのシミュレーションが困難な点について量子コンピュータでシミュレーションすることを構想していたそうです。

量子コンピュータの歴史

量子コンピュータの研究自体は1980年代から行われています。簡単に以下にまとめます。

  • 1950年代:量子力学を計算に使うという考えが提唱される
  • 1980年代:量子計算の基本的なコンセプトが考案され、研究が始まる
  • 1990年代:Shorのアルゴリズムなどアルゴリズム研究が進む
  • 2000年代:ハードウェアの研究が進み始める
  • 2010年代:量子アニーラ(D-Wave)が注目を浴び、また量子ゲートも民間等含めた開発が盛んになる

いくつか重要な点があります。

一つは1990年代で、有用なアルゴリズムが開発されたために注目を浴びます。恐らく実現に向けてで言えば、ここが研究が加速する契機です。

次は2011年のD-Waveの発表です。これはゲート式ではないものの商業の量子計算機が出たということで大変注目を集めました。それによって量子コンピュータ界隈全体が活発になりました。ゲート式が今盛り上がっている前提として量子コンピュータ界隈自体が盛り上がっていることは重要です。

その上で、2012年に量子超越性(量子スプレマシー)、古典をゲート式量子コンピュータで超えるという概念が提唱されます。これは2018年にメディア露出し現在民間各社が競って狙っている目標です。具体的に目指すべき目標が設定されたことは一つ契機だと思います。

最後に、2015年にエラー訂正すればまともに使える精度の量子ビットの開発が報告され、開発競争が加速し今に至ります。

開発競争が加速した結果

開発競争が加速した結果、

このように加速度的に開発が進んで現在に至っています。

NISQについて

NISQとは

NISQとは、Noisy Intermediate-Scale Quantumの略で「50から数百量子ビット程度の中規模でノイズが多い量子コンピュタ」を意味します。
これは、現在から数年後の量子コンピュータを表現するために2018年にPreskillによって提唱されたものです。

f:id:sora_sakaki:20181220193929p:plain
NISQ

NISQがなぜ熱いか

NISQがなぜ熱いかをお話しするにはなぜNISQという概念が作られたかを説明する必要があります。

50量子ビットの障壁

NISQの50量子ビットという数字は非常に重要です。なぜかというと量子超越性が確認できる数字だと考えられているからです。つまり、NISQは初めて古典で計算できなかったことが実現できる量子コンピュータを指し示します。

つまり、古典コンピュータを超越する新しい歴史の幕開けとして、NISQという概念が作られました。NISQによって計算の世界は誰も知らない新時代に入るのです。

新しいアルゴリズム「古典-量子ハイブリッドアルゴリズム

次に熱いポイントは、実現が見えてきた故に生まれた新しいアルゴリズムの数々です。

これまで量子 vs 古典で語られることの多かった量子コンピュータですが、これらの新しいアルゴリズムの筆頭「古典-量子ハイブリッドアルゴリズム」は量子コンピュータアクセラレータ的に使用することを念頭に置いたアルゴリズムです。たとえばQAOAやVQEがそれに当たります。

QAOA(量子近似最適化アルゴリズム)は、最小値問題を解くアルゴリズムです。ざっくり説明するとハイパーパラメータの探索は古典で実施し、最小値の計算を量子で実施するアルゴリズムです。

qiita.com

VQE(量子変分アルゴリズム、量子変分固有値ソルバー)は、低エネルギー状態を計算するアルゴリズムです。変分パラメータの探索を古典で実施し、エネルギー期待値を量子で計算します。

qiita.com

また、他に量子RBMなどの量子ディープラーニングも提唱されています。

考案されているアプリケーション案

具体的なアプリケーション案も考案されています。詳細は論文に譲りますが、

特に、個人的には量子ゲームは日常の直感に反する量子力学の世界を体感する貴重な機会を提供すると思います。

エンジニア目線で見たNISQ

エンジニア目線でこのNISQの世界を見てみます。

エンジニア目線で見た時、NISQにエンジニアとして関わるのは比較的やりやすい状況が作られています。

一つは、クラウドで使える環境やシミュレーターがすでに存在することです。

  • IBM Q
  • Microsoft VisualStudioの「Quantum Development Kit」
  • ほかいろいろ

このように計算できる環境があるため、アプリケーション開発をすぐにでも始めることができます。

もう一つは、開発環境やフレームワーク、それに伴うサンプルコードなどが存在することです。

ほかにCodeforcesなどの競技プログラミングサイトでQ#を題材にしたコンテストの開催実績などもあります。

また、エンジニアならではの魅力もあります。というのは、NISQでのプログラミングはWebのプログラミングなどとはフェイズが大きく異なる点です。

NISQは前述の通り、多くのアルゴリズムが想定したような大規模な処理系ではなく、非常にチープな処理系です。つまり非富豪的なプログラミングが求められる側面があります。個人的にはこれはかなりチャレンジングでワクワクするシチュエーションだと思っています。

古典の世界で遥か昔の英雄たちがファミコンドラクエを開発したような、頭を絞るようなプログラミングができる余地があるように思います。絶好の俺TUEEEEEEEEできるフロンティアがここにあります。(妄想)

最後に

以上、かなり偏見の混ざったNISQに関する記事でした。冒頭にもかいているのですが、もしこれを読んで少しでも気になったのであれば元ネタの論文を読んでいただいたほうが正確な内容が理解できると思います。

完全に個人の印象なのですが、珍しい環境かつ今後発展するかもしれない領域で再開発でないエンジニアリングができるという点に大変魅力を感じています。

尤も、私もまだコーディングできるような能力があるわけではないのでこれからですが、興味を持ってくださった方はぜひ一緒に新しい世界へ挑戦しましょう!


明日(遅刻したので今日)はおわたんさんです