系统:ubuntu22.04
matlab版本:R2024a
GTSAM版本: 4.2.0
1.流程及cmake选项
bash
cd gtsam_ws/gtsam
mkdir build
cd build
cmake .. \
-DGTSAM_INSTALL_MATLAB_TOOLBOX=ON \
-DGTSAM_USE_SYSTEM_EIGEN=ON \
-DGTSAM_BUILD_UNSTABLE=OFF \
-DGTSAM_BUILD_TESTS=OFF \
-DCMAKE_BUILD_TYPE=Release \
-DMatlab_ROOT_DIR=/usr/local/MATLAB/R2024a
make -j6
sudo make install
中间有一些选项是为了加快编译速度/避免报错,可以不用,把最后的地址替换为自己MATLAB的安装目录即可。
2.加入到MATLAB路径
到这里已经获得了GTSAM的Matlab Toolbox,找到安装目录如 usr/local/gtsam_toolbox,在 MATLAB 文件浏览器中,右键点击该文件夹,点击"添加到路径 -> 此文件夹"( 注意不要将子文件夹添加到路径中 )。
3.简单测试
Matlab
>> import gtsam.*
>> gtsam.Rot3.Ypr(0.1, 0.2, 0.3)
输出为:
Matlab
R: [
0.975170327, -0.0369570135, 0.218350663;
0.097843395, 0.956425086, -0.275095847;
-0.198669331, 0.289629478, 0.936293364
]
附:make中出现的问题
/usr/include/boost/smart_ptr/make_shared_object.hpp:256:5: error: no matching function for call to 'std::pair<gtsam::DiscreteConditional, gtsam::DecisionTreeFactor>::pair(std::pair<boost::shared_ptr<gtsam::DiscreteConditional>, boost::shared_ptr<gtsam::DecisionTreeFactor> >)'
256 | ::new( pv ) T( boost::detail::sp_forward<Args>( args )... );| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/c++/11/bits/stl_algobase.h:64,
from /usr/include/c++/11/bits/char_traits.h:39,
from /usr/include/c++/11/string:40,
from /usr/include/c++/11/bits/locale_classes.h:40,
from /usr/include/c++/11/bits/ios_base.h:41,
from /usr/include/c++/11/streambuf:41,
from /usr/include/c++/11/bits/streambuf_iterator.h:35,
from /usr/include/c++/11/iterator:66,
from /usr/include/boost/concept_check.hpp:22,
from /usr/include/boost/range/concepts.hpp:19,
from /home/zcy/gtsam_ws/gtsam/gtsam/base/types.h:24,
from /home/zcy/gtsam_ws/gtsam/gtsam/global_includes.h:22,
from /home/zcy/gtsam_ws/gtsam/gtsam/base/Vector.h:28,
from /home/zcy/gtsam_ws/gtsam/wrap/matlab.h:25,
from /home/zcy/gtsam_ws/gtsam/build/wrap/gtsam/gtsam_wrapper.cpp:1:
开始直接问AI,半天解决不了,最后还是到github上找到了以前有人提过这个问题,链接如下:
https://github.com/borglab/gtsam/issues/1614
解决方法:
https://github.com/borglab/gtsam/pull/1631
按照flie changed找到相应文件gtsam/discrete/discrete.i对应行修改,之后重新编译。
