はじめに
ROS&Gazeboでシミュレーションをするときに、inertiaを正しく設定しないと想定通り動かないことがあります。今回は、MeshLabを使ってinertiaを計算する方法をまとめます。
とは言っても、公式ドキュメントInertial parameters of triangle meshesが存在し、この通り設定すれば動くのですが、わたしは理解するのに小一時間なやんでしまったので、今回はその解説です。
やはく計算式をよこせという方は、こちらをどうぞ!
https://docs.google.com/spreadsheets/d/1Y_lwnLfvxX3A3op7AxNbXVvc4fE7W9cXn6xtQcOpz6E/
環境
環境 | バージョン |
---|---|
開発機 | Ubuntu 16.04.6 LTS |
ROS | Kinetic Kame |
Gazebo | version 9.11.0 |
MeshLab | v1.3.2 |
link elementの確認
まずlinkですが、今回設定するものは、inertial
のorigin
とinertia
です。origin
は、
The origin of the inertial reference frame needs to be at the center of gravity.
とあるように物体の重心を設定する必要があります。これは、ドキュメントにもあるとおり自動的にCenter of Mass
で計算されるので、そのパラメータを設定します。
次にinertia
ですが、こちらが少々わかりにくいです。MeshLabで計算されるInertia Tensor
は、calculating-inertial-matrix-for-gazeboのコメントにあるように
Note that the mass value is the same as the computed volume, this means that a default value of density rho=1 has been used. The density of the material of your gripper expressed in kg/m^3 has to be multiplied by the volume in order to get the mass. Example density is rho = 7850 Kg/m^3 (steel).
密度(density)を$1[kg/m^3]$と仮定した体積のためInertia Tensor
の単位は、$[m^5]$となります。つまりメッシュから体積を求めたので、重さ(mass)は密度から求めるなり、測定値から求めるなりしてくださいということです。
これでinertia
の計算ができそうですが、最後にScale Factor
で注意点があります。Scale Factor
は、オブジェクトが小さい時のinertiaを計算するときに小数点以下で切り捨てられることによって全て0となってしまうのを避けるために、実際の大きさからスケールして計算するときに設定するものです。密度から重さを逆算して計算する場合は、$10^5$でスケールされるのに対して、測定値の重さから計算する場合は、$10^2$でスケールされるので、最後に単位を戻すのを忘れがちです。
計算式
使いやすいようにスプレッドに計算をまとめました。これを見れば2秒で理解できると思います。この例では、cylinderをScale Factor=10で自分で測定した重さを用いて計算しています。MeshLabから計算されたinertiaが正しいかどうかは、List_of_moments_of_inertiaから手計算で同じ値になることで確認をすることができます。
まとめ
- MeshLabからinertiaを計算するときは、密度から重さを求めるか、測定値の重さを使用するかで、Scale Factorが異なるので注意する必要がある
- 簡単な形のinertiaの計算があっているかは、手計算で確認できる