名称
MIRS1102 走行用関数概要
番号
MIRS1102-DSGN-0001
最終更新・2011.12.19
版数
最終更新日
作成
承認
改訂記事
A01
2011.12.19
伊庭達哉
初版
目次
1. はじめに
2. 関数の動作内容
3. 関数の使用方法
4. 関数のバージョン
5. ゲイン調整
6. 関連文書
1.はじめに
本ドキュメントは、MIRS1102に使用する走行用関数run()の動作内容及び使用方法の概要についてのドキュメントである。関数の詳細設計は別のドキュメントに示す。
2.関数の動作内容
走行用関数runは、一つの関数で直進、回転、旋回の3種類の動作をさせることができる。
直進時には指定した距離を、回転時には指定した角度を、旋回時には指定した半径で指定した角度を、それぞれ指定したスピードで走らせることができる。
走行の際には、まず、左右のモータそれぞれで、タイヤの回転速度を一定にするために、左右のモータに取り付けられているロータリーエンコーダの値をフィードバックしてPD制御を行い、それに加えて左右のタイヤの総走行距離を同じにするためのPID制御を行って、左右のモータの回転数を制御している。
3.関数の使用方法
走行用関数runは次のような仕様になっている。
ファイル名
関数名
書式
run.c
run
int run(int mov, int v, int r, int theta, int dir)
この時の、引数、及び戻り値は次のようになる
引数
mov : 動作の内容を示す。
0 : 直進
1 : 回転
2 : 旋回
v : 走行させるスピードを指定する。
走行時のMIRSの走行速度を[mm/sec]で指定する。ただし、旋回時は左右のタイヤの回転数が異なるため、MIRSの中央部の速度を指定する。
r : 距離を設定する。
直進時 : 走行する目標距離を示す。[mm]
旋回時 : 旋回する円の半径を示す。[mm]
※回転時はrは用いないため、0としておく。
※なお、直進時に走行スピードをマイナスで指定した場合、rもマイナスにしておかないとエラーとなる。
theta : 角度を設定する。
回転時 : 回転する角度を示す。[deg]
旋回時 : 旋回する円の角度を示す。[deg]
※直進時はthetaは用いないため、0としておく。
※なお、走行スピードをマイナスで指定した場合、thetaもマイナスにしておかないとエラーとなる。
dir : 回転の方向を設定する。
0 : 左回転
1 : 右回転
※直進時はdirは用いないため、0としておく。
戻り値
0 : 正常終了
目標距離を進み終えたことを表す。この時、
モータは止まらない
ことに注意。ロータリーエンコーダの値もリセットされない。
1,2,3 : タッチセンサ反応終了
タッチセンサが反応したため、
モータを止めて
関数を終了したことを表す。このとき、
ロータリーエンコーダの値はリセットされない
ことに注意。これは、ロータリー攻略の際などで役立つ。
1 : 前方のタッチセンサ反応
2 : 左のタッチセンサ反応
3 : 右のタッチセンサ反応
-1 : 指定時間経過強制終了
この関数は、走行中に何らかの異常があり、走行関数から抜けられなくなってしまう事態を予測し、ある指定時間以上走行しようとしたときに、
モータを止めて
強制的に関数を終了する機能を備えている。これは、その機能が働いて終了したことを表す。
強制終了時間の設定は、ERR_TIMEというマクロの値(単位 : sec)を変更することで設定できる。
-2,-3 : ロータリーエンコーダエラー強制終了
この関数は、走行中に何らかの異常があり、ロータリーエンコーダの値が更新されなくなってしまう事態を予測し、ある指定時間以上ロータリーエンコーダの値に変化がなかったときに、
モータを止めて
強制的に関数を終了する機能を備えている。これは、その機能が働いて終了したことを表す。
また、この機能は、ステップやシーソーの侵入時にMIRSが引っかかって止まってしまった際にも働くので、少し下がって再び前進する、などの機能が追加しやすくなっている。
強制終了時間の設定は、R_ERRというマクロの値(単位 : sec)を変更することで設定できる。
-9999 : 規格外引数強制終了
前述した、関数runの引数として、適当でない規格外な引数を与えたときに起こるエラーによって関数を終了したことを表す。
直進時に、スピードにマイナスの値を指定して、目標距離にプラスの値を指定したりしても、このエラーは起こるので注意(そのうち、スピードと距離の符号が違っても、関数が判断して値を変えてくれる機能を追加する予定)。
9999 : 白線検知終了
白線を検知したため、
モータを止めて
関数を終了したことを表す。
4.関数のバージョン
走行用関数runは、現在ver.2.2まで完成している。ただし、走行に必要なゲインは未調整なので、動作は保証できない。
run ver.2.2
左右のタイヤの総回転数を制御するPID制御に加えて、左右のタイヤの回転数を一定にするためのPD制御を加えた。
それに伴って、指定する引数を一部変更した。
命令にかかった時間を測るモジュールを追加し、ロータリーエンコーダの値を取得するサンプリング周期を一定にした。
ロータリーエンコーダエラーの際にロータリーエンコーダの値をリセットしないようにした。
タッチセンサ強制終了時にロータリーエンコーダの値をリセットしないようにした。
run ver.2.1
直進、回転、旋回をそれぞれ別々のモジュールで定義し直し、それらをrun()から呼び出すように全体の構造を変更した。
動作内容はver.1.6と同じである。
run ver.1.6
正常終了時にモータを止めないように変更した。
run ver.1.5
ver.1.4で設けた一定時間最大スピードの機能は撤廃した。
制御の方法をPD制御からPID制御に変更した。
動作の終了後に表示される、走行距離と目標距離の誤差などの表示が、回転、旋回時におかしくなるのを修正
run ver.1.4
左右のモータをある程度同時に動かすために、関数を起動した最初の一定時間、最大スピードで走行する機能を設けた。
run ver.1.3
PD制御による旋回制御を実装した。
旋回を制御する際、モータの逆転を許したため、ゲインを直進と別に定義した。
run ver.1.2
PD制御による回転制御を実装した。
run ver.1.1
PD制御による直進制御を実装した。
タッチセンサ反応終了機能を実装した。
指定時間経過強制終了機能を実装した。
ロータリーエンコーダ異常時終了機能を実装した。
5. ゲイン調整
この、総効用関数には、左右のタイヤの回転速度を同じにするPD制御を行うためのPゲイン、Dゲインと、左右のタイヤの総走行距離を制御するためのPゲイン、Dゲイン、Iゲインがそれぞれ直進、回転、旋回で別々に定義されているため、全部で11個のゲインが存在し、それぞれMIRSに合わせて設定する必要がある。
これらの値はrun.hで定義されているが、その値はMIRSの条件によって変わる。したがって、そのMIRSに適したゲインを調整するための関数を用意した→
run_gain.c
。指示にしたがって、行う動作、サンプリング周期、各ゲインの値を入力し、同じゲインの走行履歴(走行履歴については下に記す)と区別するためのlogデータナンバを入力すると、指定したゲインによって走行制御を行う。その走行の精度は、目視による判断と、走行履歴による判断ができるようになっている。
走行履歴は、mainディレクトリがあるディレクトリと同じディレクトリに、新たにlogディレクトリを作成し、その中にdatalog、l-data、r-data、lr-dataという名前のディレクトリを作成すると、datalogには走行の詳細な履歴が保存される。l-data、r-dataにはそれぞれ左右のモータの回転速度の履歴が保存され、lr-dataには左右のタイヤの回転数の差が保存され、それぞれgnuplotでそのままplotすることができるようになっている。保存されるデータは「ディレクトリ名-動作内容(0 or 1 or 2)-サンプリング周期-速度一定化用Pゲイン-Dゲイン-左右のタイヤの回転数調整用Pゲイン-Dゲイン-Iゲイン.txt」という構成のファイル名のテキストファイルである。
6. 関連文書
走行関数詳細設計
←そのうち作る。
沼津工業高等専門学校 電子制御工学科