2019b/Member

目次

ロボット

ロボットの説明

IMG_3668a.jpg

 モーターでタイヤを動かし、ペンを搭載したロボット全体を移動させて似顔絵を描く。モーターは全部で3つあり、2つはタイヤを回すために、残り1つはペンの上げ下げのために使用されている。

IMG_3656a.jpg

ペンは2つのタイヤの間にあり、輪ゴムで固定されている。

ロボットの特徴

ペン先が2つのタイヤの中心にくるようにした

 最初、ペンの接地地点を前輪の前にくるようにした。しかし、曲線から直線に切り替えるときに変な出っ張りが現れてしまい、なめらかな線を描くことはできなかった。そのため、できる限りペン先が2つのタイヤの中心にくるようにした。結果、輪郭をなめらかな線で描くことができた。

重心をなるべく前輪の方に寄せた

 後輪は小さなタイヤ1つとなっているため、後輪の方に重心が寄るとバランスを崩しやすく、転倒することもあった。そのため、できる限り前輪の方に重心を寄せ、安定するようにした。

前輪のタイヤ幅を調整した

 タイヤの間にペンが入るくらいのスペースがあり、かつ片方のタイヤだけを回して曲がったときに自分が望むサイズの弧を描けるように調整した。それにより、プログラム面での苦労を減らすことができた。

プログラム

プログラム全体

#define SPEED 30

float GetAngle(float d)
{
    const float diameter = 5.45;
    const float pi=3.1415;
    const float distance=12.5;
    float ang = (distance*d)/diameter;
    return ang;
}
sub fwd(int t)
{
    RotateMotorEx(OUT_BC,SPEED,t,0,false,true);
}
sub fwd_B(int b)
{
    RotateMotor(OUT_B,SPEED,b);
}
sub fwd_C(int c)
{
    RotateMotor(OUT_C,SPEED,c);
}
sub turn_right(int r)
{
    int angle = GetAngle(r);

    RotateMotorEx(OUT_BC,25,angle,100,true,true);
}
sub turn_left(int l)
{
    int angle = GetAngle(l);

    RotateMotorEx(OUT_BC,25,angle,-100,true,true);
}
sub up()
{
    RotateMotor(OUT_A,15,30);
}
sub down()
{
    RotateMotor(OUT_A,-10,30);
}
task main()
{
    up();
    down();
    fwd(180);
    fwd_B(810);
    fwd(180);
    fwd_B(427);
    fwd(45);
    fwd_B(427);
    up();
    turn_left(90.0);
    fwd(30);
    down();
    fwd(270);
    up();
    turn_right(105.0);
    fwd(15);
    turn_right(110.0);
    fwd(54);
    down();
    fwd(54);
    up();
    fwd(54);
    down();
    fwd(54);
    up();
    fwd(54);
    turn_left(100.0);
    fwd(220);
    turn_left(90.0);
    fwd(100);
    down();
    fwd(90);
    fwd_B(60);
    up();
    turn_left(100.0);
    fwd(100);
    down();
    fwd_C(427);
}

プログラムの説明

括弧内に方向転換したい角度を入れ、タイヤの回転角度を計算するプログラム

float GetAngle(float d)
{
    const float diameter = 5.45;
    const float pi=3.1415;
    const float distance=12.5;
    float ang = (distance*d)/diameter;
    return ang;
}

括弧内にタイヤの回転角度を入れ、直進するサブルーチン

sub fwd(int t)
{
    RotateMotorEx(OUT_BC,SPEED,t,0,false,true);
}

括弧内にタイヤの回転角度を入れ、右、もしくは左に曲がるサブルーチン

sub fwd_B(int b)
{
    RotateMotor(OUT_B,SPEED,b);
}
sub fwd_C(int c)
{
    RotateMotor(OUT_C,SPEED,c);
}

括弧内に方向転換した角度を入れ、右、もしくは左に回るサブルーチン

sub turn_right(int r)
{
    int angle = GetAngle(r);

    RotateMotorEx(OUT_BC,25,angle,100,true,true);
}
sub turn_left(int l)
{
    int angle = GetAngle(l);

    RotateMotorEx(OUT_BC,25,angle,-100,true,true);
}

ペンを上げ、ペン先を紙面から浮かせるサブルーチン

sub up()
{
    RotateMotor(OUT_A,15,30);
}

ペンを下げ、ペン先を紙面につけるサブルーチン

sub down()
{
    RotateMotor(OUT_A,-10,30);
}

プログラムの特徴

サブルーチンを多用した

 サブルーチンでいくつかの一連の命令をまとめ、task mainのプログラムをシンプルなものにした。

ロボットの移動のスピードは少し遅めにした

 スピードが速いとロボットが重いせいで曲がるときにバランスを崩しがちだったため、全体的に動作を遅くした。

タイヤを回すためのプログラムでOnFwdではなくRotateMotor(EX)を使用した

 OnFwdだと電池残量に影響されたり、進む距離の調整に手間がかかったりした。また、ロボットの重量が変わったときの挙動の変化も大きかった。

反省・改善点

  • バランスのために重心を前輪の方に寄せたが、後ろのタイヤを増やして安定させてもよかった。
  • ロボットが重いせいか方向転換する際にタイヤが浮き、思った通りにロボットが動かないことがあった。タイヤの回転速度や使用パーツの見直しをすべきだった。
  • ロボットが縦に長く、かつ比較的重量のあるNXT本体が上の方にあったため不安定だった。ペンの上げ下げのためのモーターやNXT本体の向きや位置を変え、重心を下の方に寄せることも考えるべきだった。
  • どこからどこまでが何のプログラムかが分かりにくくなっているため、改行やスラッシュを使い見やすくするべきだった。

感想

IMG_3673a.jpg

 今回のお絵かきロボットの作成に想像以上の時間がかかり驚いた。また、ロボットは自分が望む動きをしないということを痛感した。今後は今回の反省を活かした取り組みをしていきたい。


添付ファイル: fileIMG_3673a.jpg [詳細] fileIMG_3656a.jpg [詳細] fileIMG_3668a.jpg [詳細]

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