*最小半径の物体の決定 [#pf302b02]
[[サンプルプログラム>]]をダウンロード・コンパイル・実行してください.
[[サンプルプログラム>http://www.er.ams.eng.osaka-u.ac.jp/kawai/CP2016/main3.c]]をダウンロード・コンパイル・実行してください.

このプログラムでは,アームが最小半径の物体を左下 (-0.8, -0.8) に移動させます.

今回,二つの新しい関数を作成しています.
- int minimum_object_number(Object object[]):最小半径の物体番号を返す
- bool object_move(Object object[], int n, Position target_pos, ArmState arm_state, GripperState gripper_state):object[n].positionにある物体をtarget_posへ移動させる

まず,minimum_object_number関数では,センシングした物体情報から,最小半径の物体を探します.

配列に格納された数値列から,最小値を探すアルゴリズムは今までの授業で学習しています.

*最小半径の物体の移動 [#lea08c35]
次に,その最小半径の物体番号min_numをobject_move関数に渡して,ロボットを駆動します.

今回,物体情報を格納する構造体objectは配列であることに注意してください.
メイン関数でこの関数を使うときは,配列名(先頭要素のアドレス)を渡します.
 object_move(object, min_num, front_pos, get_arm_state(), get_gripper_state());
こうすることで,この関数内でobject[i].positionの値を更新することができます.

この関数では,列挙型TaskStateで課題の達成状況を管理して,場合分けします.

前回のapproach_and_weight関数とは異なり,PICKUP(に成功した)後に,関数
 set_command_move_arm_to(target_pos);
で物体をtarget_posまで運びます.

そして,RELEASEでは,関数
 set_command_release_object();
で物体を設置しています.

また,
 object[n].position = target_pos;
で,移動させた物体の位置を更新します.

bool型の関数はfalseかtrueを返します.
object_move関数の場合,物体を設置する指令を送ったときにのみtrueを返し,それ以外のときはfalseを返します.
この返り値はmain関数でのif文で使われ,trueのときにprintf文が有効になるようになっています.

*練習 [#l74a2480]
5個すべての物体を手前の領域 (y = -0.8) に横一列で,半径の小さい順に並べるプログラムを作成してください.

**ヒント [#ld58cb70]
物体情報配列objectを半径でソートしましょう.


* 課題 [#n6351693]
N個すべての物体を重量の小さい順に並べるプログラムを作成してください.

すべての物体の重量を計測した後に,重量の小さい順に,横一列 (y = -0.8) に物体を整列してください.

物体数Nはプログラム実行後にキーボード入力します.

ただし,少ない物体数を想定してよく,整列後の列が作業空間外になることを考慮する(折り返したりする)必要はありません.

適宜コメントを入れたり,関数化したりして,他人にもわかりやすいプログラムになるように心がけてください.全くコメントのないものは減点します.

他人のプログラムを写したことが判明した場合は,両者とも0点になります.課題内容に対応していないプログラムにも点をつけません.

**ヒント [#de96ada8]
重量計測か整列かの課題達成状況で,場合分けしましょう.

**発展課題 [#s50808fe]
重量計測と整列を同時にして,上記の整列を高速化してください.
上記の整列を高速化してください.少ない物体数を想定してもよいです.

***ヒント [#v0222fc6]
例えば,重量計測段階と整列段階を区別せずに,ある物体の重量を計測した後,その物体をその場で解放せずに,手前に設置します.

そして,次の物体については,重量に応じてその設置場所を決めます.

ただし,隙間を空けてその物体を設置して,以降の物体の設置するスペースを確保する必要があります.

** 提出物 [#k17aaedc]
提出物一式を入れるフォルダの名前は学生番号にしてください.
- プログラムファイル
- 高速化のアイデアを書いたテキスト(発展課題)

** 提出期限 [#lc267e66]
次回の授業中に,提出プログラムが正しく実行できていることをTAが直接確認します.

その授業日24:00までにCLEで提出物を提出してください.

- 1・2組:1/27
- 3・4組:1/23


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