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

前回に引き続き、三角関数について紹介します。
前回は三角関数を使って計算をするだけでしたが、今回は実際にモーター制御と組み合わせて使ってみたいと思います。
まず、写真のようにモータの回転軸にアーム(テクニックビーム)を取り付けます。回転軸の中心からアームの先端までのきょりは9ポッチです。1ポッチが約8mmなので、9×8=約72mmです。

組み立てる時の注意点として、アームの向きをモーターの回転軸の0度に合わせます。回転部分にしるしが付いています。

プログラムです。
このプログラムではモーターを10度ずつ回転させて、10度×9回=90度回転させます。この時、三角関数を使って、アームの先端の位置を計算しています。回転センサーは使いません。

写真で示しているのが「アームの高さ」です。
「アームの高さ」とは、水平線(赤い線)からアームの先端までを結ぶ線の長さのことです。この線は常に垂直で、水平線に対して直角で交わります。
ちなみに、モーターをプラス方向に回転させると、アームは時計回りに動きます。
高さを計算するには次の式を使います。
高さ=sin(ラジアン)×アームの長さ
、、、です。プログラム上では「height=sin(radians(kakudo))*arm」と記述しています。高さは変数heightに格納されます。armにはアームの長さ(72mm)を格納しています。変数kakudoにはモーターの角度を格納しています。

実行すると、回転軸は0度からスタートして、1回あたり10度ずつ回転します。9回目でアームが90度に到達します。
コンソール画面に「回転軸の角度」と「アームの高さ」を表示します。

結果をグラフにすると、波のような線を描きます。 sin関数で求めたカーブです。これをサインカーブといいます。

アームの動きを図で表現すると、こうなります。
回転軸が90度に近づくほど、高さの変化が少なくなります。
◆ アークサイン関数

ここからが本題なのですが、この図のようにモーターを動かすにはどうしたらいいのでしょうか?
先ほどと同じく、回転軸は9回動きます。しかし、1回あたりに移動するアームの高さが均一(72mm÷9回=8mm)です。そして、モーターの回転角度はバラバラです。

ここで使用するのがasin関数です。asinは「アークサイン」と読みます。
asin関数はサイン値からラジアンを求めることができる関数です。
サイン値は「目標の高さ÷72mm」で算出できますので、それをasin関数の引数に入れれば、ラジアンを求めることができます。
そして、degrees関数を使えば、ラジアンから角度を求めることができます。あとはその角度に合わせてアームを回転させるだけです。この時、求まる角度は「絶対的な角度」なので、run_to_position関数を使ってモーターを動かします。

関数の働きを図にすると、こうなります。
sin関数はasin関数と逆の働きをします。sin関数はラジアンからサイン値を求めますが、asin関数はサイン値からラジアンを求めます。
今回は使用しませんでしたが、cos関数と逆の働きをするacos関数もあります。

実行すると、9回に分けて、アームが動きます。8mmずつアームの高さが増えていきます。一応、成功です。
、、、ですが、少し動きに不満があります。実際にはアームが動かなかったり、動きすぎます。これはモーターの制御にムラがあるためです。この問題を解決するには減速ギヤを使ってアームを動かす必要があります。

コンソール画面の表示結果です。
アームの高さが8mmずつ増えて、それに対応する絶対的な角度が表示されます。最後が「90度」ではなく「89度」になっていますが、これは計算の都合によるもので、結果が89.9…度だったところをint関数で整数化したためです。
以上の技術をロボットの制御に応用することができます。
今回作成したプログラム(SPIKEアプリ用)
当ブログの内容は、弊社製品の活用に関する参考情報として提供しております。
記載されている情報は、正確性や動作を保証するものではありません。皆さまの創意工夫やアイデアの一助となれば幸いです。