ライントレース製作
はじめに
はじめまして!芥河(アクタガワ)と申します!
この記事ではAxRobotix株式会社が主催しているライントレース大会用の機体のについてまとめます.
初めてのnoteなので不慣れな点がございますがよろしくお願いします.
AxRobotix株式会社とは
なにをしているか
まず大会を主催しているAxRobotix株式会社の紹介です.
ベッドや枕などの寝具にロボット技術を搭載した製品を開発しています.
これによって各個人の睡眠の質を改善し,日中のパフォーマンスを向上させることを目的としています.
現在は介護事業にも力をいれています.
HP : https://www.axrobotix.com/
ライントレース大会
毎月最終土曜日に会社で開催しているライントレース大会です.会社外部の方々も招いておりますので少しでも興味がある方は是非ご参加ください!
また,優勝者には優勝機体の記事を公開すると賞金がもらえます!
大会に参加または見学する
https://axrobotix.connpass.com/
ライントレースロボット製作
ライントレースとは黒線にそって動くように作られたロボットを走らせてゴールまでの時間を競う競技です(白線を走る場合もあります).私が参加した大会では直角に曲がる部分やコースが十字に交わる部分があって少し難しい仕様でした.
機体設計
機体のほとんどの部品は3Dプリンタで製作してネジ止めしてあります.ラインセンサ付近は太陽光や蛍光灯からの外乱を軽減するためにカバーを付けています.
車輪周りの構成は天然ゴムスポンジをホイールに接着して,スポンジの上にシリコンシートを張っています.シリコンシートは十分な摩擦力を発生させることができるのでスリップを防止できます.
回路構成
回路の構成は以下の通りです.
黒線検知には4つのフォトリフレクタを搭載したラインセンサを使います.
モータにはエンコーダ付きのものを使います.エンコーダでタイヤの角速度を取得できるので,フィードバック制御ができるようになります.フィードバック制御ができるとバッテリ電圧の変化やタイヤの状態などの外乱の影響を吸収できるようになるため,安定した動作が可能になります.
使用するマイコンはNUCLEO-STM32F303K8です.mbedコンパイラでの開発ができる比較的安価な評価ボードで,私自身が使い慣れているのでこのマイコンにしました.
NUCLEO-STM32F303K8:https://akizukidenshi.com/catalog/g/gM-10172/NUCLEO-STM32F303K8
モータは角速度フィードバックするために磁気式エンコーダ付きモータを使用します.Amazonで探して購入しました.ただ,今使っているモータはトルクに余裕がありすぎるので,もっと無負荷回転数が大きいものを選定し直した方がいいと思います.
ラインセンサはフォトリフレクタを4つ実装した自作基板です.
フォトリフレクタは小型なものを使いました.
この部品の検出距離は5mmなので,機体設計で注意が必要です.
回路図のL2,L1,R1,R2はそれぞれSTM32F303K8のアナログ入力ピンに接続します.
フォトリフレクタ:https://akizukidenshi.com/catalog/g/gI-16455/
モータドライバは過去に私が製作したモータドライバを使います.
信号線が2本で済むので配線を最小限にすることができます.
バッテリは安全面を考慮してエネループを6本直列に繋ぎます.なのでモータへの印加電圧は$${7.2[\rm{V}]}$$になります.
プログラム
ここではフローチャートの赤色の部分を解説します.
「センサの偏差を計算」ではラインセンサから返ってきたコースの明度情報の左右差を計算します.
ラインセンサには4つのフォトリフレクタが搭載されており,線の明るさに応じてマイコン内のADコンバータから$${0}$$~$${1024}$$が返ってきます.その値が$${L_2,L_1,R_1,R_2}$$の4つがあり,内側のセンサ($${L_1,R_1}$$)は黒線と同じ幅になるように配置されています.その外側に$${L_2}$$と$${R_2}$$が配置されています.$${L_1}$$と$${R_1}$$があればライントレースは可能なのですが,今回のコースは直角カーブがあるので$${L_2,R_2}$$を付けています.また,外側のセンサが反応するということは急激な旋回が必要な場面であるため,センサの値に重み$${G}$$を付けて差分を大きくします.
ここで,内側のセンサの差を$${D_1}$$,外側のセンサの差を$${D_2}$$,$${D_1}$$と$${D_2}$$の和を$${D_{12}}$$とすると以下の式になります.
$$
\begin{array}{} D_1&=&L_1-R_1\\D_2&=&G(L_2-R_2)\\D_{12}&=&D_1+D_2\end{array}
$$
$${D_{12}=0}$$のときは線の真ん中を走っている状態になります(コースアウトも含みますが今回は考えないで話を進めます).$${D_{12}>0}$$のときは機体を左に旋回させ,$${D_{12}<0}$$のときは機体を右に旋回させるようにモータの出力を調整する必要があります.
出力の調整方法がフローチャートの「PD制御で速度を計算」です.PD制御とは入力値の比例成分(Proportional)と微分成分(Differential)を使って出力を決定する制御方法です.ここでの入力値とは$${D_{12}}$$のことであり,出力は各車輪の角速度の差$${\omega_d}$$とします.PD制御をうまく使うと$${D_{12}=0}$$になるようにモータの出力を調整してくれるので,結果的に黒線の上をスムーズに走るようになります.1周期前の入力値を$${d_{12}}$$,サンプリング周期を$${\Delta t}$$とすると$${\omega_d}$$は以下の式のようになります.
$$
\omega_d=K_pD_{12}+K_d\displaystyle\frac{D_{12}-d_{12}}{\Delta t}
$$
ここでの微分は数値微分(実際の微分の近似値)を使います.また,$${K_p}$$はPゲイン,$${K_d}$$はDゲインと呼ばれる定数です.$${K_p}$$と$${K_d}$$によって機体のふるまいが変わるため,トライアンドエラーやシミュレーションなどで決定する必要があります.トライアンドエラーで調整する場合,コースアウトしたら$${K_p}$$を上げて,カーブがぎこちなかったら$${K_d}$$を上げるとよいかもしれません.
次に$${\omega_d}$$のときの各車輪の角速度の決定方法です.$${\omega_r, \omega_l}$$を各車輪の角速度,$${\omega_{dflt}}$$を定常時の角速度としたとき以下の式で導出します.
$$
\begin{array}{} \omega_l &=& \omega_{dflt}-\omega_d\\\omega_r&=&\omega_{dflt}+\omega_d\end{array}
$$
$${ω_{dflt}}$$は定数であり,ユーザがあらかじめ決定しておきます.この値が大きいほど機体の速度は上がりますが,制御が難しくなります.
動作動画
直角部分がぎこちないですが,なんとか完走できました!
最後に
初めてのnote記事なので,使い勝手が分からず稚拙な文章になってしまいましたが最後まで見て下さりありがとうございます.今回のライントレースで使ったソースコードを添付します.おおざっぱに作ったコードですので醜い部分もありますが,参考までにどうぞ.https://os.mbed.com/users/Ryu_25_MIC_512/code/Project_Kyube_linetrace/