P1140154
ジャパンオープン中津川2017に参加するロボットに搭載されている,自作の全方位カメラについて説明します. このセンサは,2017年サッカードラフトルールに向けて開発したものです. 中津川大会ではゴールの検出のために使用する予定だったのですが,開発時間や重量制限の関係で残念ながら中津川大会で全方位センサを使うことはできませんでした.

はじめに:Summary

RoboCupJunior Soccer - Rules 2017

2017年よりRoboCupJuniorのルールの一部が新しくなり,サッカーオープンリーグ競技で用いられるサッカーボールが,従来の赤外線ボールからパッシブボール(オレンジ色のカラーボール)に変更になりました.これによりオープンリーグに出場するロボットは,画像処理を行うためのデバイスを搭載する事が必須となりました.

ボールを検出するためのカメラについての規定があり

8.2.2 Limitations 

All commercial omnidirectional lenses/cameras are not permitted. Only omnidirectional lenses/cameras made by students are permitted, meaning that their construction needs to be primarily and substantially the original work of a team. 

「市販されている全ての全方位カメラ/レンズは使用できない.全方位カメラ/レンズは,学生によって作られたもののみ使用が許可される.すなわち,全方位センサの作成はチーム独自の活動に基づいたものでなければならない」

...omnidirectional is defined as having a field-of-view of more than 140 degrees horizontally and more than 80 degrees vertically (these values reflect the optical system of the human eye). 

「画角が水平140° 垂直80°(これは人間の視野に相当する)を超えるものを全方位センサと定義する」

カメラの視覚情報を基にサッカー競技をする前提においては,全方位カメラは非常に有利なアイテムになりますが,これを搭載したい場合には学生が自分で作らなければいけないという事です.全方位センサは光学機器ですから,自作のハードルはそれなりに高いです.

本記事では実際に自作した全方位センサの作成例として,プラスチックミラーの熱成形による双曲面ミラーの作成方法と,それを用いて構成したセンサの実際の動作を紹介します.

The RoboCupJunior's rule has changed in 2017, The biggest change is that the ball used for the competition has been changed from IR Ball to Passive ball. Depending on this change, now all participants have to use camera sensor to detect ball.

Also, there are specific limitation for Omnidirectional-camera, which is defined as a with over 140° horizontally and more than 80° vertically field of view. Depending on this rule, if you'd like to use omnidirectinal camera, you need to develop it by yourself.

Now, here is a examples of develop an Omnidirectional-camera using a vinyl sheet mirror and heat-forming, and actual behaviors are also introduced here.

ミラーの設計
Designing of mirror

Inventor1
Figure1 : Self-made 360 degree camera 3D-CAD design
slide-3
Figure2 : Drawing Hyperbola curve on 2D-CAD

今回作成した全方位カメラ[Figure1]は,曲面のミラーを下からカメラで覗き込むことで,全天球の映像を取得するタイプです. 魚眼レンズを使用する方法に比べて,カメラモジュール(電装系)を低い位置に配置できること,同じカメラでもミラーの形状で光の量や画角を変更可能なことがメリットだと思います.

[Figure2]はミラーの曲線の設計データです. 全方位センサにおける曲面ミラーの役割は,黄色い線で示したカメラの画角面 View surface (before reflection)を,ミラー反射後の画角面 View surface (after reflection)に変換することです.双曲線ミラーを使うことで,反射後のLight axisが焦点を通るようになるのがポイントです.例えばただの球体の面を使って反射させた場合には,反射後の画角面View surface (after reflection)が1点で交わることが無いため,画像で読み込んだあとの処理が複雑になります.

今回作成したミラーは,双曲線の原理を用いて,ミラー反射後の画角面が,[Figure2]に示したFocus of hyperbola mirrorを中心とする円弧となるように設計しています.これにより,反射前と反射後のView surfaceが線形の関係であるため,カメラで取得した映像の計算がより正確かつ簡単になります.
※ 双曲線の2つの焦点と,どちらかの双曲線上の点を繋いだ2本の直線の角度変化の関係性について確認する必要がある(2017/4/4)

