はじめに / Introduction

2015年のロボカップジュニア世界大会へ出場したロボットのプレゼンテーションです。 This article describes a robot I developed for the RoboCupJunior 2015 world tournament.

記事内の画像は、クリックしてフルサイズで見ることが出来ます(これのためだけにブログを移行しました)。
チームBlogの方にも情報を載せています。

ロボット紹介 - Gcraud

世界大会へ出場した2台のロボット、通称「関東の赤いルンバ」。 2015年の日本大会で準優勝し、1位が海外招待チームであったため国内順位1位として日本代表選抜された後に、ハードウェアをゼロベースで開発しました。 間にテストもあったためスケジュールはとてもハードでしたが、当時の開発メンバー(自分と相方のKp)と一緒に頑張って、2ヶ月間という限られた時間でロボットを完成させました。

ロボット1台をクローズアップして紹介します。 2台のロボットはハードウェアは完全に統一されており、同じプログラムを搭載すれば同じ動きをするように調整されています。 ロボットの外観は、赤い天板と黒のカーボン製フレームとのコントラストが特徴的なデザインになっています。 ユーザーインターフェースとして上面のリング状のフルカラーLED、ルールで規定されたキャリー用ハンドル(赤天板の後ろ側に配置)、周辺磁場の影響を回避するために高い位置に設置されたコンパスセンサーなどを備えます。 あまり特徴的な外観を有していないため注目されにくいですが、ボール補足エリアにキッカー(ボールを蹴る装置)を搭載しています。

コンパスセンサーモジュールです。 センサには"HMC5883L"が搭載されたボード"GY-271"を使用しています。 モジュール内部にマイコンを搭載しており、2軸コンパスセンサから逆三角関数を使用して方位(角度)を計算する処理や、EEPROMを用いたロボットの初期方向の記録、周囲の磁場環境のキャリブレーション処理などが組み込まれています。

計算された角度情報は、115200bpsのUARTシリアル通信でメインマイコンへ転送されます。 この際、送信周期を一定(75Hz)にすることで、メインマイコン側で角度から角速度への微分計算を行う際に、受信タイミングの観測を行わずレート一定として取り扱えるようにしました。 これにより、ロボットに正面を向かせるために使用しているPID制御が、より簡単に実装できるようになりました。

地磁気センサによるロボットの方向検出にあたって、地磁気センサが強い磁気にさらされると故障する問題がありました。 センサが故障した場合に備えて、センサーボード”GY-271”は単体で取り外し交換できるよう設計されています。 調整中にMacBook(ディスプレイ上部に磁石が入っている)に近づけてしまってHMC5883Lが正しい値を返さなくなった事がありましたが、ロボットを分解することなくモジュールだけを交換し復帰する事ができました。

ロボットの天板に、ステータスやモードの表示を行うための表示器として搭載しているNeo Pixel Ringを動かしているところです。 公式のライブラリがとても優秀で、きちんとクラスで定義された関数で制御することができます。 今のところ目立ったバグも無く、海外でアート用などで普及しているデバイスなので情報が豊富でした。 電源とGNDとシリアルの3芯接続で制御する事ができます。

上下の分離は、六角穴付きボルトを6本外せば簡単に分離する事ができます。 ロボットの上下部接続用の配線を20pinのフラットケーブル1本に集約することで、大幅にメンテナンス性を改善しました。

天板の裏にメイン基板を搭載しています。 ボールを視認するための赤外線センサは、メイン基板から真下にスペーサとピンヘッダで接続されています。 机に直接置いてもパターン面が傷つかないよう、上下接続フレームがメイン基板よりも下に出っ張るよう設計されています。

ボールセンサ Ball Sensor

赤外線ボールを検出するセンサです。 16個のTSSP-58038が円環状に配置されています。 センサ遮蔽の内側に、ボトムユニットと接続されるフラットケーブルのコネクタが取り付けられています。

赤外線センサーをはめ込むとこんな感じになります。 フラットケーブルの交換自体は、この状態でも行えます。 マシンの重心を下げるために極限まで上ユニットを薄くするために工夫した結果、こうなりました。 メンテナンス性も悪く無いですし、なかなか上手くいった設計の1つではないかと思います。

