この記事は高知工科大 Advent Calendar 2017 25日目の記事です。
はじめに
メリークリスマス
まあ、卒論の追われる私には関係ない話ですが
この記事では卒論の一部になる予定のステレオカメラによる距離測定について書きます。
ところで皆さん、ROBO-剣というロボット競技をご存知でしょうか?ロボットに剣道をさせるといういたってシンプルなロボットの大会です。Robocupと同じように将来は人と剣道できるロボットを目指すのだとか。
このROBO-剣というい競技はいつぞやのロボミントンのように手動制御と自動制御が混在する大会で、自動制御の場合、相手の位置を検出する必要があります。そのため叩くとポイントになる面・胴・小手にはそれぞれ赤・青・黄の色がついています。そこで今回は赤色の面を認識するためにステレオカメラで距離測定をやってみました。
実験環境
アマゾンで適当に購入したLogicoolのwebカメラをLアングルで挟むことで、平行になるようにしています。
カメラ間の距離とかは実験しながら調節する予定。
とりあえず距離を測る
距離を測定するまでにカメラの歪みを補正したりステレオカメラのキャリブレーションとかいろいろありますが、このカメラでチェストボードを映してみた感じ、いけそうだったのでとりあえず測定をしてみることに
処理の手順として
- カメラから画像を取得
- 色抽出&二値化
- 平滑化処理
- 対象の重心位置の推定
- 左右の画像から得られた対象の重心位置の差を求める
- 重心位置の差から距離を求める
今回は検出する物体が赤色の物体と決まっていたのでこのような手順で試してみました。
ステレオカメラで距離を測る場合、三角測量の考え方で距離を求めることができます。
このとき以下の式でDを求めることができます。
$D = \frac{B*f}{Z}$
このときZが左右の画像から得られた重心位置の差、Bがカメラのレンズ間の距離、fが焦点距離になります。
ここまでの処理で、実際の距離と計算によって算出された距離がどうなるか実験してみます。
軸ラベルがないのですが、横軸は実際の距離[mm]、縦軸は計算結果です。
何かがおかしいですが、線形なグラフができたのでひとまず良しとしましょう。
値を補正する
先ほど出てきた
$D = \frac{B*f}{Z}$
の式を変形させてグラフを表示させると、なんとなく距離ごとの誤差が線形近似できる気がします。
そこで、エクセルで計算された近似式をもとに先ほどと同じように距離を測定してみます。
前回上げたやつが見づらかったので上げ直し pic.twitter.com/sSfFBvS3fU
— ringo (@Malus_Mill_) 2017年12月26日
動画の中で僕が動かしているあらびき塩こしょうの頭の距離を端末に表示しています。あらびき塩こしょうに表示されている点が重心位置になります。
映像ではわかりにくいですが、プラスマイナス2,3cmぐらいの精度で距離を測定することができました!!
おわりに
クリスマスまでに記事書きたかったけど間に合わず申し訳ない
なんとなくステレオカメラで距離を測定することができました。
今後は精度の向上や、実際にロボットの制御にこの記事の測定システムを組み込むことを目標にしたいと思います。