課題1

これまで住んだことのある都道府県名、市町村名、地区名などの中から 2文字以上のものを選び、かつ合計10画以上のものを選び、それをA4の紙に書くロボットを製作せよという課題であった。

選んだ文字

私たちは令和という時代に住んでいるので「令和」にした。(地区名という条件忘れてました。ごめんなさい。)

ロボットの解説

全体 ペンアップ 前

直進、後進、回転することができる機体に上下させることができるアームを取り付けただけの非常にシンプルなロボットである。

下準備

実験

EV3は例えば前進させる時は、

mL.run_timed(time_sp=3000, speed_sp=500)
mR.run_timed(time_sp=3000, speed_sp=500)

のように時間とスピードを入力する。 しかし、時間3000,スピード500と言われてもどれだけ進むか分らないので調べてみた。

なお今後、スピードは500で統一してプログラムしていく。

実験の結果、時間300で75cm前進することが分かった。

同様に回転についても実験した結果、744と入力すると360°回転することが分かった。

回転について

距離 ev3

写真の通り、機体の回転の中心はタイヤにあるため、回転中心がペンと離れている。(図では回転中心を赤ダイヤで表現した。)

この機体で「口」の2辺を書くことを考える。「口」の2辺を書くためには、…樟を引く90°時計回りに回転する。D樟を引く という手順で書くことが出来ると考えるかもしれない。

しかし図のように、回転中心とペンが離れているため2直線が1点で交わらず、書くことが出来ない。 false

正しく書くにはどうしたらよいか。回転中心とペンの距離だけ余計に動かす必要がある。

…樟を引く回転中心とペンの距離だけ前進する90°回転するげ鹽消羶瓦肇撻鵑竜離だけ後進する。ツ樟を引く

true1

true2

true3 これで2直線が1点で交わる事ができた。

このようにペンを中心に回転させるときは回転の前後に前進後進させる必要がある。

不具合

実験をしていく中で反時計回りの回転がこの機体は苦手だということが分かった。同じ値を入力して回転させても角度がバラバラになってしまう。時計回りの回転ではこのような事が起こらず毎回入力した値までしっかり回ってくれた。このことから文字を書くときは極力時計回りで回転させるようにした。

実験では距離の測定に手持ちの定規を使ったり、角度の測定にタイルに合わせて目分量で測ったりしており正確性には欠ける。よってプログラムして機体を動かすときには入力する値は細かく微調整してより文字に見えるようにしていった。

最初私は同じ値を入力すれば、前進も後進も同じ距離進むと思い込んでいた。しかし文字を書かせてから気づいたのだが、同じ値でも後進の方が前進より長く進むことが分かった。そのため、前進して同じ距離後進させるプログラムでも前進後進で違う値が入力されている。また、短い距離だけ後進させようとするとその距離分だけ後進せずほとんど動かないことも分かった。そのため、後進はある程度長い距離動かすときのみ使用した。

書き順

”不具合”で述べた事を意識しながら書きやすくなる書き順を決めた。 書き始めは図の位置からとする。

書き始め

書き順について

令の6画目

令の6画目が下から上へ書くようになっているのは正に”不具合”で述べた「反時計回りに極力回らない」を意識した結果である。6画目を上から下へ書くようにするには4,5の道を後戻りするように進む。そうすると図のように反時計回りに回転してしまうところが出てしまう。

反時計回り

90°反時計回りに回るところを270°、もしくは450°時計回りに回転させることも出来るが回転させる角度が大きくなるほど字を書く時間も延びてしまい動作も不安定になる。6画目を下から上に書くようにすれば90°時計回り2回と180°時計回り1回で書くことができ、動作を安定させ、書く時間も短くすることが出来る。

時計回り

和の禾

禾が令和の中で最も難易度が高かった。難易度を上げている所が「2辺のはらいを一点で交わらせる」 屬呂蕕い鮟沈に合わせる」△任△襦

正しい書き順の通りに書くと△浪魴茲任る。しかし,達成できそうにない。図の状態からはらいの2辺目の書き始めに移動する方法はないことはないのだがとんでもなく複雑な動きを重ねる事になってしまう。

移動

はらいを令の1,2画目のように書くことによって,浪魴茲垢襪海箸出来る。これは図のように縦線を先に書くかはらいを先に書くかの2パターンが考えられる。△鮹成するためにはどちらが良いのだろうか。

which

△鮹成させるためには曲がる角度や進む距離を微調整しなくてはならない。その微調整するべきポイントは少ない方が簡単で良い。

