流れ星に全自動で願いを送る装置を作る

こんにちは。先進技術部でアルバイトをしている河田です。
流れ星に自動で願いを送る装置の試作品を作りました。
本記事では、作るまでの過程と作動の様子をお見せします。
なお、装置を動かすプログラムや装置の土台の3DモデルなどをGithubで公開しています。

はじめに

始まりは約3年前、ALBERT春インターンの打ち上げでした。
ちなみに、私はこのインターンに参加した後、今日に至るまでアルバイトとしてALBERTで様々な分野の研究をしています。
私は当時、大学の授業で画像から流れ星を識別する課題に取り組んでおり、打ち上げでその話をしていました。

すると、インターンを担当してくれた社員の山内さんから「自動で流れ星を検出して願いを送信してくれる装置があったら面白そうではないか?」という話が挙がりました。当時は面白いアイデアだなと思いはしましたが、まさか実現するとは思っていませんでした。

話が動いたのは半年前の雑談でした。私がなんとなく流れ星の話を出したところ、「せっかくだしやりましょう、この機会に!」ということになり、プロジェクトが始まったのでした。しかし、私は大学・アルバイトで画像識別をメインに研究しており、流れ星の方向を向き願いを送信する装置を作る方法など想像もつきませんでした。そこで、色々な方法を調査、模索しながらプロジェクトを進めることになりました。当初は完全にふざけた企画だと思っていたのですが、調べれば調べるほど様々な知識や技術が必要であることが分かってきました。

ここで、本プロジェクトの概要を述べます。

「流れ星が現れてから消えるまでに願い事を3回言うと願いが叶う」という言い伝えがありますが、本プロジェクトの目的はこれを全自動で行う装置を作ることです。

流れ星は一般的に、出現してから消えるまで約0.5秒[1]と言われています。仮に流れ星が見つけられたとしても、人間が0.5秒で瞬時に願い事を3回唱えるのはかなり無理があります。また、流れ星を見つけるためには街灯などの明かりのない場所に寝転んで夜空を見上げ、流れ星が流れるのをひたすら待たなければなりません。
先進技術部の山内さんが撮影した流れ星。
一般に販売されているカメラでも撮影することができる。
そこで、全自動で流れ星を見つけ、流れ星を追跡しながら高速で願いを送信できる装置の出番です。上記の背景から、できるだけ早く流れ星にレーザーを向け、正確に流れ星を追跡する仕組みが必要になります。

流れ星を自動で検出する既存手法として「流星電波観測」という方法があります[2]。これは、流れ星により電波が反射することを利用する方法です。正確には、流れ星が発光する際に周辺の大気が一時的に電離し、電子濃度が高くなることで電波が反射するのですが、いずれにしてもこの方法で流れ星を検出することができます。
また、この流星電波観測を使って実際に流れ星に願いを届けるプロジェクトが既に存在しています[3]。街のイルミネーションなどともコラボしており、非常にロマンチックで素敵な企画が多数行われているようです[4]。

ただ、流星電波観測では流星の正確な位置を掴むことができません。また、上記の「願いを届ける」というのも、流れ星を検知したタイミングで画面上に願いを表示するというような手法をとっており、直接流れ星に向けて願いを送っているわけではありません(なんだか理屈っぽいですね)。

そこで、本プロジェクトでは流星電波観測を使わずにカメラで流れ星を検出し、検知した流れ星に直接願いを送信することを考えます。 本プロジェクトでは、以下の方法で星に願いを送信します。
  1. 夜空をカメラで撮影し続けて流れ星を検出
  2. 検出した流れ星に向かってレーザーを照射
  3. 願い事を0/1の信号に変換し、それに合わせてレーザーを点滅させることで願い事を送信
流れ星はどんなデータ形式でも願いを受け取ってくれるはずなので、レーザーの点滅で願い事を表現します。また、どんなに小さな光でも願いはきっと届くはずなので、今回は一般的なレーザーポインターを使います。

