| ❌ | ❌ | ✅ | ❌ | ❌ | ❌ |
|---|
テクニックハブ¶
- class TechnicHub(top_side=Axis.Z, front_side=Axis.X, broadcast_channel=0, observe_channels=[])¶
LEGO® テクニックハブ。
ハブを初期化します。オプションで、上面(ボタン付き)と前面(ライト付き)の向きを指定することで、 ハブの取付けのデザイン を反映できます。
- パラメータ:
バージョン 3.3 で変更: broadcast_channel と observe_channels 引数を追加。
ハブ内蔵ステータスライトの利用
- light.off()¶
ライトの消灯。
- light.blink(color, durations)¶
指定の色で、指定の時間だけライトを点灯・消灯して点滅させます。
プログラムの残りの部分が動作している間、ライトは無限に点滅し続けます。
このメソッドは、基本的で、よく使うパターンを作成する簡易な方法を提供します。より一般的で複数色のパターンを作成するには、代わりに
animate()を使用してください。
- light.animate(colors, interval)¶
指定の間隔で1つずつ表示される色のシーケンスでライトをアニメートします。
このアニメーションはバックグラウンドで実行され、プログラムの他の部分は継続的に実行されます。アニメーションが完了すると、繰返し実行します。
IMU の利用
- imu.ready() bool¶
デバイスがキャリブレーションされ、使用可能な状態にあるかどうかをチェックします。
ロボットが数秒間静止するとデバイスの再キャリブレーションが行われるため、
Trueになります。ハブを起動したばかりのときや、10分以上キャリブレーションする機会がなかったときは、Falseになります。- 戻り値:
使用可能であれば
True、そうでなければFalse。
- imu.stationary() bool¶
現在、デバイスが静止しているかどうか(動いていないか)をチェックします。
- 戻り値:
1秒以上静止している場合は
True、動いている場合はFalse。
- imu.up() Side¶
現在、ハブのどちらの面を上に向けているかをチェックします。
- 戻り値:
Side.TOP,Side.BOTTOM,Side.LEFT,Side.RIGHT,Side.FRONT,Side.BACKのいずれか。
- imu.tilt() Tuple[int, int]¶
ピッチ角とロール角を取得します。これは、 user-specified neutral orientation からの相対的なものです。
回転の順序は、ピッチ角、ロール画です。これはロボットのY軸に沿った正回転と、X軸に沿った正回転に相当します。
- 戻り値:
ピッチ角とロール角のタプル(度単位)。
- imu.acceleration(axis) float: mm/s²¶
- imu.acceleration() vector: mm/s²
ロボットの基準座標系 における、指定した軸に沿ったデバイスの加速度を取得します。
- パラメータ:
axis (Axis) -- 加速度を計測する軸。
- 戻り値:
指定された軸に沿った加速度。軸を指定しない場合は、すべての軸に沿った加速度のベクトルが返ります。
- imu.angular_velocity(axis) float: deg/s¶
- imu.angular_velocity() vector: deg/s
ロボットの基準座標系 における、指定した軸に沿ったデバイスの角速度を取得します。
- パラメータ:
axis (Axis) -- 角速度を計測する軸を指定します。
- 戻り値:
指定された軸に沿った角速度。軸を指定しない場合は、すべての軸に沿った加速度のベクトルが返ります。
- imu.heading() float: deg¶
ロボットの方位角を取得します。正の値は時計回りに回転することを意味します。
プログラム開始時のヘディングは 0 です。ロボットが 180 度以上回転しても値は増え続けます。一部のアプリのように-180に折り返すことはありません。
注釈
今のところ、このメソッドはロボットが平らな場所にいる間だけ方位角を記録しています。
つまり、テーブルから持ち上げると、その値はもはや正しいものではありません。これを解決するには
reset_headingを呼び出して、ロボットを置いた 後に 方位角を既知の値にリセットできます。たとえば、ロボットを競技テーブルの側面に合わせ、新しい出発点として方位角を 90 度にリセットできます。- 戻り値:
開始時の姿勢に対する方位角。
- imu.rotation(axis) float: deg¶
ロボットの基準座標系 で示されている軸に沿ったデバイスの回転を取得します。
この値は、要求された軸に沿ってロボットが回転する場合に だけ 便利です。一般的な3次元の動きには、代わりに
orientation()メソッドを使ってください。値はこのクラスの初期化時に 0 からカウントを開始します。
- パラメータ:
axis (Axis) -- 回転を測定する軸。
- 戻り値:
回転角度。
- imu.orientation() Matrix¶
ロボットの基準座標系 におけるロボットの3次元姿勢を取得します。
ロボットの
X,Y,Z軸を列とする回転行列を返します。注釈
このメソッドはまだ実装されていません。
- 戻り値:
回転行列。
- imu.settings(angular_velocity_threshold, acceleration_threshold)¶
- imu.settings() Tuple[float, float]
IMU の設定を行います。引数を与えない場合は現在の値を返します。
angular_velocity_thresholdとacceleration_thresholdは、ハブが静止しているとみなされるタイミングを定義します。すべての測定値がこれらの閾値を下回る状態が1秒間続くと、IMU は再キャリブレーションを行います。周囲の振動が大きい騒がしい部屋(競技会場など)では、ロボットがキャリブレーションを行う機会を与えるために、しきい値を少し大きくすることをお勧めします。設定が期待通りに機能していることを確認するには、
stationary()メソッドを使って、ロボットが動いているときにFalse、1秒以上静止しているときにTrueになることをテストします。
非接続 Bluetooth メッセージングの利用
- ble.broadcast(data)¶
ハブ初期化時に選択した
broadcast_channelで、指定データのブロードキャストを開始します。データには、型
int,float,str,bytes,True,Falseのもの、もしくはそれらのリストを指定できます。ブロードキャスト通信を停止するに
Noneを指定します。ブロードキャスト通信が必要ない場合には、それを停止することによりパフォーマンスを向上させられます。同時にデータ観察をしている場合には特に便利です。合計データサイズはかなり制限されています(26バイト)。
TrueとFalseはそれぞれ1バイトを占有します。floatは5バイトを占有します。intは数値の大きさに応じて2から5バイトを占有します。strとbytesはオブジェクトのバイト数に加えて1バイトを占有します。マルチタスクを行う場合、ブロードキャスト通信は一度に1つのタスクでしかできません。複数のタスク(またはブロックスタック)からの情報をブロードキャストするには、ブロードキャスト通信用の専用タスクを用意して、他の複数タスクからの情報を送信するようにできます。
- パラメータ:
data -- ブロードキャストする値、もしくは値のリスト。
バージョン 3.3 で追加.
- ble.observe(channel) bool | int | float | str | bytes | tuple | None¶
指定したチャンネルで最後に観測されたデータを取得します。
ハブがコンピュータや他のデバイスに同時に接続しないようにすると、データを受信する信頼性が高くなります。
- パラメータ:
channel (int) -- 観測するチャンネル(0から255)。
- 戻り値:
送信されたデータは、送信された形式と同じ形式で受信されます。最近のデータが利用できない場合は
Noneが返されます。
バージョン 3.3 で追加.
- ble.signal_strength(channel) int: dBm¶
指定したチャンネルの平均信号強度を dBm 単位で取得します。
これはブロードキャストデバイスがどれだけ近くにあるかを示します。近くのデバイスは約 -40 dBmの信号強度を持ち、遠くのデバイスは約 -70 dBmの信号強度を持ちます。
- パラメータ:
channel (int) -- チャンネル番号(0から255)。
- 戻り値:
最近の観測データがない場合、信号強度は
-128となります。
バージョン 3.3 で追加.
バッテリー値の利用
- battery.voltage() int: mV¶
バッテリーの電圧を取得します。
- 戻り値:
バッテリーの電圧
- battery.current() int: mA¶
バッテリーから供給される電流を取得します。
- 戻り値:
バッテリーの電流。
ボタンとシステム制御
- system.set_stop_button(button)¶
実行中のスクリプトを停止させるボタンまたはボタンの組み合わせを設定します。
デフォルトでは実行中のスクリプトを停止するのにセンターボタンを使います。この動作を変更または無効にして、センターボタンを他の用途に使えるようにできます。
- パラメータ:
button (Button) --
Button.CENTER、または複数のボタンのタプルを指定します。停止ボタンを完全に無効にするにはNoneを指定します。望むなら、中央ボタンを3秒間押すことで、ハブをオフにできます。
- system.storage(offset, write=)¶
- system.storage(offset, read=) bytes
バイナリデータを永続ストレージに読み書きします。
これにより、次にプログラムを実行するときに使えるデータを保存できます。
データは通常、ハブの電源をオフにしたときにフラッシュメモリーに保存されます。ハブを起動したままバッテリーを外すと保存されません。
一度保存されたデータは、バッテリーをを外しても残ります。
- パラメータ:
- 戻り値:
読込み場合は読み込んだバイト数、書出しの場合は
None。- 例外:
ValueError -- 許容範囲外のデータを読み書きしようとした場合。
このハブには最大128バイトのデータを保存できます。データは Pybricks のファームウェアをアップデートしたとき、または元のファームウェアに戻したときにクリアされます。
- system.shutdown()¶
プログラムを停止し、ハブをシャットダウンします。
ステータスライトの利用例¶
ライトの点灯と消灯¶
from pybricks.hubs import TechnicHub
from pybricks.parameters import Color
from pybricks.tools import wait
# ハブを初期化。
hub = TechnicHub()
# ライトの点灯と消灯を5回繰り返す。
for i in range(5):
hub.light.on(Color.RED)
wait(1000)
hub.light.off()
wait(500)
明るさの変更と独自色の指定¶
from pybricks.hubs import TechnicHub
from pybricks.parameters import Color
from pybricks.tools import wait
# ハブを初期化。
hub = TechnicHub()
# 30% の照度で色を表示。
hub.light.on(Color.RED * 0.3)
wait(2000)
# 独自の色を使用。
hub.light.on(Color(h=30, s=100, v=50))
wait(2000)
# すべての色を変化させながら表示。
for hue in range(360):
hub.light.on(Color(hue))
wait(10)
ライトの点滅¶
from pybricks.hubs import TechnicHub
from pybricks.parameters import Color
from pybricks.tools import wait
# ハブを初期化。
hub = TechnicHub()
# 赤で点滅。
hub.light.blink(Color.RED, [500, 500])
wait(10000)
# 緑の遅い点滅と速い点滅を続ける。
hub.light.blink(Color.GREEN, [500, 500, 50, 900])
wait(10000)
ライトアニメーションの作成¶
from pybricks.hubs import TechnicHub
from pybricks.parameters import Color
from pybricks.tools import wait
from umath import sin, pi
# ハブを初期化。
hub = TechnicHub()
# 複数色を使ったアニメーションを行う。
hub.light.animate([Color.RED, Color.GREEN, Color.NONE], interval=500)
wait(10000)
# 赤をサインカーブのパターンで照度を変えながら表示hub.light.animate([Color.RED * (0.5 * sin(i / 15 * pi) + 0.5) for i in range(30)], 40)
wait(10000)
# 虹色で繰り返しながら表示。
hub.light.animate([Color(h=i * 8) for i in range(45)], interval=40)
wait(10000)
IMU の利用例¶
上がどっちかのテスト¶
from pybricks.hubs import TechnicHub
from pybricks.parameters import Color, Side
from pybricks.tools import wait
# ハブを初期化。
hub = TechnicHub()
# それぞれの側の色を辞書に定義。
SIDE_COLORS = {
Side.TOP: Color.RED,
Side.BOTTOM: Color.BLUE,
Side.LEFT: Color.GREEN,
Side.RIGHT: Color.YELLOW,
Side.FRONT: Color.MAGENTA,
Side.BACK: Color.BLACK,
}
# 検出した側を元に色を更新し続ける。
while True:
# ハブの上になっている側をチェック。
up_side = hub.imu.up()
# 検出した側を元に色を変更。
hub.light.on(SIDE_COLORS[up_side])
# 結果の表示も行う。
print(up_side)
wait(50)
傾き値の読取り¶
from pybricks.hubs import TechnicHub
from pybricks.tools import wait
# ハブを初期化。
hub = TechnicHub()
while True:
# 傾き値を読み込む。
pitch, roll = hub.imu.tilt()
# 結果を表示。
print(pitch, roll)
wait(200)
ハブの向きの変更¶
from pybricks.hubs import TechnicHub
from pybricks.tools import wait
from pybricks.parameters import Axis
# ハブを初期化。この場合、ハブは上側を前に、前側を右に向けるよう
# 組み立てているいるように指定します。たとえば、51515セットのBLASTでは
# そのようになります。
hub = TechnicHub(top_side=Axis.X, front_side=-Axis.Y)
while True:
# 傾きの値を読み取ります。今、BLAST が直立しているときの値は0です。
# 前傾姿勢ではピッチがプラスになります。右に傾くとロールがプラスになります。
roll.
pitch, roll = hub.imu.tilt()
# 結果を表示。
print(pitch, roll)
wait(200)
加速度と角速度ベクトルの読取り¶
from pybricks.hubs import TechnicHub
from pybricks.tools import wait
# ハブを初期化。
hub = TechnicHub()
# 加速度のベクトルを g で取得。
print(hub.imu.acceleration() / 9810)
# 角速度のベクトルを取得。
print(hub.imu.angular_velocity())
# 何がプリントされているかが確認できるように待機。
wait(5000)
1つの軸の加速度と角速度の読取り¶
from pybricks.hubs import TechnicHub
from pybricks.tools import wait
from pybricks.parameters import Axis
# ハブを初期化。
hub = TechnicHub()
# 1つの軸に沿った加速度あるいは angular_velocity を取得する。
# 1つの値しか必要ない場合は、こちらの方がメモリ効率が良い。
while True:
# 前方の加速度を読み取る。
forward_acceleration = hub.imu.acceleration(Axis.X)
# ヨーレートを読み取る。
yaw_rate = hub.imu.angular_velocity(Axis.Z)
# ヨーレートを表示。
print(yaw_rate)
wait(100)
Bluetooth の例¶
他のハブへのデータのブロードキャスト¶
from pybricks.hubs import TechnicHub
from pybricks.pupdevices import Motor
from pybricks.parameters import Port
from pybricks.tools import wait
# ハブを初期化。
hub = TechnicHub(broadcast_channel=1)
# モーターを初期化。
left_motor = Motor(Port.A)
right_motor = Motor(Port.B)
while True:
# 他のハブに送るモーター回転角度の読取り。
left_angle = left_motor.angle()
right_angle = right_motor.angle()
# ブロードキャストするデータを設定。まだブロードキャストしていなければ開始。
data = (left_angle, right_angle)
hub.ble.broadcast(data)
# ブロードキャストは100ミリ秒ごとにのみ送信するので、それ以上の頻度で
# broadcast() メソッドを呼び出す理由はありません。
wait(100)
他のハブからのデータ観測¶
from pybricks.hubs import TechnicHub
from pybricks.pupdevices import Motor
from pybricks.parameters import Color, Port
from pybricks.tools import wait
# ハブを初期化。
hub = TechnicHub(observe_channels=[1])
# モーターを初期化。
left_motor = Motor(Port.A)
right_motor = Motor(Port.B)
while True:
# 他のハブからのブロードキャストの受信。
data = hub.ble.observe(1)
if data is None:
# 過去1秒間にデータが受信されていない。
hub.light.on(Color.RED)
else:
# データが受信され、かつ1秒未満の新しいデータ。
hub.light.on(Color.GREEN)
# *data* には、他のハブで hub.ble.broadcast() に指定した
# 順序と同じ値が同じ順序で含まれています。
left_angle, right_angle = data
# 他のハブのモーターの位置をこのハブのモーターに反映します。
left_motor.track_target(left_angle)
right_motor.track_target(right_angle)
# ブロードキャストは100ミリ秒ごとにのみ送信されるので、それ以上の頻度で
# observe() メソッドを呼び出す理由はありません。
wait(100)