« 2012年9月 | トップページ | 2012年12月 »

2012年11月

第33回全日本マイクロマウス大会

全日本マイクロマウス大会に出場された方、お疲れ様でした。
またボランティアの方々お疲れ様でした。
さて、大会でロボトレースのマイマシンの全貌を公表したので、blogでも紹介しようと思います。

新型ロボトレーサ METEORA (メテオラ)です。
名前の由来は、ギリシャの美しき世界遺産と、Linkin Parkのアルバム名より来ています。
全日本マイクロマウス大会 ロボトレース競技の成績は、45位で予選通過はなりませんでしたが、完走することができました。
言い訳すると、加減速走行のルーチンを作る時間がなかったのです。


Dsc08600

Dsc08599


車両型式:左右独立変則四輪
CPU:STM32F103VET6 72MHz
Motor:RE13 118465 ×2
全長:216mm
全幅:170mm
トレッド:91mm
重量:151g
ジャイロセンサ:Invensense社製 ISZ-650
センサ:SHARP GP2S700 ×72
メモリ:Cypress社製 CY14B101P-SFXI 1Mbit SRAMとFlashを組み合わせた不揮発性メモリ
電源:リチウムポリマー電池11.1V

特徴

■アナログセンサアレイ

フォトインタラプタのGP2S700を72個、密に円弧状に配置した"METEORA Sensor"と名付けたアナログセンサアレイが特徴です。まるでスキャナのようにコース路面情報をまるごと取り込むことができます。

METEORA Sensorでは72chの電気信号をリアルタイムに処理する必要がありますが、8ch入力のAD変換ICのADC128S102を9個利用することでこの読み取りを実現しました。
AD変換ICとマイコン間の通信はSPIを利用しています。普通に読み取ると時間がかかるためSTMマイコンのDMA(Direct Memory Access)を使いました。DMAによりCPUを介在せず0.3msで72個のセンサの値を読み取れています。
下図は直線走行時のMETEORA Sensorの生出力です。横軸はセンサ番号、縦軸は距離です。
0587cea9b7b1490ada6c38cad23ab7af

生の信号をうまく処理してやることで直線やカーブも形状はもちろんのこと、METEORAの回転中心からコース上の一番近い点までの距離、コースの接線の傾きも計算できます

下図はカーブ走行時のMETEORAが計算したコース形状です。
縦軸、横軸は共に距離[mm]で、縦軸上向き方向がマシンの進行方向で、原点(0,0)がマシンの回転中心位置です。
3c73cec525e01af5e3214c4bf22de53f

青い線がコース形状、黒い線がMETEORAの回転中心とコース上の点をつないだ線、赤い線が接線の傾きを表しています。
このようにMETEORA Sensorからの情報とオドメトリと組み合わせることで、METEORAはコースの2次元的形状を理解することができます。(この能力を周回速度の向上に活かせたらよかったのですが…)

また一般的なロボトレーサには必ずと言っていいほど、スタートやゴール、カーブの曲率変化を示す印を読み取る"マーカセンサ"がついていますが、METEORAにはマーカセンサがありません。METEORAではラインを読むセンサとマーカを読むセンサが統合されています。
ラインとマーカが40mm離れているという位置関係を利用し、METEORA Sensorからの信号をうまく処理することで、マーカ読み取りを実現しています

ところで、二次元形状を取得するならカメラを使えば良いという話もありますが、カメラは
  * フレームレートが30~60fpsとロボットの目に使うには低速
  * データ量が多く情報取得・処理が困難
という実用上の課題があります。

■電源

METEORA内部の電源は大きく分けて2系統あり、5V電源はBP5275という三端子レギュレータ型DC-DCコンバータを使って生成しています。
高効率なのでMETEORAでは発熱がほとんどありません。ただ出力がノイジーなのでアナログ回路の電源として使うのは避けたほうが良いでしょう。
3.3V電源はBP5275の5V出力をリニアレギュレータで降圧しています。こちらも発熱はほとんどありません。

■Bluetooth

Bluetooth通信モジュールのRBT-001を搭載しています。これはRS-232Cのシリアル通信を無線化するモジュールです。

シリアル通信が無線化されれば、走行中のロボットが持つデータをリアルタイムに可視化でき、コースやマシン状態の情報を確認できます。
またマイコンの小さなRAMにログ情報を保存しようとしなくて済むメリットもあります。液晶画面が不要となり軽量化も可能です。

大量の情報を生み出すMETEORA Sensorによるライントレース機能を開発するときに大いに役立ちました。

