名称 MIRS1102 走行用関数概要
番号 MIRS1102-DSGN-0001

最終更新・2011.12.19

版数 最終更新日 作成 承認 改訂記事
A01 2011.12.19 伊庭達哉 初版

目次




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. 関連文書





沼津工業高等専門学校 電子制御工学科