2009a11l課題?

2009a a11L 課題1「似顔絵ロボットを作る」

 NQCを用いたプログラムを理解するため、似顔絵を描くプログラムを作ってみる。

目次

ロボット概要

他のグループとの差別化として、「車」であることを強調する外見に作り上げた。
また全体的にコンパクトなデザインを追求した。

ペン保持部

先輩のアイデアを生かし、車輪でペンを保持することにした。
pen.jpg
車輪を直接モーターに取り付け、反対側にモーターには取り付けないが回転できる車輪を上下にひとつづつ取り付けた。
回転しない車輪は、ゴムタイヤを外したミゾ付きのものを使用。
こうすることでうまくペンを保持することができた。
更にパーツ節約のため、できるだけコンパクトになるよう設計。

車体

最初のコンセプトとして、三輪にすることになった。
後輪と前輪の間にペン保持部を取り付けるのがやりやすいと思ったため。
後輪二輪、前輪一輪で、モーターは後輪のみ。前輪は説明書47Pを基に、キャスターを作った。
kyasutadef2.jpg
しかし47Pのキャスターをそのまま取り付けると車高が高くなってしまうため、後輪タイヤを大きなものに変更。
更にキャスター保持部も低くなるようにパーツを取り替えた。
kyasuta.jpg

基本的な構造はローヴァーロボットを幅詰めしたもの。
前に拡張するようなイメージで、モーターのほぼ直前にペン保持部を装着できるようにした。
kumikomi2.jpg shatai.jpg
しかしRCXを後方に取り付けてしまったため、重心が後ろに傾いてしまう。
よって後方、RCXの下にはね上がり防止パーツを装着。ついでにrcxと本体の接続も補強できた。
bousi.jpg
車輪を使わなかったのは、ちょうど地面に接する径のものが存在しなかったため。

ペン保持部装着

gattai.jpggattai2.jpg

前輪フレームに挟み込むように装着。
安定性を高める結果となった。

調整

ただ回転しただけで大きな円(=顔の輪郭)を描くために後タイヤ間を広くした。
軸を長くしたため、動かすとタイヤがブレるようになってしまった。
そのため、タイヤを前後左右から覆うようにフレームを増強。ブレはかなり抑えられた。
hokyou.jpg

安定性、レゴの保持力を高めるように作ったため、特に後輪周りの組み替えやメンテナンスが面倒になってしまった。 fukuzatu.jpg

完成

kansei.jpg
後輪タイヤが大きいため、トルクが大きいと、補強したとはいえ停止時にかなりブレが生じてしまうのが欠点。

プログラム

ロボットの設計上、大きな円を全員の輪郭として使用し、
顔のパーツを変えることでそれぞれ差別化を図ることになった。

ライスさんの顔

長い車間を生かした円形の輪郭を描く。
彼の上に上げた髪型を表現。
長い車間のせいで彼のまるく大きな目が描けなかったので、縦棒でその大きさを表現してみる。
彼のいつも絶えない笑顔は大きな口で表してみた。
momo.jpg

#define p_u(t) OnFwd(OUT_B);Wait(t);Off(OUT_B);//pen_up ペンを上げる
#define p_d(t) OnRev(OUT_B);Wait(t);Off(OUT_B);//pen_down ペンを下ろす
#define g_s(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);//go_strait 直進
#define g_b(t) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);//go_back 後退
#define g_c(t) OnFwd(OUT_A);Wait(t);Off(OUT_A);//go_circle 円を描く
task main()
{
       /*輪郭を描く*/
	g_c(400);//circle 円形の輪郭
      
       /*髪を描く*/
	OnRev(OUT_C);//hair
	Wait(100);//circle  	 
	OnFwd(OUT_C);
	OnRev(OUT_A);
	Wait(20);//return ピヨンと出た髪を演出
	Off(OUT_A);
	Off(OUT_C);
	
	Set(OUT_B,1);//up ペンを上げる
       p_u(5);

       /*目を描く*/
	g_c(25);//eye ment 移動 
	g_s(10);
	p_d(8);//down ペンを下ろす
	
	
	g_s(15);//left eye 左目
	p_u(6);//ペンを上げる
	Wait(50);
		
	OnFwd(OUT_C);//L90 左90度旋回
	OnRev(OUT_A);
	Wait(43);
	Off(OUT_A+OUT_C);

	g_s(32);//ment Reye 右目へ移動
	
	OnFwd(OUT_A);//R90 右90度旋回
	OnRev(OUT_C);
	Wait(43);
	Off(OUT_A+OUT_C);
	Wait(20);
	
	p_d(8);	//down ペンを下ろす
	g_b(13);// 右目を描く
	p_u(6);//up ペンを上げる
	Wait(50);
	
       /*口を描く*/
	g_s(20);//ment mouth 口へ移動
	Wait(70);
	p_d(7);//down ペンを下ろす
	g_c(50);//mouth 口を描く
	
} 

ブレ防止のため、各動作の後に細かい無動作時間を設定した。
ペンの上げ下げについて、一定の数値だとペンが地面に触れないことがあったので、
マクロを時間の関数にして対処した。
作成:ピーチクパーチク

ダークホースさんの顔

彼の立てた髪を表現するのは難しかったので、上げた前髪だけを描くことにした。
いつもつけているヘアピンも描いた。
hayashi.jpg

