2025年1月9日

018-1.SPIKEプライムPython入門-第2回「モーターを動かす」

この連載では「レゴ エデュケーションSPIKEプライム(以下、SPIKE)」を使ったPython(SPIKEアプリ)によるプログラミングの方法を紹介します。 Python(パイソン)はプログラミング言語の一つです。Pythonは教育や人工知能の研究など様々な分野で使われていて、人気があります。 Pythonの主な特徴はオブジェクト指向を採用していることです。オブジェクト指向というのはプログラムの機能をオブジェクトという単位で切り分けて扱う手法のことです。オブジェクト指向は複雑なプログラムを作る場合に効果を発揮します。(文/松原拓也)

◆ クラスとは?

今回は「グリッパー搭載ロボット」を動かすプログラムを作ります。このロボットの作り方は「SPIKEプライム入門」の第9回目が参考になります。

まず、ロボットのモーターを1つだけ回すプログラムを作ります。
プログラムの1~2行目はSPIKE用の関数を使える状態にする命令です。この記述はプログラムを新規で作成した時、自動的に生成されます。
4行目の「motor_a = Motor('A')」は、Motorクラスを使って、motor_aというオブジェクトを生成するという命令です。クラス、、、いきなり難しい言葉ばかりになってしまったので解説します。

「クラス」というのは一定の機能を集めたプログラムの単位のことです。モーターを動かすプログラムを「Motorクラス」にまとめているわけです。学校では「人の集まり=クラス」と呼びますが、ここでは「プログラムの集まり=クラス」として考えます。 「オブジェクト」は様々な使い方ができる「入れ物」のことです。Pyhtonでは変数をオブジェクトとして扱います。オブジェクトには数を入れるだけではなく、変数や関数など、様々な機能を入れることができます。 この場合、motor_aオブジェクトの中にはモーターを動かす機能が入ります。オブジェクトの名前は自由に付けることができます。今回はポートAのモーターを動かすので、motor_aという名前にしています。
5行目の「motor_a.run_for_degrees(360,25)」は「ポートAのモーターをスピード25で360度回す」という命令です。カッコ内の数値は引数といいます。第1引数が角度。第2引数がスピードです。
run_for_degrees」はモーターを回すための関数です。その左がわに「motor_a.」の書かれていますが、これは「motor_aオブジェクトの中にある関数を使います」という意味です。入れた覚えはないのに、オブジェクトの中にはrun_for_degrees関数が入っていて不思議に思うかもしれません。この関数はMotorクラスの中に含まれています。このように、どこの誰かが作った関数を自由に呼び出せるということがオブジェクト指向の強みです。 Motorクラスの中には、この他にもたくさんの関数が含まれています。関数の名前を知らないと呼び出すことができないため、ナレッジベース(ヘルプ)を読むことは重要です。

プログラムを実行すると、ポートAのモーターが360度回ります。
成功です。

◆ ロボットを前進させる

続いて、ロボットを前進させてみたいと思います。
これはrun_for_degrees関数を2回呼び出してみた例ですが、これだとモーターが順番に回るので、ロボットがまっすぐ動きません。この方法は失敗です。
前進させるにはモーターを2つ同時に回す必要があります。

モーターを2つ同時に回すには「MotorPair」というクラスを使います。
ここではオブジェクト名を「motor_ba」としました。 ロボットを前進させるには「move」関数を使います。 関数の第1引数には移動する距離が入ります。 第3引数にはステアリングの値です。この値が0の場合は直進します。

プログラムを実行した結果がこちらです。
ロボットが15cm前進しました。うまく動かすことができました。

◆ グリッパーを動かす

続いて、グリッパーを開閉させてみます。
この場合、「run_for_degrees」関数を使うことはできません。スピードで制御したり、角度で制御しようとすると、無理にモーターを回してしまいますので、モーターやギヤに余分な負担がかかってしまいます。

そこで、モーターのパワーを固定にして、グリッパーが開閉する限界に達したらストール(パワーが負けてモーターが止まる状態)させる必要があります。ここで使うのが「start_at_power」関数です。この関数はパワーを固定した状態でモーターを回すことができます。
ちなみにグリッパーが開く時と閉じる時では、プログラムの記述がほとんど同じです。 プログラムにムダがあるように思えます。このムダを無くす方法については後で紹介します。

プログラムの実行結果です。
実行すると、グリッパーが開いて、それから閉じます。

◆ 関数を作る

先ほどのプログラムには、同じような記述を繰り返していたので、ムダがありました。このムダを無くすため、「ユーザー関数」を取り入れてみたいと思います。これを使うと、マイブロックのようなことができるようになります。
ユーザー関数を使ったプログラムがこちらです。ユーザー関数を作るには「def」という文を記述します。書式は「def 関数名(引数):」です。関数の名前は自由に付けることができます。 関数の内容を表現するため、「:」からは「字下げ(インデント)」を行います。字下げをやめたところから、通常のプログラムが始まります。
これで、グリッパーの「開く処理」と「閉じる処理」を1つの関数として記述することができました。

以上の方法を応用してできたプログラムがこちらです。 グリッパーで手前のものをつかんで持ち帰るというプログラムです。
turn」というユーザー関数を作り、その場せん回を行えるようにしています。 turn関数の引数はせん回する角度です。

プログラムを実行すると、このように動きます。

(1)グリッパーを開いて、15cm前進する。
(2)グリッパーを閉じる。
(3)その場せん回を行って180度向きを変える。
(4)15cm前進して、元の場所に戻る。
以上で、ロボットを思い通りに動かすことができました。次回にはセンサーを使ってみたいと思います。

今回作成したプログラム(SPIKEアプリ用)

当ブログの内容は、弊社製品の活用に関する参考情報として提供しております。
記載されている情報は、正確性や動作を保証するものではありません。皆さまの創意工夫やアイデアの一助となれば幸いです。