*最小半径の物体の決定 [#pf302b02]
[[サンプルプログラム>http://www.er.ams.eng.osaka-u.ac.jp/kawai/CP2016/main3.c]]をダウンロード・コンパイル・実行してください.
サンプルプログラムをダウンロード・コンパイル・実行してください.
~
このプログラムでは,アームが最小半径の物体を (0, -0.7) に移動させます.

今回,二つの新しい関数を作成しています.
 int minimum_object_number(Object *object);
この関数は,センシングした物体情報をもとに最小半径の物体番号を返します.

 void object_move(Object *object, int n, Position target_pos);
この関数はobject[n].positionにある物体をtarget_posへ移動させます.

*最小半径の物体の移動 [#lea08c35]
今回のobject_move関数における状態の場合分けは,
 typedef enum{
   MEASURE,
   SEARCH,
   APPROACH,
   PICKUP,
   MOVE,
   PLACE,
   FINISH
 } TaskState;
です.

この関数では,位置を計測し (MEASURE) し,minimum_object_number関数を用いて最小半径の物体番号nを探します (SEARCH).
~
そして,その物体までアームを移動させ (APPROACH),物体を把持し (PICKUP),目標位置target_positionまでアームを移動させ (MOVE),物体を設置します (PLACE).

今回,物体情報を格納する構造体objectは配列であることに注意してください.
~
メイン関数でこの関数を使うときは,配列名object(先頭要素のアドレス)を渡します.
 object_move(object, &min_num, front_pos);
こうすることで,この関数内でobject[i].positionの値を更新することができます.
~
また,移動させる物体番号min_numもアドレスとして渡すことで,whileループで状態遷移をしたとしてもその数値を維持できます.

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

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

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

最終的に,状態がFINISHになり,main関数で物体情報を表示し,whileループをbreakします.

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

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

*練習2 [#n6351693]
5個すべての物体を重量の小さい順に並べるプログラムを作成してください.
~
すべての物体の重量を計測した後に,重量の小さい順に,横一列 (y = -0.8) に物体を整列してください.

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


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