报错undefined reference to `fmt::v7::format_error::~format_error()‘

前置条件:系统ubuntu20.04

在2023年回来跑高博的SLAMBOOK2代码,有些环境的问题,现记录一下搞Sophus库时遇到的问题:1,为了跑比较有年代的开源代码,之前安装了Sophus的非模板类版本(也就是常看到的官网“ git checkout a621ff ”,下文称“旧版本”);2,slambook2的代码仓库为了与时俱进,也能支持Sophus的模板类版本(发文日期对应的版本是"master-1.x“,下文称“新版本”)。旧版本不需要用到fmt库,新版本用到了fmt库,为了在电脑上保留两种版本的Sophus库,就有点点麻烦要处理。

基于我的安装顺序(先装了旧版本,后装了新版本),参考了这篇经验Sophus库(Linux下)的安装(模板类.hpp,非模板类.h)_hpptstmessss4suosuo_vigigo的博客-CSDN博客Sophus库(Linux下)的安装(包含模板类.hpp,非模板类.h)_hpptstmessss4suosuohttps://blog.csdn.net/qq_40574123/article/details/122764225新版本的安装我采用命名:sophus_with_template,编译安装(几步常见操作后,sudo make install)到这个位置“/usr/local/include/sophus_with_template/include/sophus/”,这个时候会提示缺失fmt库,同样去github下载,我下载的是7.1.3版本(一开始装了最新的10.0.0版本,编译sophus通不过,降版本之后成功编译通过),make install之后的相关文件位置在“/usr/local/include/fmt/”等。

看起来似乎没啥问题了,编译slambook2的ch5的rgbd文件夹下的joinMap.cpp时,又报错了,如下:

/usr/bin/ld: CMakeFiles/joinMap.dir/joinMap.cpp.o: in function `void fmt::v7::detail::check_format_string<Eigen::Transpose<Eigen::Matrix<double, 4, 1, 0, 4, 1> >, Sophus::SO3Base<Sophus::SO3<double, 0> >::normalize()::{lambda()#1}::operator()() const::FMT_COMPILE_STRING, 0>(Sophus::SO3Base<Sophus::SO3<double, 0> >::normalize()::{lambda()#1}::operator()() const::FMT_COMPILE_STRING)':
joinMap.cpp:(.text._ZN3fmt2v76detail19check_format_stringIJN5Eigen9TransposeINS3_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEZZN6Sophus7SO3BaseINS8_3SO3IdLi0EEEE9normalizeEvENKUlvE_clEvE18FMT_COMPILE_STRINGLi0EEEvT0_[_ZN3fmt2v76detail19check_format_stringIJN5Eigen9TransposeINS3_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEZZN6Sophus7SO3BaseINS8_3SO3IdLi0EEEE9normalizeEvENKUlvE_clEvE18FMT_COMPILE_STRINGLi0EEEvT0_]+0x248): undefined reference to `fmt::v7::detail::error_handler::on_error(char const*)'
/usr/bin/ld: joinMap.cpp:(.text._ZN3fmt2v76detail19check_format_stringIJN5Eigen9TransposeINS3_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEZZN6Sophus7SO3BaseINS8_3SO3IdLi0EEEE9normalizeEvENKUlvE_clEvE18FMT_COMPILE_STRINGLi0EEEvT0_[_ZN3fmt2v76detail19check_format_stringIJN5Eigen9TransposeINS3_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEZZN6Sophus7SO3BaseINS8_3SO3IdLi0EEEE9normalizeEvENKUlvE_clEvE18FMT_COMPILE_STRINGLi0EEEvT0_]+0x270): undefined reference to `fmt::v7::detail::error_handler::on_error(char const*)'
/usr/bin/ld: joinMap.cpp:(.text._ZN3fmt2v76detail19check_format_stringIJN5Eigen9TransposeINS3_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEZZN6Sophus7SO3BaseINS8_3SO3IdLi0EEEE9normalizeEvENKUlvE_clEvE18FMT_COMPILE_STRINGLi0EEEvT0_[_ZN3fmt2v76detail19check_format_stringIJN5Eigen9TransposeINS3_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEZZN6Sophus7SO3BaseINS8_3SO3IdLi0EEEE9normalizeEvENKUlvE_clEvE18FMT_COMPILE_STRINGLi0EEEvT0_]+0x2be): undefined reference to `fmt::v7::detail::error_handler::on_error(char const*)'
/usr/bin/ld: joinMap.cpp:(.text._ZN3fmt2v76detail19check_format_stringIJN5Eigen9TransposeINS3_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEZZN6Sophus7SO3BaseINS8_3SO3IdLi0EEEE9normalizeEvENKUlvE_clEvE18FMT_COMPILE_STRINGLi0EEEvT0_[_ZN3fmt2v76detail19check_format_stringIJN5Eigen9TransposeINS3_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEZZN6Sophus7SO3BaseINS8_3SO3IdLi0EEEE9normalizeEvENKUlvE_clEvE18FMT_COMPILE_STRINGLi0EEEvT0_]+0x323): undefined reference to `fmt::v7::detail::error_handler::on_error(char const*)'
/usr/bin/ld: joinMap.cpp:(.text._ZN3fmt2v76detail19check_format_stringIJN5Eigen9TransposeINS3_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEZZN6Sophus7SO3BaseINS8_3SO3IdLi0EEEE9normalizeEvENKUlvE_clEvE18FMT_COMPILE_STRINGLi0EEEvT0_[_ZN3fmt2v76detail19check_format_stringIJN5Eigen9TransposeINS3_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEZZN6Sophus7SO3BaseINS8_3SO3IdLi0EEEE9normalizeEvENKUlvE_clEvE18FMT_COMPILE_STRINGLi0EEEvT0_]+0x332): undefined reference to `fmt::v7::detail::error_handler::on_error(char const*)'
/usr/bin/ld: CMakeFiles/joinMap.dir/joinMap.cpp.o:joinMap.cpp:(.text._ZN3fmt2v76detail19check_format_stringIJN5Eigen9TransposeINS3_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEZZN6Sophus7SO3BaseINS8_3SO3IdLi0EEEE9normalizeEvENKUlvE_clEvE18FMT_COMPILE_STRINGLi0EEEvT0_[_ZN3fmt2v76detail19check_format_stringIJN5Eigen9TransposeINS3_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEEEZZN6Sophus7SO3BaseINS8_3SO3IdLi0EEEE9normalizeEvENKUlvE_clEvE18FMT_COMPILE_STRINGLi0EEEvT0_]+0x349): more undefined references to `fmt::v7::detail::error_handler::on_error(char const*)' follow
/usr/bin/ld: CMakeFiles/joinMap.dir/joinMap.cpp.o: in function `main':
joinMap.cpp:(.text.startup+0x11fb): undefined reference to `fmt::v7::vprint(fmt::v7::basic_string_view<char>, fmt::v7::format_args)'
/usr/bin/ld: joinMap.cpp:(.text.startup+0x121d): undefined reference to `fmt::v7::vprint(fmt::v7::basic_string_view<char>, fmt::v7::format_args)'
/usr/bin/ld: CMakeFiles/joinMap.dir/joinMap.cpp.o: in function `char const* fmt::v7::detail::parse_format_specs<char, fmt::v7::detail::specs_checker<fmt::v7::detail::dynamic_specs_handler<fmt::v7::basic_format_parse_context<char, fmt::v7::detail::error_handler> > >&>(char const*, char const*, fmt::v7::detail::specs_checker<fmt::v7::detail::dynamic_specs_handler<fmt::v7::basic_format_parse_context<char, fmt::v7::detail::error_handler> > >&)':
joinMap.cpp:(.text._ZN3fmt2v76detail18parse_format_specsIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v76detail18parse_format_specsIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x44c): undefined reference to `fmt::v7::detail::error_handler::on_error(char const*)'
/usr/bin/ld: joinMap.cpp:(.text._ZN3fmt2v76detail18parse_format_specsIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v76detail18parse_format_specsIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x617): undefined reference to `fmt::v7::detail::error_handler::on_error(char const*)'
/usr/bin/ld: joinMap.cpp:(.text._ZN3fmt2v76detail18parse_format_specsIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v76detail18parse_format_specsIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x645): undefined reference to `fmt::v7::detail::error_handler::on_error(char const*)'
/usr/bin/ld: joinMap.cpp:(.text._ZN3fmt2v76detail18parse_format_specsIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v76detail18parse_format_specsIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x7e4): undefined reference to `fmt::v7::detail::error_handler::on_error(char const*)'
/usr/bin/ld: joinMap.cpp:(.text._ZN3fmt2v76detail18parse_format_specsIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v76detail18parse_format_specsIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x7fd): undefined reference to `fmt::v7::detail::error_handler::on_error(char const*)'
/usr/bin/ld: CMakeFiles/joinMap.dir/joinMap.cpp.o:joinMap.cpp:(.text._ZN3fmt2v76detail18parse_format_specsIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v76detail18parse_format_specsIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x80d): more undefined references to `fmt::v7::detail::error_handler::on_error(char const*)' follow
/usr/bin/ld: CMakeFiles/joinMap.dir/joinMap.cpp.o: in function `char const* fmt::v7::detail::parse_format_specs<char, fmt::v7::detail::specs_checker<fmt::v7::detail::dynamic_specs_handler<fmt::v7::basic_format_parse_context<char, fmt::v7::detail::error_handler> > >&>(char const*, char const*, fmt::v7::detail::specs_checker<fmt::v7::detail::dynamic_specs_handler<fmt::v7::basic_format_parse_context<char, fmt::v7::detail::error_handler> > >&)':
joinMap.cpp:(.text._ZN3fmt2v76detail18parse_format_specsIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v76detail18parse_format_specsIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x88e): undefined reference to `fmt::v7::format_error::~format_error()'
/usr/bin/ld: joinMap.cpp:(.text._ZN3fmt2v76detail18parse_format_specsIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v76detail18parse_format_specsIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x895): undefined reference to `vtable for fmt::v7::format_error'
/usr/bin/ld: joinMap.cpp:(.text._ZN3fmt2v76detail18parse_format_specsIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_[_ZN3fmt2v76detail18parse_format_specsIcRNS1_13specs_checkerINS1_21dynamic_specs_handlerINS0_26basic_format_parse_contextIcNS1_13error_handlerEEEEEEEEEPKT_SD_SD_OT0_]+0x89c): undefined reference to `typeinfo for fmt::v7::format_error'
/usr/bin/ld: CMakeFiles/joinMap.dir/joinMap.cpp.o: in function `fmt::v7::detail::compile_parse_context<char, fmt::v7::detail::error_handler>::char_type const* fmt::v7::detail::parse_format_specs<Eigen::Transpose<Eigen::Matrix<double, 4, 1, 0, 4, 1> >, fmt::v7::detail::compile_parse_context<char, fmt::v7::detail::error_handler> >(fmt::v7::detail::compile_parse_context<char, fmt::v7::detail::error_handler>&)':
joinMap.cpp:(.text._ZN3fmt2v76detail18parse_format_specsIN5Eigen9TransposeINS3_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEENS1_21compile_parse_contextIcNS1_13error_handlerEEEEEPKNT0_9char_typeERSB_[_ZN3fmt2v76detail18parse_format_specsIN5Eigen9TransposeINS3_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEENS1_21compile_parse_contextIcNS1_13error_handlerEEEEEPKNT0_9char_typeERSB_]+0xd8): undefined reference to `fmt::v7::detail::error_handler::on_error(char const*)'
/usr/bin/ld: CMakeFiles/joinMap.dir/joinMap.cpp.o: in function `fmt::v7::detail::buffer_appender<char> fmt::v7::detail::write<char, char, fmt::v7::detail::buffer_appender<char> >(fmt::v7::detail::buffer_appender<char>, fmt::v7::basic_string_view<char>, fmt::v7::basic_format_specs<char> const&)':
joinMap.cpp:(.text._ZN3fmt2v76detail5writeIccNS1_15buffer_appenderIcEEEET1_S5_NS0_17basic_string_viewIT_EERKNS0_18basic_format_specsIT0_EE[_ZN3fmt2v76detail5writeIccNS1_15buffer_appenderIcEEEET1_S5_NS0_17basic_string_viewIT_EERKNS0_18basic_format_specsIT0_EE]+0x3d6): undefined reference to `fmt::v7::detail::basic_data<void>::left_padding_shifts'
/usr/bin/ld: CMakeFiles/joinMap.dir/joinMap.cpp.o: in function `void fmt::v7::detail::value<fmt::v7::basic_format_context<fmt::v7::detail::buffer_appender<char>, char> >::format_custom_arg<Eigen::Transpose<Eigen::Matrix<double, 4, 1, 0, 4, 1> >, fmt::v7::detail::fallback_formatter<Eigen::Transpose<Eigen::Matrix<double, 4, 1, 0, 4, 1> >, char, void> >(void const*, fmt::v7::basic_format_parse_context<char, fmt::v7::detail::error_handler>&, fmt::v7::basic_format_context<fmt::v7::detail::buffer_appender<char>, char>&)':
joinMap.cpp:(.text._ZN3fmt2v76detail5valueINS0_20basic_format_contextINS1_15buffer_appenderIcEEcEEE17format_custom_argIN5Eigen9TransposeINS9_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEENS1_18fallback_formatterISD_cvEEEEvPKvRNS0_26basic_format_parse_contextIcNS1_13error_handlerEEERS6_[_ZN3fmt2v76detail5valueINS0_20basic_format_contextINS1_15buffer_appenderIcEEcEEE17format_custom_argIN5Eigen9TransposeINS9_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEENS1_18fallback_formatterISD_cvEEEEvPKvRNS0_26basic_format_parse_contextIcNS1_13error_handlerEEERS6_]+0x25d): undefined reference to `std::locale fmt::v7::detail::locale_ref::get<std::locale>() const'
/usr/bin/ld: joinMap.cpp:(.text._ZN3fmt2v76detail5valueINS0_20basic_format_contextINS1_15buffer_appenderIcEEcEEE17format_custom_argIN5Eigen9TransposeINS9_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEENS1_18fallback_formatterISD_cvEEEEvPKvRNS0_26basic_format_parse_contextIcNS1_13error_handlerEEERS6_[_ZN3fmt2v76detail5valueINS0_20basic_format_contextINS1_15buffer_appenderIcEEcEEE17format_custom_argIN5Eigen9TransposeINS9_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEENS1_18fallback_formatterISD_cvEEEEvPKvRNS0_26basic_format_parse_contextIcNS1_13error_handlerEEERS6_]+0x4aa): undefined reference to `fmt::v7::detail::error_handler::on_error(char const*)'
/usr/bin/ld: joinMap.cpp:(.text._ZN3fmt2v76detail5valueINS0_20basic_format_contextINS1_15buffer_appenderIcEEcEEE17format_custom_argIN5Eigen9TransposeINS9_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEENS1_18fallback_formatterISD_cvEEEEvPKvRNS0_26basic_format_parse_contextIcNS1_13error_handlerEEERS6_[_ZN3fmt2v76detail5valueINS0_20basic_format_contextINS1_15buffer_appenderIcEEcEEE17format_custom_argIN5Eigen9TransposeINS9_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEENS1_18fallback_formatterISD_cvEEEEvPKvRNS0_26basic_format_parse_contextIcNS1_13error_handlerEEERS6_]+0x75c): undefined reference to `fmt::v7::detail::error_handler::on_error(char const*)'
/usr/bin/ld: joinMap.cpp:(.text._ZN3fmt2v76detail5valueINS0_20basic_format_contextINS1_15buffer_appenderIcEEcEEE17format_custom_argIN5Eigen9TransposeINS9_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEENS1_18fallback_formatterISD_cvEEEEvPKvRNS0_26basic_format_parse_contextIcNS1_13error_handlerEEERS6_[_ZN3fmt2v76detail5valueINS0_20basic_format_contextINS1_15buffer_appenderIcEEcEEE17format_custom_argIN5Eigen9TransposeINS9_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEENS1_18fallback_formatterISD_cvEEEEvPKvRNS0_26basic_format_parse_contextIcNS1_13error_handlerEEERS6_]+0x7a0): undefined reference to `fmt::v7::detail::error_handler::on_error(char const*)'
/usr/bin/ld: joinMap.cpp:(.text._ZN3fmt2v76detail5valueINS0_20basic_format_contextINS1_15buffer_appenderIcEEcEEE17format_custom_argIN5Eigen9TransposeINS9_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEENS1_18fallback_formatterISD_cvEEEEvPKvRNS0_26basic_format_parse_contextIcNS1_13error_handlerEEERS6_[_ZN3fmt2v76detail5valueINS0_20basic_format_contextINS1_15buffer_appenderIcEEcEEE17format_custom_argIN5Eigen9TransposeINS9_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEENS1_18fallback_formatterISD_cvEEEEvPKvRNS0_26basic_format_parse_contextIcNS1_13error_handlerEEERS6_]+0x882): undefined reference to `fmt::v7::detail::error_handler::on_error(char const*)'
/usr/bin/ld: joinMap.cpp:(.text._ZN3fmt2v76detail5valueINS0_20basic_format_contextINS1_15buffer_appenderIcEEcEEE17format_custom_argIN5Eigen9TransposeINS9_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEENS1_18fallback_formatterISD_cvEEEEvPKvRNS0_26basic_format_parse_contextIcNS1_13error_handlerEEERS6_[_ZN3fmt2v76detail5valueINS0_20basic_format_contextINS1_15buffer_appenderIcEEcEEE17format_custom_argIN5Eigen9TransposeINS9_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEENS1_18fallback_formatterISD_cvEEEEvPKvRNS0_26basic_format_parse_contextIcNS1_13error_handlerEEERS6_]+0xa19): undefined reference to `fmt::v7::detail::error_handler::on_error(char const*)'
/usr/bin/ld: CMakeFiles/joinMap.dir/joinMap.cpp.o:joinMap.cpp:(.text._ZN3fmt2v76detail5valueINS0_20basic_format_contextINS1_15buffer_appenderIcEEcEEE17format_custom_argIN5Eigen9TransposeINS9_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEENS1_18fallback_formatterISD_cvEEEEvPKvRNS0_26basic_format_parse_contextIcNS1_13error_handlerEEERS6_[_ZN3fmt2v76detail5valueINS0_20basic_format_contextINS1_15buffer_appenderIcEEcEEE17format_custom_argIN5Eigen9TransposeINS9_6MatrixIdLi4ELi1ELi0ELi4ELi1EEEEENS1_18fallback_formatterISD_cvEEEEvPKvRNS0_26basic_format_parse_contextIcNS1_13error_handlerEEERS6_]+0xa79): more undefined references to `fmt::v7::detail::error_handler::on_error(char const*)' follow
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/joinMap.dir/build.make:137:joinMap] 错误 1
make[1]: *** [CMakeFiles/Makefile2:76:CMakeFiles/joinMap.dir/all] 错误 2
make: *** [Makefile:84:all] 错误 2

 看起来是因为fmt库没有被检测到,目标:修改各种文件让fmt库连接过来。

