- Dec 25, 2022 Update structure, fix typo
- Jul 09, 2023 Separate JA and EN articles
- Jul 09, 2023 あやしい日本語を修正
English article: Self-made Omnidirectional for RoboCupJunior 2017 [EN]
はじめに
本記事では全方位カメラを自作する具体的な設計法と製法について説明します。 本記事で紹介するセンサは、2017年世界大会サッカードラフトルールに対応して開発され、ジャパンオープン2017中津川大会に参加するロボットYunit5に搭載されたものです。 中津川大会ではゴールの検出のために使用する予定だったのですが、開発時間や重量制限の関係で残念ながら中津川大会で全方位センサを使うことはできませんでした。
全方位センサを自作するモチベーションとしては、その広い画角による試合での優位性と、ルールにより学生の手による自作が義務付けられている事の2点があります、 2017年よりRoboCupJuniorのルールが大きく変更され、Soccer Open Leagueの競技ボールが従来の赤外線ボールからカラーボールへと変更されました。 加えて、ボールの検出に用いるセンサのうち全方位センサに分類されるものを用いる場合に限り、特殊な制限が設けられています。 以下に2017年のルールブックの一部を引用します。
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.
市販されている全方位カメラ/レンズは使用できない。 全方位カメラ/レンズは、学生によって作られたもののみ使用が許可される。 すなわち、全方位センサの作成はチーム独自の主たる活動に基づいたものでなければならない。
from RoboCupJunior Soccer Rule 2017また、2017年ルールの定める「全方位カメラ」の定義は以下の通りです。
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°(これは人間の視野に相当する)を超えるものを全方位センサと定義する。
競技の特性上、全方位カメラは非常に有利なアイテムですが、それを競技に使用するには学生が自ら作成する必要があります。 光学デバイスとして機能するために十分な精度を持ったミラーを作りには、何らかの製法の工夫が必要となるわけです。 我々のチームでは、ルールが発表されたその年の国内大会の時点で、プラスチックミラーシートを熱成形する手法を用いて、競技に十分に満足な性能を持つ全方位センサを自作することに成功しました。 本記事では、その詳細な作成方法と、その実際の動作を紹介します。
ミラーの設計
本記事で扱う全方位カメラは、図1に示すように曲面のミラーを下からカメラで覗き込む事で、全天球の映像を取得します。 この構造は、魚眼レンズを使用する方法に比べてカメラモジュール(電装系)を低い位置に配置できるため、視界を遮る配線や構造を排除できることや、ミラーの形状やその大きさにによって明るさや画角を変更可能であることが特徴です。
図2はミラーの曲線の設計データです。 全方位センサにおける曲面ミラーの役割は、黄色い線で示したカメラの画角面View surface (before reflection)を、ミラー反射後の画角面View surface (after reflection)に変換することです。双曲線ミラーを使うことで、反射後のLight axisが焦点を通るようになるため、例えばただの球体の面を使って反射させた場合と比較して、画像で読み込んだあとの処理が複雑になります
今回作成したミラーは、双曲線の原理よりミラー反射後の画角面が図2に示したFocus of hyperbola mirrorを中心とする円弧となるように設計しています。 ミラーの形状は数学的に解がありますが、自分は数学が得意ではなかったため、AutoCADを活用して線分を描画しまくることで双極性を描画しました。 数式によるプロット作図ベースでミラーを作る手法では、聞いたところによれば、式を導出したあとGnuplotで"set terminal dxf"して出力する方法が簡単らしいです。

Figure1 Self-made omnidirectional camera 3D CAD design

Figure2 Drawing hyperbola curve on 2D CAD
図3は双曲線ミラー上での光軸の入射角と反射角の関係です。 光軸が曲面ミラー上で反射するとき、入射角と反射角はいかなる点においても等しくなります。 この関係が常に成り立つように、具体的には入射角と反射角は角度の一致拘束を繰り返して作図することで、数学的な式の導出をせずに双曲線を作図できます。