レーザー光照射位置の動かし方

本装置にはレーザー光を流れ星に向ける仕組みが必要です。しかし、レーザーポインター本体を動かすとなると重量もあり、動かすのに時間がかかることが予想されます。
そこで、本プロジェクトでは「ガルバノミラー」[5]を使用します。ガルバノミラーとは簡単に言うとレーザー光を反射する鏡のことです。2組の鏡を適切に動かしてレーザー光を反射させることでレーザーポインター本体の位置を変えることなくレーザー照射位置を高速に動かすことができます。
ガルバノミラー(1枚の場合)。
レーザーポインター本体を動かすことなく、レーザー光照射位置を大きく動かすことができる。
今回は鏡をモーターで回転させることを考えます。モーターを制御するために、本プロジェクトでは「Arduino」というマイコンボードを使用します。Arduinoを使うことで、複数のモーターにそれぞれ命令を送って動かすことができます。
そこで、モーターの先端に鏡を取り付けてモーターを動かすことで、レーザーを反射する角度を調節することにします。
Arduinoを使って二つのモーターを制御している様子。
モーターの先端についている鏡を適切な位置にセットすることで、レーザー光を目的地に照射できる様になる。
ガルバノミラーをはじめとした色々な部品は、完成した精度の高いものが売られており購入することができるのですが、今回は基本的に1から作るという方針で進めました。

ARマーカーの追跡実験 〜ひとまず動かす〜

さて、いよいよ装置を作っていくのですが、いきなり屋外で流れ星を探してレーザーを照射するのは現実的ではありません。そこで、まずは下図の「ARマーカー」を流れ星と見立て、レーザー光がARマーカーを追跡する装置を作ることから始めます。ARマーカーはOpenCVにより画像から簡単に識別することができます。
ARマーカー。
これを紙に印刷して追跡する。
まずは鏡を1枚だけ使用して、レーザー光を横方向に動かすことを考えます。
カメラでARマーカーとレーザー光をそれぞれ検出し、二つの位置の差が縮まるようにモーターを動かしてレーザー光をARマーカーに近づけます。
なお、レーザー光は単純に撮影画像の明るい箇所を探すことで検出します。
カメラで撮影されたARマーカーとレーザー光。
二つの距離を小さくするようにレーザー光を動かす。
では、実験に移ります。まず、レーザー光を鏡で反射できるように、レーザーポインターと鏡を同じ高さにセットします。ARマーカーの位置に合わせて鏡が回転し、横方向にレーザー光の照射位置が動く仕組みです。
また、投影する壁が撮影できる位置にカメラをセットします。
各部品を設置した様子。なんだか”夏休みの自由研究感”が強い…。
ARマーカーを追跡した結果がこちらです。