所做改动:

  1. 修改joinMap.cpp,做好sophus版本管理:
    #include <sophus_with_template/include/sophus/se3.hpp>

  2. 修改CMakeLists.txt,做好fmt和sophus版本管理:
  3. set (Sophus_INCLUDE_DIRS "/usr/local/include/sophus_with_template/include/sophus/")
    set (fmt_INCLUDE_DIRS "/usr/local/include/fmt/")
    set (fmt_LIBRARIES "/usr/local/lib/libfmt.a")

总之,改完后的文件:

joinMap.cpp 

#include <iostream>
#include <fstream>
#include <opencv2/opencv.hpp>
#include <boost/format.hpp>  // for formating strings
#include <pangolin/pangolin.h>
#include <sophus_with_template/include/sophus/se3.hpp>
// #include "/home/niumao/software/Sophus/sophus/se3.h"


using namespace std;
typedef vector<Sophus::SE3d, Eigen::aligned_allocator<Sophus::SE3d>> TrajectoryType;
typedef Eigen::Matrix<double, 6, 1> Vector6d;

// 在pangolin中画图,已写好,无需调整
void showPointCloud(
    const vector<Vector6d, Eigen::aligned_allocator<Vector6d>> &pointcloud);

int main(int argc, char **argv) {
    vector<cv::Mat> colorImgs, depthImgs;    // 彩色图和深度图
    TrajectoryType poses;         // 相机位姿

    ifstream fin("./pose.txt");
    if (!fin) {
        cerr << "请在有pose.txt的目录下运行此程序" << endl;
        return 1;
    }

    for (int i = 0; i < 5; i++) {
        boost::format fmt("./%s/%d.%s"); //图像文件格式
        colorImgs.push_back(cv::imread((fmt % "color" % (i + 1) % "png").str()));
        depthImgs.push_back(cv::imread((fmt % "depth" % (i + 1) % "pgm").str(), -1)); // 使用-1读取原始图像

        double data[7] = {0};
        for (auto &d:data)
            fin >> d;
        Sophus::SE3d pose(Eigen::Quaterniond(data[6], data[3], data[4], data[5]),
                          Eigen::Vector3d(data[0], data[1], data[2]));
        poses.push_back(pose);
    }

    // 计算点云并拼接
    // 相机内参 
    double cx = 325.5;
    double cy = 253.5;
    double fx = 518.0;
    double fy = 519.0;
    double depthScale = 1000.0;
    vector<Vector6d, Eigen::aligned_allocator<Vector6d>> pointcloud;
    pointcloud.reserve(1000000);

    for (int i = 0; i < 5; i++) {
        cout << "转换图像中: " << i + 1 << endl;
        cv::Mat color = colorImgs[i];
        cv::Mat depth = depthImgs[i];
        Sophus::SE3d T = poses[i];
        for (int v = 0; v < color.rows; v++)
            for (int u = 0; u < color.cols; u++) {
                unsigned int d = depth.ptr<unsigned short>(v)[u]; // 深度值
                if (d == 0) continue; // 为0表示没有测量到
                Eigen::Vector3d point;
                point[2] = double(d) / depthScale;
                point[0] = (u - cx) * point[2] / fx;
                point[1] = (v - cy) * point[2] / fy;
                Eigen::Vector3d pointWorld = T * point;

                Vector6d p;
                p.head<3>() = pointWorld;
                p[5] = color.data[v * color.step + u * color.channels()];   // blue
                p[4] = color.data[v * color.step + u * color.channels() + 1]; // green
                p[3] = color.data[v * color.step + u * color.channels() + 2]; // red
                pointcloud.push_back(p);
            }
    }

    cout << "点云共有" << pointcloud.size() << "个点." << endl;
    showPointCloud(pointcloud);
    return 0;
}