Figure3 The relationship between AOI(*) and AOR(**) on the hyperbola mirror
- (*)入射角: Angle of incident
- (**)反射角: Angle of reflection
作図していると、ある面白い法則に気が付きます。 図2において、光軸は双曲線ミラー上のいかなる点を反射しても、光路長(Length of light axis)が等しくなります。 あくまで近似解ではありますが、図4で実際にAutoCADでそえぞれの光路長を作図した結果から、3経路それぞれの光路長が等しくなっているのが分かると思います。 作図の際には、数学的にはこれが等しくなるらしいというところから、この経路帳測定をもってファクトチェックをかけていました。

Figure4 The mathematical property of length of the optical axis
設計のパラメータを図5にまとめました。 使用するカメラを決めた時点で、カメラ画角は製品により決定されます。 残る必要なミラー画角と焦点間距離は、自分で決定します。
今回の設計では、画角を水平から上 +15 下 -45 degreeとし、ミラー直径を46 mmに決定してすべてのパラメータを決定しました。 ミラー直径を予め決めたのは、アクリルのクリアパイプを特注する際に、汎用在庫品である直径50 mmm, 厚さ2 mmのタイプを使うとコストを削減できたためです。

Figure5 The parameter for calculate Hyperbola-mirror
ミラー型の製作
ミラーの作成には、ヒートプレスと呼ばれる手法を使っています。 これは、比較的シンプルな凸面形状のプラスチックシート整形に用いる製法で、熱を与えて柔らかくしたプラスチックの薄板を型に押し当てることで任意の形状に仕上げる手法です。 ヒートフォーミングを行うに当たり、図6に示すような三次元形状の型のモデルを3D-CADで設計し、これを3Dプリントしてパテ埋めすることで型を製作しました。

