船舶の揺動をシミュレーションする環境構築

# はじめに
なんらかの物体の運動をシミュレーションするためには、その特性を表す数式が必要です。いや数式だけでなく、数式に与える係数、入力も必要です。その物体の置かれた環境もパラメータ化する必要があるかもしれません。
ふと思い立って、船の運動をシミュレーションしてみたいと思いまして、調べた結果をつらつらと書きます。

ご存じのように、自動車であればその運動をシミュレーションする際に参考にできる情報は巷にあふれています。
- 「自動車運動力学」みたいなタイトルの書籍がリーズナブルな価格で多数出ていたり
- 解説ページがウェブでもよく見られます。

しかし、船の運動のシミュレーションってどんな数式が使われるのかしら？
以前にモンキーターン（アニメ化もされた人気漫画、知ってます？）で知ったのですが、船は左に旋回する時は右に傾けるそうですね。右に傾けると水にあたる船体の面積が右側が大きくなるので右から押す力が左からの力に勝り結果として左に行く、とのこと。なるほどね。こりゃ難しそうだ。。。

立式するところ~~からやるのは面倒くさいので~~は先人の知恵を拝借しちゃいましょう。
また、シミュレーションモデルも既存のがあれば流用しちゃいたいですよね。

# 環境構築
ちょうどいいのがありました！
http://github.com/cybergalactic/MSS
MATLABが前提の船舶シミュレーションアセットでGNUライセンスのもとフリーです。（以降MSSライブラリーと呼びます）
以下、MATLAB R2021a を前提としたセットアップを見ていきます。
## ローカルに展開
1. 上記リンクからダウンロードしたZipファイルをローカルに解凍
Zipファイルは 'MSS-master.zip' という名前なので、解凍するとデフォルトでは MSS-master というフォルダができます。
2. MSS という名前のフォルダーを作って、その中に解凍されたファイル（MSS-masterの中身）を格納
ここのフォルダー名は重要です！
後述するサンプルモデル用のスクリプト処理がフォルダ名固定で記述されていますので、ここのフォルダ名が異なると後でサンプルモデルを動かすときにエラーに悩まされることになります。

以上でローカルに展開は終了です。

## MATLAB の設定
上記で作った MSS フォルダー内にパスを通していきます。
ここでは、MATLABの標準機能の"プロジェクト"を使います。
MSSのためにフォルダーパスを追加した場合、MSS以外の作業をする際に邪魔になることを避けるために、パスの設定をバッチ化しておきたいですよね。"プロジェクト"を使うとこの問題は解決できます。他にも以下のような利点があります。
・複数のファイル（MATLAB以外にも docやxlsも）を一括管理
・何らかのスタートアップ処理を仕込むことが簡単
・環境をまるっと他のPCに複製が簡単
・Gitなどソース管理ツールと連携

### プロジェクトの作成
1. MATLABのメインウィンドウの[ホーム]タブから、
　[ 新規 ] - [ プロジェクト ] - [ フォルダーから ] 
を選択します。
![CreatePrj.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790621/ff97e022-9411-948c-9f9e-033f97085f9f.png)

2. [ 新規プロジェクト ]のダイアログが出てきますので、プロジェクト名に適当な名前でを入れ（ここでは MSS とします）、プロジェクトフォルダーに上記で作った MSS を指定します。
![CreatePrj2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790621/16ed25ee-820c-3e35-cc76-ccf9835fddd9.png)

### プロジェクトのパスの設定
1. ”プロジェクト”ウィンドウが開くので、［プロジェクトの設定］でMSSフォルダー（サブフォルダー含む）を指定することでパスの設定は終了です。
![setupPrj.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790621/22f1a1e4-874b-df99-67d5-3e9d107622c8.png)


以上でMATLAB上でMSSの船舶モデルをシミュレーションできるようになります。
設定、簡単でしょ？
プロジェクトウィンドウを閉じると、プロジェクトを閉じることになり（MATLABは起動したまま）、同時にプロジェクト用のパスの設定が解除されます。
この手順でプロジェクトを作成すると、MSSフォルダー直下に、MSS.prj なるファイルができています。
次回以降は、MATLABからこのprjファイルをダブルクリックすることで、プロジェクトが立ち上がり、パスが自動で通ります。