void showPointCloud(const vector<Vector6d, Eigen::aligned_allocator<Vector6d>> &pointcloud) {

    if (pointcloud.empty()) {
        cerr << "Point cloud is empty!" << endl;
        return;
    }

    pangolin::CreateWindowAndBind("Point Cloud Viewer", 1024, 768);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    pangolin::OpenGlRenderState s_cam(
        pangolin::ProjectionMatrix(1024, 768, 500, 500, 512, 389, 0.1, 1000),
        pangolin::ModelViewLookAt(0, -0.1, -1.8, 0, 0, 0, 0.0, -1.0, 0.0)
    );

    pangolin::View &d_cam = pangolin::CreateDisplay()
        .SetBounds(0.0, 1.0, pangolin::Attach::Pix(175), 1.0, -1024.0f / 768.0f)
        .SetHandler(new pangolin::Handler3D(s_cam));

    while (pangolin::ShouldQuit() == false) {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        d_cam.Activate(s_cam);
        glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

        glPointSize(2);
        glBegin(GL_POINTS);
        for (auto &p: pointcloud) {
            glColor3d(p[3] / 255.0, p[4] / 255.0, p[5] / 255.0);
            glVertex3d(p[0], p[1], p[2]);
        }
        glEnd();
        pangolin::FinishFrame();
        usleep(5000);   // sleep 5 ms
    }
    return;
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(rgbd)
set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_FLAGS "-std=c++11")

# Eigen
include_directories("/usr/include/eigen3")
# 寻找OpenCV库
find_package(OpenCV REQUIRED)
# 添加头文件
include_directories(${OpenCV_INCLUDE_DIRS})

# 直接定义路径,让它不走标准路径
set (Sophus_INCLUDE_DIRS "/usr/local/include/sophus_with_template/include/sophus/")
set (fmt_INCLUDE_DIRS "/usr/local/include/fmt/")
set (fmt_LIBRARIES "/usr/local/lib/libfmt.a")

find_package(Sophus REQUIRED)
include_directories(${Sophus_INCLUDE_DIRS})

find_package(Pangolin REQUIRED)

find_package(fmt REQUIRED)

add_executable(joinMap joinMap.cpp)
target_link_libraries(joinMap ${OpenCV_LIBS} ${Pangolin_LIBRARIES} ${fmt_LIBRARIES})


# 这句是在其他经验文下看到的解决方案,参考了这句写的上面这句
# target_link_libraries(joinMap fmt::fmt)
  • 之后就是cmake ..和make -j4 ,就得到了可执行文件了,运行结果如下

 至此问题解决,mark。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值