SLAM十四讲中的第五讲点云拼接
SLAM十四講中的第五講點云拼接錯誤解決
出現錯誤
CMakeFiles/joinMap.dir/joinMap.cpp.o:在函數‘showPointCloud(std::vector<Eigen::Matrix<double, 6, 1, 0, 6, 1>, Eigen::aligned_allocator<Eigen::Matrix<double, 6, 1, 0, 6, 1> > > const&)’中:
joinMap.cpp:(.text+0xcd):對‘pangolin::CreateWindowAndBind(std::__cxx11::basic_string<char, std::char_traits, std::allocator >, int, int, pangolin::Params const&)’未定義的引用
joinMap.cpp:(.text+0x1a8):對‘pangolin::ModelViewLookAt(double, double, double, double, double, double, double, double, double)’未定義的引用
joinMap.cpp:(.text+0x1e8):對‘pangolin::ProjectionMatrix(int, int, double, double, double, double, double, double)’未定義的引用
joinMap.cpp:(.text+0x1f6):對‘pangolin::OpenGlRenderState::OpenGlRenderState(pangolin::OpenGlMatrix const&, pangolin::OpenGlMatrix const&)’未定義的引用
joinMap.cpp:(.text+0x1fb):對‘pangolin::CreateDisplay()’未定義的引用
joinMap.cpp:(.text+0x252):對‘pangolin::View::SetBounds(pangolin::Attach, pangolin::Attach, pangolin::Attach, pangolin::Attach, double)’未定義的引用
joinMap.cpp:(.text+0x27f):對‘pangolin::Handler3D::Handler3D(pangolin::OpenGlRenderState&, pangolin::AxisDirection, float, float)’未定義的引用
joinMap.cpp:(.text+0x28a):對‘pangolin::View::SetHandler(pangolin::Handler*)’未定義的引用
joinMap.cpp:(.text+0x299):對‘pangolin::ShouldQuit()’未定義的引用
joinMap.cpp:(.text+0x2b6):對‘pangolin::View::Activate(pangolin::OpenGlRenderState const&) const’未定義的引用
joinMap.cpp:(.text+0x346):對‘pangolin::FinishFrame()’未定義的引用
CMakeFiles/joinMap.dir/joinMap.cpp.o:在函數‘pangolin::GlTexture::~GlTexture()’中:
joinMap.cpp:(.text._ZN8pangolin9GlTextureD2Ev[_ZN8pangolin9GlTextureD5Ev]+0x25):對‘pangolin::ShouldQuit()’未定義的引用
CMakeFiles/joinMap.dir/joinMap.cpp.o:在函數‘pangolin::GlTexture::Reinitialise(int, int, int, bool, int, unsigned int, unsigned int, void*)’中:
joinMap.cpp:(.text._ZN8pangolin9GlTexture12ReinitialiseEiiibijjPv[_ZN8pangolin9GlTexture12ReinitialiseEiiibijjPv]+0x12b):對‘pangolin::glErrorString(unsigned int)’未定義的引用
CMakeFiles/joinMap.dir/joinMap.cpp.o:在函數‘pangolin::GlTexture::~GlTexture()’中:
joinMap.cpp:(.text._ZN8pangolin9GlTextureD0Ev[_ZN8pangolin9GlTextureD5Ev]+0x29):對‘pangolin::ShouldQuit()’未定義的引用
CMakeFiles/joinMap.dir/joinMap.cpp.o:在函數‘void std::vector<Sophus::SE3, Eigen::aligned_allocatorSophus::SE3 >::_M_realloc_insert<Sophus::SE3 const&>(__gnu_cxx::__normal_iterator<Sophus::SE3*, std::vector<Sophus::SE3, Eigen::aligned_allocatorSophus::SE3 > >, Sophus::SE3 const&)’中:
joinMap.cpp:(.text.ZNSt6vectorIN6Sophus3SE3EN5Eigen17aligned_allocatorIS1_EEE17_M_realloc_insertIJRKS1_EEEvN9__gnu_cxx17__normal_iteratorIPS1_S5_EEDpOT[ZNSt6vectorIN6Sophus3SE3EN5Eigen17aligned_allocatorIS1_EEE17_M_realloc_insertIJRKS1_EEEvN9__gnu_cxx17__normal_iteratorIPS1_S5_EEDpOT]+0x78):對‘Sophus::SE3::SE3(Sophus::SE3 const&)’未定義的引用
joinMap.cpp:(.text.ZNSt6vectorIN6Sophus3SE3EN5Eigen17aligned_allocatorIS1_EEE17_M_realloc_insertIJRKS1_EEEvN9__gnu_cxx17__normal_iteratorIPS1_S5_EEDpOT[ZNSt6vectorIN6Sophus3SE3EN5Eigen17aligned_allocatorIS1_EEE17_M_realloc_insertIJRKS1_EEEvN9__gnu_cxx17__normal_iteratorIPS1_S5_EEDpOT]+0x9c):對‘Sophus::SE3::SE3(Sophus::SE3 const&)’未定義的引用
joinMap.cpp:(.text.ZNSt6vectorIN6Sophus3SE3EN5Eigen17aligned_allocatorIS1_EEE17_M_realloc_insertIJRKS1_EEEvN9__gnu_cxx17__normal_iteratorIPS1_S5_EEDpOT[ZNSt6vectorIN6Sophus3SE3EN5Eigen17aligned_allocatorIS1_EEE17_M_realloc_insertIJRKS1_EEEvN9__gnu_cxx17__normal_iteratorIPS1_S5_EEDpOT]+0xcc):對‘Sophus::SE3::SE3(Sophus::SE3 const&)’未定義的引用
CMakeFiles/joinMap.dir/joinMap.cpp.o:在函數‘main’中:
joinMap.cpp:(.text.startup+0x56f):對‘Sophus::SE3::SE3(Eigen::Quaternion<double, 0> const&, Eigen::Matrix<double, 3, 1, 0, 3, 1> const&)’未定義的引用
joinMap.cpp:(.text.startup+0x592):對‘Sophus::SE3::SE3(Sophus::SE3 const&)’未定義的引用
joinMap.cpp:(.text.startup+0x859):對‘Sophus::SE3::SE3(Sophus::SE3 const&)’未定義的引用
joinMap.cpp:(.text.startup+0x926):對‘Sophus::SE3::operator*(Eigen::Matrix<double, 3, 1, 0, 3, 1> const&) const’未定義的引用
CMakeFiles/joinMap.dir/joinMap.cpp.o:(.data.rel+0x0):對‘vtable for pangolin::HandlerScroll’未定義的引用
CMakeFiles/joinMap.dir/joinMap.cpp.o:(.data.rel+0x8):對‘vtable for pangolin::Handler’未定義的引用
collect2: error: ld returned 1 exit status
CMakeFiles/joinMap.dir/build.make:343: recipe for target ‘joinMap’ failed
make[2]: *** [joinMap] Error 1
CMakeFiles/Makefile2:67: recipe for target ‘CMakeFiles/joinMap.dir/all’ failed
make[1]: *** [CMakeFiles/joinMap.dir/all] Error 2
Makefile:129: recipe for target ‘all’ failed
make: *** [all] Error 2
CMakeliste.txt文件,改成下面的樣子
cmake_minimum_required(VERSION 2.8)project(joinMap) set( CMAKE_BUILD_TYPE Release ) set( CMAKE_CXX_FLAGS "-std=c++11 -O3")# 包含opencv庫 find_package( OpenCV REQUIRED) include_directories( ${OpenCV_INCLUDE_DIRS})#包含eigen庫 find_package( Eigen3 REQUIRED) include_directories( "/usr/include/eigen3/" ) #pangolinfind_package(Pangolin) include_directories( ${Pangolin_INCLUDE_DIRS} )#Sophus find_package(Sophus) include_directories( "/usr/include/sophus/" )#包含pcl庫 find_package( PCL REQUIRED common io) include_directories( ${PCL_INCLUDE_DIRS}) add_definitions( ${PCL_DEFINITIONS}) list(REMOVE_ITEM PCL_LIBRARIES "vtkproj4") LINK_LIBRARIES(${PCL_LIBRARY_DIRS}) add_executable(joinMap joinMap.cpp)target_link_libraries(joinMap ${OpenCV_LIBS} ${PCL_LIBRARIES} ${Pangolin_LIBRARIES} ${Sophus_LIBRARIES}) install(TARGETS joinMap RUNTIME DESTINATION bin)出現錯誤
fatal error: sophus/se3.hpp: 沒有那個文件或目錄
#include <sophus/se3.hpp>
^~~~~~~~~~~~~~~~
compilation terminated.
這種類似的問題的時候,先看你電腦里面這個聲明的頭文件是.h文件還是.hpp文件,然后
將joinmap.cpp文件的頭文件聲明改稱電腦中該文件的樣子。
我的就改成了下面這個樣子
joinMap.cpp
#include <iostream> #include <fstream> #include <opencv2/opencv.hpp> #include <boost/format.hpp> // for formating strings #include <pangolin/pangolin.h> #include <sophus/se3.h>using namespace std; typedef vector<Sophus::SE3, Eigen::aligned_allocator<Sophus::SE3>> 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::SE3 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::SE3 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()]; // bluep[4] = color.data[v * color.step + u * color.channels() + 1]; // greenp[3] = color.data[v * color.step + u * color.channels() + 2]; // redpointcloud.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; }總結
以上是生活随笔為你收集整理的SLAM十四讲中的第五讲点云拼接的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javaweb JAVA JSP计算机系
- 下一篇: Java面试题及答案整理(2022最新版