2019a/Member

目次

課題について

詳しくは2019a/Mission1を参照してください。 私の場合は信州という字をロボットに書かせることにしました。

ロボット本体の説明 

右手がロボット前部

  私のロボットは基本的には、2つのタイヤで移動して字を書くというシンプルなものです。以下詳細について述べていきます。

,魯撻鵑鮖つ部分でmedium Motor を+方向、-方向に回転させることで字を書く、書かないのスイッチのオン、オフを切り替えています。本体が柔らかい筆ペンを挟むことで、輪ゴムなしで十分固定することができました。 下の画像がスイッチ切り替え動作の立体的な説明です。赤いのがMediumモーター、灰色が動作前のペンの状態、黒色が動作後のペンの状態、黒矢印がペンの回転方向を表しています。。switch_off,switch_onについてはそれぞれ関数の説明のΑ↓Ч爐任修譴召貍椶靴説明しています。

スイッチの切り替え

large Motorにタイヤを付け、反対側と合わせて2つのタイヤで移動をします。画像の右方向にロボットが動くと前進、画像の左方向にロボットが動くと後進です。戦車や工事車両のキャタピラと同じく、左右の回転差を調整して動かすことで、その場で旋回したり、曲がったりすることができます。注意点としては、タイヤのゴムにすぐゴミが付いて摩擦係数が下がってしまい滑りやすくなるので、定期的に洗わなければいけない点です。

ロボットの重心を下げ、動作を安定させるための重りです。再現性の改善に貢献しました。私の好きなスポーツカーであるトヨタ86やスバルBRZは旋回するときの安定性、運動性の向上を重視して非常に重心が下げられていることに影響されて今回の重りをつけました。ここからは余談です。グランツーリスモ6(PlayStation3で2013年12月5日発売)というレーシングシュミレーターで操作していても他の車種と比べても非常に旋回性がよかったことや、実際のレースであるSuperGT(スバルBRZ GT300クラス)や全日本ラリー選手権(トヨタ86)でも実績を残していることを思い出し、取り入れました。実際の写真を見てもらえば重心が低そうだとわかると思います。時間があれば以下を参照してください。 BRZ GT300の写真があるスバル公式サイト→https://www.subaru-msm.com/2018/sgt/machine/ トヨタ公式サイトの86写真→https://toyota.jp/86/

EV3本体です。ここですべての制御、通信を行っています。制御についてはケーブルを通して各モーターを動かしています。使用したポートはA,B,Cの3つです。通信については、sshという通信プロトコルを利用しています。私のラップトップから遠隔操作で通信し、プログラムの実行をEV3のインストラクティブシェル上でしています。

プログラミング、関数について

言語は全てPython3で書かれており、python-ev3devというev3用に書かれたpythonライブラリを読み込んでいます。これによりモーターが使えるようになります。以下が最初の関数の定義です。これらの説明は次の関数の説明で行います。  

def motor_init(): #
    mL.reset()
    mR.reset()
def move_forward(t): #
    mL.run_timed(time_sp=t,speed_sp=250,stop_action='hold')
   mR.run_timed(time_sp=t,speed_sp=250,stop_action='hold')
    sleep(t/1000)
def move_back(t): #
    mL.run_timed(time_sp=t,speed_sp=-250,stop_action='hold')
    mR.run_timed(time_sp=t,speed_sp=-250,stop_action='hold')
    sleep(t/1000)
def turn_left(t): #
    mL.run_timed(time_sp=t,speed_sp=-190,stop_action='hold')
    mR.run_timed(time_sp=t,speed_sp=190,stop_action='hold')
     sleep(t/1000)
def turn_right(t): #
    mL.run_timed(time_sp=t,speed_sp=190,stop_action='hold')
    mR.run_timed(time_sp=t,speed_sp=-190,stop_action='hold')
    sleep(t/1000)
def switch_off(t): #
    mM.run_timed(time_sp=t,speed_sp=200,stop_action='hold')
    sleep(t/1000)
def switch_on(t): #
    mM.run_timed(time_sp=t,speed_sp=-200,stop_action='hold')
    sleep(t/1000)
def back_left(t): #
    mR.run_timed(time_sp=t,speed_sp=-300,stop_action='hold')
    mL.run_timed(time_sp=t,speed_sp=-100,stop_action='hold')
    sleep(t/1000)
def back_right(t): #
    mR.run_timed(time_sp=t,speed_sp=-100,stop_action='hold')
    mL.run_timed(time_sp=t,speed_sp=-300,stop_action='hold')
    sleep(t/1000)
def moveforward_harai(t): #
    mR.run_timed(time_sp=t,speed_sp=100,stop_action='hold')
    mL.run_timed(time_sp=t,speed_sp=300,stop_action='hold')
    sleep(t/1000)
