こんにちは GROOVE X の Mチーム の hiro-ogawa です。 Mチームの M は Mapping の M でして、主に担当しているのはLOVOTをお迎えされたおうちのマップを作ることと、マップの中でLOVOT自身がどこにいるのかを推定すること*1の機能を開発しています。 今日はLOVOTで実際にどうやっているのかを簡単にご紹介します。
マップを作る手順
マップを作るための基本的な手順は以下の通りです。
- 周りの情報を記録する
- 自分の位置を記録する
- 別の場所に移動する
- 最初に戻る
基本的には周囲の情報をいろいろな場所で集めて、それを繋げばマップができるというわけなんですが、ここで、問題になってくるのは2つ目の項目にある、自分の位置をどうやって知るのか。 自分の位置を知るためにはマップが必要です。でもマップは今作っているところなので、まだマップがありません。 これは、鶏が先か、卵が先かという問題になりますね。
で、どうしているかというと、これらの手順をちょっとずつ実行します。 まず自分の周りの狭い領域のマップを作って、その場所を最初の場所として覚えます。 少しだけ移動すると、これまで見えていなかった情報が見えるようになってきますので、それらを新しい情報として記録します。 少しだけの移動なので、これまで見えていた情報もたくさん残っていて、先程作った狭い領域のマップを使って、自分がどれだけ動いたかがわかります。 それを繰り返すことで、ちょっとずつマップを広げながら探索していきます。
一般的には SLAM
と呼ばれていて*2、これは Simultaneous Localization and Mapping
の頭文字を取ったものです。和訳すると 自己位置推定とマップ作成の同時実行
という感じでしょうか*3。
実際にはだんだん誤差が累積していくなどの問題が発生するので、様々なテクニックで発生する誤差を解消したりしますが、そのお話を始めると際限無く長くなってしまうので、別の機会にします。
LOVOTのSLAM
マップを作るために LOVOT が持つ様々なセンサが使われています。主に使われているのは下記の3つになります。
- 半天球カメラ
- 姿勢センサ
- 深度カメラ
半天球カメラ
周囲360度が見渡せるカメラです。 LOVOTでは人の検出や識別、写真撮影などに使われていますが、マップ作りにも使われています。
具体的には画像の中で特徴的な点を抽出して、その点の動きから自分の動きを推定したり、特徴点の配置から自分の位置を推定したりしています。
画像を用いたSLAMを VSLAM *4 と呼んだりもします。 特にLOVOTではカメラ1台を利用しているので、単眼VSLAMと呼ばれる方式になります。
上の図を見てもわかるとおり、特徴点は均一の壁などではほとんど検出されません。 ですのでシンプルなお部屋よりも、絵画やポスターなど、いろいろ飾ってあるお部屋の方がマップの情報量が増えてLOVOTが自分の位置を見つけやすいかもしれません。
姿勢センサ
IMU*5とも呼ばれており、並進の加速度と回転の角速度が計測できます。 実際に欲しいのは基準位置姿勢からの位置と姿勢の差分なのですが、それを直接計測できるセンサはありません*6。 そこで、加速度を2回積分して位置の変化量を求めたり、角速度を積分して角度の変化量を求めたりします。 ただし、積分では誤差が累積しやすいので、IMU単体で使うことはあまり多くなく、LOVOTでは上記の半天球カメラと組み合わせて利用しています。
VIO*7 SLAM
実は単眼SLAMでは大きさが区別できません。 これは特徴点までの距離がわからないことが原因です。 精巧に作られたミニチュアのセットと実物とでは大きさが全然違うのにカメラで撮影するとその違いがほとんどわからないのと同じです。 そこで、カメラとIMUを組み合わせることで、特徴点の移動した量と、カメラの動いた量との関係から、大きさを推定します。
複数のセンサを組み合わせて使うことをセンサフュージョンと言いますが、このセンサフュージョンを行う際に重要になってくるのが、時刻同期です。 このタイミングがずれると、カメラがほとんど動いていないのに特徴点が大きく動くことや、その逆が発生してしまい、大きさの推定がおかしくなってしまいます。
実は LOVOT ではセンサフュージョンを前提として、専用のカメラモジュールを作っています。 半天球カメラとIMUを同じFPGAに接続して、撮像タイミングとIMUの測定タイミングの時刻を制御することで、正確に時刻同期をさせ、精度の高い特徴点のマップを作っています。 ちなみに、IMU情報は画像フォーマットの中に埋め込まれた形で届けられます。
壁情報
LOVOTアプリでは下のようなマップの表示があります。 VIO SLAMでは画像の特徴点のマップを作ると説明しましたが、特徴点は白い壁などではほとんど取れませんので、通行できない場所を知ることができません。
そこで登場してくるのが、LOVOTのフロントセンサユニットにある深度カメラ。 これは距離画像カメラとも呼ばれていて、画像の画素が色でなく、距離が計測できるようになっています。 下の図は距離を色に変換してわかりやすくしたものです*8。
距離の計測方法にはいくつかの種類があるのですが、LOVOTで使用しているのは Time of Flight *9 という光が対象物に当たって帰ってくるまでの時間を計測して光の速さ*10と掛け算して距離を求めます。 光が帰ってこないと距離が計測できないので、ガラスなどの透明なものや、鏡、つやつやな表面など正反射が強いもの、反射しない黒い物などが苦手ですね*11。
ちょっと話が脱線してしまいましたが、深度カメラとLOVOTの位置がわかると、それをたくさん集めて融合させることで、壁などの障害物情報が作れます。 それがLOVOTアプリで表示されているマップ情報になります。 この壁情報によって通れる場所、通れない場所を判断できるようになって、お出迎えの時の玄関までの経路やネストに戻るための経路が計算ができるようになります。
LOVOTの自己位置推定
マップができたら、そのマップを使って自分の位置を推定します。 LOVOTの自己位置推定では次の4つのセンサを使っています。
- 半天球カメラ
- 深度カメラ
- ホイールモータ
- 姿勢センサ
半天球カメラと深度カメラでは今見えている画像内の特徴点や壁の形状と、自分の持っているマップとを比較して、合致する場所を推定します。 基本的にはカメラ画像をメインで使いますが、夜に部屋の電気が消えている場合などは、画像が暗くて特徴点がうまく取れない場合があるので、そのような場合には深度カメラを使って推定します。
また、補助的に自分の動きをホイールモータの速度情報と姿勢センサの角速度情報から自分の移動量を推定しています。 ただ、この推定は目隠しで歩いているようなものなので、移動量が増えると誤差も累積しやすい問題がありますね。
おわりに
LOVOTはかわいい家族型ロボットではあるのですが、ちゃんとしたロボット技術が使われていて、専用のハードウェアまで作っちゃっているんです。 現在、 GROOVE X ではSLAM / 自己位置推定 開発エンジニアを募集しています。 各家庭や職場で1万体以上が愛されているLOVOTで使われるSLAM技術を一緒に開発しませんか?
また、SLAM以外の分野でも募集しておりますので、LOVOTに関わるお仕事に興味ある方は是非ご検討ください。
*1:Localization、自己位置推定と言います。
*2:スラムと読みます。これだけで検索するとバスケットボールの情報がよく出てくる。
*3:Simultaneous は地デジのサイマル放送のサイマルです。
*4:Visual SLAMの略。
*5:Inertial Measurement Unit の頭文字。
*6:そんなセンサがあったらすごく欲しい。
*7:Visual Inertial Odometry の頭文字。これだけで検索すると・・・以下略。
*8:青いものが近く、赤いものが遠くを表しいます。
*9:ToFと略されます。
*10:約30万km/sです。
*11:誰にでも苦手なものはありますよね。そう、LOVOTにもね。反射強度もわかるので、モノクロ画像みたいなものも取れます。