設計にはAutoCADを使用し,双曲線は拘束と繰り返しコマンドを駆使して作図しました(脳筋手法).

The appearance of the omnidirectional camera is shown in [Figure 1]. This sensor is mechanisms to acquire the image of the Omnidirectinal-view by looking through the curved mirror from the bottom with the camera. Compared with the method using a fisheye lens, this mechanism is advantageous that the camera module and the electrical system can be arranged at a low position, and even with the same camera, you can change the amount of light and the angle of view by changing the shapes of a mirror.

I calculated hyperbolic mirror shape with 2DCAD as shown in [Figure2]. In the omnidirectional sensor, the curved mirror functions to convert the view surface (before reflection) to the view surface (after reflection).
Using the Hyperbolic mirror, the light axis after reflection will pass through the Focus point of hyperbolic curve. this is very important point, for instance, if you use a perfect sphere as a mirror, the view surface (after reflection) becomes an arc with no center, and you can not process the image obtained by this.

slide-1
Figure3 : The relationship between AOI(*) and AOR(**) on the hyperbola mirror
(*) 入射角 : Angle of incident
(**) 反射角 : Angle of reflection

双曲線ミラー上での光軸の入射角と反射角の関係性を[Figure3]で示しています.
光軸が曲面ミラー上で反射するとき,入射角と反射角はいかなる点においても等しくなります.この関係が常に成り立つよう接線の角度を決定し,それを画角のステップごとに繰り返して曲面を作図しました. CAD上では,入射角と反射角は角度の一致拘束を適応し,必要な回数だけコピーして繰り返し作図しています. 毎回角度の一致拘束を適応する必要があるので,それなりに時間がかかります.

今後の展望としては,パラメータからDXF図面(座標のテキストバイナリデータ)を生成するソフトウェアを開発する事が考えられます. 今のところ一度作成したきりもう変更は滅多にしないので需要がないのですが,機会があればプログラミングの練習がてらにチャレンジしてみたいと思います.

※2018/09/13追加
聞いたところによると,Gnuplotで"set terminal dxf"して出力する方法が簡単らしいです.

slide-2
Figure4 : The mathematical property of length of the optical axis

[Figure2]において,光軸は双曲線ミラー上のいかなる点を反射しても,光路長(Length of light axis)が等しくなります. 実際,AutoCADでの作画では,計算通りの値は出ていませんが,ある3点を無差別に選択し,そえぞれの光路長を測定した結果[Figure4]を見ると,それぞれの光路長の長さは,その差が十分に無視できる程小さく,従って光路長はいかなる点で反射しても等しいと結論付けることができます.

光路長の計算は,双曲線の数学的性質に基づくものですが,その説明は今回は割愛します.

参考:
双曲線の定義 (焦点がy軸上の場合)
Hyperbola - Wikipedia


parameter
Figure5 : The parameter for calculate Hyperbola-mirror

今回僕が双曲線を描いた手法は,線分を数十本くらい作図する脳筋手法です.
ミラーの物理的な原理が分かっていれば作図だけで必要な機能は満足できますが,計算で求める場合でも,以下の(1) ~ (3)のパラメータがわかっていれば,その条件を満たす双曲線の関数がただひとつ求まります.
(1) カメラの焦点から双曲線の焦点までの距離
(2) カメラの画角
(3) 全方位センサの垂直画角

設計のパラメータを[Figure5]にまとめました.
使用するカメラを決めた時点で,カメラ画角は製品により決定されます. 残る必要なミラー画角と焦点間距離は,自分で決定します.

今回の設計では,画角を水平方向+15 -45[degree]とし,ミラー直径を46[mm]に決定してすべてのパラメータを決定しました. ミラー直径を予め決めたのは,アクリルのクリアパイプを特注する際に,汎用性の高い直径50[mm] 厚2[mm]のタイプを使うとコストを削減できたためです.

