- 追加された行はこの色です。
- 削除された行はこの色です。
*最小半径の物体の決定 [#pf302b02]
[[サンプルプログラム>]]をダウンロード・コンパイル・実行してください.
[[サンプルプログラム>http://www.er.ams.eng.osaka-u.ac.jp/kawai/CP2017/main3.c]]をlibrobo.aを使ってコンパイル・実行してください.
~
このプログラムでは,アームが最小半径の物体を (0, -0.7) に移動させます.
このプログラムでは,アームが最小サイズの物体を左下 (-0.8, -0.8) に移動させます.
今回,二つの新しい関数を作成しています.
- int minimum_object_number(Object object):最小サイズの物体番号を返す
- void object_move(Object object, Position target_pos, ArmState arm_state, GripperState gripper_state, int i):object[i].positionにある物体をtarget_posへ移動させる
int minimum_object_number(Object *object);
この関数は,センシングした物体情報をもとに最小半径の物体番号を返します.
まず,minimum_object_number関数では,センシングした物体情報から,最小半径の物体を探します.
void object_move(Object *object, int *n, Position target_pos);
この関数はobject[n].positionにある物体をtarget_posへ移動させます.
配列に格納された数値列から,最小値を探すアルゴリズムは今までの授業で学習しています.
*最小半径の物体の移動 [#lea08c35]
次に,その最小サイズの物体番号をobject_move関数に渡して,ロボットを駆動します.
今回のobject_move関数における状態の場合分けは,
typedef enum{
SEARCH,
APPROACH,
PICKUP,
MOVE,
PLACE,
FINISH
} TaskState;
です.
いつものように列挙型TaskStateで,課題の達成状況を記録して,場合分けします.
この関数ではまず,位置を計測し,minimum_object_number関数を用いて最小半径の物体番号nを探します (SEARCH).
~
そして,その物体までアームを移動させ (APPROACH),物体を把持し (PICKUP),目標位置target_positionまでアームを移動させ (MOVE),物体を設置します (PLACE).
前回のapproach_and_weight関数とは異なり,PICKUP(に成功した)後に,関数
メイン関数でこの関数を使うときは,配列名object(先頭要素のアドレス)を渡します.
object_move(object, &min_num, front_pos);
こうすることで,この関数内でobject[i].positionの値を更新することができます.
~
また,移動させる物体番号min_numもアドレスとして渡すことで,whileループで状態遷移をしたとしてもその数値を維持できます.
前回のapproach_and_weight関数とは異なり,物体の把持後に,関数
set_command_move_arm_to(target_pos);
で物体をtarget_posまで運びます.
でその物体をtarget_posまで運びます.
そして,RELEASEでは,関数
そして,PLACEでは,関数
set_command_release_object();
で物体を設置しています.
*練習 [#l74a2480]
5個すべての物体を手前 (y = -0.8) に半径の小さい順に並べるプログラムを作成してください.
また,
object[*n].position = target_pos;
で,移動させた物体の位置を更新します.
手前の領域に,横一列に物体を並べてください.
最終的に,状態がFINISHになり,main関数で物体情報を表示し,whileループをbreakします.
*練習 [#l74a2480]
5個すべての物体を手前の領域 (y = -0.7) に横一列で,半径の小さい順に並べるプログラムを作成してください.
**ヒント [#ld58cb70]
物体情報配列objectを半径でソートしましょう.
* 課題 [#n6351693]
N個すべての物体を重量の小さい順に並べるプログラムを作成してください.
*練習2 [#n6351693]
5個すべての物体を重量の小さい順に並べるプログラムを作成してください.
~
すべての物体の重量を計測した後に,重量の小さい順に,横一列 (y = -0.8) に物体を整列してください.
物体数Nはプログラム実行後にキーボード入力します.
適宜コメントを入れたり,関数化したりして,他人にもわかりやすいプログラムになるように心がけてください.全くコメントのないものは減点します.
他人のプログラムを写したことが判明した場合は,両者とも0点になります.課題内容に対応していないプログラムにも点をつけません.
**ヒント [#de96ada8]
重量計測か整列かの課題達成状況で,場合分けしましょう.
**発展課題 [#s50808fe]
重量計測と整列を同時にして,上記の整列を高速化してください.
** 提出物 [#k17aaedc]
提出物一式を入れるフォルダの名前は学生番号にしてください.
- プログラムファイル
- 高速化のアイデアを書いたテキスト(発展課題)
** 提出期限 [#lc267e66]
次回の授業中に,提出プログラムが正しく実行できていることをTAが直接確認します.
その授業日24:00までにCLEで提出物を提出してください.
- 1・2組:1/27
- 3・4組:1/23