toioとLEGOを使って生き物を作ってみた（ヘビ編）


# toioに命を吹き込んでいきたいと思います

**Hiroshi Takagi**と申します。普段は組み込みエンジニアをやっています。


この記事は、以前作成した、[Unityでtoioを動かすスクリプト](https://qiita.com/HrshTkg/items/fce40de243946821e425)を用いて、身の回りの生物（ヘビ）を作ってみた記事です。
開発の環境等は前回の記事を参考にしてみてください。

[工作生物 ゲズンロイド](https://toio.io/titles/gesundroid.html)とか、[ウロチョロス](https://morikatron.com/urochoros/)ってすごく愛嬌のある動きをしますよね。
何か愛嬌のあるものを作ってみたい！と思い、身の回りのものをtoioに模倣させてみようと決めました。

# さて、何を作ろう

最初はR2-D2とか作れたらいいなぁと思ってLEGOを組み立ててみたんですが、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">R2○2風につくりました <a href="https://t.co/lTWOWHH3Uo">pic.twitter.com/lTWOWHH3Uo</a></p>&mdash; Hiroshi Takagi (@TkgHrsh) <a href="https://twitter.com/TkgHrsh/status/1203228665670029312?ref_src=twsrc%5Etfw">December 7, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

なかなか思い通りに行きませんね。。
思ったよりもロボットの見た目とか動きとかを真似るのって難しいです。

そこで、ふと身の回りの動物たちを作ってみようと思い立ち、
なんとなぁく簡単にできそうかなヘビを作ろうと決めました。
要はくねくねすればいいんですよねw

# ヘビの動きを作ってみた

とは言ってみたものの、動きをイメージして作るのは難しかったので、
まずはネット検索から始めたところ、こんな動画を見つけることができました。
https://www.youtube.com/watch?v=58aZnl9V2L0

東工大の教授さんが発見したヘビの動きで、サーペノイド曲線っていうらしいです。
**向きをサイン波で動かしながら、進む**のがポイントのようです。

公式とか調べるのは大変だったので、そのまま実装に入りました。
それで作成したコードがこちら

```cs
    void Update()
    {
        timeout += Time.deltaTime;
        if (timeout >= 0.05f)
        {
            timeout = 0f;
            if(isMoving){
                int speed = (int)Speed.GetComponent<Slider>().value;
                int gain = (int)Gain.GetComponent<Slider>().value;
                int times = (int)Times.GetComponent<Slider>().value * 5;
                float direction = Mathf.Sin( 2.0f * Mathf.PI * (float)count/(float)(times) + 0.5f * Mathf.PI);
                int diff = (int)((float)gain * direction);
                int left = speed - diff;
                int right = speed + diff;

                Cube.GetComponent<CubeController>().Move(left, right, 100);

                count++;
                if(count >= times){
                    count = 0;
                }
            }
        }
    }
```

Unityの記述になっていますが、50msec間隔でsin関数で計算した向きからモーター指示を出しています。
speedとgainとtimesは後で調整できるように以下のようにUI上のデータから引っ張ってきています。
![スクリーンショット 2019-12-22 9.29.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542743/ac1597e8-ed49-b0e4-08e8-e5da3974c4fd.png)
*ヘビのアイコンは[イラストエイトさんのもの](https://illust8.com/contents/3773)を使わせていただきました。


動作させてみた結果がこちら
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">キューブに蛇の動きをさせてみた。サーペノイド曲線っていうらしい。 <a href="https://t.co/1PyQYPVeR9">pic.twitter.com/1PyQYPVeR9</a></p>&mdash; Hiroshi Takagi (@TkgHrsh) <a href="https://twitter.com/TkgHrsh/status/1203597123846991872?ref_src=twsrc%5Etfw">December 8, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

いい感じですかね。あとは見た目を作成できれば完了です。

# あとはLEGOで見た目を作るだけ
LEGO初心者の私には、LEGOでくねくねさせるイメージが全く湧かなかったのですが、
周りの方に聞いてみたところ、意外と基本的なパーツで作成することができました。
![IMG_0914.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542743/b0382fd9-7234-57ef-948d-83e85077f4f8.jpeg)

この白いフック形状のものと、黄色い穴あきのものを組み合わせて、お花で蓋をすれば完成です。

# 完成品がこちら
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">サーペノイドキューブ＋LEGO <a href="https://t.co/591NC4paJl">pic.twitter.com/591NC4paJl</a></p>&mdash; Hiroshi Takagi (@TkgHrsh) <a href="https://twitter.com/TkgHrsh/status/1208241990120296449?ref_src=twsrc%5Etfw">December 21, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

どうですか？結構様になっていませんかね？
Unityとtoio、LEGOがあるおかげで、こんなにもすぐに動くヘビが作れてしまったことに驚きです。


#おわり
これからもtoioとLEGOの生き物シリーズを作っていきたいと思いますので、お楽しみに。

それではまた！（クリスマスまであと三日！）