ミラーの作成
Manufacturing of mirror

Inventor3
Figure6 : The hyperbola curve surface 3D-CAD Model

[Figure6]は3D-CADで作成した双曲面のモデルです.
このデータを使用して,実際にミラーを作成してきます.

ミラーの作成には,ヒートプレスと呼ばれる手法を使っています.
51o8FqBRN4L
イズミ 電気コンロ IEC-105 オレンジ
購入当時で1500円と非常に安かったためこれを選びました.
ヒートプレスにガスコンロを使う例もあるようですが,高確率でプラ板に火が付くためお勧めしません.
上の商品のような,電熱器タイプをお勧めしますが,家にあるからと言って例えばキッチンから電気コンロを借りて樹脂を溶かす…なんてことをすると,以下お察しなので,なるべくご家族と喧嘩にならないメイカーライフを送りましょう(自分は新規購入しました).

UNADJUSTEDNONRAW_thumb_2f7
Figure7 : The mold for plastic heat forming

[Figure7]は,ヒートプレス整形のためのモールド(型)です. 3Dプリンタで出力したあと,ポリパテで細かい段差を埋めてなめらかに仕上げています. 熱で溶けてしまう心配がありましたが,幸いパテの耐熱が充分だったので問題ありませんでした.

UNADJUSTEDNONRAW_thumb_2eb
Figure8 : A vinyl chloride mirror sheet  

[Figure8]はヒートプレス整形するt = 0.5[mm]塩化ビニールのミラーシートです.
東急ハンズで購入しましたが,ホームセンターや Amazon.co.jpでも購入できます .  
300x450なので150x150[mm]の板が6枚取れます(写真のように切った後それに気が付く).

UNADJUSTEDNONRAW_thumb_2ec
Figure9 : Cutting with cnc milling machine
UNADJUSTEDNONRAW_thumb_2ed
Figure10 : Taping
UNADJUSTEDNONRAW_thumb_2ee
Figure11 : Paste the mirror sheet

塩ビのシートをCNCで切削した治具に貼り付けます. 正直CNCじゃなくても作れると思うのですが,部屋を汚したくなかったのと,僕の腕力の低下によりCNCを使っています.

ヒートプレスでは,熱で柔らかくした樹脂を押し付けて延ばして整形しますので,両面テープは, なるべく円形に近い形に繋げて貼り付けます [Figure10]. また,押し付けた際に剥がれてしまわないように,なるべくしっかり固定します.


Movie1 :  Plastic sheet heat press forming

UNADJUSTEDNONRAW_thumb_2f1
Figure12 : Detach
ハサミを使ってミラーから必要な部分を切り出します. 型に押し付ける際に境界線も写るので,それに添って切っていきます. 一旦大雑把に切ってからハサミで仕上げると楽です.

UNADJUSTEDNONRAW_thumb_2f3
Figure13 : Detached mirror and put it on the mold
切り出したミラーです. 型の上に乗せるとピッタリ重なります. 実際には,熱成形やプレス成形においては「スプリングバック」と呼ばれる,整形後の形状が若干型から浮き上がる現象を考慮する必要がありますが,今回はそれを誤差とみなして無視します.

これでミラーが完成です.
次のセクションで,モジュールの組み立てとカメラ取り付けについて説明します.

カメラモジュールとの接続
Connection to camera module

UNADJUSTEDNONRAW_thumb_2f8
Figure14 : Printing parts using 3D printer
UNADJUSTEDNONRAW_thumb_2f4
Figure15 : Parts of 360° camera module

全方位センサのパーツは3Dプリンタを使用して出力しました.
フィラメントはAfiniaのABS Plus Blackを使用しています.

アクリルの透明パイプは特注品です. 今回は アクリ屋.com さんにお願いしました.

d30063d1
Figure16 : Pixy CMUcam5
※画像引用元(丁度いい写真が無かったから拝借):http://kemarin-tech.blog.jp