def moveback_harai(t): #
    mR.run_timed(time_sp=t,speed_sp=-100,stop_action='hold')
    mL.run_timed(time_sp=t,speed_sp=-300,stop_action='hold')
    sleep(t/1000)

 

関数の説明

私が採用したmX.run_timed(X=L,R,M)は時間を指定してモーターを動かす関数です。time_sp=?で時間を指定し、speed_sp=?でモーターの回転する速度(=速さ&正負の方向)を指定、stop_action='?'で指定した時間が経った後モーターの動作を停止する方法を指定します。今回用いた、stop_actio='hold'はモーターを停止する際、慣性により時間が経った後も周り続けてしまったモーターを自動で元の状態に戻し、指定した角度分だけ正確にモーターが回転します。ただし、タイヤであろうと、滑ることを完全に防ぐことはできません。あくまでモーターの回転角度の正確さが目的です。例えば、ペンを動かすMediumモーターは毎回正確な角度を動かないとペンの位置がずれ、文字の太さが全然変わってしまったり、最悪、ペンが接地しなくなり文字が書けなくなります。

motor_init():モーターの設定をリセット、初期化します。

move_forward(t):速度一定、時間tを指定して、その時間分だけモーター2つを回転して前進します。の動きと前後逆の関係になります。

move_back(t):速度一定、時間tを指定して、その時間分だけモーター2つを回転して後進します。△瞭阿と前後逆の関係になります。

turn_left(t):速度一定、時間tを指定して、その時間分だけモーターをそれぞれ逆方向に回転させて、その場で左向きに旋回する。旋回したい角度の10倍の時間を指定すると、その角度分旋回するようになっている。例えば、(t=450)とすると45度だけ左に旋回する。イ瞭阿と左右逆の関係になります。

turn_right():速度一定、時間tを指定して、その時間分だけモーターをそれぞれ逆方向に回転させて、その場で右向きに旋回する。旋回したい角度の10倍の時間を指定すると、その角度分旋回するようになっている。例えば、(t=900)とすると90度だけ右に旋回する。い瞭阿と左右逆の関係になります。

switch_off(t):速度一定、時間tを指定して、その時間分だけ前部のmediumモーターを回転させて固定したペンを地面から離れるようにする。ただし回転時間をГ汎韻500に固定し、いつも同じ場所にくるようにする。

switch_on(t):速度一定、時間tを指定して、その時間分だけ前部のmediumモーターをΔ箸狼嬖向に回転させて固定してペンを地面につくようにする。ただし回転時間をΔ汎韻500に固定し、いつも同じ場所にくるようにする。

back_left(t):速度一定、時間tを指定して、その時間分だけ左右のモーターを逆回転して後進します。その際に右側のモーターを左のモーターより早く動かすことで左右の回転差を大きく生じさせ左後ろに曲がりながら後進します。と左右逆の動きになります。車でいうとハンドルを左に切りながら後進するイメージです。

back_right(t):速度一定、時間tを指定して、その時間分だけ左右のモーターを逆回転して後進します。その際に左側のモーターを右のモーターより早く動かすことで左右の回転差を大きく生じさせ右後ろに曲がりながら後進します。┐蛤険Φ佞瞭阿になります。車でいうと、ハンドルを右に切りながら、後進するイメージです。

moveforward_harai:速度一定、時間tを指定して、その時間分だけ左右のモーターを回転して前進します。その際、左側のモーターを右のモーターより少し早く動かすことで、左右の回転差を少しつけ、信州の州の字の2画目の最後のはらいを書くことを目的に定義されています。と前後逆の動きになります。

moveback_harai:速度一定、時間tを指定して、その時間分だけ左右のモーターを逆回転して後進します。その際、左側のモーターを右のモーターより少し早く動かすことで、左右の回転差を少しつけ、信州の州の字の2画目の最後のはらいを書いた後に元の位置に戻ることを目的に定義されています。と前後逆の動きになります。

「信州」を書いてみた-全体的な問題と改善

まず「信州」を書く際に生じた、全体的な問題そしてその結果について述べておきます。第一の問題はペンの位置です。ペンがロボットの左上の位置にあり、中央にはないので、ロボットを字の形に沿って動かすだけでは字が左上に書かれていくだけで、意図したとおりに上手く書けませんでした。ロボットを動かす際にうまく左上のペンが次のスタート位置にこれるように、ロボットの中央とペンの位置関係のずれを考えるのが大変でした。

第二の問題は、モーターの速度です。最初move_forwardのspeed_sp=1000などとしていたので、早すぎて、動作が止まるたびにロボットが跳ねて、どんどんズレていき、再現性がまったく確保できませんでした。周りや先生からもそれを指摘されたので、最終的にspeed_sp=250くらいにして、時間tの指定を4倍にし、同じ距離でロボットをゆっくり動かし、なおかつ上で触れたように、後部に重りをつけ、重心を下げたので動作が安定し、再現性が向上しました。他のmoveforward_haraiなども同様にspeedを遅くして安定するようにしました。