#define b_up OnFwd(OUT_B);Wait(5);Off(OUT_B);//ペンを上げる
#define b_dw OnRev(OUT_B):Wait(6);Off(OUT_B);//ペンを下げる
#define gs(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);//(t)だけ直進
#define gb(t) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);//(t)だけ後退
#define turn_r(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A+OUT_C);//右旋回(t)
#define turn_l(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t);Off(OUT_A+OUT_C);//左旋回(t)
task main()
{
          OnFwd(OUT_A) ;//輪郭を描く
          Wait(400) ;
          Off(OUT_A) ;
          b_up(5);
          turn_r(35);//目へ移動
          gb(25);
          
          b_dw(6);//左右横長の目を描く
          gs(20);
          b_up(5);
          gs(10);
          b_dw(6);
          gs(20);
          
          b_up(5);//口へ移動
          turn_r(43);
          gs(20);
          turn_r(40) ;
          gb(35) ;
          
          b_dw(6);//口を描く
          gs(30) ;
         
          b_up(5);
          turn_l(45) ;//髪へ移動
          gb(55) ;
          
          b_dw(6);//髪を描く
          OnRev(OUT_C) ;
          Wait(65) ;
          Off(OUT_C) ;
          turn_l(40);
          
          b_up(5);//ヘアピンへ移動
          gs(30);
          turn_r(55);
          b_dw(6);
          gs(25);//ヘアピンを描く
                   
}

髪がツノのようになってしまったが、彼の特徴をつかんだ絵に仕上がったと思う。
作成:ライス

ピーチクパーチクさんの顔

彼は優しい顔立ちをしているが少し暗いのでその暗さを出してみた。
主にうつむきがちな目とヘの字に結んだ口。 ore.jpg

#define t_l(t) OnRev(OUT_A);OnFwd(OUT_C);Wait(t);Off(OUT_A+OUT_C);//左旋回
#define t_r(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A+OUT_C);//右旋回
#define go_s(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);//直進
#define go_b(t) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);//後退
#define p_w  Set(OUT_B,1);OnRev(OUT_B);Wait(8);Off(OUT_B);//ペンを下ろす
#define p_u  Set(OUT_B,1);OnFwd(OUT_B);Wait(5);Off(OUT_B);//ペンを上げる
#define s_r(t) OnFwd(OUT_A);Wait(t);Off(OUT_A);//円を描く

task main(){

int i;
	//rinkaku  輪郭(円)を描く
	s_r(350);
	p_u;

	//kami   髪を描く
	go_s(60);// 移動
	t_r(43);
	go_s(10);
	t_r(43);
	p_w;// 描く
	go_s(62);

	//eye  目を描く
	p_u;
	go_s(60);// 移動
	t_l(43);
	go_s(10);
	t_l(43);
	go_s(10);// 直進しながらペンを上げ下げする
	p_w;
	go_s(15);
	p_u;
	go_s(10);
	p_w;
	go_s(15);
	p_u;
	go_s(10);

	//mouth 口を描く
	go_s(60);// 移動
	t_r(43);
	go_s(10);
	t_r(43);
	go_s(20);
	p_w;// 描く
	go_s(20);
	p_u;
	go_s(20);
	
	//nose 鼻を描く
	t_l(43);// 移動
	go_b(30);
	p_w;// 描く
	go_b(10);
	p_u;
}

温厚な感じに仕上がった。優しさがにじみ出ている。
作成:ダークホース

コメント

コメントをどうぞ

  • テスト -- ピーチクパーチク? 2009-05-21 (木) 16:58:57
  • マクロを使えていますし、ロボットの説明もよくできています。あとは、二人目のプログラムの説明を加えてください。 -- FI? 2009-05-21 (木) 20:01:27
  • ロボットの説明はとても分かりやすいです。プログラムの説明はもう少し付け足していただきたいです。説明をつけることは、「サブルーチンや関数、マクロなどを使って部品に分けること」の手助けになり、より美しいプログラムが書けます。 -- こさか? 2009-05-21 (木) 23:12:22
  • 5/22 18:17 更新 -- ピーチクパーチク? 2009-05-22 (金) 16:56:17
  • プログラムの説明が入ったことで、私の目からも「どこをマクロにすべきか?」が見えて参りました。例えばピーチクパーチクさん作成のプログラム、「ペンを上げる」「ペンを下ろす」が数回出てきているところなんかがその例です。 -- こさか? 2009-05-28 (木) 23:59:53
  • 上で言ったことができています!大変見やすく、美しいプログラムになりました。 -- こさか? 2009-06-05 (金) 13:33:31


添付ファイル: fileore.jpg 269件 [詳細] filemomo.jpg 294件 [詳細] filehayashi.jpg 296件 [詳細] fileshatai.jpg 271件 [詳細] filepen.jpg 313件 [詳細] filekyasutadef2.jpg 313件 [詳細] filekyasuta.jpg 323件 [詳細] filekumikomi2.jpg 284件 [詳細] filekansei.jpg 341件 [詳細] filehokyou.jpg 332件 [詳細] filegattai2.jpg 303件 [詳細] filegattai.jpg 291件 [詳細] filefukuzatu.jpg 313件 [詳細] filebousi.jpg 286件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-06-05 (金) 13:33:31 (3731d)