Knowhow/C, C++, CMake 11

Eigen 형변환 :Quaterniond, Vector3d to Matrix4d

Eigen을 활용해서 구현을 자주 하는데 그 때마다 quaternion과 translation을 표현하는 변수 타입이 섞이는 일이 많다. Vector4d가 편할 때, Quaterniond가 편할 때, Matrix4d가 편할 때가 각각 달라서 하나로 통일하긴 뭐하고 매번 서로 변환해가면서 쓴다. 같은 함순데 매번 새로 구현하는 것이 귀찮아서 이곳에 기록해둔다. 그냥 값을 일일이 복붙하는 식으로 구현해도 되지만 뒤에 ceres solver라도 붙이려고 한다면 메모리 주소가 공유돼서 연결되어 있어야 하므로 다음과 같이 구현하는 것이 좋더라. void qt2mat(Eigen::Quaterniond q, Eigen::Vector3d t, Eigen::Matrix4d& mat){ mat.block(0,0) = q...

Eigen Vector4d와 Quanterniond, 그리고 Ceres EigenQuaterniondParameterization()

Ceres를 이용하여 최적화 코드를 구현할 때 Eigen을 많이 활용한다. 특히 최적화 대상에 보통 rotation이 포함되는 경우가 많아서 Quaternion을 표기하는 과정에서 Eigen::Vector4d, Eigen::Quaterniond를 많이들 사용한다. 하지만 주의할 점이 있어 기록해두고자 한다. 그 내용은 각각 어떤 convention을 따르느냐는 것이다. 다시 말해 (w,x,y,z) 순서인지, (x,y,z,w) 순서인지 말이다. Eigen::Vector4dEigen::Vector4d는 (x,y,z,w) 순서를 사용한다. Hamilton convention으로 알려진 (w,x,y,z)이 아니다. argument 순서와 내부 데이터 저장 순서 동일하게 전부 (x,y,z,w) 순서를 사용한다. ..

CMakeLists.txt 작성 팁 1

기본적으로 작성하면서 꼭 이해해야 될 것 같다고 생각한 내용들을 적어두고, 나중에 복붙하기 편하게 정리해두고자 한다. 1) C 버전 지정 if (NOT CMAKE_C_STANDARD) set(CMAKE_C_STANDARD 99) endif() 웬만하면 최신 99 사용하면 된다. 2) C++ 버전 지정 if (NOT CMAKE_CXX_STANDARD) set(CMAKE_CXX_STANDARD 20) endif() C++부터는 버전을 좀 봐야 함. 98, 11, 14, 17, 20, 23, 26 존재함. 대충 20쓰는 것 좋을 듯함. 3) compile option 지정 if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_com..

CMakeLists.txt 팩토링

${ROOT} |-app | |-CMakeLists.txt (3) |-core | |-CMakeLists.txt (2) |-CMakeLists.txt (1) 모든 코드가 CMakeLists.txt 파일 하나로 정리되지는 않는다. 가능은 하다만 팩토링 측면에서 너무 길고 지저분해지므로 권장되는 방식이 아니다. 보통 C++ 프로젝트를 작성할 때 위와 같이 나누곤 하는데 최소 3개로 나누어서 사용한다. CMakeLists.txt (1) (1)의 경우, 프로젝트 전체를 한 번에 build할 때 사용되는 CMakeList로써 큰 설정들만 들어간다. find_package : 프로젝트 전체에 걸쳐 쓰일 것 cmake_module : find_package 실패에 대비한 FindXXX.cmake 파일 추가 pkg_s..

STL vector 팁들

.reserve() vs .resize() 이 두 개를 검색해보면 둘 다 vector의 크기를 사전에 할당해두는 함수들이라고 나오고 혼동하기 쉬운데, 전자는 초기값이 없고 후자는 있다는 차이 이상의 내용이 있다. 먼저 .reserve(A) 를 사용하면 A만큼의 메모리 공간을 해당 vector에 부여하고 잡아두는 것이 맞다. 하지만 메모리가 먼저 잡혀있는 것이지 실제 vector 사이즈가 A로 만들어지는 것이 아니다. 따라서 indexing이 안된다. 따라서 .reserve()를 사용하는 경우는, push_back으로 vector에 계속 넣어줄 것인데 이 과정에서 사이즈를 명시하지 않으면 내부적으로 확장하고 복사하고 확장하고 복사하고 하면서 시간 잡아먹으니 이 시간 효율을 높이고 싶을 때 쓴다. 반대로 ...