第一段階としてはまずまずの結果になりました。ARマーカーの動きに合わせてレーザー光がARマーカーを追跡している様子が見て取れます。
一方で、ARマーカーを高速で動かすと、追跡するまでの遅延が顕著になります。流れ星は短時間しか見えないため、遅延はできるだけ減らしたいところです。
ARマーカーを高速で動かした場合。
レーザー光が追いつくまでに時間がかかっている。
さて、横方向に動かすことができたので、次は鏡を2枚使って2回反射させることで、縦方向にもレーザー光を動かすことに挑戦します。これにより、目標地点にぴったりとレーザーを照射できるようになるはずです。
各部品を設置。高さを合わせなければならないので箱やノートを使って調節
この日は晴れでレーザーが検出しにくかったため、部屋を暗くできる自宅の和室で実験。
レーザー光はまず上の鏡で1回反射し、その後に下の、2枚目の鏡で再度反射して壁に照射されます。下図の置き方をした場合、上の鏡がレーザー光の横方向の移動、下の鏡が縦方向の移動を担当することになります。
なお、1枚目の鏡で反射したレーザー光は2枚目の鏡でも反射する必要があります。そのため、二つの鏡が離れていると、上の鏡を動かせる角度が非常に小さくなってしまいます。そこで、広範囲にレーザー光を照射するためには1枚目と2枚目の鏡の距離をできるだけ近づける必要があります。
二つのモーターの位置関係とレーザー光の反射の様子。
二つの鏡はできるだけ近づけたいが、近づけすぎると鏡がぶつかる。
この実験でもARマーカーを追跡しますが、ARマーカーの中心にレーザー光を照射するとARマーカーの識別できなくなってしまいます。そこで、今後の実験ではARマーカーの左上を目標地点としてレーザー光を照射することにします。 実験の結果、レーザー光がARマーカーを正しく追跡していることが確認できました。
ARマーカーの左上を正しく追跡することができている。
しかし、これらの実験を通して様々な課題が浮かび上がってきました。
  • 1秒あたりの動作回数が少なく、遅延も大きい
    • この装置を動かすためには、「撮影→ARマーカーとレーザー光の検出→モーターの操作」と複数の段階を踏む必要があります。そのため、1秒あたりに命令を出せる回数が少ないという問題があります(1秒間に5回ほど)。また、各段階の処理に時間がかかるため、撮影してからモーターを動かすまでの遅延が大きいという問題もあります。
  • 各部品の位置を毎回調節しなければならない
    • 特にレーザーポインターや鏡の位置はレーザー光の照射位置に直接影響し、少しずれると目標地点に照射できなくなってしまいます。また、持ち運びにも大変不便です。将来的に屋外で使うことになった場合を考えると各部品を固定する必要があります。
  • レーザー光を検出して用いている
    • この実験ではARマーカーとレーザー光の位置を検出していましたが、最終的にはレーザーは夜空に向かって照射する予定であるため、レーザー光を観測することはできません。また、レーザー光は撮影画像の明るい場所を選んでいるだけなので、実験する日の条件によりカメラの絞りやゲインを都度調節する必要があります。
      さらに、撮影した画像における距離と実空間の距離は1:1で対応していません。例えば、カメラからの距離などによっても1ピクセルあたりの実空間での長さは変わります(カメラに近いほど大きく写る)。そのため、撮影画像における距離(ピクセル)の差から鏡を動かすと正確な目的地に到達するまでに時間がかかります。レーザー光が大きく動く場合を確認してみると、目標位置に向かう際に揺れる様な動きを見せながら徐々に動きが止まる様子が確認できます。これは、実空間での距離ではなく画像内の距離からモーターを動かしていることが原因です。
レーザー光がぐるぐる回りながら目標地点に近づいている。
これらの課題を解決するために改良を行いました。

ARマーカーの追跡実験 〜装置の改良〜

まず、1秒あたりの動作回数が少なく遅延も大きいという問題は、プログラムを「マルチプロセス化(非同期処理)」することで改善しました。具体的には、撮影と、ARマーカーなどの識別と、Arduinoに命令を送る処理をそれぞれ別プロセスで行うことで、各作業を待つ時間が短縮され高速に動く様になりました(1秒間に50〜60回ほど)。

