物体情報の取得とデータ処理

サンプルプログラムをダウンロード・コンパイル・実行してください.
このプログラムでは,一つの物体の位置へアームを移動させ,物体を把持し,その重量を計測します.
物体の見た目の情報(位置,色,半径)は天井の視覚センサ(カメラ)で,物体の重量はグリッパの力覚センサで計測できると仮定します.
ただし,簡単化のため,カメラ画像処理は省いており,物体番号を渡すとその位置,色,または,半径を返す関数が用意されています.
また,これらのセンサ値にはノイズはないと仮定します.

まずは,その物体情報を格納するObject構造体を定義しましょう.

typedef struct{
     int index;
     Position position;
     ColorRGB color;
     double radius;
     double weight;
} Object;

indexは物体の番号を表すものとします.

get_object_position関数を用いて,object_index番目の物体の位置情報を取得できます.

Position get_object_position(int object_index);

例えば,引数0は1番目の物体を意味します.

同様にして,色,半径,重量を以下の関数で取得できます.

ColorRGB get_object_color_rgb(int object_index);
double get_object_radius(int object_index);
double get_object_weight(int object_index);

ただし,重量値は物体を把持しているときのみ取得可能です.

把持動作と重量情報の取得

ループの中で,取得した位置情報を元に,その物体の重量を計測します.
この処理は煩雑になるため,また,後で繰り返し使えるように,

void approach_and_weigh(Object *object);

に関数化しています.

アームが動いているときに指令を与えてもアームの動作の邪魔になるだけなので,

if(get_arm_state() == ARM_STATE_STOP)

の条件をつけて,アームが止まっているときに限りapproach_and_weigh関数が処理されるようにします.

approach_and_weigh関数では,課題の状態遷移に応じた場合分けをしています.
今回,位置測定 (MEASURE),アームの移動 (APPROACH),把持 (PICKUP),重量測定と解放 (RELEASE),終了 (FINISH) の5つの状態を仮定します.
現在どの状態にあるのかはtask_stateに書いておきます.
task_stateをわかりやすくするために,プログラムの上に,enum型としてのTaskState?型を次のように定義しています.

typedef enum{
  MEASURE,
  APPROACH,
  PICKUP,
  RELEASE,
  FINISH
} TaskState;

はじめ,

TaskState task_state = MEASURE;

であるので,

(*object).index = 1;
(*object).position = get.object_position(0);

で一番目の物体の位置を取得します.

次に,APPROACHに状態遷移し,

set_command_move_arm_to(object.position);

で,物体位置までアームを移動させます.

そして,PICKUPでは,

set_command_pick_up_object();

で物体を把持します.

最後に,RELEASEでは重量を測定して,物体を離します.

状態がFINISHになると,main関数で物体情報を表示し,whileループをbreakすることで処理を終了します.

このような,状態に応じた場合分けをすることで,状態ごとの処理がわかりやすくなり,見通しの良いプログラムになります.

練習

5個すべての物体の重量を計測・表示するプログラムを作成してください.

ヒント

状態がFINISHになったときに,次の物体の処理へ進めましょう.

課題

N個すべての物体の位置・重量・色・半径,ならびに,課題の遂行にかかった時間をファイル(txtやcsv)出力するプログラムを作成してください.

ヒント

シミュレーションの経過時間の取得には,関数

double get_system_time_in_sec();

を用います.

グラフ描画ツールには例えば,gnuplot,R,python,Microsoft Excel,OpenOffice? Calcがあります.

発展課題

より短い(最短の)アームの移動で課題を終了させるためにはどのようにすればよいか考え,そのプログラムを作成してください.
提案した発展課題プログラムの実行時間と,課題プログラムの実行時間を比較し,どれだけ実行時間を短縮できたかを示してください.
この課題はセールスマン巡回問題と関連し,難問ですので,後回しでもよいです.

提出物

提出物一式を入れるフォルダの名前は学生番号にしてください(ログインIDではない!).

提出日

2週間後の24:00までに,上記を入れたフォルダをzipに圧縮したものをCLEで提出してください.


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS