tools -- 汎用ツール

タイミングと、データロギング、線形代数のための共通ツール。

タイミングツール

1000mswait
awaitwait(time)

指定された時間の間、ユーザプログラムを一時停止します。

パラメータ:

time (Number, ms) -- 待機時間。

watch
class StopWatch

時間隔を計測するためのストップウォッチです。スマホのストップウォッチ機能に似ています。

watchtime
time() int: ms

ストップウォッチの現在時刻を取得します。

戻り値:

経過時間。

watchpause
pause()

ストップウォッチを一時停止します。

watchresume
resume()

ストップウォッチを再開します。

watchreset
reset()

ストップウォッチの時間を 0 にリセットします。

実行状態は、影響を受けません。

  • 一時停止していた場合は、一時停止したままです(ただし 0 になります)。

  • 実行中であれば、実行中のままです(ただし、0 から再スタートします)。

入力ツール

readfirst byte
readfirst key
readlast byte
readlast key
read_input_byte() int | str | None

標準入力からブロックなしで1バイトを読み込み、読み込んだ分を入力バッファから除きます。

パラメータ:
  • last (bool) -- バッファ内の最後の(最も最近に入力された)バイトを読み込んで、残りを破棄する場合は True を指定します。最初の(最も以前に入力された)バイトのみを読み込む場合は False を指定します。

  • chr (bool) -- 結果を1文字の文字列に変換する場合は True を指定します。

戻り値:

読み込んだバイトを数値(0から255)または文字列(例: "B")として返します。データが利用できない場合は None を返します。 chr=True としたとき、読み込んだバイトが文字として表示可能でない場合も None を返します。

バージョン 3.3 で変更: オプション lastchr を追加。

hub_menu(symbol1, symbol2, ...) int | str

ハブのディスプレイにメニューを表示し、ユーザーがボタンを使ってアイテム選択するのを待ちます。これは、他のプログラムを実行するかどうかを選択するカスタムメニュープログラム内で使えます。

これは、ディスプレイ、ボタン、および待機を組み合わせてシンプルなメニューを作成するための便益関数であることに注意してください。したがって、プログラムの開始時だけでなく、プログラム内のどこでも使えます。

パラメータ:
  • symbol1 (int or str) -- メニューに表示する最初のシンボル。

  • symbol2 (int or str) -- 2番目のシンボル、およびその後のシンボル...

戻り値:

選択されたシンボル。

from pybricks.tools import hub_menu

# この例は、Pybricks Code に "fly_mission", "drive_mission",
# "zigzag" という名前の他の3つのプログラムがあることを前提としています。
# この例では、実行するプログラムを選択できるメニューを作成します。

# 文字を選択。
selected = hub_menu("F", "D", "Z")

# 選択したものに該当するプログラムを実行。
if selected == "F":
    import fly_mission
elif selected == "D":
    import drive_mission
elif selected == "Z":
    import zigzag

線形代数ツール

バージョン 3.3 で変更: このツールは以前、 pybricks.geometry モジュールに配置されていました。

class Matrix(rows)

行列の数学的表現。互換性のあるサイズの行列に対して、加算 (A + B)、減算 (A - B)、乗算 (A * B) をサポートします。

また、スカラー倍算(c * A または A * c)やスカラー除算(A / c)もサポートします。

Matrix オブジェクトは不変です。

パラメータ:

rows (list) -- 行のリスト。各行は、それ自体が数値のリストです。

T

元の行列の転置行列である新しい Matrix を返します。

shape

タプル (m, n) を返します。 m は行の数、 n は列の数です。

340vector
vector(x, y) Matrix
vector(x, y, z) Matrix

(2, 1) または (3, 1) の形状の Matrix を作成するための便利な機能です。

パラメータ:
  • x (float) -- ベクトルの x 座標。

  • y (float) -- ベクトルの y 座標。

  • z (float) -- ベクトルの z 座標(オプション)。

戻り値:

列ベクトルの形をした行列。

cross(a, b) Matrix

2つのベクトルの内積 a × b を取得します。

パラメータ:
  • a (Matrix) -- 3次元ベクトル。

  • b (Matrix) -- 3次元ベクトル。

戻り値:

内積の3次元ベクトル。

マルチタスク

バージョン 3.3 で追加.

Pybricks は async および await キーワードを使った協調的マルチタスクをサポートしています。これにより、通常時間がかかる操作を他の操作と並行して実行できます。

multitask untilalldone
awaitmultitask(coroutine1, coroutine2, ...) Tuple

複数のコルーチンを同時に実行します。これにより、他のどのコルーチンと同様に使える新しいコルーチンが作成されます。また、別のマルチタスクステートメント内でも使えます。

パラメータ:
  • coroutines (coroutine, coroutine, ...) -- 並行して実行する1つ以上のコルーチン。

  • race (bool) -- すべてのコルーチンの終了を待つ場合は False を指定します。1つのコルーチンの終了を待って他のコルーチンをキャンセルする場合、つまり「レース」のように扱うには True を指定します。

戻り値:

各コルーチンの戻り値のタプル。終了していないコルーチンは戻り値として None を持ちます。

run_task(coroutine) bool | None

プログラムの残り部分をブロックしながら、コルーチンを最初から最後まで実行します。これは主に、プログラムのメインコルーチンを実行するために使います。

この関数の呼び出しを入れ子にすることはできません。

パラメータ:

coroutine (coroutine) -- 実行するメインコルーチン。

戻り値:

coroutine が指定されていない場合、この関数は実行ループが現在アクティブであるか(True)そうでないか(False)を返します。

次の例では、マルチタスクを使って、ロボットを前進させ、同時にグリッパーを上下に動かし、その後後退させる方法を示しています。

from pybricks.pupdevices import Motor
from pybricks.parameters import Direction, Port
from pybricks.robotics import DriveBase
from pybricks.tools import multitask, run_task

# 全てのデバイスをセットアップ。
left = Motor(Port.A, Direction.COUNTERCLOCKWISE)
right = Motor(Port.B)
gripper = Motor(Port.C)
drive_base = DriveBase(left, right, 56, 114)


# グリッパーをアップ・ダウン。
async def move_gripper():
    await gripper.run_angle(500, -90)
    await gripper.run_angle(500, 90)


# 前進させ、同時にグリッパーを動かし、後退させる。
async def main():
    await drive_base.straight(250)
    await multitask(drive_base.turn(90), move_gripper())
    await drive_base.straight(-250)


# 開始から終了までメインプログラムを走らせる。
run_task(main())
class coroutine
class await

await キーワードでプレフィックスされた関数やメソッドがあれば、それはマルチタスクをサポートしていることを意味します。 run_task でコルーチンを実行すると、 await でプレフィックスされたすべてのメソッドや関数はコルーチンとして動作します。

マルチタスクを使わない場合、 await キーワードを無視して、通常通りプログラムを書けます。具体的には run_task を使用しない場合、 await でプレフィックスされた関数は通常の関数として動作します。