Python&Matplotlibで簡単シミュレータを作る

この記事はMice Advent Calendar 2018の7日目の記事です.

 

前日の記事はqtfdl94qさんの社会人まうさーを続けてみての感想でした.

 

来年度から社会人となる私にとってはとても参考になる記事でした.

これからは思うように開発時間が取れないと思うので,先人たちに習って効率的に時間を使えるようにしたいですね.

あと粗大ごみは要らないです.

 はじめに

この記事を書くきっかけとなったのが,サークルの後輩に

「ターンシミュレータを作りたいがどこから始めれば分からない」

と相談された事でした.

つまりこれは言い換えると,

GUIを作りたいがどういう環境を導入すればいいか分からない」

という事だと言えます.

厳密に言うとGUIではない気がするけどまぁええか

 

どれを使うか

まずはどの環境を使うかを選びます.

 

・Processing

 グラフィックアートなどを作るための言語です.線や円などの図形を描くためのライブラリが用意されており簡単にお絵かきが出来ます.環境も専用のIDEを導入するだけなので簡単.ただし描画はグリッド基準で行われるため今回のようにグラフを描きたい場合は少々面倒.とりあえず何か作りたいという人向け.

 

・DXライブラリ

 基本的にProcessingと同じだが,導入がそれと比べ面倒なので同じことをするならProcessingでいいと思う...

 

Python

 豊富なライブラリと充実したドキュメントを持つ今最高にホットな言語(らしい).今回はPythonのグラフ描画ライブラリであるMatplotlibを使いました.

 

・えくせる

 ある意味最も楽にシミュレータを作れる. が,発展性に乏しいのでお勧めしない.

 

他にもC#とかJavaとかあるけど書いたことがないのでわかりません...

 

PyCharmの導入

それではPythonを開発する環境を導入します.Pythonの開発環境は色々ありますが私はPyCharmを使っています.

導入方法は書くのが面倒なので以下の記事を参考にしてください.

qiita.com

やや古い記事ですが私はこれを参考にして導入できたのでおそらく問題ないかと思われます.

PyCharm以外にもAnacondaの導入方法も書いてあるので一緒に入れておきましょう.

 

プロジェクトを作る

無事に環境を構築出来たらプロジェクトを作ります.

左上のタブからFileNew Project...で新規プロジェクトを作ります.

f:id:b4rrAcud4:20181207040049p:plain

矢印がダサいだって? うるせぇゲイツの息吹を感じろ

f:id:b4rrAcud4:20181207040430p:plain

プロジェクト名はお好みでどうぞ

 

各種ライブラリの導入

それでは早速コードを書いていく...前に,各種ライブラリを入れていきます.

FileSettingsを開きます.

f:id:b4rrAcud4:20181207041312p:plain

そこからProject Interpreterを開きます.

f:id:b4rrAcud4:20181207041537p:plain

右上にある「」マークをクリックすると,

こういう画面が出てくると思います.ここから各種ライブラリを追加していきます.

上にある検索窓に「matplotlib」と入れると,

下に候補が出てきますので,matplotlibを選択し左下の「Install Package」をクリックすると,インストールが始まりライブラリの横に(installing)と出ます.

終わると下の方に緑色で「Package 'matplotlib' installed successfully」と出ます.しくじると赤文字でエラーが出たはずですのでその場合はまぁ頑張ってくれ.

 

同じ要領でNumpyというライブラリも入れましょう.こちらは数値計算用のライブラリで配列などを扱う際に便利です.

f:id:b4rrAcud4:20181207042753p:plain

2つのライブラリがインストールできていればProject Interpreterにこのように表示されるためです.お気づきかと思われますがライブラリを入れる過程で他に必要なライブラリがあれば自動的にインストールしてくれるようです. べんり!

 

Pythonを書いてみる

左側にあるプロジェクト名(今回はuntitled)のフォルダを右クリック→NewPython Fileで新しくPythonファイルを作ります.

f:id:b4rrAcud4:20181207043545p:plain

ファイル名は何でもいいですが,とりあえずmainとでもしておきます.

mainファイルが出来たらとりあえず以下のようなコードを書いてprintします.

# coding: utf-8

print ("タイヤが6つあるとスピードが出るんだ")

できたら実行します.初回実行する時はRunRun...から実行します.Alt+Shift+F10でもOK.

f:id:b4rrAcud4:20181207044324p:plain

f:id:b4rrAcud4:20181207044636p:plain

実行するファイルを選択します.今回はファイルが1つしか無いので特に問題ないですが複数ファイルを使う場合はメインとなるファイルを選択します.

また,2回目以降はShift+F10で実行できます.

f:id:b4rrAcud4:20181207045901p:plain

実行するとこんな感じになります.

 

グラフを書く

それではいよいよグラフを書きます.とりあえずこんな風に書いてみます.

import numpy as np
import matplotlib.pyplot as plt