# シミュレーションモデル
さて、シミュレーション環境を構築できましたが、どんな仕組みになっているのかはいまだ不明のままです。
MSSライブラリーを展開すると、documentationフォルダーがあり解説ドキュメントが入ってます（英語ですが）。
![documents.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790621/3096d8e2-7609-466f-7227-6f0b13dc90f9.png)
そして、モデルをSimulink化したライブラリとそのライブラリを使ったSimulinkのサンプルモデルも入ってます。
数式モデルを完全に理解できなくても、こういうものと思ってざぁーっと読み進めて、あとはSimulinkモデルを実際に動かして理解する、ってのが手っ取り早いと思います。
以下、私なりの理解です。
間違ってるところあれば、是非ご指摘いただきたく。
### ライブラリ
MSSライブラリーには、Simulinkで作られたブロックをライブラリにまとめたモデルが入っています。
![MssLib.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790621/db106066-0695-7dfd-cce2-1421f55414ee.png)
この mssSimulink.slx を右クリックして「ショートカットの作成」をしておきましょう。次回から、プロジェクトウィンドウの「プロジェクト ショートカット」タブから簡単に開くことができます。
### サンプルモデルたち
タンカー、潜水艦など、ライブラリブロックを使ったモデリング例が２０個ほど入っていました。
![sampleMdls.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790621/a632d1bc-87fa-20fb-a2f4-3760493b5d8b.png)
片っ端から開いて動かして遊んでみましょう！
### 入力
船舶モデルに対しての入力は、推進力と外乱です。
#### 推進力
六分力で入力します。
・xyz方向の力、
・ロール・ピッチ・ヨー方向のトルク
#### 外乱
大きく分けて以下の３つが考慮されています。
波浪
風
流れ

### 船舶
船舶のモデルはシンプルに質点で表現されているようです。
[WAMIT](https://www.wamit.com/) や [ShipX](https://www.sintef.no/en/software/shipx/) といったツールで構築した船舶モデルをエクスポートしMATLABに読み込んでいます。
読み込む際にはRAO(Response Amplitude Operator)に変換してその船の特性としています（エクスポートされたデータをMATLAB用に変換する関数もMSSライブラリーに入っています）。言い換えると、波の影響を６分力に変換して質点に入力として与えて運動方程式を解く、という流れ。これで船の形状によって異なる波から受ける影響を計算できるようにしています。しかも計算負荷がむちゃくちゃ軽い！
MSSライブラリーには、サンプルとして複数の船舶特性が入っています。

### 出力
6DOFモデルでは船の動揺として以下が算出されます。
・eta : 位置ベクトル（xyz方向位置、ロール角、ピッチ角、ヨー角）
・nu : 速度ベクトル（xyz方向速度、ロールレート・ピッチレート・ヨーレート）
また、上記のサンプルモデルではこれらの出力から、XY平面へのプロット（航行軌跡）やＺ軸の時系列データ（ヒーブの振る舞い）などを見られるように簡単な後処理も入っています。
# 船舶のシミュレーションを何に使うのか？
何らかハードウェア（今回は船舶）をモデル化するのは、多くの場合、それは手段であって目的ではないと思われます。日本では自動車業界を中心に広がっている開発手法のモデルベース開発（MBD: Model Based Design）の流れで使われることになることでしょう。
以下に、３つの使用シーンを挙げます。
### 船舶の走行制御ロジック検証
例えば、南南西に向かって速度10ノットで進みたくても、海洋面の流れ（速度、方向）、波の状態（速度、方向、高さ）、底から水面の距離などでその通りには行きません。
シミュレーションで制御ロジックの試作を作りこむ用途が考えられます。
### 荷役作業の可否判断
荷役作業（船から荷物を積み上げ/下ろす作業）の際に、波が高い場合は船が大きく揺れて危険なので作業を中止しなければならないわけですが、船そのものが揺れてなければ（動揺が小さければ）作業続行してもいいだろうということで、揺動から荷役作業の可否を評価する手法があるようです。
気象庁などから波浪情報を取得し、ある港湾施設で荷役をする場合の作業効率を見積もることもできそうです。
### 船舶の操船訓練
リアルタイムマシンにモデルを実装し、操船インターフェースをつなげることで HILS(Hardware In the Simulator)を構築して、操船訓練をバーチャルで行うこともできそうです。

# おわりに
以上、ざぁっとではありますが船舶の運動シミュレーション環境構築について述べました。
上述のように、波が船に与える影響を表すパラメータの作成・編集についてはMATLABではない他のツールを前提としているので、任意の船舶のシミュレーションをこのMSSライブラリー＋MATLABの環境のみでおこなうのは現実的ではないかもしれません。
しかし、船舶運動のシミュレーションを理解する、という教育目的であるならば十分に活用できると思われます。