ボールを検知するための赤外線センサーの遮蔽部分です。 ライトウェイトリーグは重量制限が厳しいため、Φ2x10のエンドミルとCNCを活用して、POMから削り出しで作りました。

オリジナルマインドさんの両面フライスされたPOMは厚さ精度が保証されていてとても使いやすいです。 今回ばかりは自分でフライスする時間も無かったため、今回はふんだんに使っています(笑)

メイン基板 Main Circuit Board

搭載パーツ一覧
CPU
  • STM32F401(Nucleo Board) x 1
  • ATmega32U4(A-Star 32U4 Mini) x 1
UI

ロボットにはフィールドの壁を検知して自分の位置を判断するための超音波距離測定センサが搭載されています。 このマシンに使っているのはAmazonで激安購入できるHC-SR04です。 当たりハズレが大きいですが、ちゃんと使えるものはちゃんと使えます。 PalalaxのPingと違ってTrigピンとEchoピンが別になっていますが、2kΩほどの抵抗を挟んでTrigピンを使えば3ピンで使うことができ、このマシンでも実際そのようにして使っています。

メイン基板は、壁面に超音波センサを埋め込んでボックス化しました。 超音波センサを垂直に立てるパーツと、スペーサーとしての機能を両立させた工夫です。 非常にコンパクトにまとめられていると思います。

メインマイコン Main Microcontroller

メインマイコンにはSTmicro社のSTM32F401CRを搭載したマイコンボード"Nucleo" (秋月電子URL) を使用しています。 非常に安価に入手する事ができ、接続してすぐ使える「お手軽さ」も兼ね備えたマイコンです。 マイコンのソフトウェア開発は”相方の開発したXcodeライブラリ”を使って、Xcodeで行っています。。

小型化・軽量化するため、ST-Link部分とマイコン部分を切り離しています。 ロボットにプログラムを書き込む通信ポートは、ロボットの正面にMIL6Pinコネクタを設け、そこへST-Linkを接続する方式をとっています。 逆接続防止のため、逆に繋ぐと基板エッジにコネクタが引っかかるよう設計されています。

サブマイコン Sub Microcontroller

メインマイコンを補助するために、コンパスモジュール内部に1つ、ラインセンサ監視とユーザーインターフェイス用に1つ、計2つのサブマイコンを搭載しています。 インターフェイス用マイコンは、ロボットが走行中にはラインセンサの処理を行い、停止しているときには照光式トグルスイッチやロータリエンコーダの読み取り、ブザー音の出力や16連シリアルLEDの制御を行います。

使われているのはAtmelのATMEGA32U4で、Arduinoで開発しています。 ただし、そのままの状態では使っておらず、内部のdigitalRead()関数などは全て相方のKpによって改造されたものが使われています。 改造後のArduinoは、デジタルピン等をmbedと同様にクラスで扱うことができ、コード上のマジックナンバーを減したり、処理時間を短縮したりしています。

電源 Power Circuit

5V電源には村田製作所のDCDCコンバータ(秋月電子URL)を使っています。 元々は表面実装用に設計されたモジュールですので、このような無理矢理な付け方はあまり推奨されませんが、いまのところ問題なく動いています(残る心配はハンダ割れ)。 固定は裏返しにしてピンで空中配線で固定しています。 パターンにはリップル除去用のチップコンデンサが入力/出力に載ってます。

コイル系の電源モジュールは、物理的に圧力を加える事で電圧がブレる事があるので注意しています。 逆さ付けにする際には、基板との間に隙間を作るようにしました。

電圧は青い半固定抵抗で決定しています。 最初に調整してから1/100[V]単位でのズレはほとんど無く、安定して動いています。

足回り Drive Unit

移動の効率を上げるためには可能な限りロボット重心を低くする必要がありました。 以前まで地上から少し高い位置に配置していたバッテリーも、今回はマシンの一番低い位置に配置することにしました。

電源スイッチの基板です。 裏にヒューズがはんだ付けされているため、万が一切れた際にはスイッチやケーブルごと交換します。 スイッチはパフォーマンスの面からすれば重いし効率下げるだけのパーツですが、そもそもの安全対策として無くてはならない機能です(今のルールだとヒューズの搭載は義務付けられているようです)。 万が一内部で回路が短絡した場合でも、すぐにスイッチを切ることができるか、保護回路でバッテリーの過放電を防止できるような設計をしています。