2つのパターンで微調整するべきポイントを見てみる。左は図のように距離2つ角度1つ微調整するべきポイントがある。それに対し、右は距離1つしかない。はらいを縦線に合せるより縦線をはらいに合わせるほうが簡単である事が分かる。

微調整

反時計回り回転をしないと言う点から考えても縦線は下から上に書く方が良い。だから禾の横線2本ははらい、縦線の後に書いている。

禾の横線1本目だけバックしながら書いているがこれは”不具合”で述べたようにこの機体に短い距離だけバックさせようとするとほとんど動かない為である。

動く

プログラム

始めに

始めにev3dev用に書かれたpythonライブラリやsleep関数などを導入する。

#!/usr/bin/env python3
from ev3dev.ev3 import *
from time import *
mL = LargeMotor("outA")
mR = LargeMotor("outB")
mC = MediumMotor("outC")

mLは左側の車輪を動かすモーター、mRは右側の車輪を動かすモーター、mCはペンを上げ下げさせるアームのモーターを表している。

関数

様々な関数を定義する。

動作の直後にsleepを入れ、動きを止めることで動作を安定させている。今回は止める時間を2秒で統一した。

  • penupで、ペンを上げ、pendownでペンを下げる。あんまり下げる角度を大きくしすぎるとペンが紙に引っかかり動かなくなるので気をつける。
def penup():
    mC.run_to_abs_pos(position_sp=10,speed_sp=500,stop_action="hold")           
    mC.run_to_abs_pos(position_sp=10,speed_sp=500,stop_action="hold")           
    sleep(2)
def pendown():
    mC.run_to_abs_pos(position_sp=-15,speed_sp=500,stop_action="hold")
    sleep(2)
  • run_by_mm(mm)で進みたい距離まで前進させる。backでは後進。”実験”で得た結果をここで利用している。
def run_by_mm(mm):
    mL.run_timed(time_sp=30*mm/7.5,speed_sp=500)
    mR.run_timed(time_sp=30*mm/7.5,speed_sp=500)
    sleep(2)
def run_back_mm(mm):
    mL.run_timed(time_sp=30*mm/7.5,speed_sp=-500)
    mR.run_timed(time_sp=30*mm/7.5,speed_sp=-500)
    sleep(2)
  • turnRでペンが回転中心になるように時計回りに回転、turnLで反時計回りに回転する。(position_sp)に回転したい角度を入力するとそれだけ回転する。前進後進関数と同じように”実験”の結果をここで利用している。”回転について”で述べたように回転の前後に前進後退が入っている。また、”不具合”で述べたようにturnLは今回は2回しか用いていない。
def turnR(position_sp):
    run_by_mm(125)
    sleep(2)
    mL.run_to_rel_pos(position_sp=744*position_sp/360,speed_sp=500,stop_action="hold")
    mR.run_to_rel_pos(position_sp=-744*position_sp/360,speed_sp=500,stop_action="hold")
    sleep(2)
    run_back_mm(115)
def turnL(position_sp):
    run_by_mm(125)
    sleep(2)
    mL.run_to_rel_pos(position_sp=-744*position_sp/360,speed_sp=500,stop_action="hold")
    mR.run_to_rel_pos(position_sp=744*position_sp/360,speed_sp=500,stop_action="hold")
    sleep(2)
    run_back_mm(115)
  • 機体をそのまま反時計回りに回転する。
def tturn(po):
    mL.run_to_rel_pos(position_sp=744*po/360,speed_sp=500,stop_action="hold")
    mR.run_to_rel_pos(position_sp=-744*po/360,speed_sp=500,stop_action="hold")
    sleep(2)

プログラム

実際に動かすプログラムを載せる。 pendownの横にある#,楼豌萍椶僚颪始めを表す。penupでその画の書き終わりを表す。

まず「令」を書く。

#rei
pendown() #
run_by_mm(120)
penup()
turnR(60)
pendown() #
run_by_mm(120)
penup()
run_by_mm(260)
tturn(175)
turnL(45)
run_by_mm(35)
pendown() #
run_by_mm(60)
penup()
run_by_mm(200)
turnL(85)
run_by_mm(50)
turnL(85)
run_by_mm(80)
pendown() #
run_by_mm(90)
penup()
turnR(90)
pendown() #
run_by_mm(65)
penup()
run_by_mm(60)
turnR(90)
run_back_mm(40)
run_by_mm(45)
turnR(90)
run_back_mm(40)
pendown() #
run_by_mm(95)
penup()

「令」の書き終わりから「和」を書き始めるポジションへ移動させる。

run_by_mm(155)
tturn(175)
turnR(90)
run_back_mm(40)
run_by_mm(140)
turnR(130)