Figure6 The hyperbola curve surface 3D CAD Model
図7は、ヒートプレスに用いるモールド(型)です。 3Dプリンタで出力したあと、ポリパテで細かい段差を埋めてなめらかに仕上げています。 熱で溶けてしまう心配がありましたが、幸いパテの耐熱が充分だったので問題ありませんでした。
ヒートプレスのための加熱器具には、以下のような電熱器タイプをお勧めします。 ガスコンロを使うと高い確率で材料に火が移ってしまい危ないので、ガスでの加熱は推奨できません。 また、加熱の際にはきつい匂いが出ますので、換気のいい場所を確保して家庭の理解を失わないようにしつつ行いましょう。
ミラー板には、鏡面めっきのかけられた厚さ0.5 mmの透明な塩ビ板を使用しました。 東急ハンズで購入しましたが、ホームセンターやAmazon.co.jpでも購入できるようです。 300x450なので150x150 mmの板が6枚取れます(写真のように切った後それに気が付く)。
塩ビのミラーシートは、CNCで切削した治具に貼り付け、この状態で加熱して型に押し付けます。 ヒートプレスでは、熱で柔らかくした樹脂を押し付けて延ばして整形します。 両面テープは図10に示すようになるべく円形に近い形に繋げて貼り付けて、押し付けて伸ばす際の伸びしろが均等になるようにします。 加えて、材料は型に押し付ける際に伸びる力がかかるため、それに耐えるようにしっかり固定する必要があります。 材料のサイズは最低でも型の直径の2倍、理想的には3倍程度を確保し、変形して伸びる分の余裕をもたせるようにします。
整形後は、ハサミを使ってミラーから必要な部分を切り出します。 型に押し付ける際に境界線も写るので、それに添って切っていきます。 一旦大雑把に切ってからハサミで仕上げると楽です。
整形後に切り出したミラーです。 型の上に乗せるとピッタリ重なります。 実際には、熱成形やプレス成形においては「スプリングバック」と呼ばれる、整形後の形状が若干型から浮き上がる現象を考慮する必要がありますが、今回はそれを誤差とみなして無視します。 これでミラーが完成です。 次のセクションで、モジュールの組み立てとカメラ取り付けについて説明します。
動画で実際の作業のプロセスを説明していますので参考にしてください。
Movie1 Plastic sheet heat press forming
カメラモジュールとしての統合
本記事で解説する線方位カメラは、色認識カメラモジュールとしてPixy CMUcam5というモジュールを使用し、ミラー部分のみを自作して全方位センサを構成しています。 最近ではシングルボードコンピュータ等を活用して、より高解像度や高フレームレートを実現するチームも増えてきました。 通常サイズのサッカーフィールドであればPixyの解像度でぎりぎり全域のボールを追跡できますが、例えば世界大会のビッグフィールではこれが難しくなるため、より高みを目指したいチームはシングルボードコンピュータの活用を視野に入れてみてください。
全方位センサのフレームは図15に示すように大部分が3Dプリントで作られています。 ミラー部分を支える透明な筒状の部品は市販品をカット販売にて購入したものです。 日本であればアクリ屋.comで、長さを指定して購入できます。
図16のPixy cameraは非常に便利ですが、カラーシグネチャの登録に毎回USB接続とGUIによる確認・指定が必要なのが、非常に運用を難しくします。 ロボットに搭載する際には、USBポートに簡単にアクセスできるように、ハードウェアの分解性を良くするか、ケーブルパスを確保してロボットに組み込んだ状態での認識テストをしやすくしておく必要があります。
入手当時の調達先はAmazon.com(Pixy (CMUcam5) Smart Vision Sensor)で、価格はおよそ60~70USDでした。
Pixyの動作とマイコンでのデータ読み取りのデモ動画です。
Movie2 Pixy test 1 (Read with Arduino), from kemarin-tech.blog.jp
L字のUSBケーブルを使ってロボットからケーブルを引き出して調整します。
実際の動作 Demonstration
動画3は実際に全方位センサとして構成した状態でのデモンストレーションです。 Pixy専用アプリケーションにて映像を取得し、青と黄とオレンジの3色を登録して追跡しています。 マイコンと接続した際にどのように座標が出力されるかは、動画2を参考にしてください。
Movie3 Self-made 360° camera demonstration
図18はオレンジボールを検出できる限界の距離を示したものです。 タイルカーペットが1枚あたり50cmスクエアですので、およそ1m程度であれば検出可能である事がわかります。 因みに、画面を見ると前後方向の視野が削られているように見えますが、水平方向+15°の余裕分が削られているだけなので、正面方向でも遠くのボールは検出可能です。

Figure18 Ball detectable max limit distance (In the state of the photograph, the camera can detect the ball)
図19及び図20は、全方位カメラがボールを検出可能な最小距離を示したものです。 図19において、カメラはボールの頭の部分のみを捉えている状態で、これ以上内側にボールが入り込んでしまうと、ボールを見失ってしまいます。 正面の場合、もう少し前進すればあとはホールドセンサ(ボールがロボットのキッカーに接触しているか検出するセンサ)の情報を使ってボールの追跡が可能ですが、ソフトウェアがやや複雑になります。 この問題の対策としては、ソフトウェアでより複雑な追跡処理をかけるよりも、ロボットがボールを常に視認できるようにメカ設計を工夫したほうがいいでしょう。
図20においても、正面と同様に、カメラはボールの頭を少しだけ捉えた状態です。 僕のロボットの場合、後ろにはユーザーインターフェイスが搭載されており、上下方向の視界がフロントに比べて狭くなってしまい、結果的にロボットの後ろ9[cm]ほどが死角となってしまっている状態です。

Figure19 Ball detectable min limit distance (in front of Robot)