これを含めた改善にも関わらず、時間の関係上、結果として十分綺麗な字を書けなかったことが非常に残念です。悔しいです。 下が実際に書いた「信州」です。書き順は「信」の「口」の部分以外は守っています。黄色が「信」も書き順で、紫が「州」の書き順です。

信州
書き順

これを書いたのは令和元年6/1土曜日の昼過ぎで、いざ本番や、と思い大学に行ったところ、普段授業や放課後の作業で使用していた10番教室が開いておらず、全学教育機構第一講義棟の1階渡り廊下の木の床に用紙をガムテープで固定して筆ペンで書きました。床の木の板と板の隙間に毎回ロボットがひっかかり、どんどんずれてしまい、汚い字となってしまいました。記録には残っていませんが、この前日に10番教室で試し書きしたのよりひどくなってしまいました。私としては残念な結果です。

まず「信」を書いてみる-問題と改善

ここからは、上の結果につながる過程、実際のプログラムの作成について述べていきます。まず「信」を書くプログラムを下に書いておきます。初期条件は、筆が地面についている状態です。書き順は上の写真の書き順と同じです。

#!/usr/bin/env python3 #言語はPython3という宣言
from ev3dev.ev3 import * #ev3devをインポートするという宣言
from time import sleep  #時間はsleep関数を用いるという宣言
mL = LargeMotor('outB') #左側のモーターがBポートに繋がっている(Lはleftの略)
mR = LargeMotor('outC') #右側のモーターがCポートに繋がっている(Rはrightの略)
mM = MediumMotor('outA') #ペンの切り替えに使うモーターがAポートに繋がっている
motor_init()
move_forward(500) #「信」の一画目を書いている
sleep(1)
switch_off(500) #筆を用紙から離している(以下switch_offは同様の動作をしている)
sleep(1)
move_forward(350) #位置調整
sleep(1)
back_right(2000) #2画目の前まで移動(車でいうハンドルを右にきって、後進するイメージ)
sleep(1) 
back_left(990) #2画目の前まで移動(車でいうハンドルを左にきって、後進するイメージ)
sleep(1)
move_forward(1700) #2画目の直前まで移動
sleep(1)
switch_on(500) #筆を地面につける(以下switch_onは同様の動作をしている)
sleep(1)
move_forward(800) #2画目を書いている
sleep(1)
switch_off(500) 
sleep(1)
back_right(1600) #3画目への移動
sleep(1)
turn_right(250)  #3画目への角度調整
sleep(1)
move_forward(1090) #3画目の直前まで移動
sleep(1)
switch_on(500) 
sleep(1)
move_forward(150) #3画目を書いている
sleep(1)
switch_off(500)
sleep(1)
move_back(750) #4画目への移動
sleep(1)
turn_right(600) #4画目への角度調整
sleep(1)
move_forward(2400) #4画目への移動
sleep(1)
back_right(1950) #4画目への移動
sleep(1)
move_forward(1200) #4画目の直前まで移動
sleep(1)
switch_on(500)
sleep(1)
move_forward(700) #4画目を書いている
sleep(1)
switch_off(500)
sleep(1)
back_right(500) #5画目への移動
sleep(1)
back_left(500) #5画目への移動
sleep(1)
move_forward(100) #5画目の直前まで移動
sleep(1)
switch_on(500)
sleep(1)
move_forward(420) #5画目を書いている
sleep(1)
switch_off(500)
sleep(1)
move_back(420) #6画目への移動
sleep(1)
back_right(500) #6画目への移動
sleep(1)
back_left(500) #6画目への移動
sleep(1)
move_forward(670) #6画目の直前まで移動
sleep(1)
switch_on(500)
sleep(1)
move_forward(420) #6画目を書いている
sleep(1)
switch_off(500) 
sleep(1)
move_back(420) #7画目への移動
sleep(1)
back_right(500) #7画目への移動
sleep(1)
back_left(500) #7画目への移動
sleep(1)
move_forward(500) #7画目の直前まで移動
sleep(1)
switch_on(500)
sleep(1)
move_forward(400) #7画目を書いている
sleep(1)
switch_off(500)
sleep(1)
move_back(400) #8画目への移動
sleep(1)
back_right(500) #8画目への移動
sleep(1)
back_left(500) #8画目への移動
sleep(1)
move_forward(450) #8画目の直前まで移動
sleep(1)
switch_on(500)
sleep(1)
move_forward(400) #8画目を書いている
sleep(1)
switch_off(500)
sleep(1)
move_forward(400) #9画目への移動
sleep(1)
turn_left(900) #9画目への移動
sleep(1)
move_back(500) #9画目の直前まで移動
sleep(1)
switch_on(500)
sleep(1)
move_forward(200) #9画目を書いている
sleep(1)
switch_off(500)
sleep(1)
move_back(200) #10画目への移動
sleep(1)
turn_right(900) #10画目への移動
sleep(1)
move_forward(380) #10画目への移動
sleep(1)
turn_left(900)#10画目の直前まで移動
sleep(1)
switch_on(500)
sleep(1)
move_forward(200)#10画目を書いている
sleep(1)
switch_off(500)