ちなみに有線、無線を問わず遠隔操作を禁ずるロボトレースのルールに対応するため、
大会本番で走行するときにはBluetooth通信モジュールを取り外しています。
(通信モジュールがついていても、その場でデータの送受信をしなければ問題無いと思いますが、念のため外しています)

■電流制御と姿勢制御

METEORAは電流センサのACS712を利用してモータに流れる電流を制御しています。制御周期は0.1msです。
モータのトルクは流れる電流は比例するため、電流制御ならモータの出力トルクを自由にコントロールできます。すると、モータの逆起電力定数や巻線やブラシの接触抵抗とその温度変化などを無視することができ、マシンの物理モデルを非常に単純にすることができます。
METEORAの姿勢制御には1ms周期の力制御を採用し、制御則を仮想的にバネマスダンパ系とすることで、ライントレース時の姿勢を安定させています。

コースにマシンを追従させて走行させることを考えると、コースの位置に合わせた
PID制御がまず思い浮かびます。
一般的なPID制御は、方法論はほぼ確立されているにしろ、個別にP、I、Dのゲインを調整する必要が出てきます。

PID制御ではなく、METEORAで採用しているバネマスダンパモデルなら、調整に必要なパラメータは系の固有振動数ωnと減衰係数ζの2つになります。ζは臨界減衰となる0.6固定でよいので、実質ωn一つをいじるだけで姿勢制御の応答性を変えることができます。またモデル誤差やデジタル制御の遅延による影響を除けば、本質的に安定です。

■その他 開発・環境構築

○コンパイラ・デバッガ
Eclipseを使いました。
導入時の環境構築やライブラリの使い方に関しては、
が詳しく、かなりの部分を上記の本に頼りました。
本の著者のサイトで、ダウンロードしてCドライブに置けばそのまま動く開発環境が
圧縮ファイルで提供されているので、カップ麺にお湯を注ぐぐらい簡単にEclipseによるARMマイコン開発を始められました。

○JTAG
JTAGは純正のST-LINKを利用しました。非常に安価ながら、書き込みとプログラムのステップ実行、メモリ内の値の読み取り・書き換え等ができるのでお勧めです。
パターン認識や、複雑なオドメトリアルゴリズムを実装する上でJTAGのステップ実行の
役割は非常に大きかったです。

○回路構成
ストロベリー・リナックスのSTBeeをパクりリファレンスとして使いました。

○Scilab
開発で重要な役割を演じたのがMATLABのパクリ互換ソフトのScilabです。
コース形状を再現するオドメトリや、電流制御の波形、加減速テーブルの生成結果などシリアル経由ですぐグラフにして見ることができたので、非常に役立ちました。シリアル通信の利用方法は

他にもScilabは、C言語で開発したコードをDLLにして使用出来るという強みがあります。
ロボット用の関数をコンパイルしてDLLにして、そのままPC上でテストできるわけです。
私は実機から取得した走行データを、DLL化した関数の引数与え、その計算結果をScilabでグラフで表示できるようにしました。
少しずつソースコートを変えてその結果をすぐ得られるのでデバッグが進みました。
たとえば加減速テーブルの演算結果も、ロボットに付けた液晶画面やシリアル通信経由で詳しく確認するのが困難ですが、Scilabならワンクリックでデータを処理しグラフにすることで簡単に確認できます。
ちなみに普通、Windowsとマイコンそれぞれの環境に依存する部分があるので、そのままではコンパイルできません。しかしソースファイルの作り方を工夫すると、1つのソースコードをEclipseとVisual Studio 2010のどちらでもコンパイルできます。具体的には、Windows側は"WIN32"というマクロが定義されているのでそれぞれの環境に依存する差異の部分を#ifdefや#else、#ifndefと#endifで括ります。

-------------
例:ヘッダファイルのインクルード
#ifdef WIN32     //Windowsに依存した処理を記述
     #include "stdafx.h"
#else            //マイコンに依存した処理
     #include "stm32f10x.h"
     #include "platform_config.h"
#endif
#include "stdio.h"
#include "math.h"
-------------

なおScilabでDLLを使う場合、
 ・C関数の戻り値が取得できない(引数として受け取ったポインタが指すメモリ領域へ戻り値を書き込む)
 ・引数が32bit整数もしくはdoubleの浮動小数点数のポインタに限定される
という欠点があります。ただそれ以上にいろいろなメリットがありそうです。

○バージョン管理
バージョン管理はGit guiを使いました。
今までは開発をすすめる上で、定期的にプロジェクトのソースコードが入ったフォルダのコピーを残していたのですが、gitではそのように無駄にフォルダが増えることがありません。
また昔のバージョンに戻すことも簡単です。

| | コメント (4) | トラックバック (0)

« 2012年9月 | トップページ | 2012年12月 »