simscapeでみんな大好きリンク構造を作ってみた

からあげ帝国アドベントカレンダーに予約してしまったので、今やっていることを書き込みます。

# 何がしたいの？

みんな大好き多脚ロボットですが、なかなか思い通りに動かすことが難しい。
ということで、モーターにお金をかける前に、もう少し制御にお金をかけて思った通りに動かせるかどうかをやってみることにします。

関節を作って動きをシミュレーションしてみます。

# 前提条件、用意するもの

Matlab/Simulink/multibodyなどを使って、制御の検証をしてみます。
MathWorksのStandardは年間12万円ですが、個人アカウントは永続で検討するべきお値段でした。

|製品|価格|期限|
|-|-|-|
|Matlab|15,500円|永久|
|Simulink|4,490円|永久|
|Simscape|4,490円|永久|
|Simscape Multibody|4,490円|永久|


新製品が発売される度にスイッチサイエンスやAliから段ボールが着弾して、積基板、積モーターが堆積しているこの界隈の諸兄には余裕で出せてしまうお値段ではないでしょうか。

一か月の無料アカウントも配布されています。

# 初期設定

最初はチュートリアルでもこなして、操作方法を覚えてください。
それほど難しくはないですが、私の老朽化した脳だとGUIに慣れるのに時間がかかりました。

Simscapeでは以下の部品を配置してからシステムを組んでいきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/75ebf385-9e24-1b89-ee12-b5b281c3b129.png)

+ Mechanism Configuration：ブロックが接続された機構の重力とシミュレーションのパラメーターを指定
+ World Frame：座標系の原点
+ Solver Configuration：ソルバーの設定

この3つのブロックをシステムの起点にして、部品を追加していきます。

# リンクバーを追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/1e0c95a8-9aba-cce6-5b68-891b01235fc0.png)

リンク本体の直方体（Brick Solid）の両端に、座標系の変換ブロック(Rigid Transform)を置きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/d572ee0e-dc90-0f20-e03e-23045a59291c.png)

直方体のサイズをX,Y,Z = 1m,0.1m,0.1m として設定します。

両端の変換座標はX座標の両端に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/0ef0da33-01aa-37b8-405a-d99298fb30f0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/ed681445-e53f-9743-d0a6-93562d6e4699.png)


>Brick Solid : ジオメトリ、慣性、および色をもつ固体直方体要素
Rigid Transform : 座標系間の固定された空間関係

追加した部品をまとめて選択して、サブシステム化すると、こんな感じにまとまります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/d18f6e80-3e75-a83d-5ebb-5d94d08b6ad2.png)

この状態だと、Conn2側が宙ぶらりんなため、エラーが出ます。
モデル化→モデル設定で設定を開いて、「剛性的に拘束されたブロック」の「設定」をなしに設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/5af0b3df-5a6f-39d2-0ffc-b337512ff59f.png)

これで実行できるようになります。
うーん、棒が表示されるだけですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/55114b7f-35ba-1faa-5fb1-3b7ab6fd8be9.png)

# ソルバーの設定
モデル化→モデル設定でソルバーを選んで設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/6581070c-f637-201c-e9f7-0d3b74d8d68b.png)

公式の奨励設定、ode15s(stiff/NDF)で最大ステップサイズを0.01にします。

重力の方向をY方向マイナス側にかかるように設定します。
リンクをX方向に伸ばした棒にしたので、ここでは-Y方向を下にして重力をかけます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/f838414b-6bef-f906-7bf1-382e06f64ade.png)

世界座標とリンクの間にジョイントを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/6a669aa5-0409-6ef3-500e-e387e0a36efe.png)


ジョイントの初期値を0度（水平）に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/c9f60431-97d1-3c51-f4b2-5e107cf3454f.png)


**ぶらんぶらん**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/68b779b0-8f7e-af3f-41fc-e6df30a5a433.png)


# 二重振り子にしてみる

作ったリンクとジョイントをコピペしてつないでみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/abb8f2c2-a254-f2da-42d7-d128a4d88c77.png)

ぶらんぶらん（動画）
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/78d9908b-c414-397b-b422-e72a91ed2f05.gif)

さらに三重振り子
ぶらんぶらんぶらん
![ezgif.com-video-to-gif (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/ff862f15-999a-9abd-b78a-77eac2073d08.gif)

レモンに振り回される私
ぶらんぶらんぶらんぶらん
![ezgif.com-video-to-gif (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/44d53e10-d4a3-5b38-5bd0-92af5422005d.gif)



# まとめ

自分でコーディングすると何日もかかりそうなリンクの振子を、簡単に作ることができました。
GUIや作法に慣れる必要があったり、パラメータの設定ミスがあると、無駄に調査に労力を使ってしまいますが、ロボットを作り上げた挙句、思った通りの制御ができないことに悩まされている方は、Simscapeの導入も検討してみてはいかがでしょうか。

この後は、みんな大好き４節リンクに進化させてみようと思います。