2017年5月27日土曜日

C++で使える使いやすい線形台数のライブラリ


はじめに

ロボットを開発している際にベクトルや行列のライブラリを使いたくなることは多いと思います。


本来ベクトルである物理量にたいして、その各成分を変数で定義して管理するよりも、クラスや構造体で管理した方がすっきりしますし、ベクトルの演算がオーバーロードされていた場合かなりコードが見やすくなります。
(演算子のオーバーロードは処理パフォーマンスは悪くなりますが、きれいなコードを書いた方が自分にとって幸せな気がします。)


ただ、ベクトルクラスや行列クラスを自分で作るのはちょっと面倒ですよね。ですので、既存のライブラリを使いましょう。

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とかいうテクニックを使うといいらしい)

0 件のコメント:

コメントを投稿