Simscapeを用いたロボットの可動域描画

## 1. はじめに
多自由度のロボットの可動域を3次元的に表現したいことってありますよね。
単純にプロットする分には数値計算で点群を生成することはできます．
ですが，3Dモデルを配置しないと直感的に可動域を把握できない

公式がサンプルこの辺の事例ではRigid Body Treeの仕組みがどうも理解できず...
お手軽にやる方法を発見したので共有します．

※デジタルツインにも使えそうなのでこの手法を取りましたが，運動学モデルがあれば点群だけ生成＋STL取り込みで同じことができます．

## 2. 対象者
Autodesk Fusionとsimulinkの基本的な操作ができる人．
SolidWorksやCreoもプラグインの対象なのでXXXXファイルを出力するのはそちらでも問題ありません．

【ソフトウェア】
- MATLAB R2023b
- simscape multibody
- Autodesk Fusion
- Autodesk Inventor 2021
- Simscape Multibody Link Plugin

Inventorのバージョンについては以下のサイトで対応するバージョンを確認してください．
※2024/12/20現在Inventor 2021がサポート終了しており`製品とサポート`ページやチャットサポートからダウンロードできないようです．現状，インストーラもしくは一度インストールしたPCさえ所持していればある工程を踏めばソフトの起動自体はできそうです．


## 3. 流れ
### (1) 各種ソフトインストール
3DCADとMATLABの以下のアドインをインストールしておいてください。
- simscape
- simscape multibody

### (2) Link Pluginインストール
インストール方法は公式サイト[[1]](https://jp.mathworks.com/help/sm/ug/installing-and-linking-simmechanics-link-software.html)に記載してあるのでそれ通りに進めてください．

### (3) Autodesk Fusionのモデルをエクスポート
Inventor専用のファイルにエクスポートできればいいのですが，最新版のFusionだとInventor 2022以上のファイルしかエクスポートできないのでstepファイルでエスポートします．

### (4) Autodesk Inventorで読み込み再ジョイント
Inventorで直接CADデータを作成している場合はそのままで問題ありません．
Fusionでエクスポートしたファイルにはジョイント情報が含まれないので再ジョイントします．

### (5) エクスポート
Pluginを使ってCADモデルをエクスポートしてください．

### (7) simscapeモデル編集
できたSimscapeモデルを編集していきます．
Jointブロックをダブルクリックし，以下のように書き換えます．
Actuation > Torque: Automatically Computed
Actuation > Motion: Provided by Input
Sensing: Position

### (8) 点群データ生成
さらに，点を打っていくアルゴリズムをブロックで組み，運動学のプログラムを組み込みます．
実行すればviewerでモデルが動き回るのを確認できると思います．
**(8-1)角度の組み合わせ生成**
- リニアに数値が上がるソースを配置
- カウントアップを組み合わせて全角度の組み合わせを実現
![スクリーンショット 2024-12-25 235927.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2654082/d5ae401b-fd5f-c5a7-135a-9a9ee65ed15d.png)
**(8-2)SimlinkとSimscapeを接続**
- actuation端子に接続するため微分値が必要？みたいなエラーがでたので，左下の0と1のConstantを置いたらとりあえず動きました．（要確認）
![スクリーンショット 2024-12-25 235958.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2654082/13e2e093-86e2-83ff-3a19-045bc1ad5299.png)
**(8-3)変数に格納**
- out.simoutで変数に格納しておきます．
![スクリーンショット 2024-12-26 000016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2654082/f1830cb1-0682-556f-7078-1fb8c6dc0e7b.png)

実行するとMechanics Explorersで以下のような挙動を示します．(1/8倍速)
（エンドエフェクタがずれているのはCAD座標のミス）
![レコーディング 2024-12-29 222702.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2654082/a4bd4ef6-5543-4057-64f4-f45b23793ce6.gif)


### (9) 3Dモデルを重ねる
Plotに3Dモデルを取り込めれば完成です．
有志の方が作成したSTLReaderを使ってSTLファイルからMATLABにジオメトリをインポートします．
[参考] Eric Johnson, "STL File Reader - File Exchange - MATLAB Central", 
https://jp.mathworks.com/matlabcentral/fileexchange/22409-stl-file-reader

## 4. さいごに
(8-1)のブロックの部分をシリアル通信で角度値を受信すればデジタルツインにも使えます．
その場合，viewerの再生速度をx8~x32とかにしないと遅すぎて使えないので注意．

## 注意事項
### (1) フォルダ移動
【症状】
機械モデルはpath指定されているので，slxとモデルファイルが入っているフォルダを移動させると機械モデルの枠が赤色になるエラー表示が出現します．
【原因】
機械モデル名.DataFile.mとのリンクが外れたことが原因です．
【解決】
上部メニュー`モデル化 > モデルエクスプローラー`内に答えがあったような...
モデルの階層構造の`Simulink Root > simulinkモデル名 > Model workspace`のデータソースMATLABファイルのファイル名がコピー元のパスになっているのでそれをコピー先のパスに変更すれば解決します．
ソースから再初期化をしただけではまだ赤枠が残りますが，モデルを更新(Ctrl+D)もしくは実行すれば消えます。

## 参考文献
[1] MathWorks, "Install the Simscape Multibody Link Plugin",
https://jp.mathworks.com/help/sm/ug/installing-and-linking-simmechanics-link-software.html