おいふぉりーのぶろぐ

きっと趣味のブログに違いないです!!

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

ロボットの移動ルーチンの提案

move_class.png

今週は、残りのテストが色々あって忙しいのですが。。。
書きたくなったので、書く。基本的には、今年のInRoFで使ったルーチン(というよりクラス構造)ですが、InRoFを振り返ってちょっと修正(間際だと汚いこと書いてるんで)。とりあえず、今回はステッピングモーターを使って、直進(後進)と超信地旋回のみをするロボットとします。

えと、何がしたいかって
・ロボットの現在位置、向きの計算
・ロボットの移動量の記録
うん、基本的にはこの2つです。

上のUMLダイアグラム(オブジェクト指向的なプログラミングをするときに書くプログラムの設計図みたいなもの)を見てもらうと分かるんですが、クライアントはCMoveControlクラスに対してアクセスして色々します。以下、CMoveControlクラスのメソッド一覧。
・Move()、Turn()…前進(負の値を設定すると後進)、超信地旋回。
・BeginRecording()、EndRecording()…移動量の記録開始、終了。BeginRecording()は移動量記録用のオブジェクトを生成して返します。この2つのメソッドで囲まれた部分で実行されたMove()、Turn()メソッドを記録するようにします。
・Redo()、Undo()…記録した移動量をそのまま実行、逆順(パラメータも符号を逆にして)で実行。
・SetPos()、SetAngle()、GetPos()、GetAngle()…現在位置、向きの設定、取得。
・AdjustPos()、AdjustAngle()…基本的には、SetPos()、SetAngle()と同じであるが、この2つのメソッドはセンサによって現在位置を補正するときに呼び出すようにする。この2つのメソッド内では、現在位置と新たな現在位置の差(位置の場合は距離)を計算し、一定値を超えた場合は例外を発生させる(または、エラー処理をする)。要は、センサによる新たな設定値の誤差が大きすぎるときにそのエラーを検出できるようにする。デバッグとかに便利かも。

以上のことを実装するために、まず”ロボットの移動”と言うこと自体をオブジェクトにしてしまいます。ここで、この”ロボットの移動”という抽象的なオブジェクトはIMoveインターフェースとし、移動を定義したExecute()メソッド、その移動を元に戻すオブジェクトを生成するCreateUndo()メソッドを持つとします。
一方具体的には、”ロボットの移動”には”前進”と”超信地旋回”がありますので、それぞれCMoveクラスとCTurnクラスとして実装します。
実装の例としてCMoveクラスをとると、Execute()メソッドは直進した後現在値を再計算という内容になります。CreateUndo()メソッドは移動距離の符号を反転したCMoveオブジェクトを生成するようにします。
さらに、CMoveControlクラスではロボットの移動量の記録についても取り扱うので、移動量記録用のCMoveListクラスを用意します。これも、(便利かなぁ~と思って)IMoveから派生します(後から考えてみると、派生する必要は無いかも)。CMoveListには、IMoveオブジェクトのポインタの配列を持たせて、AddMove()メソッドを追加します。CMoveListのExecuteメソッドは所持している移動オブジェクトのExecute()メソッドを順に呼び出していけば良いですが、CreateUndo()メソッドは所持している移動オブジェクトに対して逆順にCreateUndo()メソッドを呼び出し、それを新たに生成したCMoveListオブジェクトに追加していくようにします。

最後に、CMoveControlクラスの実装についてです。
Move()、Turn()メソッドについては、まずCMove、CTurnオブジェクトを生成し、引数である距離、回転角度を生成したオブジェクトのメンバ変数に設定します。そして、Execute()メソッドを呼び出します。最後に、記録中であるときは生成したオブジェクトをm_TempMoveListに追加するようにし、記録中でないときはオブジェクトを破棄して終了します。
BeginRecording()メソッドは、CMoveListオブジェクトを生成し、m_TempMoveListに設定して、それを返します。
EndRecording()メソッドは、m_TempMoveListにNULLを設定して終了します。m_TempMoveListがNULLであるかどうかによって記録中かどうかの判別ができます。
Redo()、Undo()は簡単で、引数として渡されたCMoveListオブジェクトのExecute()を実行します。Undo()のときは、CreateUndo()して生成されたオブジェクトのExecute()を実行します。
以上で肝である部分の説明は終わったと思います。えと、言い忘れてましたが、位置情報はCVector2というテンプレートベクトル演算ライブラリ(自作)を使って管理します(まあ、構造体と同じです)。

たまには、ソフトなことも書きたくなるのね。

  1. 2006/07/31(月) 16:53:13|
  2. ソフトウェア開発
  3. | トラックバック:0
  4. | コメント:0
<<newlib | ホーム | アクセス解析とりつけさせていただきます。>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://tm86eublog.blog42.fc2.com/tb.php/123-76919ee7
この記事にトラックバックする(FC2ブログユーザー)

来客数

プロフィール

Euphorie

Author:Euphorie
"おいふぉりー"って呼んでくださいな☆
ハードウェアとかソフトウェアとかの開発に興味があったり。。。
連絡先は上の画像。

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

カテゴリー

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

RSSフィード

リンク

このブログをリンクに追加する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。