2019b/Member

課題1 お絵描きロボット

チームメイトの似顔絵を描くロボットの作成

課題の成果

image1.jpeg

ロボットについて

最初はロボットの前後と進行方向に垂直にペンを移動させる方法を考えていたが、ロボット自体の構造が複雑になってしまうことやモーターの回転で直線的な位置を管理するのが難しいと考え、ロボット自体が自由に動く仕組みに切り替えた。

ロボットの説明

image2.jpeg

モーターを3つ使っている。タイヤ2輪にそれぞれモーターをつけ、もう一つのモーターにペンを取り付け回転させることでペンの上げ下げを行う仕組みになっている。ペンの位置を決めやすくするために2つのタイヤの中間にペンが来るようにした。タイヤの上にペンがあるため本体が後ろ寄りにつくせいで重心が後ろになってしまう。倒れないようにするためにキャスターを増やし、4輪にした。

image0.jpeg

ロボットの反省点

この方法は安定性が低かった。 タイヤで地面を走るため、

  • タイヤと地面の摩擦
  • キャスターの角度
  • ペンと紙との摩擦

などの要素で位置がずれてしまう。一度位置がずれてしまうとその時の位置をもとに次の位置を目指すためすべての顔のパーツの位置がおかしくなってしまう。実際にタイヤのほこりをふくだけで別の顔が出来上がった。

ロボット自体が走る方法にしても、

  • ロボットの重心をもっと中央に寄せる
  • ペンを斜めに接地させ摩擦を減らす
  • ロボット自体が高く、倒れやすくなっているためもっとコンパクトな作りにする

などの工夫を行うべきであった。

プログラムについて

使用したプログラム

#define SPEED 50
#define TIME 500

void turn(float f)
{
    const float diameter=5.5;
    const float distance=12.5;
    float angle=f*distance/diameter;
    if(f>0)
    {
        RotateMotorEx(OUT_BC,SPEED,angle,100,true,true);
    }
    else
    {
        RotateMotorEx(OUT_BC,SPEED,angle,-100,true,true);
    }
    Wait(TIME);
}
void straight(float d)
{
    const float diameter=5.5;
    const float pi=3.1415;
    float ang=d/(diameter*pi)*360;
    RotateMotorEx(OUT_BC,SPEED,ang,0,true,true);
    Wait(TIME);
}
void curve(int Vb,int Vc,int t)
{
    OnFwd(OUT_B,Vb);
    OnFwd(OUT_C,Vc);
    Wait(t);
    Off(OUT_BC);
    Wait(TIME);
} 

task main()
{
    straight(5);
    curve(0,70,950);
    straight(3);
    curve(0,70,950);
    straight(5);
    curve(10,80,1800);
    RotateMotor(OUT_A,10,20);
    straight(5);
    turn(80);
    straight(2);
    RotateMotor(OUT_A,-10,20);
    straight(3);
    RotateMotor(OUT_A,10,20);
    straight(2);
    RotateMotor(OUT_A,-10,20);
    straight(3);
    RotateMotor(OUT_A,10,20);
    turn(90);
    straight(5);
    RotateMotor(OUT_A,-10,20);
    curve(-20,50,1500);
    RotateMotor(OUT_A,10,20);
    turn(90);
    straight(2);
    turn(-45);
    RotateMotor(OUT_A,-10,20);
    straight(2);
    RotateMotor(OUT_A,10,20);
    straight(30);    
}

プログラムの説明

3つの関数を使っています。

関数名:関数の意味(数値が指定するもの)
turn:ロボットがその場で回転する(ロボットの回転する角度、単位は度)
straight:ロボットが直進する(ロボットの直進する距離、単位はcm)
curve:ロボットが曲線を描く(右タイヤの速さ,左のタイヤの速さ,走る時間)

turn

似顔絵を描く上でロボットは左右に回転できた方が便利である。そのため、括弧の中の数の正負で回転方向を変えられるようにしたいと考えた。しかし、

RotateMotorEx(OUT_BC,50,90,100,true,true);
RotateMotorEx(OUT_BC,50,-90,100,true,true);

このように指定する角度の正負を入れ替えても挙動は同じになってしまった。そのため、

if(f>0)
{
    RotateMotorEx(OUT_BC,SPEED,angle,100,true,true);
}
else
{
    RotateMotorEx(OUT_BC,SPEED,angle,-100,true,true);
}

if文を用いて角度の正負を判断し、それぞれ別の命令を出すようにした。

straight

進みたい距離からタイヤの回転角を決め、進む関数です。

curve

似顔絵にはたくさんの曲線が必要だと考えたため作成した。走る時間と左右のタイヤの速度をそれぞれ指定して曲線(円の一部)を描く。

まとめ

途中でロボットの構造を変えるなど計画性のない行動をとってしまった。次回はもっとロボットに時間をかけ、計画的に作成したい。プログラムに関しては関数を利用してシンプルな書き方ができた。しかし、まだ手探りな部分が多いため慣れていきたい。


添付ファイル: fileimage2.jpeg 1件 [詳細] fileimage1.jpeg 5件 [詳細] fileimage0.jpeg 2件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-11-11 (月) 21:03:58