カメラモジュールには Pixy CMUcam5を使用しています.
Amazon.com(US)で60~70USD (およそ7000~8000JPY)で購入できます.

Pixy (CMUcam5) Smart Vision Sensor



Movie2 : Pixy test 1 (Read with Arduino)
from  http://kemarin-tech.blog.jp/archives/19994568.html

Pixyの動作とマイコンでのデータ読み取りのデモ動画です.
P1140164
Figure17 : Assemble 360° camera module and connect usb cable
L字のUSBケーブルを使ってロボットからケーブルを引き出して調整します.  

実際の動作
Demonstration


Movie3 : Self-made 360° camera demonstration
動作のデモンストレーションです. Pixy専用アプリケーションにて映像を取得し,青と黄とオレンジの3色を登録して追跡しています. マイコンと接続した際にどのように座標が出力されるかは,[Movie2]を参考にしてください.

P1140170
Figure18 : Ball detectable max limit distance ( In the state of the photograph, the camera can detect the ball )

[Figure18]はオレンジボールを検出できる限界の距離を示したものです.
タイルカーペットが1枚あたり50cmスクエアですので,およそ1m程度であれば検出可能である事がわかります. 因みに,画面を見ると前後方向の視野が削られているように見えますが,水平方向+15°の余裕分が削られているだけなので,正面方向でも遠くのボールは検出可能です.

P1140171
Figure19 : Ball detectable min limit distance (in front of Robot)
P1140174
Figure20 : Ball detectable min limit distance (behind of Robot) 

[Figure19]及び[Figure20]は,全方位カメラがボールを検出可能な最小距離を示したものです.

[Figure19]において,カメラはボールの頭の部分のみを捉えている状態で,これ以上内側にボールが入り込んでしまうと,ボールを見失ってしまいます. 正面の場合,もう少し前進すればあとはホールドセンサ(ボールがロボットのキッカーに接触しているか検出するセンサ)の情報を使ってボールの追跡が可能である可能性があります,今後検討が必要です.

[Figure20]においても,正面と同様に,カメラはボールの頭を少しだけ捉えた状態です.
僕のロボットの場合,後ろにはユーザーインターフェイスが搭載されており,上下方向の視界がフロントに比べて狭くなってしまい,結果的にロボットの後ろ9[cm]ほどが死角となってしまっている状態です.

解決方法としては以下が考えられます.

①ハードウェア的な解決方法
センサの位置を高くする,あるいは死角を発生させているオブジェクトの位置を変更する.
課題としては,ハードウェアの再設計自体のコストと,デザインへの影響が考えられます.

②ソフトウェア的な解決方法 
ボールの座標自体を,時間との条件付き確率分布として扱う.
→連続してボールを検出したのであれば,その辺りにボールがある可能性が高い
→連続してボールを非検出であれば,その辺りにボールがある可能性が低い

課題としてはただただ難しそうってだけなので,これは頑張って実装してみたいと思います.
「連続」の定義を調整しないと,鈍くなってしまったりノイズに弱くなってしまったりしそうですが,Pixyの送ってくる座標自体が結構Noisyなので,いずれにせよ時間領域でのフィルタは必要になってくると思います.

おわりに
Conclusion

2017年のRoboCupJunior国際ルールで,全方位カメラに関するルールが公開されてから2ヶ月足らずですが,早速こうして自作の全方位センサを実現できたことに満足しています.

いま,世界中のRCJ参加選手がパッシブボール(カラーボール)への対応を迫られており,その中には全方位カメラの導入を模索しているチームも多いと思います. 今回,日本のみならず海外の多くのチームから僕の自作全方位カメラについての問い合わせがあり,僕としても是非多くの人にこの技術をシェアしたいという思いがあったため,この記事の執筆に至りました.

質問等はコメントかTwitterのDMかブログ右のメッセージ欄(公開されません)よりお願いします.