空飛ぶロボットのつくりかた

ロボットをつくるために必要な技術をまとめます。ロボットの未来についても考えたりします。

Eigen事始め

f:id:robonchu:20190202123719p:plain

やりたいこと

C++で行列計算を高速に行いたい!

ので、行列計算ライブラリEigenを学ぶ。

教科書

インストール

Eigen からダウンロードする。

もしくはROSが入っている場合、

/usr/include/eigen3/Eigen

にEigenがインストールされている。

コンパイル方法

g++ -I /path/to/eigen/ my_program.cpp -o my_program

Getting Started

#include <iostream>
#include <Eigen/Dense>

int main() {
  // 2行2列の行列作成
  Eigen::Matrix2d m(2,2);
  m(0,0) = 3;
  m(1,0) = 2.5;
  m(0,1) = -1;
  m(1,1) = m(1,0) + m(0,1);
  std::cout << m << std::endl;

  // 1行2列のベクトル作成
  Eigen::Vector2d v(1,2);
  std::cout << v << std::endl;

  // 上記行列とベクトルの積
  std::cout << "m * v =" << std::endl << m * v << std::endl;
}

出力

  3  -1
2.5 1.5
1
2
m * v =
  1
5.5

Dynamicに生成

以下のように記述することで行列サイズを動的に決めることができる

Eigen::MatrixXd m = MatrixXd::Random(3,3);

コンマで初期化

Matrix3f m;
m << 1, 2, 3,
     4, 5, 6,
     7, 8, 9;
std::cout << m;

便利機能まとめ

配列からEigenに変換

配列からEigenに変換するのに便利なEigen::Map

int array[8];
for(int i = 0; i < 8; ++i) array[i] = i;
cout << "Column-major:\n" << Map<Matrix<int,2,4> >(array) << endl;
cout << "Row-major:\n" << Map<Matrix<int,2,4,RowMajor> >(array) << endl;

出力

Column-major:
0 2 4 6
1 3 5 7
Row-major:
0 1 2 3
4 5 6 7

クオータニオン計算

TBD

参考なるブログ

所感

これは便利 ! 使いやすいし、多機能

背中がITAI...