作成:栁澤研究室 Robo-BE用
Robo-BEではRaspberry PIとPythonを使って,ロボットを作成していきます.
Pythonはデータ解析,機械学習など様々な分野で使われています.
初めて覚えるプログラミング言語としてもおすすめです.
モータの制御やセンサによる計測などはこの後の章で勉強しますので,この章ではPythonの基本的な使い方を勉強します.
(この章では,基礎中の基礎しかやりません.もっと実践的な内容は応用課題や、自分で勉強するかして理解を深めてください.)
ラズベリーパイならすぐにPythonが使えます.ラズベリーパイがなくても,「Google colaboratory」を使えばいつでもPythonを使うことができます.
(Google colaboratoryは,大学のGmailアドレスを使ってログインしてください.)
初めてプログラミングを学ぶ人は,最初は大変かもしれませんが,エラーは恐れずガンガン書いていきましょう.
ラズベリーパイのDesktopにROBO-BE用のフォルダを作りましょう.
(Google colaboratoryならその必要はありません.)
その中にこれから勉強していくプログラムを入れて保管しましょう.
書き方を忘れたときは,見直すこともあると思いますので,なんのプログラムか分かるように保存しましょう.
メモの仕方は下の「コメントを書こう」を読んでください.
※Robo-BEの授業の初回に詳しく説明しますので,予習する人は気にしなくても大丈夫です.春休みに勉強する方はGoogle colaboratoryを使いましょう.
最初のうちは短いプログラムしか書きませんが,最終的には膨大な量のプログラムを書くことになると思います.
また,チームで1台のロボットを作成していくことになりますので,自分の書いたプログラムがほかの人に理解できない状態だと困ったことになります.
理解を深めるためにも,そのプログラムやコマンドがどういった意味を持つのかコメントを書くようにしましょう.
コメントにするときは「#」最初につけるだけです.コメントは日本語で書いてもOKです.
ただし,コメントではない部分は,基本的にには日本語は使えませんし,全角スペースも使えませんので気をつけてください.
a = 5
b = 2
print(a + b) ##足し算
print(a - b) ##引き算
print(a * b) ##掛け算
print(a / b) ##割り算(商)
print(a % b) ##割り算(余り)
print(a ** b) ##乗数
※pirntは結果を表示するという意味のコマンドです.
プログラムでは文字と数字を区別する必要があります.上の例では数字の計算について学びました.
次は文字について学びましょう.基本的なルールとして文字は『"』(ダブルコーテーション),『'』(シングルコーテーション)で囲います.
a = "たこ焼き"
b = "たぬき"
print(a + b) ##文字列を足し合わせる(そのままつなげる)
print(a * 2) ##指定した数だけ文字列を繰り返す
a = "たこ焼き"
b = 2
print(a + b)
上の例のように文字と数字は足すことができません.そのため、以下のように書く必要があります.
『str()』で数字を文字に変換します.反対に文字を数字にするのは『int()』です.
a = "たこ焼き"
b = 2
print(a + str(b) + "個食べたい")
出力例:私の名前は,AAAです(BB歳).身長はCCC㎝,体重はDDkgです.
例えば,ロボットの前に障害物があった場合,ロボットを停止させるなどの処理を書く場合は,if文を使います.
a = 5
if a > 3:
print("3より大きい")
else:
print("それ以外です")
ifの直後(上の例だと『a > 3』)の部分を論理式といいます.書き方は以下の通りです.
※プログラムでよく使われる『=』は数学で使われる等しいという意味ではなく,代入するという意味です.
『a = 5』はaという変数に5という数字を代入するという意味です.(aは5と決めたという意味)
そのため、論理式では『==』で等しいという意味を表現しています.
数値だけでなく,文字でもif文を使うことができます.
a = "たこ焼き"
if a == "タイ焼き":
print("タイ焼き")
else:
print("たこ焼きじゃない!")
次は,複数の条件を設定する場合です.
a = 6
if a > 10:
print("10より大きい")
elif a > 5:
print("5より大きい")
else:
print("それ以外")
他のプログラムだと『else if』と書いたり,『switch』文を使うこともできますが,Pythonはこの書き方のみです.
ロボットの制御プログラムを作成していくと,同じ処理を複数回繰り返してもらいたい場合が頻繁にあります.
そんなときに使うのが、繰り返し文です.繰り返し文には「for」,「while」の2種類があります.
##nに1~10の数字を順番に代入していく
for n in range(1, 10):
print(n)
また,「range(1,10)」は1~10の数字が順番に入ったデータを作るという命令で,繰り返す範囲を指定しています.
例えば,2~7までの範囲にする場合は以下のように書きます.
for n in range(2, 8):
print(n)
0,2,4,・・・10のように,0から10まで2ずつ増えていく場合は以下のように書きます.
for n in range(0, 10 ,2):
print(n)
だんだん増えるのではなく,減る場合は以下のように書きます.
for n in range(10 , 0, -1):
print(n)
for文で繰り返す内容(処理)は,インデントで字下げされた部分です.同じインデントの部分がひとかたまりの処理になります.
例えば以下の「print(n)」は3回繰り返されます.
for n in range(0,3):
print(n)
でも,以下の場合はfor文が終わってから「print(n)」が実行されます.(for文の繰り返す内容はインデントで文字下げされた部分なので)
「n」は最後2ですので,「2」のみ表示されます.
(もちろん繰り返し文の外なので1回だけです.)
for n in range(0, 3):
n ##特にこのnには意味がありません.for文の中に何も書かないとエラーになるため書いただけです.
print(n)
for文を多重にすることもできます(よく使います).
下の例の場合,まず1つ目のfor文がn1 = 0の状態で,2つ目のfor文が実行され,n2 = 3,4,5が順番に表示されています.
次に一つ目のfor文がn1 = 1になり,2つ目のfor文が実行されて,n2 = 3,4,5が順番に表示されます.
自分で数字を色々変えて,どうなるか確認してみましょう.
for n1 in range(0, 3):
for n2 in range(3, 6):
print(n1, n2)
繰り返す回数が未定で,ある条件を満たすまで繰り返してほしいときはwhile文を使います.
条件の指定方法はif文のときに習った論理式と同じです.
書き方を間違えると無限ループするので注意してください!
n = 0
while n < 3: #nが3未満のときはインデントで字下げ下部分の処理を繰り返す
print(n)
n = n + 1
上のプログラムの「n = n + 1」は繰り返し処理を1回行うごとに nに1を足しています.
(このように変数の値を1増やす処理をincrement(インクリメント)、反対に減らす処理をdecrement(デクリメント)と言います.)
他にも以下のように書くこともできます.
n = 0
while n < 3: #nが3未満のときはインデントで字下げ下部分の処理を繰り返す
print(n)
n += 1
ちなみに,このインクリメントの部分がないと n はずっと 0 のままになるため,無限ループします.
無限ループになった場合は,焦らずに「ctr」+「c」を同時押ししてください.
while文の別の書き方として,以下のように「break」を使ったループを中断する方法もあります.
以下の例では,繰り返す条件が「while 1」となっており,これはbreakしない限りずっと条件を満たさないため,無限ループになります.
n = 0
while 1:
print(n)
n += 1
if n == 3:
break
商品の金額と個数から合計金額を計算する場合,身長と体重からBMIを求める場合など,同じ計算(処理)を数値を変えて繰り返す場合は,関数を作って対応します.
例えば,商品の合計金額と購入する個数から合計金額(消費税を含む)を計算する場合は,以下のように書きます.
def cal(price, n): #商品の金額と個数を入力する(このときの,金額と個数を引数と呼びます)
ans = price * n * 1.1 #金額と個数の積に,消費税をかけて,合計金額を求める.
return ans #この関数が出力する値(合計金額)を返り値と呼びます
print(cal(100, 2)) #関数を実行
上の例では,金額と個数の順番を逆にしても結果は同じになりますが,意味としては,2円の商品を100個買ったときの金額になってしまいます.
引数の順番には意味がありますので,気を付けましょう.
また,引数を持たない関数を作ることもできます.
例えば, ロボットの前進動作に必要な処理を一つの関数にまとめておけば,ロボットを前進させたいときはその関数を呼び出すだけで,前進させることができます.
def print_takoyaki(): #ただ「たこ焼き」、「お好み焼き」、「もんじゃ焼き」の3つを表示するだけの関数
print("たこ焼き")
print("お好み焼き")
print("もんじゃ焼き")
print_takoyaki() #関数を実行
関数をうまく使えば,プログラムを修正するときも,該当する機能の関数のみ修正すればいいので簡単です.
役割分担して1台のロボットを作るときにも便利です.