Eigen 라이브러리
그렇습니다. C++에서 마치 Matlab의 Matrix를 다루는 것과 같은 효과를 느끼는 (물론 다소 다리지만) 그 라이브러리.
Matrix/Vector 연산에 이만한 라이브러리가 없는 것 같은데 심지어 무료입니다.
그 이점에 비해 Eigen 라이브러리는 Documentation이 좀 부족한 것으로 보입니다. 생각해 보면, 누군가 유용한 API를 잔뜩 만들어 두었는데 그 사용법이 적혀있지 않아 쓰지 못한다는 것은 얼마나 비극적인 일일까요.
물론, Eigen은 Doxygen 형태로 Auto-generated Documentation이 열려있기는 하지만, 컴퓨터 분야에서 어느정도 지식/경험이 있지 않은 사람에게는 그림의 떡인 경유가 허다합니다. 그래서, 부족한 저라도 아는 바를 상세히 적어 조금이나마 더 많은 사람들이 이걸 만들어 준 분들의 contribution을 누릴 수 있도록 노력하고자 합니다.
here)
(혹시 CMake에 익숙한 분 중 Eigen의 CMakeLists 예제를 찾는다면 여기에 링크된 github를 방문하시길Eigen과 CMake?
Eigen 홈페이지에서 제공되는 getting started 튜토리얼에 따르면 Eigen을 사용하는데 'CMake가 필수가 아니다'라고 되어있습니다. 틀린 말은 아니지만, 저처럼 ROS 위에서 개발은 한다거나, 기타 다른 경우에도 CMake 환경에서 개발하는 것이 필연적인 경우가 많습니다. 그래서, CMake 환경에서 어떻게 CMakelists.txt를 구성하면 되는지 설명하고자 합니다.
CMakeList.txt
Eigen 라이브러리가 정상적으로 설치되어 있다면 (Ubuntu 기준) 아래와 같은 형식의 CMakeLists.txt로 Eigen Library를 프로젝트에 링크시킬 수 있습니다.
cmake_minimum_required(VERSION 2.8) project(eigen_trial) #The name of your choice for the project comes here add_compile_options(-std=c++11) #optional to use c++11 find_package(Eigen3 REQUIRED) link_directories(${Eigen_INCLUDE_DIRS}) add_executable(${PROJECT_NAME} "eigen_trial.cpp") #The name of the cpp file and its path can vary target_link_libraries(${PROJECT_NAME} ${Eigen_LIBRARIES} )
Eigen 사용 예
링크가 잘 되었다면 Eigen Library를 부르는 데 문제가 없을 것 입니다. 아래 cpp로 이를 테스트 해볼 수 있습니다.
#include <iostream> #include <eigen3/Eigen/Core> #include <eigen3/Eigen/Dense> int print_eigen(Eigen::MatrixX3d m) { // Eigen Matrices do have rule to print them with std::cout std::cout << m << std::endl; return 0; } int main() { Eigen::Matrix3d test; //3 by 3 double precision matrix initialization // Let's make it a symmetric matrix for(int i=0; i<3; i++) { for(int j=0; j<3; j++) test(i,j) = (i+1)*(1+j); } // Print print_eigen(test); return 0; }
Symmetric Matrix를 Eigen data type으로 생성 후 이를 프린트하는 예 입니다.
모든 설정이 정상적으로 되었다면, 빌드 후 실행하여 저와 동일하게 아래 결과를 얻을 수 있습니다.
1 2 3 2 4 6 3 6 9
'Robotics > C++' 카테고리의 다른 글
CMake 디렉토리(경로)를 변수로 받아 사용하기 (12) | 2023.01.04 |
---|---|
[ZeroMQ] C++와 Python 프로그램간 통신 연동 예제 (10) | 2023.01.03 |