また、3Dプリンターで装置の土台を作ることで、各部品を固定しました。 土台のモデリングを行う前に、紙にイメージを書いて大きさや形を決めていきました。
各土台のイメージ図
まず、モーターに取り付ける鏡を固定する土台を作りました。これまではセロテープでくっつけていただけだったのですが、3Dプリンターで土台を作ることで、モーターに対して正確に、垂直に固定することができました。土台の裏がわからボルトで固定しています。
鏡を固定する土台(鏡の背面の赤い部品)。
モーターの中心が鏡の反射面になるように、鏡の厚さも考慮して作成した。
次に、モーターやレーザーポインターの位置関係を固定する全体の土台です。これを作ることで部品の位置を調整する必要がなくなり、正確な位置に部品を置くことができるようになります。モーターやレーザーポインターは該当箇所に収めた後、ボルトで2カ所から押さえつけることでガタガタと細かく動くことがないようにしました。
装置全体の土台。
手前の細長い直方体の部分にレーザーポインターをセットしている。
ナットが入る穴を用意し、ボルトで2カ所から部品を壁に押し込むことで細かく動かないようにしている。
さらに、上のモーターにカメラを取り付けることで、全ての部品を固定できるようにしました。
カメラ、レーザーポインター、モーターの位置関係を固定。
モーターの回転数を決めるプログラムにも改良を加えました。これまでは撮影した画像に映ったARマーカーとレーザー光の位置の差をピクセル単位で計算して、その値を元にモーターを動かしていました。しかし、OpenCVを用いることで撮影されたARマーカーの実空間での距離(x, y, z)を取得できることを利用し、計算の仕方を改良しました。これはつまり、カメラからARマーカーまでの距離が○[cm]という風に計算できるということです。
実空間での距離が分かれば縦方向と横方向にそれぞれどの程度の角度でレーザーを照射すれば良いかが三角関数で計算できるので、そこからモーターのステップ数を簡単に計算することができます。
実空間での距離からモーターの回転量を決めることで、目標地点に到達するための必要ステップ数がぴったり計算することができるようになります。そのため、目標地点の周りをグルグルと回りながら近づく挙動をしなくなるはずです。

また、使用するデータはARマーカーの位置だけなので、レーザー光を検出する必要がなくなります。そのため、撮影画像にレーザー光が映らない夜空を想定した実験でもうまく動くことが期待できます。
加えて、わざわざ明るさの調整なども必要なくなりました。

しかし、カメラの位置とレーザーが反射する鏡の位置は厳密には異なります。また、取り付けたカメラの傾きなども影響してくる可能性があります。
そこで、カメラ座標系から装置座標系への変換行列をMLP(多層パーセプトロン)で表現して事前に学習し、より正確なレーザー照射を可能にしました。学習するパラメータは平行移動用の3個と回転用の3個、合計6個と非常に少ないので、学習もGPUを使わずに高速に行うことができます。

それでは、数々の改良を行った装置で、ARマーカーを追跡してみます。
先ほどの実験と同様、レーザー光は常にARマーカーの左上に照射するように設定しています。結果を見てみると、かなり高速でARマーカーを動かしているのにも関わらず、低遅延で正確に追跡できている様子が確認できます。
動作中のモーターの動き。
また、流れ星を高速で追跡できても、出現した瞬間に素早く流れ星にレーザー光を照射できなければ追える時間は短くなってしまいます。そこで、流れ星が出現した瞬間を再現するために、ARマーカーが出現した後どのくらい素早く目標地点に到達できるかを実験してみました。ARマーカーは一部を隠すと識別できなくなるため、指で上部を隠しています。
結果を見ると、かなり高速で目標地点までたどり着いていることが確認できます。また、改善前のように目標地点の周りをグルグル回りながら近づくのではなく、一回の命令で正確に目標地点に到達していることが確認できます。

流れ星を追う実験

さて、ここまではARマーカーを照射目的として追跡する実験をしてきましたが、実際に流れ星を追う場合はどのくらい正確に、素早くレーザーを照射できるのかが気になるポイントです。
そこで、Youtubeで流れ星の動画[6]を探してスクリーンに映し、その流れ星にレーザーを照射する実験を行いました。
実際に流れ星を検出するためには、雲や他の星の瞬きなどのノイズの影響があるため機械学習を用いる必要があると考えられます。しかし、今回はノイズの影響は考えずに前後のフレームの差分を取り、明るくなった部分を流れ星だと想定して実験を行います。流れ星の場合、画像から実空間でのx, y, z座標を求めることができませんが、スクリーンに映すことからz座標(カメラからスクリーンまでの距離)は確定しています。そこで、ARマーカーを使った事前学習の結果を用いて実空間でのx, y座標を計算します。