昇圧回路 Step-up DCDC Convertor

左半分はほとんどキッカー用の昇圧回路とスイッチング回路です。 金色のコンデンサは昇圧電源のチャージ用、中に昇圧された60[V]の電源が常にチャージされます。 電源を切った際にコンデンサの電圧が自然放電されるよう、1MΩ程度の抵抗をコンデンサの両端に挟んであります。 コンデンサは63V1000μFのオーディオ用アルミ電解コンデンサを2個並列で運用していますが、耐圧ぎりぎりで運用するのは破損の恐れがあるため推奨しません。

DCDCコンバータの入出力電圧差の定格を守るため、昇圧回路を2段に分けています。 1段目で12[V]→20[V]まで昇圧し、2段目で60[V]まで昇圧することで、昇圧回路の要件「入出力比が3を超えてはならない」を守っています。 先輩が実装しているのを真似してこのような形にしました。

キッカー Kicker

ボールを蹴るための装置”キッカー”です。 ソレノイドはタカハ機構さんの"CB1037"の端子間抵抗10Ωのタイプで、プランジャの先端以外は無改造で使用しています。 ほとんどのマシンが固定面を上下に向けて使っているのに対し、板金曲げパーツを駆使してリニアガイドと抜け止めストッパー機能を追加しながら、シンプルに実装しました。 ソレノイド除く周辺パーツで、計30[g]に抑えることができています。

 モータ固定マウント Motor Holder

モーター(maxon RE16 + GP16A)はA7075削り出しの固定ブロックにねじ止めする設計です。 シャーシへの固定用に、厚5mmの側面にM3のタップで固定穴が作られています。 maxon GP16A(ギアヘッド)には、M2の固定穴が2本しかなく強度に不安があったため、ギアヘッドの先端3mmほどを埋め込む形状を設け、ラジアル方向の負荷をフレームで受け止める構造にしました。 これにより、ねじにかかる負荷がスラスト方向に限定され、今まで多かったギアヘッド固定ネジのトラブルは発生しなくなりました。

オムニホイール Omniwheel

独自設計のオムニホイールです。 外径は58[mm]と、このサイズのロボットにしては大きめの部類に入ると思います。 サイドホイールのグリップにはシリコンのOリングを使っていましたが、コストが高いしあまり長持ちしないしOリングすぐ外れるしで、あまり良いところがありませんでした。

日本大会のロボットのスパイクグリップと比較すると、グリップはその半分以下くらいだと思います。 Oリングの外れとグリップを成立させるのが難しく、外れないように溝を深くしていくと、グリップはどんどん弱くなっていきます。 ブレーキが効かかった事によるアウトオブバウンズが多発し、世界大会では最高速度の50%も出せませんでした。 路面に大きく依存するのも問題で、例えば北九州オープンの時の床は東リのカーペットだったので、比較的良くグリップしたのを覚えています。

加工方法 Machine Tools

ロボット製作のための設備はほぼすべて自分用意していました。 CNCでCFRPを加工する方法については、過去に書いた記事で詳しく紹介しています。

ロボットのフレームの加工は、オリジナルマインドさんのKitMill SR420を使いました。 上で紹介した全てのパーツを、このCNCと卓上ボール盤のみで仕上げています。 オリジナルマインドさんのCNCを無くして、このマシンは生まれませんでした。

今回製作したロボットには、2足歩行ロボット時代からお世話になっている浅井製作所さんの”低頭ネジ”を使っています。 低頭ねじを使うと、メカ設計の際に頭の高さをあまり気にする必要がなくなる上に、母材の金属の体積そのものが減るので重量削減にも大きく貢献します。 何よりも、精度の高いねじは、精度の高いロボットを作るために重要です。 ねじなめんなよ!

個人でも数百本単位から注文ができます。 関東圏の人はぜひ一度、工場見学に行ってみてください!(埼玉県草加市にあるよ〜) 以下リンクからどうぞ:
浅井製作所URL

世界大会での試合の様子 Movie

YunitのYouTubeチャンネルから試合の模様を見ることが出来ます。

その他の写真 Photo Garally