はじめに
ロボットを開発している際にベクトルや行列のライブラリを使いたくなることは多いと思います。本来ベクトルである物理量にたいして、その各成分を変数で定義して管理するよりも、クラスや構造体で管理した方がすっきりしますし、ベクトルの演算がオーバーロードされていた場合かなりコードが見やすくなります。
(演算子のオーバーロードは処理パフォーマンスは悪くなりますが、きれいなコードを書いた方が自分にとって幸せな気がします。)
ただ、ベクトルクラスや行列クラスを自分で作るのはちょっと面倒ですよね。ですので、既存のライブラリを使いましょう。
Eigenを導入
Eigenというライブラリを使いましょう。博士っぽい帽子をかぶっている太った茶色いフクロウがマスコットキャラクターです。
ダウンロード方法
以下からダウンロードできます。http://eigen.tuxfamily.org/index.php?title=Main_Page
プログラムへの組み込み方
ダウンロードしたら解凍し、自分のコードにEigenというフォルダをまるっとコピーしてください。後はEigenのモジュールをincludeするだけで使えます。簡単な使用例
例えば、二次元のベクトルを使う場合以下のような記述になります。
//Eigenのモジュールのインクルード
#include <Core>
#include <Geometry>
using namespace Eigen;
// 二次元ベクトルの定義
Vector2f v1(3.3f, 3.0f);
Vector2f v2(1.0f, 0.5f);
Vector2f v = Vector2f::UnitX();
//足し算
v = v1 + v2;
//スカラー倍
v = 3.0 * v1
//各成分へのアクセス方法は↓以外にもいろいろある。
printf("test %f,%f\n",v(0),v(1));
ベクトルの初期化の仕方や各成分へのアクセス方法はいろいろと用意されているようです。他にも便利なものがいろいろと用意されています。
Eigenのリファレンス
https://eigen.tuxfamily.org/dox/group__QuickRefPage.html
Eigenのいいところ
個人的にEigenでいいと思っている点は以下の3点です。
- クオータニオンのクラスがある。
- ヘッダファイルのみからなるので、ビルドが必要ない。
- ルネサスのRXマイコン(開発環境はe2studio)で使えた。
おわりに
*) 二項演算子でオブジェクトの生成が何度もされてしまうのが主な原因。Expression Templateとかいうテクニックを使うといいらしい)