キャタピラユニットCuGoを利用したAGVシステムについての解説を行います。
本システムはArduinoとPixy2を用いてCuGoの制御を行っています。
実際に走行している動画がYouTubeにアップロードされておりますので、そちらも併せてご覧いただければと思います。
本ページでは、解説とサンプルプログラムの掲載を行っております。ご活用いただければ幸いです。
1.全体像
本システムは以下の製品を使用しています。
- Pixy2
- Arduino Uno
- CuGo
- CuGoドライバ回路
Pixy2にてラインを検知し、そのラインの情報をArduinoに渡します。Arduinoは、そのラインの情報を元に左右のキャタピラユニットの速度を制御しています。これによりライントレースを実現することが出来ます。
Pixy2のライン認識調整、Arduinoでの最高速度調整を行うことにより、より適応したAGVシステムを構築することが可能です。
2.Pixy2
Pixy2とは、既にライントレースや物体追従のアルゴリズムが組み込まれたカメラユニットです。
Arduinoと接続を行う前に、PixyMonと呼ばれるソフトウェアにて調整を行います。
PixyMonでは、アルゴリズムの切り替え、各アルゴリズムごとの細かな設定を行うことが出来ます。今回はライントレースのアルゴリズムを用いますので、それについて特に言及します。
まずは、PixyMonのインストールを行います。以下のリンクのPixyMon v2よりソフトウェアのダウンロードができますので、指示に従ってインストールを行ってください。
PixyMonがインストールされたら、Pixy2をPCに繋げて起動します。この時、接続するケーブルはPixy2に付属のものを用いてください。一定以上の電流量が必要となるため、代替品では認識しない場合があります。接続ができると、PixyMonにPixy2が認識している映像が映されます。
接続が完了したら、アルゴリズムを選択します。Program>line_trackingを選択することにより切り替えが完了します。
ここで設定(四つのアイコンの一番右の歯車アイコン)を行うことにより、より環境に適応したライントレースができるようになります。ここで設定を行うときは、Pixy Parameter(saved on Pixy)のタブにて行ってください。
代表的な設定項目は以下の通りです。
- Tuning>Edge threshold
どれだけ鋭敏にエッジ(画像の境界線)検出を行うかを設定する。
- Tuning>Maximum line width
最も太い線の幅を設定する。
- Tuning>Minimum line width
最も細い線の幅を設定する。
- Tuning>White line
トレースする線が白線の場合はチェックを入れる。
実際にPixy2が設置される場所からラインを見たときに、不要なベクトルがなくなるように、また本来認識すべきベクトルが認識できるように、スライドバーを用いてパラメータを調整します。
調整し終わりましたらPCから取り外します。
これにてPixy2の設定は終了です。
3.Arduino
Pixy2からはPixy2付属のケーブルを通してデータのやり取りが行われます。接続の仕方は以下の写真の通りです。
これで物理的な接続はこの1本で終了です。これは電源と信号線を兼ね備えており、Pixy2はArduinoから給電されます。
次に、Arduinoとのソフトウェア的な接続を行います。
まずはArduino IDEにライブラリをインクルードします。
以下のリンクのArduino Pixy2 library version *.*.*よりダウンロードできます。
Arduinoに流し込むソースコードは、以下のリンクからダウンロードできます。
手っ取り早く動作を確認したい場合は、こちらをご利用ください。
【ソースコードDLリンク】
3-1.ソースコードの解説
16-42行目までは主に定義を行っています。
特に大切な部分としては以下の二つです。
- 28-30行目
バーコード番号の定義を行っています。下記のリンクのBarcodesにPDFファイルがあるので、番号はそちらを参照してください。今回は5と0にそれぞれ左右の情報を割り当てました。
- 32-38行目
ArduinoとCuGoドライバ回路との接続ピンを決めます。1つのモーター当たり2ピン必要になりますが、片方は必ずPWM出力が可能なピン(Digital 3,5,6,9,10,11)を選択してください。
45-69行目はセットアップ関数になります。PCとのシリアル通信の開始、ピンのモード定義、CuGo初期状態命令(後述)、Pixy2との接続、設定を行っています。
CuGo初期状態命令に使われているcugoDrive関数は、55-57行目にある以下のように定義されています。
ピン2本と回転スピードの値を渡すことによって、その割合に応じたPWMを生成することが出来ます。ここで165行目のgndPinはdigitalWriteにて指定されているのは、PWM周波数による電圧の違いを加味したものです。
セットアップ関数が終わると、ループ関数の記述になります。
まずは変数宣言、データ格納とエラー処理です。
データ格納である82行目のresには、Pixy2が認識した以下の3種類のデータが含まれます。
- ベクトル情報 (res=0x001)
- バーコード情報 (res=0x010)
- 交点情報 (res=0x100)
いずれもresの値は1以上になるので、if文にてエラー処理を行います。
ベクトル情報が渡された場合の処理を96行目から行います。
resが1(001)の場合はベクトルを意味します。
ベクトル情報は始点と終点の座標が二次元的に送られます。ベクトル情報の構造体は以下のような構造をしています。
m_x0,m_y0,m_x1,m_y1は以下の定義における座標の値が代入されています。また、ベクトルの先に交差点がある場合にはm_flagsが000から100に変更されます。
100行目では、このベクトルの終点(m_x1,m_y1)が中心からどれだけ離れているかを算出しています。y座標は進行方向に影響を与えないため、x座標の差異のみを変数errorに代入しています。
105,108,109行目では、先程取得した差異を代入し、速度の基本となる数値を左右のキャタピラのスピードを表す変数に代入しています。
112,126行目のif elseの分岐についてです。
112-125行目までの命令が実行されるのはベクトルが上を向いているとき、つまりはy軸と逆方向を向いているときに実行されます。この場合はスピードを示す変数に定数がプラスされ、前進方向の速度が増加します。
逆に、126-130行目までの命令が実行されるのはベクトルが下を向いているとき、つまりはy軸と同方向を向いているときに実行されます。この場合は定数がマイナスされ、後進方向への速度が増加します。
前進する行動においては、再度115行目にある分岐があります。これはベクトルのみの場合は速い速度で前進し、交点がある場合にはゆっくりとした速度で進むというものです。
以上をもとに左右の速度の値、つまりはPWMの値を変更します。
最後にcugoDrive関数に速度を渡すことによって出力します。
141,142行目では交点があった場合の処理を行っています。交点の場合、resの値は2(010)になることを利用して分岐させます。
また、151-160行目ではバーコードがあった場合の処理を行っています。バーコードのresの値は4(100)です。setNextTurn関数は、次に交点を認識した場合にどちらを基準にするかという関数です。左から+90度、中心に向かうにつれ数値が小さくなり中心では0度、右が-90度と定義づけられています。
これにてサンプルコード解説の終了です。
4.CuGo
CuGoとは、CuboRex社が販売する汎用クローラユニットです。
TechShareでも取り扱っております。
本AGVシステムでは、一つ前のモデルを使用しています。(前モデル名:CuBase)
ともにアルミフレームを取り付けることが可能で、自由度の高い積載を実現することができます。
CuGo1台あたりの耐荷重が80kgのため、両輪に用いると150kg強の積載が可能です。
駆動は1つのDCモーターにより行われます。速度調節や旋回動作を行う際には、次節にもあるようにPWMにより制御するのが比較的容易です。
現行モデルであるCuGoについては、クローラ部分の素材がゴムに変更されているため、より高い走破性を持っています。
5.CuGoドライバ回路
Arduinoの信号によりモーターをドライブさせる回路です。
回路図は以下のとおりです。
- 電源部
- ドライバ部
バッテリーは6セルのLi-ionバッテリーを用いています。
電源部にてDCDCコンバータにより5Vへと降圧しています。また、バイパスコンデンサを始め、インジケータとしてLEDを装着しています。
電源部からの22.2Vでの出力は、CuGoのモーターに使われる電源です。したがって、モーターの逆起電圧に対応するためにダイオードが挿入されています。
ドライバ部にあるDRV8835は、TA7291の代替品です。
また、ArduinoとDRV8835の接続は、ソースコードに準じてピンを接続してください。
ArduinoのPWM出力によりキャタピラユニットCuGoのドライブ速度を調整することが出来ます。
以上によりCuGoを用いてAGVシステムを実装することが可能です。