沼津高専 電子制御工学科
MIRS0005 Software詳細設計書
MIRS0005-SOFT-0001
改訂記録
版数 作成日 作成者 承認 改訂内容
A01 2001.6.1 金武 佐野 小島 金武 初版
A02 2001.6.19 金武 佐野 6.I各モードモジュールの関数名を変更。
8.作成ドキュメントを変更。
A03 2001.7.10 金武 佐野 小島 金武 6.I 走行tのフローチャートを大幅に変更。
6.I 補正モードを削除。
2 センサの位置がわかりにくかったので図を追加。
6.II 壁直進モジュールを追加。直進走行・回転・カーブモジュールの フローチャートを追加。
A04 2001.8.23 金武 佐野 6.0共通で使う変数一覧を追加
A05 2001.8.27 金武 佐野 6各種値入力モード作成。自己位置確認モード、経路の計算モードを削除。

目次

  1. はじめに
  2. 概要
  3. OS(RT-Linux)の概要
  4. 行動モードの詳細
  5. プログラム群の構成
  6. プログラム群の詳細
    1. モードモジュール
    2. 機能モジュール
    3. RTタスクモジュール
    4. デバイスドライバ
    5. 関数モジュール
    6. ヘッダファイル
  7. 試験
  8. 作成ドキュメント一覧
  9. 進行状況

  1. はじめに

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

  2. 概要

  3. OS(RT-Linux)の概要

     ソフトウェアの動作環境であるRT-Linux、及び開発環境等については詳しくは MIRS0005 ソフトウェアの調査(MIRS0005-TECH-0014) を参照。
     MIRS0005のOSにRT-Linuxを採用した主な理由として、 各種センサ、機体のリアルタイム制御にRT-Linuxの持つリアルタイムスケジューリングが適していたため、 容量に限りのあるフラッシュメモリ内に収まるため、等があげられる。

  4. 行動モードの詳細

    モード遷移図へ

    モードの定義、遷移条件は以下に示すモードモジュールと1:1で対応しているのでここでは省略する。

  5. プログラム群の構成

    以下にMIRS0005 SOFTWARE ユーザプログラム・RTタスクモジュール・デバイスドライバの関係を表す。 LCDドライバは全モードモジュールに使用されているので、以下の説明では構成要素から省略する。


    program.doc

    各ボックスをクリックすると、その説明にとびます。

  6. プログラム群の詳細

      0. 全体で共通に使う変数

      • int ts[i]=0,1 : タッチセンサi番OFF:0、ON:1
      • int irs[i]=0,1 : 赤外線センサi番OFF:0、ON:1
      • int uss[i]=0,1 : 超音波センサi番OFF:0、ON:1
      • int nowx,nowy : 現在のx座標、y座標
      • int nowmode,oldmode,nextmode : 現在のモード、ひとつ前のモード、次のモード (1〜8)各モードに 遷移するフラグの変数。now,oldの変数を比較して、次のモードを決める。nextmodeに値が入っているときは、そのモードに移行する。

      Number010203111213141516
      Mode走行t(一回目)走行k(二回目)各種値入力経路の計算角度調整ポスト周回ポストタッチ自己確認緊急回避
      Number21222324
      Module壁直進直進走行回転カーブ

    1. モードモジュール
      • モードモジュールとは、一つのモードに対し(1:1)で対応し、 内容は、以下に示す機能モジュールをどういう条件で、どういう順番で呼び出すかを記述する。
      • 2つ戻り値があるものは、ポインタ等で工夫する。
      1. MAIN関数(待機モード)
        • 定義: このモードはメイン関数である。各モードが終了すると、MAIN関数であるここに戻ってくる。

           また、これは待機モードも兼ねている。テンキー入力により、「通常走行1回目(走行モードt)」、「通常走行2回目(走行モードk)」、 「テスト走行1(各種値入力モード)」、「テスト走行2(経路の計算)」、「テスト走行3(角度修正)」、 「テスト走行4(ポスト周回)」、「テスト走行5(ポストタッチモード)」、「テスト走行6(自己確認)」のモードに飛ぶ。

        • 遷移条件: MIRSのスイッチを入れたとき。
        • 構成要素: 全モードモジュール、テンキー入力
        • 関数名: main()
        • 引数: なし
        • 変数: int nowmode,nextmode(1〜8:各モード、テンキーの入力に対応。 nowmodeは現在のモード、nextmodeは次に移行するモードを示す変数。 各プログラムから参照、代入できるように、外部変数として定義する。)
        • 戻り値: なし
        • アルゴリズム(フローチャート)taiki.doc

      2. 各種値入力モード
        • モード定義:テスト走行するときに、モード単体でのテストをするために ポストの位置などを前もって登録するために直接値を入力できるようにする。  
        • モード遷移条件:待機モードでモード選択をして選ばれたら。
        • 構成要素: 
        • 関数名: nyuuryoku()
        • 引数: 
        • 戻り値: なし
        • アルゴリズム(フローチャート)
      3. 走行モードt
        • モード定義: MIRSが指定された経路(フィールドの壁際一周)を走行する。
        • モード遷移条件: 待機モードから 「通常走行1回目」 の入力を受けたとき。
        • 構成要素: 直進走行モジュール、回転モジュール、USS監視モジュール、TS監視モジュール、Zahyohikaku関数
        • 関数名: soukout()
        • 引数: なし
        • 戻り値: int zahyo[2][](座標値)
        • アルゴリズム(フローチャート)soukout2.doc

          以下のXは、後で実験により求める。


        構造体Shukai

        i
        Shukai[i].action
        Shukai[i].data
        Shukai[i].turn
        0
        2
        20
        0
        1
        2
        +90
        0
        2
        1
        124
        1
        3
        3
        -90
        0
        4
        1
        248
        3
        5
        3
        -90
        0
        6
        1
        248
        4
        7
        3
        -90
        0
        8
        1
        248
        4
        9
        3
        -90
        0
        10
        1
        124
        5
        11
        3
        -90
        0

        Shukai[i].action:前進:1 後退:2 回転:3
        Shukai[i].data:前進・後退の距離(cm)、回転の角度(°)
        Shukai[i].houkou: 西:1 北:2 東:3 南:4 (前進のみ)
        imax=11

      4. 緊急回避モード
        • モード定義:それが壁かポストかは問わず、反応した方向と逆方向に少し進み、それを避ける。避けた後は元の行動に戻る。  
        • モード遷移条件:本来の行動計画上、あたるはずのないものにあたりタッチセンサが反応した場合 
        • 構成要素: 直進走行モジュール、回転モジュール、USS監視モジュール、TS監視モジュール
        • 関数名: kinkyuu()
        • 引数: int ts[i] (例 ts[3]=1:TS3がONになった、OFFなら0)
        • 戻り値: なし
        • アルゴリズム(フローチャート)kinyuu.doc

          下図において、X1〜X7、θ1〜7は実験により後で決める。

      5. 走行モードk
        • モード定義: 計算された経路を進む。 このとき斜め方向に進みたくても、縦横に、フィールドに平行に進む。
        • モード遷移条件: 経路の計算が終わったとき。
        • 構成要素: 直進走行モジュール、回転モジュール、USS監視モジュール、TS監視モジュール、IRS監視モジュール
        • 関数名: soukouk()
        • 引数: int dx,dy
        • 戻り値: なし
        • アルゴリズム(フローチャート)soukouk.doc

      6. 角度調整モード
        • モード定義: 真中のセンサを反応するまで前部の3つのタッチセンサをポストにぶつけて、ポストとの位置を垂直になるようにする。
        • モード遷移条件: 目標物の周辺に移動し、超音波センサにより、それが壁でなく、目標物だと認識したとき。
        • 構成要素: 直進走行モジュール、回転モジュール、USS監視モジュール、TS監視モジュール
        • 関数名: tyousei()
        • 引数: なし
        • 戻り値: なし
        • アルゴリズム(フローチャート)tyousei.doc

      7. ポスト周回モード
        • モード定義:  反時計周りにポストの周りを円運動する。
        • モード遷移条件: 角度調整モードにおいてタッチセンサTS3がONになったとき。
        • 構成要素: カーブモジュール、USS監視モジュール、TS監視モジュール
        • 関数名: syuukai()
        • 引数: なし
        • 戻り値: int ensyu(円周のx°/360°周ったか)
        • アルゴリズム(フローチャート)syuukai.doc

      8. ポストタッチモード
        • モード定義: 赤外線センサがOFFになるまでポスト獲得を試みる。
        • モード遷移条件: 角度修正モード中に前方の赤外線センサがON,またはポスト周回モード中に右側の赤外線センサがONになった時。
        • 構成要素: 直進走行モジュール、回転モジュール、USS監視モジュール、TS監視モジュール
        • 関数名: touch()
        • 引数: なし
        • 戻り値: int zahyo[][](取った座標を置き換え)
        • アルゴリズム(フローチャート)tatti.doc

    2. 機能モジュール
      • 機能モジュールは、各種機能を実現するためのモジュールである。
      • RTタスクモジュール・デバイスドライバを取り扱う。
      • モードモジュールから直接呼び出される。
      1. 壁直進モジュール
        • 機能: 走行tでMIRSを壁際を一定距離で直進させる。壁との距離は通常を7cmとし、±3cmずれると左右の回転比を変え、補正を行う。
        • 構成要素: PWM/エンコーダRTタスクモジュール、回転モジュール、USS監視モジュール、TS監視モジュール
        • 関数名 kabetyoku()
        • 引数 int distance
        • 戻り値 nowx,nowy(現在位置)
        • アルゴリズム(フローチャート)kabetyoku.doc

      2. 直進走行モジュール
        • 機能: PWM/ロータリーエンコーダRTタスクモジュールを用いてMIRSを指定した距離直進させる。
        • 構成要素: PWM/ロータリーエンコーダRTタスク内void pwm_cm_data(int l_distance, int r_distance) MIRSを指定した距離だけ走らせて停止させるための関数。
        • このモジュールが使用されるモード: 走行モードk、角度修正モード、ポストタッチモード
        • 関数名 tyokushin()
        • 引数 int distance(=l_distance=r_distance)
        • 戻り値 nowx,nowy(現在位置)
        • アルゴリズム(フローチャート)tsoukou.doc

      3. 回転モジュール
        • 機能: ロータリーエンコーダRTタスクモジュールを用いてMIRSをした角度その場で回転させる。
        • 構成要素:PWM/ロータリーエンコーダRTタスク内void pwm_circle_data(int angle)
        • このモジュールが使用されるモード:走行モードt、走行モードk、角修正モード、ポストタッチモード
        • 関数名 kaiten()
        • 引数 int angle(角度)
        • 戻り値 int nowangle(現在のフィールドに対する姿勢)
        • アルゴリズム(フローチャート)kaiten.doc

      4. カーブモジュール
        • 機能: ロータリーエンコーダRTタスクモジュールを用いてMIRSを指定した半径で曲がらせる。
        • 構成要素:PWM/ロータリーエンコーダRTタスク内void pwm_cm_data(int l_distance, int r_distance) void pwm_right_data(int r_duty) void pwm_left_data(int l_duty)
        • このモジュールが使用されるモード:ポスト周回モード
        • 関数名 curve()
        • 引数 int curve(右と左の回転数の比)
        • 戻り値 int curve(x°/360°周ったか)
        • アルゴリズム(フローチャート)curve.doc

      5. 超音波センサ監視モジュール
        • 機能: 超音波センサRTタスクモジュールと上位モードモジュールの仲介をする。
        • 構成要素: 超音波センサRTタスクモジュール
        • このモジュールが使用されるモード: 走行t、補正、緊急回、走行k、周回、自己位置
        • 関数名 ussck()
        • 引数 なし
        • 戻り値 int uss1,uss2,uss3,uss4(距離の値を返す)
      6. タッチセンサ監視モジュール
        • 機能: タッチセンサデバイスドライバと上位モードモジュールの仲介をする。
        • 構成要素:タッチセンサ・赤外線センサデバイスドライバ
        • このモジュールが使用されるモード: 走行t、補正、緊急回避、走行k、角度調整、周回、タッチ
        • 引数 なし
        • 戻り値 int ts(1〜7を返す)
      7. 赤外線センサ監視モジュール
        • 機能: 赤外線センサデバイスドライバと上位モードモジュールの仲介をする。
        • 構成要素:タッチセンサ・赤外線センサデバイスドライバ
        • このモジュールが使用されるモード: 走行k、周回、タッチ  走行k、角度調整、ポスト周回、ポスト獲得
        • 関数名 irsck()
        • 引数 なし
        • 戻り値 int irs(1〜5を返す)

    3. RT タスクモジュール
      1. PWM・ロータリーエンコーダ RTタスクモジュール
        標準MIRSで提供されている物を使用する。MIRSATLM PWM・ロータリーエンコーダRTタスクモジュール取扱説明書(MIRSATLM-SOFT-1002)
        • 機能: 左右のロータリーエンコーダのカウント値、速度データ、各種機能の指令などをやり取りする。直進、回転を このRTタスクで実現する。足回り系の全ての制御を行う。
        • このRTタスクモジュールがされるモジュール 直進走行モジュール、回転モジュール、カーブモジュール
        • 関数名
          1. void pwm_both_data(int l_duty, int r_duty) 速度データをPWMへ送るのに使用する関数。
          2. void pwm_left_data(int l_duty) 左のタイヤの速度のみを変更する必要があるときに使用する関数。
          3. void pwm_right_data(int r_duty) 右のタイヤの速度のみを変更する必要があるときに使用する関数。
          4. void pwm_circle_data(int angle) その場回転をする際に使用する関数。
          5. void pwm_cm_data(int l_distance, int r_distance) MIRSを指定した距離だけ走らせて停止させるための関数。
        • 優先度
        • FIFO の仕様
          1. FIFO3(ロータリーエンコーダのカウント値用)
          2. FIFO4(速度データ用)
          3. FIFO5(RT-タスク制御用)
        • アルゴリズム
      2. 超音波センサ RTタスクモジュール
        標準MIRSで提供されている物を使用する。MIRSATLM 超音波センサRTタスクモジュール取扱説明書(MIRSATLM-SOFT-1001)
              
        • 機能: 上位プログラムとコマンド、データのやり取りを行い、超音波センサを制御する。
        • このRTタスクモジュールがされるモジュール 超音波センサ監視モジュール
        • 優先度
        • FIFO の仕様
          1. FIFO1(超音波センサ選択コマンド)
          2. FIFO2(測定結果 )

    4. デバイスドライバ
      1. 赤外線・タッチセンサドライバ
        標準MIRSで提供されている物を使用する。MIRSATLM 赤外線・タッチセンサデバイスドライバ取扱説明書(MIRSATLM-SOFT-1004)
        • 機能: 赤外線デバイスドライバは、MIRS0005に搭載されるタッチセンサ、赤外線センサ、パワーオン信号のON/OFFを調べるためのLINUX用デバイスドライバである。
        • このドライバが使用されるモジュール 赤外線センサ監視モジュール、タッチセンサ監視モジュール
        • 関数名
          1. int fc=open("/dev/irs_ts",f_mode) 赤外線・タッチセンサドライバをopenする。
          2. read(fc, char *data,size_t count,loff_t offset) タッチセンサ・赤外線センサの現在の状況をI/Oポートからint型で読み込む。
        • IO アドレス、IRQ
      2. LCDドライバ
        標準MIRSで提供されている物を使用するMIRSATLM LCDデバイスドライバ取扱説明書(MIRSATLM-SOFT-1003)
        • 機能:LCDデバイスドライバは、MIRS0005に搭載されるLCD(SC1602BS)への表示を行うLINUX用デバイスドライバである。
        • このドライバが使用されるモード、モジュール:全モードモジュール
        • 関数名
          1. int fd=open("/dev/lcd$i",f_mod) LCDドライバをopenする。
          2. read(fd, char *buf,size_t count,loff_t offset) 表示されているデータを取り込む。
          3. write(fd, char *buf,int count,offset) bufに格納されている文字をLCDに表示する。
          4. ioctl(fd,int cmd,int &ctl_nr) LCDの表示クリアなど、各種命令を実行するための関数。
        • IO アドレス、IRQ

    5. 関数モジュール
      1. 座標比較
        • 機能: 走行tでUSS4(右側)で右側の距離を測りながら直進し、data[2][]に代入する。それを比較して ポストと思われる座標をx=zahyo[a][0],y=zahyo[a][1]に代入する。
        • この関数を利用するプログラム: 走行k
        • 関数名 zahyohikaku
        • 定義する変数 data[2][],zahyo[2][],a

  7. 試験
    1. モードモジュール、機能モジュール単体試験
      • モード間の以降が問題無く行われるか。機能モジュールが機能の実現を 十分に果たしているかを試験する。
    2. 標準MIRS上での移行試験
      • MIRS0005と標準MIRSはOS等ソフトウェアの動作環境はほぼ同じで、 エレクトロニクスの一部分とセンサの位置とメカニクスが違い、MIRS0005の実機が完成するまでは、標準MIRSで試験を行うことになる。 駆動系センサ系等の部分を修正して、実際にフィールドでポストの取得ができるかテストを行う。(計算系等はそのまま使える)
      • 緊急回避モードのθ1〜7、x1〜7を決める。
    3. 実機上での試験
      • カーブモジュールのカーブ半径、直進走行モジュールの計算上の走行距離と 実際の走行距離を合わせる試験が必要。
      • フィールド上で、しっかりポストを認識できるか、獲得できるか、それぞれの ステップにおいて、テスト走行をする。

  8. 作成ドキュメント一覧

  9. 進行状況
    番号ファイル担当者進行状況
    1taiki.c金武コンパイル通った
    2soukout.c佐野コンパイル通った
    3soukouk.c佐野通ってない
    4nyuuryoku.c佐野コンパイル通った
    5tyousei.c小島コンパイル通った
    6syuukai.c小島コンパイル通った
    7touch.c小島コンパイル通った
    9kaihi.c小島コンパイル通った
    10kabetyoku.c佐野コンパイル通った
    11tyokushin.c金武コンパイル通った
    12kaiten.c金武コンパイル通った
    13curve.c金武コンパイル通った
    14zahyohenkan.c金武コンパイルとおったが動作がおかしい

関連文書

BACK