Figure20 Ball detectable min limit distance (behind of Robot)
さいごに
2017年のRoboCupJunior国際ルールで、全方位カメラに関するルールが公開されてから2ヶ月足らずですが、早速こうして自作の全方位センサを実現できたことに満足しています。 いま、世界中のRCJ参加選手がパッシブボール(カラーボール)への対応を迫られており、その中には全方位カメラの導入を模索しているチームも多いと思います。 今回、日本のみならず海外の多くのチームから僕の自作全方位カメラについての問い合わせがあり、僕としても是非多くの人にこの技術をシェアしたいという思いがあったため、この記事の執筆に至りました。 質問等はコメントかTwitterのDMかブログ右のメッセージ欄(公開されません)よりお願いします。
コメント
コメント一覧 (56)
できれば入手元も教えてください。
どの写真に写っているスペーサーだか分からないのですが,Figure17に写っている白いスペーサーはM3のジュラコンスペーサーです。スペーサーは殆どヒロスギネットさんというネットショップで購入しています。
最初の写真に写ってるアルミ(?)スペーサーのことです。
最初の写真に写っているアルミスペーサーも複数あります。
M2とM3も混在しており,どれを答えれば良いか分かりませんので,写真で見える範囲のものを全てお伝えすると
・廣杉ARL-335E
・ドローン用のアルミスペーサー M3 L35 赤アルマイト 詳細不明
・廣杉RL-2007.5E
になります。
柔らかくてねじ穴がすぐバカになってしまいます。
どうやったら防げますか?
ピクシーカメラについてなのですが通信はどの方式で通信していますか?
わたくしはあまりロボットに詳しくないのですがとりあえず通信にはi2cを使おうと思っています。
その他にもいろいろと通信方法があったと思いますがどれが一番良いと思われますか?
お願いします 長文失礼しました。
もし中華製の安いジュラコンスペーサを使っているのでしたら,廣杉さんなどの,工業用のものを選んで使うことをお勧めします。中華製は,整形の品質もそうですが,材料の品質が低いのでナメやすいです。
あとは,締め付けトルクを間違えているか,噛み合わせる長さが短すぎます。
当然ですが金属と同じトルクで締め付けはできませんが,M2でもM3でも,ロボット程度の振動なら,自分から緩まない程度には固定ができるはずなので,それが出来ないとなると何か間違った使い方をしている事になると思います。
PixyのI2Cを試した事がないので,あまり具体的な事は言えませんが
通信方式にはSPIを使って,Pixy側には無条件にデータを出力させ,受信側はそれを受け取るだけの構造になっています。ノイズが乗った際や,チェックサムが合致しなかった場合の処理も省いています。振動とノイズが極端に激しい環境下における特例として,このような方法を取っています。
ロボットに乗せる機器は,常に電気ノイズ(主にモータやソレノイドから発生する電磁ノイズ)と物理的ノイズ(物理的な振動や衝突・ギアのノイズなど)の影響を考慮しないといけません。特に,シリアル通信は,ノイズによってデータが途切れてしまった場合を考えておかないと,例えばI2Cなどの「データが来るまで無限に待機する」構造をしているプロトコルは,ノイズによって信号が遮断されると,永遠にデータを受け付けない無限ループに突入してしまう事があります(もちろんこれが対処されたプロトコルも存在します・対処方法としてウォッチドックタイマなどの暴走検出など)。
従って,ノイズで信号が遮断された時に「データが乱されても通信は継続できる」ようなプロトコルを選ぶのが望ましいと私は思います。
参考程度になれば幸いです。
ありがとうございます
たぶん、嚙み合わせる長さが短すぎたんだと思います。
試してみましたが,紫色の僅かな光が,至近距離でぎりぎり捉えられる程度なので
むしろ赤色のLEDの方が検出し易そうでした。あれを追いかけるのは難しそうです。
公式ボールの赤外光やLEDではなくボールの黒色半透明でトラッキングすることは難しいでしょうか?(同じ色のロボットがあった場合、まずいということは承知の上です。
)
PixyはHSV色空間という,色相空間で色を認識して追いかけていますので,彩度の低い(黒っぽい)色は認識できません。Pixyで赤外線ボールを追いかけるのは難しいと思います。色の付いたケースを内部に仕込ませるなど工夫が必要だと思います。
エポキシ接着剤を使って3Dプリンタのケースに貼り付けています.
型番は.忘れました(すみません)
瞬間接着剤を使うと,乾燥時に溶剤のススが出てしまい,クリアの部品を曇らせてしまいます.乾燥するときにススが出なくて,振動に強い(ゴム系),透明な接着剤が良いかなと思います.
あくまで憶測ですが…
ミラーなど光学機器は専門業者が加工しているはずで、プラスチックやガラスのベースに化学反応で皮膜を形成するのが一般的な製法だと思います。
それとも誤差として無視していますか?
双曲線には2つの焦点があるので、ミラーの反対側の焦点がカメラの焦点と重なるようにします。実際はカメラの焦点の正確な位置を求めるのは難しいので、かなり雑に配置しています。厳密な展開計算などをしないのであれば、それで十分だとは思います。
屈折は誤差として無視しています。
多くの場合、カメラのレンズによる歪みの補正にはチェスボード(キャリブレーションパターンと呼ばれる場合もある)を実際に撮影する事で行います。
歪みを引き起こす細かい要素は無視した、結果ベースの補正をかけるので、仰っているようなクリアパイプの補正などは、それ単体で考慮されることはあまり無いかと思います。
ミラーの反対側の焦点が(カメラの)レンズの中心と重なっているように見えます。
しかしFigure2では確かにカメラの焦点と重なっているように見えます。
私の図への解釈がおかしいのでしょうか?
混乱しています。教えてください。
Figure5を「ミラーの反対側の焦点がカメラの焦点と重なっている」と解釈して下さい。
頭が悪くてごめんなさい。
ただ、私はこのミラーで展開計算などをしようとは思わないので、そこまで厳密な位置決めをしようとも思いません。あくまで、特定の競技に使うために設計されたもので、その構造も非常にラフなものである事をご理解下さい。
ありがとうございます。
TADAさんは頭悪くないと思いますよ。
すいません、疲れて変なことを書いていました。頭→図 です(笑)
丁寧なフォローありがとうございます、今後もどうぞよろしくお願いしますm(_ _)m
時間のある時で構わないので教えてください。
Yunit5XのメインコアはNucleo F446REと互換で、開発環境はmbedです。
Pixyとの通信はUARTを繋げていますが、速度的にはSPIを使ったほうが安心です。通信方式自体はどれを使おうが、ソフトウェア的な変更はほぼ必要ありませんから、通信方式はマイコンの空きポートやノイズなどの物理的な部分で決定されるでしょう。自分は接続が簡単という理由でUARTを選びました。
Kemarin-techのブログに書かれた通り、公式のライブラリはマルチシグネチャの処理にバグがあります。GitHubの方ではIssueが出されていて、Arduinoのライブラリだけは修正がかかっているみたいです。ですからArduinoで使う場合には、GitHubから最新の物を落とせば問題ないと思います。
Pixy用のライブラリは私が独自に書いたものをKemarinの政岡くんと一緒に使ってました。気が向いたら公開しようと思います。
メインマイコンにnucleoを使ってみたいと思っていたのですが、再度検討することにします。
メインMCUはSTM32F446をNucleo boardと同構成の回路で実装し、ファームウェアはmbedを使っています。開発環境はXcodeとgcc-armを使ったオフラインの開発環境を使っています。こちらについては、Kp氏執筆の記事が当ブログに公開されています。
厚さ何センチですか?(全体で取っ手無し測定の場合)
直径は216mmで高さが約170mmです。
ハンドルの高さは全方位センサの高さよりも低いです。
市販品でしょうか?
お時間ある時で構わないのでお願いします
ハンドルは自作のものですが、私が作ったものではありません。
当時チームを組んでいた相方の政岡さんが作ったものです。直径6mmのアルミ棒を、ベンダーを使って曲げて、側面にハンドドリルとハンドタップでねじを切ったそうです。
パラボラの3Dモデルはどうして、全体パラボラじゃなくて、上の部分は平面(?)ですか?
もし全体パラボラでしたら、カメラに何かの影響はありますか?
よろしくお願いします。
Iam confuse about hyperbolic design for 360, do you have 3d file, so i just print from your file
どのように高さを算出すればいいのでしょうか
返信が遅くなり申し訳ありません。
長期間コメントのチェックをしていませんでした。
Amazonのリンク先には600Wとあります。
ヒートフォーミングをするにあたっては、炎を熱源に使うとプラスチックに引火してしまうという問題を避けるために、炎以外の熱源を使うのが望ましいため電熱器を使っています。他にもヒートガンや炭火なども手段としては有効だと考えていますが、当方試したことがありませんので保証はできかねます。
電熱器を使う場合、熱源との距離で温度等は調整がある程度効くので、出力や温度それ自体をそこまで気にしなくてもいいと思います。具体的には、お湯が沸けば熱源の温度それ自体はプラスチックを変形させるのに十分であるはずだ、という程度の感覚です。
返信が遅くなり申し訳ありません。
長期間コメントのチェックをしていませんでした。
記事中にある通り、AutoCADで作図線を引いて離散的に1本ずつ作図しました。計算式が定まっていれば、ExcelでプロットしたものをDXFに置き換えたり、GnuplotでSet terminal dxdして出力したりすることで数式ベースの図形が出せると思います。
高さの算出はどういう式で計算するかに依存しますが、この記事ベースでお答えできる範囲ではないので、ごめんなさい。
返信が遅くなり申し訳ありません。
長期間コメントのチェックをしていませんでした。
全体パラボラでない理由は、センサ本体を写してしまう部分を平面にしてやる事で、その部分を後でくり抜くか黒塗りにしてセンシング範囲から外すことができると考えたからです。
製品化されている全方位カメラのミラー部分には、センサ本体が写り込んでしまう部分には黒色の三角コーンが立てられていて、これによってカメラ自身の映り込みとクリアパイプ内部の乱反射による映像の曇りを防いでいるようです。
返信が遅くなり申し訳ありません。
長期間コメントのチェックをしていませんでした。
E-MAX GT2218/09 1100KVを使っています。ブラシレスESCにはHOBBYWING XRotor 20Aを使っています。詳細なハードウェアの解説記事はどこにも上げていないので、情報が無いと思います。すみません。
『画像内で青or黄をさがす』→『その物体の座標を読み取る』→『メインマイコンに送る』→『その向きにシュート』
こんな感じくらいしか思いつかないのですが、skycrewさんがopenMVの開発にあったて参考にしたものがあれば教えていただきたいです。(やはりopenMV公式から活用できそうなライブラリや機能をひたすら探すしかないのでしょうか)
うちはSKY Crewさんのブログではないのでお答えできないですが、TwitterでSKY CrewのKossanさんにメンションを飛ばしておきました。運が良ければここで返信してもらうか、ご自身でTwitterアカウントを作ってKossanさんに直接聞いてみるのがいいかと思います。メンション先はPCでブログ見ると僕のタイムラインが出てきますのでそこからリプライ先を見つけてください。
以前skycrewさんのほうに質問したのですが返信があまり来ず(数年前の記事なので時間がたっていることもあると思いますが…)、時間に余裕がなかったのでカメラを使っていらっしゃるTADAさんに急いで質問をコピペで送ってしまいました。
また、skycrewさんの方にもメンションを飛ばしてくださりありがとうございます。もし気分を害してしまったのでしたら本当に申し訳ないです。次回からは自分でtwitterのアカウントを作りこのようなことが起こらないよう努めます。
TADAさんより連絡を受けました、SKY Crewのkossanです。
SKY Crewのチームブログにて返信差し上げましたので、ご確認ください。