乱数を使ってロボットを制御する | Pythonとロボットプログラミング

2023年11月25日

Pythonには多くの乱数を発生させる命令が用意されていますが、今日はこのPythonの乱数を使ってクムクムロボットを制御するプログラムを書いてみます。乱数は命令をコールするたびに異なった数値を発生させてくれるので、この数値をうまく使ってクムクムロボットがさも自分の意志で動いているかのようなプログラムを作ってみます。

Pythonによる関数

まず、Python3.11.3ドキュメント を開いてみると、Pythonには実に多くの乱数発生器のコマンドが用意されていることがわかります。

Python乱数関数など(ドキュメント抜粋)

保守関数
random.seed(a=Noneversion=2) 乱数生成器を初期化します。
random.getstate() 乱数生成器の現在の内部状態を記憶したオブジェクトを返します。
random.setstate(state) getstate() が呼び出された時の乱数生成器の内部状態を復元します。
バイト列用関数
random.randbytes(n) n バイトのランダムなバイト列を生成します。
整数用の関数
random.randrange(stop) Return a randomly selected element from range(start, stop, step).
random.randrange(startstop[step]) Return a randomly selected element from range(start, stop, step).
random.randint(ab)  <= N <= b であるようなランダムな整数 N を返します。
random.getrandbits(k) Returns a non-negative Python integer with k random bits. This method is supplied with the Mersenne
シーケンス用の関数  
random.choice(seq) 空でないシーケンス seq からランダムに要素を返します。
random.choices(populationweights=None*cum_weights=Nonek=1) population から重複ありで選んだ要素からなる大きさ k のリストを返します。
random.shuffle(x) シーケンス x をインプレースにシャッフルします。
random.sample(populationk*counts=None) 母集団のシーケンスから選ばれた長さ k の一意な要素からなるリストを返します。
Discrete distributions  
random.binomialvariate(n=1p=0.5) Binomial distribution. Return the number of successes for n independent trials with the probability of success in each trial being p:
実数分布  
random.random() ランダムな浮動小数点数(範囲は 0.0 <= X < 1.0)を返します。
random.uniform(ab) ランダムな浮動小数点数 N を返します。
random.triangular(lowhighmode) 境界値の間に指定された最頻値 mode を持つようなランダムな浮動小数点数 N を返します。
random.betavariate(alphabeta) ベータ分布です。0 から 1 の範囲の値を返します。
random.expovariate(lambd=1.0) 指数分布です。ambd は平均にしたい値の逆数です。
random.gammavariate(alphabeta) Gamma distribution. (Not the gamma function!) The shape and scale parameters, alpha and beta, must have positive values. 
random.gauss(mu=0.0sigma=1.0) Normal distribution, also called the Gaussian distribution. mu is the mean, and sigma is the standard deviation. This is slightly faster than the normalvariate() function defined below.
random.lognormvariate(musigma) 対数正規分布です。
random.normalvariate(mu=0.0sigma=1.0) 正規分布です。
random.vonmisesvariate(mukappa) mu は平均の角度で、0 から 2*pi までのラジアンで表されます。 
random.paretovariate(alpha) パレート分布です。
random.weibullvariate(alphabeta) ワイブル分布です。
他の発生器  
class random.Random([seed]) random モジュールがデフォルトで使用する疑似乱数生成器を実装したクラスです。
class random.SystemRandom([seed]) オペレーティングシステムの提供する発生源によって乱数を生成する os.urandom() 関数を使うクラスです。

Pythonで乱数プログラミング

エディタの起動とクムクムロボットとの接続

クムクムにはしっかり充電をした電池をセットしスイッチをONにします。
次に ここをクリック してクムクムロボット専用のPythonエディタ(Q-Py)を起動します。
起動出来たらクムクムロボットとの接続ボタンをクリックしQ-PyとクムクムロボットをBluetoothで接続しましょう。

乱数が発生するか実験

まずは簡単なプログラムを作って、関数がコールされるたびに乱数が本当に発生しているのかどうかを実験してみます。
モータの角度は0~180度までなので 整数を発生する randint を使用します。

import qumcum as q
import random
print(random.randint(0,180))

このプログラムをQ-Pyに入力し[RUN]ボタンを何度かクリックしてみます。

エディタ画面下の黒い部分の、プログラム実行開始 と プログラム実行終了 の間に、RUNをクリックするたびに0~180までの数字が変化して表示されるはずです。

クムクムロボットを乱数で動かしてみる

まずは簡単にクムクムロボットの顔のサーボモータを乱数で勝手な角度に動かしてみます。

import qumcum as q
import random
q.motor_power_on(500)

face_d=random.randint(0,180)
print(face_d)
q.motor_set_pos(4,face_d)
q.motor_start()

この調子で両腕のモータも動かしてみます。

import qumcum as q
import random
q.motor_power_on(500)

for i in range(10):
    q.voice_math(i)
    face_d=random.randint(0,180)
    arm_l=random.randint(0,180)
    arm_r=random.randint(0,180)
    q.motor_set_pos(4,face_d)
    q.motor_set_pos(1,arm_l)
    q.motor_set_pos(7,arm_r)
    q.motor_start(False)