実験は下図の様に装置をセットして行いました。流れ星の光は弱く、これを明るさの差分で検出するため、完全に真っ暗にできる部屋で実験を行いました。レーザー光自身を検出しない様に、赤色の成分が強い光は検出しないように閾値を調整します。
スクリーンに映った流れ星をレーザーポインターで追跡する
流れ星の前に、画面にPCのカーソルを表示して、それをレーザー光で追跡する様子をお見せします。赤い光がレーザーポインターで照射しているレーザー光です。カーソルを低遅延で正確に追跡できていることが確認できます。
次に、速度と現れている時間が違う二つの流れ星を追跡した様子をお見せします。白い光が流れ星です。流れ星が現れた瞬間は光が弱く追跡することはできませんが、光が強くなるとレーザー光は瞬時に目標地点に移動し、その後は高精度に追跡できています。
この実験より、作成した装置を使うことで流れ星を高速、正確に追跡できることが分かりました。

今後の展望

本プロジェクトでは流れ星をレーザーで追跡する装置を作成しましたが、実は肝心の「願いを送る」部分が搭載されていません。願いを送る実験の準備は済ませているのですが、レーザーを点滅させる処理が増えると遅延が大きくなる可能性があるので、今回は割愛しました。
なお、レーザーを点滅させて信号を授受する事前実験では、”Hello world.”を表す96bitのデータの送信を、0.03秒で正しく行えていることを確認しています。今後、実際に使う段階まで本プロジェクトが進むのであれば、こちらの処理も必要になります。

また、今回の実験では考慮しませんでしたが、実際に装置を屋外で動かすことになった場合は雲や星の瞬きなどのノイズの影響も考えなければなりません。機械学習を用いるのであれば学習データが必要です。また、流れ星を検出するための適切なモデルも検討しなければなりません。

他にも、屋外かつ無人で使うのであれば、Jetson Nanoなどの低電力で動作する開発ボードを用いてPC無しで動かせるようにする必要があります。また、流れ星の移動方向の予測や照射位置の精度向上など、まだまだやれることは残されています。

失敗談、大変だったこと

ここでは、本プロジェクトを行う上での失敗談や大変だったことを記します。

電子工作の知識が皆無
最初につまずいたのは電子工作の部分でした。ジャンパ線の端子にはオスとメスの2種類があることが頭から抜けており、オスのジャンパ線のみを購入していたため、ひとまずセロテープでくっつけてなんとかしようとしました。全て自宅での作業になるため、何か部品が足りないとその都度商品を購入して自宅に送る申請を出す必要があり、関係者の皆さんには大変お手数をおかけしました。
セロテープでなんとかしようとした。
なんとかならなかった。
また、モーターを動かすためのドライバーには「はんだ付け」が必要でした。日頃から電子工作をされている方であれば、はんだごては家にあって普通に使えるものなのかもしれません。しかし、私の家にはなかったので会社ではんだごてを購入していただき、頑張ってはんだ付けしました。
意外な難関「はんだ付け」
はんだ付け前(左)とはんだ付け後(右)
・部品の破損
マイコンボードのArduinoやモータードライバーは過度な電圧を加えると、それが一瞬であっても破損してしまいます。今回作成した装置は命令系統の5V電圧とモーターを動かすための12V電圧が混在しているため、最新の注意を払っていたものの…破損してしまいました。2度。壊すたびに新しい部品を購入して送っていただかなければならないので、冷や汗を流しながら連絡することになったのでした。
なお、Arduinoは部品を交換して復活させることができました。