array_x = np.array([10,20,30,40,50])
array_y = np.array([30,20,40,20,10])

plt.plot(array_x,array_y)
plt.show()

実行すると以下のようなグラフが表示されます.

どうでしょう! たったこれだけの行数でグラフが書ける!!!!

これがPythonですよ皆さん!!!!!

更に左下のボタンから分かるようにグラフを移動したり拡大してみたり画像を保存することも出来るんです!!! 超便利!!!!!!

どうでもいいけどフロッピーのマークで保存って今の小学生とか絶対わかんないよね 

電話のピクトグラムが黒電話のやつと同じアレを感じる

 

コードの解説をしていきます.

import numpy as np
import matplotlib.pyplot as plt

これは各ライブラリをimportしているところです.asを使うことで好きなように別名をつけることが出来ます.ライブラリは要はクラスなので別名をつけないと一々「numpy.array~~」とか「matplotlib.pyplot.plot~~」みたいに長ったらしく書かないといけないので付けておきます.

array_x = np.array([10,20,30,40,50])
array_y = np.array([30,20,40,20,10])

これはグラフに使う配列を定義しているところです.numpyを使って配列を作っています.

plt.plot(array_x,array_y)
plt.show()

そしてmatolotlibのpyplotでグラフを表示します.plt.plot()で使う配列データ(x軸,y軸)を入れておきplt.show()で描画します.

基本的にはこのように表示したいデータの配列を作って描画することになります.

 

迷路を書いてみる

基本的なことはここまでなので後は各々頑張ってくれと言いたいと事ですが折角なので迷路の表示までは書いておこうと思います.

import numpy as np
import matplotlib.pyplot as plt

plt.plot(np.array([-90.0, -90.0]), np.array([0.0, 360.0]), color="gray", linestyle="dashed")
plt.plot(np.array([0.0, 0.0]), np.array([0.0, 360.0]), color="gray", linestyle="dashed")
plt.plot(np.array([90.0, 90.0]), np.array([0.0, 360.0]), color="gray", linestyle="dashed")
plt.plot(np.array([180.0, 180.0]), np.array([0.0, 360.0]), color="gray", linestyle="dashed")
plt.plot(np.array([270.0, 270.0]), np.array([0.0, 360.0]), color="gray", linestyle="dashed")

plt.plot(np.array([-90.0, 270.0]), np.array([0.0, 0.0]), color="gray", linestyle="dashed")
plt.plot(np.array([-90.0, 270.0]), np.array([90.0, 90.0]), color="gray", linestyle="dashed")
plt.plot(np.array([-90.0, 270.0]), np.array([180.0, 180.0]), color="gray", linestyle="dashed")
plt.plot(np.array([-90.0, 270.0]), np.array([270.0, 270.0]), color="gray", linestyle="dashed")
plt.plot(np.array([-90.0, 270.0]), np.array([360.0, 360.0]), color="gray", linestyle="dashed")

plt.plot(np.array([0.0, -90.0]), np.array([360.0, 270.0]), color="gray", linestyle="dashed")
plt.plot(np.array([180.0, -90.0]), np.array([360.0, 90.0]), color="gray", linestyle="dashed")
plt.plot(np.array([270.0, 0.0]), np.array([270.0, 0.0]), color="gray", linestyle="dashed")
plt.plot(np.array([270.0, 180.0]), np.array([90.0, 0.0]), color="gray", linestyle="dashed")

plt.plot(np.array([180.0, 270.0]), np.array([360.0, 270.0]), color="gray", linestyle="dashed")
plt.plot(np.array([0.0, 270.0]), np.array([360.0, 90.0]), color="gray", linestyle="dashed")
plt.plot(np.array([-90.0, 180.0]), np.array([270.0, 0.0]), color="gray", linestyle="dashed")
plt.plot(np.array([-90.0, 0.0]), np.array([90.0, 0.0]), color="gray", linestyle="dashed")

plt.gca().set_aspect('equal', adjustable='box')
plt.show()

実行するとこんな感じに迷路の中心線が書けます.

colorやlinestyle等で色や線種を指定できます.また,無指定だとグラフのアス比が勝手に変更されるので,

plt.gca().set_aspect('equal', adjustable='box')

でグラフのアス比を1:1に指定しています.

 

さいごに

シミュレータを作る最低限の説明はここまでとなります.これらの機能を組み合わせるとこんな感じのシミュレータが作れます.

 

ここまで書くのに3時間くらいかかった しんどかった.

Pythonは私も勉強中なので間違えている箇所もあるかと思いますが優しく指摘して頂けると幸いです.

 

明日の記事はstarknighthoodさんの「斜めの姿勢制御について」です.

今年度のクラシック優勝機の姿勢制御がどうなってるのか,乞うご期待!!!

 

参考記事

今からWindowsで初心者にとってベストなPython開発環境を構築する手順メモ - Qiita

matplotlib でグラフ作成 – Python でデータサイエンス