ここから「信」を書く際に生じた問題とその改善策について述べていきたいと思います。一つ目は信の2画目の垂直な棒です。1画目の後、45度正確に回転して、かつ、1画目の真ん中からスタートするのが大変でした。主に時間の調整により、回転角度をぴったりに調整し、棒がまぁまぁ垂直に書けるようにしました。次は、4、5,6,7画目などの横棒についてです。back_rightとback_leftを繰り返すことで少しづつ下に位置を動かしながら、横棒を書いたのですが棒ごとの長さ、位置のバランスを揃えるために move_forward、move_backを調整しながら入れました。最後の、「信」の「口」の部分の2本の横棒はスタート位置も長さも違ったので調整に苦労しました。

次に「州」を書いてみる-問題と改善

次に、「州」を書くプログラムについて述べていきます。 下が実際のプログラムです。初期条件は筆が地面から離れています。

switch_on(500) #信と同様に筆を地面につけます(以下同様)
sleep(1)
move_forward(200) #「州」の1画目を書いています
sleep(1)
switch_off(500) #信と同様に筆を地面から離します(以下同様)
sleep(1)
back_right(1400) #2画目の直線上にまで移動
sleep(1)
back_left(770) #2画目の直線上にまで移動
sleep(1)
move_forward(800) #2画目の直前まで移動
sleep(1)
switch_on(500)
sleep(1)
move_forward(1000) #2画目を書いている
sleep(1)
moveforward_harai(400) #2画目の「はらい」を書いている(とめ、はね、はらい、のはらいです)
sleep(1)
switch_off(500)
sleep(1)
moveback_harai(400) #上のはらいを書く直前の位置まで復帰する
sleep(1)
back_right(1700) #3画目まで移動
sleep(1)
turn_right(500) #3画目の直線と平行になるよう向きを合わせる
sleep(1)
move_forward(1000) #3画目の直前まで移動
sleep(1)
switch_on(500)
sleep(1)
move_forward(400) #3画目を書いている
sleep(1)
move_back(400) #3画目を2回書いている(州の3画目の丸みを出すため) 
sleep(1)
switch_off(500)
sleep(1)
move_back(500) #4画目まで移動
sleep(1)
turn_left(400) #4画目まで移動
sleep(1)
move_forward(1400) #4画目まで移動
sleep(1)
back_left(1750) #4画目の直線状まで移動
sleep(1)
move_forward(1000) #4画目の直前まで移動
sleep(1)
switch_on(500)
sleep(1)
move_forward(1000) #4画目を書いている
sleep(1)
switch_off(500)
sleep(1)
back_right(1600) #5画目まで移動
sleep(1)
move_forward(150) #5画目まで移動
sleep(1)
turn_right(700) #5画目の直線上まで移動
sleep(1)
move_forward(200) #5画目の直前まで移動
sleep(1)
switch_on(500) 
sleep(1)
move_forward(200) #5画目を書いている
sleep(1)
switch_off(500)
sleep(1)

まず第一の問題は「州」という字の2画目に「はらい」があることでした。この曲線を描くにはどうすりゃええねんと悩みましたが、左右で速度を少しずらし、ちょっとだけ回転差を生じさせれば上手く曲線を描けるのでは?と思い、moveforward_harai(t)とmoveback_harai(t)を定義しました。それ以外については、基本は「信」と同じで、垂直に棒を下ろす前のback_right(t),back_left(t)等の角度調整に苦労しました。

感想と反省

結果としてはお世辞にも綺麗な字が書けたとは言えず、はっきり言って汚い字です。先生や他のチームの方からも動作を安定させるためにspeedの速さを小さくするべきとアドバイスを頂いたにも関わらず、当初は調整が時間的に大変だからと躊躇したり、時間がないのにプログラムを全部書き直したりと、スケジュール管理がまったくできていませんでした。プログラミングではこのような修正の時間が大半で、書くこと自体はすぐであることを学びました。次回の課題ではこれを念頭において、大変な作業でも、客観的にするべきことなら周りの意見にしっかりと耳を傾け、よくよく検討して時間を効率的に使うようにしたいと思います。


添付ファイル: file114514-4.JPG 22件 [詳細] file114514-3.JPG 23件 [詳細] file114514-2.JPG 19件 [詳細] file114514-1.JPG 33件 [詳細] file114514.JPG 9件 [詳細]

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