・Jetson Nanoを使ってみたかった
本研究ではPCにArduinoやカメラをつなげて実験をしていたのですが、屋外で長時間動かすことを想定した場合、PCを使うのは現実的ではありません。
そこで、当初はJetson Nanoという小型かつ低電力で作動する開発ボードを使うことを考えていました。
しかし、いざ使ってみようとすると必要なライブラリが入らなかったり、PCでは反応したカメラが反応しなかったり、様々な問題がありました。
わざわざJetson Nano専用のカメラ(e-CAM24_CUNX)を会社で買っていただいたりもしたのですが、OSを1から入れ直す必要があり、非常に時間がかかってしまったので結局今回は使いませんでした。

・3Dプリンター初心者
3Dプリンターの使い方も知らず、これも1から勉強することになりました。3Dプリントは非常に時間がかかるため、予め出社する社員の方に印刷をお願いして、後日取りに行くということもありました。ご協力ありがとうございました。
ボルトも3Dプリンターで作れるということを知り実際に作ってみたのですが、小さすぎたのか、密度の設定に問題があったのか、かなり脆いボルトができてしまいました。装置の鏡を固定する部分に刺したボルトは途中で折れて取れなくなってしまいました。
3Dプリンターで作成したボルト
折れたボルト
取り出せなくなったボルトの残骸が今も残っている

まとめと感想

本プロジェクトでは、全自動で流れ星を検出してレーザーで追跡し、願いを届ける装置の試作品を作成しました。実際に流れ星に願いを届けられるようになるまでには更なる改良が必要ですが、目的のものを作ることができました。

はじめは何もかも分からず全てが1からのスタートでしたが、やったことのない分野を勉強して新しい何かを学んだり作ったりするのは非常に楽しかったです。
今回のプロジェクトでは主にアルバイトの私が装置やプログラムの作成を行いましたが、社員の皆さんに大いに助けられてここまでやってくることができました。
部内にも専門家の方がいたわけではなかったのですが、相談や質問などに快く応じていただきました。また、私物の道具や本を貸していただくなど非常に協力的な体勢を取っていただき、スムーズに作業を進めることができました。
部外の皆さんにも大変助けられました。様々な商品を購入するたびに細かい手続きや自宅への送付の手間がありましたが、こちらも迅速に対応していただきました。ありがとうございました。

残念ながら私はこの流れ星のプロジェクトを最後にALBERTでのアルバイトを終了することになるのですが、3年間の長い期間で本当に色々勉強することができました。物体検出やセグメンテーション、クラス識別をはじめとした画像識別から、ロボットアームの操作やそのシミュレーション、ArduinoやJetson Nanoを用いた制御、3Dモデリングに至るまで、様々な知識・経験をALBERTでのアルバイトで得ました。週2回で細々と続けてきましたが、この経験が大学・大学院での研究にも大いに活きましたし、今後も活躍すると信じています。

もし、「この流れ星プロジェクトを引き継いでやってみたい!」という方がいらっしゃれば、是非こちらからアルバイトを申し込んでみてください。

また、ALBERTは日本屈指のデータサイエンスカンパニーとして、データサイエンティストの積極的な採用を行っています。興味を持っていただいた方は、採用ページもご覧ください。

参考

[1] “流れ星は – キッズ ギャラクシー”. 宇宙科学研究所.
https://www.isas.jaxa.jp/kids/faq/q_a/038.html

[2] “流星電波観測の歴史と仕組み”. 流星電波観測国際プロジェクト.
https://www.amro-net.jp/about-hro/hro1_j.html

[3] “Meteor Broadcaster”. Bascule.
https://meteorbroadcaster.com/

[4] “NIHONBASHI – 願いの森”. Bascule.
https://bascule.co.jp/work/negainomori/

[5] “ガルバノスキャナ AtoZ”. 株式会社 ティー・イー・エム.
https://www.tem-inc.co.jp/galvano/

[6] “ふたご座流星群2017“ (CC BYライセンス). nontan3458.
https://www.youtube.com/watch?v=rC7DMnIRErM

[7] “L6470デイジーチェーン接続のテスト“. 北の国から電子工作(仮).
http://spinelify.blog.fc2.com/blog-entry-81.html

いずれも2022/02/22に参照。