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

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

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

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

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

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

object.position = get_object_position(0);

ここで,関数の引数0は1番目の物体を意味します.

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

object.color = get_object_color_rgb(0);
object.radius = get_object_radius(0);
object.weight = get_object_weight(0);

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

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

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

approach_and_weigh(Object *object, GripperState gripper_state);

に関数化しています.
この関数には,グリッパの状態も渡しています.

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

if(arm_state == ARM_STATE_STOP)

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

アームは移動 (APPROACH),把持 (PICKUP),重量測定と解放 (RELEASE),停止 (STOP) の四つの動作をする必要があるので,この関数ではその四つの場合に分けています.
現在,どの処理段階にあるのかはtask_stateに書いておきます.

はじめ,

TaskState task_state = APPROACH;

であるので,

set_command_move_arm_to(object.position);

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

そして,PICKUPでは,

set_command_pick_up_object();

で物体を把持します.

最後に,RELEASEでは重量を測定して,物体を離します.
このとき,mainにtrueを返すことで,測定が終了したことを知らせます.

weight = get_hold_object_weight();
set_command_release_object();
task_state = STOP;
return(true);

STOPの処理には何も書いてありませんので,ロボットは停止します.

練習

5個すべての物体の重量を計測・表示するプログラムを作成してください.
このグリッパは把持に失敗することがあります.
そのときに再度把持をするようにしてください.

ヒント

approach_and_weight関数がtrueを返したときに,次の物体の処理へ進めましょう.

課題

N個すべての物体の位置・重量・色・半径,ならびに,すべての物体の計測が終了するまでのアームのx-y軌道長を(txtやcsv)ファイル出力するプログラムを作成してください.
物体数Nはプログラム実行後にキーボード入力します.

このときのアームの軌道をグラフ化してください.
物体位置はランダムに決まるので,一回の実行結果を提出してください.

適宜コメントを入れたり,関数化したりして,他人にもわかりやすいプログラムになるように心がけてください.全くコメントのないものは減点します.
他人のプログラムを写したことが判明した場合は,両者とも0点になります.課題内容に対応していないプログラムにも点をつけません.

ヒント

アームの位置の取得には,関数

Position get_arm_position()

を用います.

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

発展課題

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

提出物

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

提出日

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


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