沼津高専 電子制御工学科
MIRS0103ソフトウェア詳細設計書
MIRS0103-SOFT-0001
改訂記録
版数 作成日 作成者 承認 改訂内容
A01 2002.5.10 中村、花島、山本 中村 初版
A02 2002.6.3 中村 中村 モードの説明の追加
エラー処理関連の追加
それに伴う図の変更、差し替え
A03 2002.12.13 花島 中村 ライブラリの説明の修正
A04 2002.12.17 花島 中村 ライブラリの説明の修正
A05 2003.2.12 山本 中村 プログラムの仕様変更に伴うフローチャートおよび行動詳細の改定

目次

  1. はじめに
  2. 概要
  3. OS(RT-Linux)の概要
  4. プログラム群の構成
  5. プログラム群の詳細
    1. モード
      1. 待機モード
      2. ポスト数入力モード
      3. 1回目競技用初期化モード
      4. 2回目競技用初期化モード
      5. 行動決定モード
      6. ポスト探索モード
      7. ポスト中心割り出しモード
      8. 接近モード
      9. ポスト周回モード
      10. ポスト番号判断モード
      11. ポスト取得モード
      12. 終了処理モード
      13. 試験モード
    2. ライブラリ
      1. タッチセンサ
      2. 超音波センサ
      3. 赤外線センサ
      4. PWM
      5. LCD
      6. マウス
      7. ログ
    3. エラー処理
      1. 概要
      2. エラー内容
        1. ERR_EXTOUCH
        2. ERR_POST_USS
        3. ERR_POST_TOUCH
        4. ERR_NO_IR
        5. ERR_FAILED_ET_IR
  6. 試験
    1. 標準MIRS上での試験
    2. 実機上での試験

  1. はじめに

    本ドキュメントは、MIRS0103基本設計書に規定された システムの動作規定、状態遷移を実現する各タスクの開発(コーディング、試験等)に必 要な事項を述べる。

  2. 概要

    MIRS0103 ソフトウェアは、RT-Linux 上で動作するプログラム群で構成される。 プログラムはC言語でかかれ、Linux の標準の API とともに、行動モードに対応したプログラム、一つの機能を複数のプログラム群で提供する機能モジュール、および、RTタスク、ドライバと、補助関数と独自に定義したヘッダファイルから構成される。

  3. OS(RT-Linux)の概要

    調査報告書参照

  4. プログラム群の構成

    プログラム群構成

  5. プログラム群の詳細

    1. モード

      各モードの動作を示す関数は引数にMIRS構造体へのポインタをとる。 MIRS構造体はMIRSの動作状態を示す変数をまとめたものである。
      また、各関数は戻り値として正常終了なら次に遷移するべきモードの番号(0以上)を、それ以外(エラー等)なら負の数を返す。
      各関数は独立しており、関数が呼び出され終了するまでに、すべての必要な処理を終了している必要がある。

      1. 待機モード   
        • モード定義
          電源が入った後自動的にこのモードに入る。 キーボード入力をされるまでループし、入力された数字に対応したモードへ移行する。
        • モード遷移条件
          • テンキーから1を入力→ポスト数入力モード
          • テンキーから2を入力→1回目競技用初期化モード
          • テンキーから3を入力→2回目競技用初期化モード
          • テンキーから4を入力→試験モード
        • 構成要素
          • LCDデバイスドライバ
          • テンキー
        • プロトタイプ
          • int mode_wait(MIRS*);
        • アルゴリズム(フローチャート)

      2. ポスト数入力モード   
        • モード定義
          競技が始まる直前にポストの総数を入力するモードポストの入力を促すメッセージを表示する。キーボード入力をされるまでループし、入力さ れた値をMIRS構造体に含まれるポスト構造体に代入した後 待機モードに戻る。
        • モード遷移条件
          • ポストの数を入力→待機モード
        • 構成要素
          • LCDデバイスドライバ
          • テンキー
        • プロトタイプ
          • int mode_input(MIRS*);
        • アルゴリズム(フローチャート)

      3. 1回目競技用初期化モード   
        • モード定義
          MIRSの初期設定をするモード MIRSの現在の座標を0,0に設定し、全ポストを未探索に設定する。 設定した後ポスト探索モードに移行する。
        • モード遷移条件
          • 停止スイッチ押下 or 初期化失敗→待機モード
          • 初期化正常終了→ポスト探索モード
        • 構成要素
          • LCDデバイスドライバ
          • テンキー
        • プロトタイプ
          • int mode_init1(MIRS*);
        • アルゴリズム(フローチャート)

      4. 2回目競技用初期化モード   
        • モード定義
          MIRSの初期設定をするモードMIRSの現在の座標を0,0に設定し、全ポストの座標データを読み込む。設定した後行動決定モードに移行する。
        • モード遷移条件
          • 停止スイッチ押下 or 初期化失敗→待機モード
          • 初期化正常終了→行動決定モード
        • 構成要素
          • LCDデバイスドライバ
          • テンキー
        • プロトタイプ
          • int mode_init2(MIRS*);
        • アルゴリズム(フローチャート)

      5. 行動決定モード   
        • モード定義
          ポスト探索モード、接近モード、終了処理モードのいずれに移行するか判断するモード。調べるポストの座標がわかっていれば接近モード、そ うでなければポスト探索モードすべてのポストを獲得済みなら終了処理モードに移行する。
        • モード遷移条件
          • 停止スイッチ押下→待機モード
          • 移動すべきポストを知らない→ポスト探索モード
          • 移動すべきポストを知っている→接近モード
          • 全部のポストを調べ終わった→終了処理モード
        • 構成要素
          • LCDデバイスドライバ
        • プロトタイプ
          • int mode_decide_movement(MIRS*);
        • アルゴリズム(フローチャート)

      6. ポスト探索モード   
        • モード定義

           前後左右の超音波センサを使ってポストを探索するモード。開始位置から前進し競技場の端を目指す。競技場端に到達したらその場で方向転換し、競技場の中心軸上の移動を繰り返す。タッチセンサに反応があった場合はポスト中心割り出しモードへ、超音波センサでポストを発見した場合は接近モードに移行する。

        • モード遷移条件
          • 停止スイッチ押下->待機モード
          • タッチセンサに反応->ポスト中心割り出しモード
          • 超音波センサでポストを発見->接近モード
        • 構成要素
          • LCDデバイスドライバ
          • マウスドライバ
          • PWM
          • 赤外線センサドライバ
          • 超音波センサドライバ
          • タッチセンサドライバ
        • プロトタイプ
          • int mode_find(MIRS*);
        • アルゴリズム(フローチャート)

      7. ポスト中心割り出しモード   
        • モード定義

           ポストとの接触が起きたときに、4つのタッチセンサの反応を見て、ポストの中心を判断するモード

        • モード遷移条件
          • 正面の二つのタッチセンサが反応した->ポスト周回モード
        • 構成要素
          • LCDデバイスドライバ
          • タッチセンサドライバ
          • PWM
          • マウスドライバ
        • プロトタイプ
          • int mode_post_center(MIRS*);
        • アルゴリズム(フローチャート)

      8. 接近モード   
        • モード定義

           現在位置からポストの位置まで接近するモード。探索するポストの位置を呼び出し接近する。接近中も すべての超音波センサを用いて未探索ポストがあるか調べ、座標を記録する。目標のポストに接触するまで近づくが、赤外線センサに反応が あった場合は接触する前に停止し、ポスト番号判断モードへ遷移し、反応がない場合は接触後、ポスト周回モードへ移行する。

        • モード遷移条件
          • 停止スイッチ押下→待機モード
          • 規定位置までポストに接近→ポスト周回モード
          • 赤外線を感知→ポスト番号判断モード
        • 構成要素
          • LCDデバイスドライバ
          • マウスドライバ
          • PWM
          • 赤外線センサドライバ
          • 超音波センサドライバ
          • タッチセンサドライバ
        • プロトタイプ
          • int mode_approach(MIRS*);
        • アルゴリズム(フローチャート)

      9. ポスト周回モード   
        • モード定義

           ポストの周りを、ポストが発信する赤外線を感知するまで円を描いて周回するモード。周回中、赤外線を感知した時点で停止しポスト番号判断モードへ移行する。二周して赤外線を感知しなかった場合は、行動決定モードへ遷移する。

        • モード遷移条件
          • 停止スイッチ押下→待機モード
          • 赤外線センサがポストの赤外線信号を感知→ポスト番号判断モード
        • 構成要素
          • LCDデバイスドライバ
          • マウスドライバ
          • PWM
          • 赤外線センサドライバ
          • 超音波センサドライバ
          • タッチセンサドライバ
        • プロトタイプ
          • int mode_revolve(MIRS*);
        • アルゴリズム(フローチャート)

      10. ポスト番号判断モード   
        • モード定義
          入ってきた赤外線信号の番号を判断し、獲得するかどうかを判断するモード。赤外線センサでポスト番号を調べ、そのポストが獲得する順番に 沿っていたらポスト取得モードへ移行し、そうでなければ座標と番号を記録した後行動決定モードへ移行する。
        • モード遷移条件
          • 停止スイッチ押下→待機モード
          • 取得すべきポストではない→行動決定モード
          • 取得すべきポストである→ポスト取得モード
        • 構成要素
          • LCDデバイスドライバ
        • プロトタイプ
          • int mode_judge_num(MIRS*);
        • アルゴリズム(フローチャート)

      11. ポスト取得モード   
        • モード定義
          ポストに接触し、ポストのスイッチを押すモード。スイッチの方向へポストに接触するまで接近し、赤外線が消えたら行動決定モードへ移行する。
        • モード遷移条件
          • 停止スイッチ押下→待機モード
          • ポスト取得→行動決定モード
        • 構成要素
          • LCDデバイスドライバ
          • マウスドライバ
          • PWM
          • 赤外線センサドライバ
          • 超音波センサドライバ
          • タッチセンサドライバ
        • プロトタイプ
          • int mode_get(MIRS*);
        • アルゴリズム(フローチャート)

      12. 終了処理モード   
        • モード定義
          全ポスト獲得後に、ポストの位置の記憶などの終了処理を行うモード。いままで記録しておいたポスト番号と座標をまとめて書き出し、デモンス トレーションを行った後待機モードに移る。
        • モード遷移条件
          • 停止スイッチ押下 or 終了処理終了→待機モード
        • 構成要素
          • LCDデバイスドライバ
        • プロトタイプ
          • int mode_end(MIRS*);
        • アルゴリズム(フローチャート)

      13. 試験モード   
        • モード定義
          各モードを単独で実行する。
        • モード遷移条件
          • 停止スイッチ押下 or 試験走行終了→待機モード
        • 構成要素
          • LCDデバイスドライバ
          • テンキー
          • マウスドライバ
          • PWM
          • 赤外線センサドライバ
          • 超音波センサドライバ
          • タッチセンサドライバ
        • プロトタイプ
          • int mode_exam(MIRS*);

    2. ライブラリ

      MIRS標準のモジュールを、統一されたインターフェースで使用できるようなラッパ関数を作成する。

      1. タッチセンサ
        • 機能
          タッチセンサの状態を管理する。
        • 構成要素
          • なし
        • 関数群
          1. int init_TS(void);
            • 引数
              なし
            • 戻り値
              初期化の成否。0以下なら失敗、それ以外なら成功。
          2. int get_TS(int num);
            • 引数
              num:取得するタッチセンサを指定する。
            • 戻り値
              numで指定した番号のタッチセンサの状態を返す。1なら押されている。0なら押されていない。データ読み込みを失敗したときには-1以下を返す。
          3. int *get_TS_all(int *data_array);
            • 引数
              int *data_array:このポインタが示すアドレスに、取得した配列データを書きこむ
            • 戻り値
              データ読み込みの成否を返す。0以下なら失敗、それ以外なら成功。
          4. int release_TS(void);
            • 引数
              なし
            • 戻り値
              解放の成否。0以下なら失敗、それ以外なら成功。
      2. 超音波センサ
        • 機能
          超音波センサの状態を管理する。
        • 構成要素
          • MIRSATLM超音波センサモジュール
        • 関数群
          1. int init_USS(void);
            • 引数
              なし
            • 戻り値
              初期化の成否。0以下なら失敗、それ以外なら成功。
          2. double get_USS(int num);
            • 引数
              num:取得する超音波センサを指定する。
            • 戻り値
              numで指定した番号の超音波センサで、反応した物体までの距離をmm単位で返す。データ読み込みを失敗したときには-1以下を返す。
          3. int get_USS_all(double *data_array);
            • 引数
              double *data_array:このポインタが示すアドレスに、取得した配列データを書きこむ
            • 戻り値
              データ読み込みの成否を返す。0以下なら失敗、それ以外なら成功。
          4. int release_USS(void);
            • 引数
              なし
            • 戻り値
              解放の成否。0以下なら失敗、それ以外なら成功。
      3. 赤外線センサ
        • 機能
          赤外線センサの状態を取得する。
        • 構成要素
          • MIRSATLM赤外線センサモジュール
        • 関数群
          1. int init_IRS(void);
            • 引数
              なし
            • 戻り値
              初期化の成否。0以下なら失敗、それ以外なら成功。
          2. int get_IRS(int num);
            • 引数
              num:取得する赤外線センサを指定する。
            • 戻り値
              numで指定した番号の赤外線センサが取得しているポストの番号を返す。0ならセンサの前に何もポストがない。読み込みに失敗したときには-1以下を返す。
          3. int get_IRS_all(int *data_array);
            • 引数
              int *data_array:このポインタが示すアドレスに、取得した配列データを書きこむ
            • 戻り値
              データ読み込みの成否を返す。0以下なら失敗、それ以外なら成功。
          4. int release_IRS(void);
            • 引数
              なし
            • 戻り値
              解放の成否。0以下なら失敗、それ以外なら成功。
      4. PWM
        • 機能
          モータを制御し、指定した量だけMIRSを移動させる。
        • 構成要素
          • MIRSATLMPWMモジュール
        • 関数群
          1. int init_PWM(void);
            • 引数
              なし
            • 戻り値
              初期化の成否。0以下なら失敗、それ以外なら成功。
          2. int move_PWM(int x, int y, int velocity);
            • 引数
              x:x方向の移動量
              y:y方向の移動量
              velocity:移動速度
            • 戻り値
              移動の設定の成否を返す。0以下なら失敗、それ以外なら成功。
          3. int release_PWM(void);
            • 引数
              なし
            • 戻り値
              解放の成否。0以下なら失敗、それ以外なら成功。
      5. LCD
        • 機能
          LCDに文字列を表示する。
        • 構成要素
          • MIRSATLMLCDデバイスドライバ
        • 関数群
          1. int init_LCD(void);
            • 引数
              なし
            • 戻り値
              初期化の成否。0以下なら失敗、それ以外なら成功。
          2. int print_LCD(char *string);
            • 引数
              string:表示するべき文字列
            • 戻り値
              表示の成否を表す。0以下なら失敗、それ以外なら成功。
          3. int release_LCD(void);
            • 引数
              なし
            • 戻り値
              解放の成否。0以下なら失敗、それ以外なら成功。
      6. マウス
        • 機能
          マウスの移動量を取得する。
        • 構成要素
          • なし
        • 関数群
          1. int init_mouse(void);
            • 引数
              なし
            • 戻り値
              初期化の成否。0以下なら失敗、それ以外なら成功。
          2. int get_mouse_move(vector2 *position);
            • 引数
              position:現在の位置データを受け取るvector2構造体
            • 戻り値
              常に1
          3. int get_mouse_move_diff(vector2 *position);
            • 引数
              position:前回取得持からの差分データを受け取るvector2構造体
            • 戻り値
              常に1
          4. int release_mouse(void);
            • 引数
              なし
            • 戻り値
              解放の成否。0以下なら失敗、それ以外なら成功。
      7. ログ
        • 機能
          ファイルに文字列を書き込む。
        • 構成要素
          • なし
        • 関数群
          1. int init_log(char *filefame);
            • 引数
              filename:ログのファイル名
            • 戻り値
              初期化の成否。0以下なら失敗、それ以外なら成功。
          2. int print_log(char *string);
            • 引数
              string:出力する文字列
            • 戻り値
              出力の成否。0以下なら失敗、それ以外なら成功。
          3. int release_log(void);
            • 引数
              なし
            • 戻り値
              解放の成否。0以下なら失敗、それ以外なら成功。
    3. エラー処理
      1. 概要

        エラーの検出を行うためにエラー処理専用にスレッドを一つ作り、 常にそのスレッドでエラーを監視する。
        エラーが起こった場合、 モード処理関数からエラー処理関数のほうに全ての処理を移す。
        モードが遷移したときに、 エラー処理スレッドに現在自分がどのモードにいるかを知らせなければならない。
        エラー処理スレッドが持つ現在のモードを表す値から、 下の一覧のエラーからどの項目をチェックする必要があるかを判断する。
        エラー処理スレッドに、どのエラーチェックを有効にするかは、 エラー一覧で定義されている値を組み合わせることで指定する。
        たとえば、ERR_EXTOUCHとERR_NO_IRをチェックしたい場合、 処理判断用変数にERR_EXTOUCH | ERR_NO_IRを代入する。

      2. エラー内容
        1. ERR_EXTOUCH
          • 定義値
            0x00000001
          • 内容
            タッチセンサに、想定外の状態で反応があった。
          • 対処
            接触したポストの番号を取得し、現在の位置に補正をかける。
            その後、行動決定モードに処理を移す。
        2. ERR_POST_USS
          • 定義値
            0x00000010
          • 内容
            MIRSが移動中に発見したポストの位置が、 過去に超音波センサを使って調べた位置と現在超音波センサで調べた位置で違った。
          • 対処
            今超音波センサで発見した値で、ポストの位置を上書きする。
            その後、行動決定モードに移行する。
        3. ERR_POST_TOUCH
          • 定義値
            0x00000100
          • 内容
            ポストに接触したときに、 現在の位置と過去に調べたポストの位置とで差がある。
          • 対処
            現在の位置でポストの値を上書きする。
            その後処理をポスト周回モードに移す。
        4. ERR_NO_IR
          • 定義値
            0x00001000
          • 内容
            ポスト周回中にポストの赤外線信号を取得できなかった。
          • 対処
            再度ポストを周回し、赤外線信号を探す。
            信号を発見できたらポスト取得モードに移行し、 できなかったらそのポストは取得したものとみなし、 行動決定モードに移行する。
        5. ERR_FAILED_ET_IR
          • 定義値
            0x00010000
          • 内容
            ポスト取得時に、 ポストに接触したにもかかわらず赤外線信号が消えない。
          • 対処
            再びポストから距離をとりポストを周回する。 赤外線信号を見つけ次第、ポスト取得モードに移行する。

  6. 試験

    MIRS0103は標準MIRSと構造が大きく異なるため、 標準MIRSで行える試験は少ない。 そのため、ソフトウェア以外の部分を早めに仕上げる必要がある。

    ATLMで試験するモード、およびライブラリ

    1. モード
      • 待機モード
      • ポスト数入力モード
      • 1回目競技用初期化モード
      • 2回目競技用初期化モード
      • 行動決定モード
      • ポストポスト中心割り出しモード
      • ポスト番号判断モード
      • 終了処理モード
    2. ライブラリ
      • タッチセンサ
      • 超音波
      • 赤外線センサ
      • PWM
      • LCD
      • ログ

    実機で試験するモード、およびライブラリ

    1. モード
      • ポスト探索モード
      • 接近モード
      • ポスト取得モード
      • ポスト周回モード
    2. ライブラリ
      • マウス


関連文書