TBB 팁

1) TBB는 install 하고 나서 CMakeLists.txt 내에 find_package(TBB REQUIRED)만 추가해준다면 못 찾는 경우가 빈번함. 아래에 적힌 2개의 문장처럼 뭔 오류인지 모르겠는 말이 계속 나온다면 TBB를 못찾고 있는게 맞다. undefined reference to `tbb::interface7::internal::task_arena_base~~~ tbb::interface9::global_control::global_control(tbb::interface9::global_control::parameter, unsigned long) ~~~ 해결법은 미리 cmake되어서 모듈화되어있는 TBB를 연결해주는 방법이다. https://github.com/justusc/Fin..

Boost serialization 팁들

Tips 1) shared_ptr 와 같이 쓴 변수들은 A에 serialize() overriding을 해줬더라도 오류가 난다. 다음 include 필수. 세트로 도 잊지 말자. #include #include 2) 다음와 같은 오류명이 잔뜩 뜰 수 있음 [build] /usr/bin/ld: ../core/libsfm.so: undefined reference to `boost::archive::detail::basic_iarchive::next_object_pointer(void*)' [build] /usr/bin/ld: ../core/libsfm.so: undefined reference to `boost::archive::basic_binary_oprimitive::init()' [build] /u..

Boost serialization

c++에서 새로운 클래스를 정의하고 이로 만든 객체를 저장하고 싶을 경우가 있다. 나는 대표적으로 Frame이라는 클래스 내에 이미지, 이미지 경로, 이미지 feature, intrinsic parameters 등 전부 담아둔 뒤, 모든 입력 이미지를 Frame 객체로 만들어두는 작업에서 필요성을 느꼈다. 이 경우 저장을 어떻게 할지 멤버 변수마다 하나하나 지정해줘서 저장 함수를 구현해야 하기 마련인데 이게 도통 귀찮은 일이 아니기 때문에 이를 지원하는 기능이 boost에 있었다. boost의 serialization 기능을 이용해 객체 자체를 직렬화해버리고 그냥 파일에 써버리는 것이다. 당연히 human readable 형태는 아니지만 deserialization 기능을 이용해 다시 원복했을 때 저장했..

CMake 백과사전

CMake를 다룰 때 개념을 잡기 위해 반드시 보면 좋을 문서를 찾았다. 제목이 쪼오오금 도움이 되는 문서지만 실제로 도움이 많이 된다. 내용을 옮겨적기에 방대한 양이지만 다 쓸모있는 내용들로 길어진 것이어서 다 읽어볼만 하다. https://gist.github.com/luncliff/6e2d4eb7ca29a0afd5b592f72b80cb5c CMake 할때 쪼오오금 도움이 되는 문서 CMake 할때 쪼오오금 도움이 되는 문서. GitHub Gist: instantly share code, notes, and snippets. gist.github.com

VScode C/C++ 개발 세팅, CMakeLists.txt 이용하기 2

앞선 글을 통해 C/C++ 코드를 실행하려면 CMake를 이용하여 빌드하면 된다는 것을 알았다. 하지만 코드 편집기에서 코딩을 한 뒤에 해당 프로젝트 폴더로 가서 cmake 명령어를 매번 치는 것이 귀찮기 때문에 에디터에 CMake를 연동해서 쓴다. (귀찮음이 편리함을 낳는게 맞는 것 같다... make >> cmake >> cmake in editor) C/C++ 개발 시 많은 에디터가 있지만 가장 많이 쓰이는 것은 VScode일 것 같은데 모듈 형태로 간단하게 연동할 수 있다. Visual studio 랑 다른 것이니 이름 확인하는 걸 잊지 말고 큰 취향이 없다면 VScode를 추천한다. (다른건 다 괜찮은데 윈도우 비주얼스튜디오는 좀...) CMakeLists.txt 파일은 잘 만들어두었다는 전제 ..