「和」の禾を書く。最後に「口」を書き始めるポジションに移動するためtturnとrun_back_mmを入れている。

#wa nogihen
pendown() #
run_by_mm(50)
penup()
turnR(60)
pendown() #
run_by_mm(50)
penup()
turnR(150)
run_by_mm(45)
turnR(90)
run_back_mm(45)
pendown() #
run_by_mm(100)
penup()
turnR(90)
run_by_mm(50)
pendown() #
run_back_mm(60)
penup()
run_by_mm(120)
turnR(90)
run_by_mm(40)
turnR(90)
run_by_mm(60)
pendown() #
run_by_mm(90)
penup()
tturn(175)
run_back_mm(200)

最後に「和」の「口」を書く。

線を書き、90°回転させる。これを4回繰り返せばよいのでfor文でループさせる。4本線を書いてから90°回転させる意味はないので今回は3回ループさせる。

#wa sikaku
for sikaku in rarge(3):
        pendown()
        run_by_mm(70)
        penup()
        run_by_mm(60)
        turnR(90)
        run_back_mm(40)
pendown()
run_by_mm(70)
penup()

結果

以上のプログラムで書いた「令和」がこれである。

令和

下の写真は「令」の3画目と4画目の距離を短くしすぎてしまった場合である。それ以外は上のコードと何一つ変わらないのだがこっちの方が「令和」っぽく見える気がする。

令和こっちの方がよくない?

考察

苦労した、工夫した点

このロボットはペンと機体が同時に動いてしまうので曲線どころか折り曲がりさえも上手くかけなかった。一番難しかったのは3辺以上が一点で交わる所、つまり「令」の5画目(プログラムでは6画目)と「和」の禾である。特に禾の4,5画目(プログラムでは7,8画目)の部分が難しかった。本来の書き順通り3画目の縦線を書いてから、4,5画目を書こうとしたがそこの始点が縦線に全く合わない。そこで4,5画目を始めに書いてしまい、その始点に縦線を突き刺すようにして書くことで「禾」に近づける事ができた。(実際始点と縦線を合わせることは出来なかったが。)

人文字、一パーツなら上手く書けてもそれをまとめて書こうとすると上手くいかくなるのも苦労した。。「口」を書くプログラムもそれ単体で実行するとわりときれいな四角形になったのだが全体で通すとずれてしまった。(原因がいまいち分からなかった。EV3のモーターの問題?reset()メソッドを入れなかったから?それらの原因を突き止め、修正したかったが時間が無かった。)ただプログラムするだけでは上手くいかないロボットの難しさを感じる事ができた。

わりときれいな四角形

反省点と改善案

  • 機体が止まるときに慣性力が働いて後輪が浮いてしまった。それが原因で書き終わりが乱れたり、少し傾きがずれてしまい、思った通りに字が書けなくなったと考えられる。後ろに重りかなにかをつけると慣性力で浮き上がることは無くなると思われる。
  • そもそも動かすスピードが速すぎた。速く動く、それだけでロボットは安定しない。スピードを500で統一したのも特に深い理由は無かった。もっとスピードを落とすべきだった。しかしそうするともう一度実験し直す必要があり、これまで決めた値も全て無駄になってしまいそうするだけの時間も残っていなかった。
  • 一番始めに書き始めるポジションを人の感覚で決めていた。始めに置いた角度で文字の形が大きく変わってしまう気がする。「紙の何センチ下から何度傾けて置いてスタートする」といった事を始めに決めておくべきだった。

合計訪問者数 112 人


添付ファイル: file動く.jpg 5件 [詳細] file令2.jpg 6件 [詳細] file微調整.jpg 4件 [詳細] filewhich.jpg 5件 [詳細] file移動.jpg 8件 [詳細] file令1.jpg 5件 [詳細] file令.jpg 4件 [詳細] file書き始め.jpg 2件 [詳細] file令和.jpg 2件 [詳細] filetrue3.png 8件 [詳細] filetrue2.png 10件 [詳細] filetrue1.png 8件 [詳細] filefalse.png 8件 [詳細] fileev3.png 9件 [詳細] file8509.jpg 8件 [詳細] file9006.jpg 9件 [詳細] file8686.jpg 12件 [詳細] fileれいわ.png 10件 [詳細] fileddd.png 4件 [詳細] filekyo.jpg 13件 [詳細] fileInked15894_LI.jpg 8件 [詳細] filemae.jpg 12件 [詳細] file15897 aaa.jpg 11件 [詳細] file15894 aa.jpg 12件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-07-15 (月) 13:49:53 (40d)