ubuntu16.04 ROS Kinetic+RGBDSLAM_v2安装运行

本文档详细介绍了在Ubuntu系统中配置RGBD-SLAM和PCL1.8的完整过程,包括创建工作空间、下载和卸载相关库、修改配置文件、编译安装以及处理可能出现的问题。涉及到的关键技术包括g2o、eigen3、PCL和SIFTGPU的安装与配置,以及C++11支持的设置。此外,还提供了测试RGBD-SLAM所需的数据集下载和播放方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安装的ros版本若是“full”,则是自带opencv,无需自己重新安装,但是在系统中找不到这个opencv

建议在安装之前下载好数据集,PCL1.8,这两个下载非常慢
PCL1.8 下载地址
RGBDSLAM数据集下载(bag版本)

1.建立工作空间

mkdir -p ~/robot_ws/src
cd ~/catkin_ws
catkin_make

这里的文件夹随便自己如何建立,最好是全英文路径,~代表自己的路径,因此在复制代码时,注意将此改为自己的路径。同时您也可以手动打开文件夹,在文件夹内运行终端,这样可以避免路径出错

2.下载RGBD-SLAM

cd ~/robot_ws/src
git clone https://github.com/felixendres/rgbdslam_v2

3.卸载g2o

如果之前安装过g2o则需要卸载,安装作者自己改动过的g2o.
删除g2o的头文件,位于/usr/local/include/g2o下.

sudo rm -r /usr/local/include/g2o

删除g2o的库文件,位于/usr/local/lib下.

sudo rm -r /usr/local/lib/libg2o*

删除g2o的可执行文件,位于/usr/local/bin下.

sudo rm -r /usr/local/bin/g2o*

4.安装g2o依赖项

sudo apt-get install libsuitesparse-dev

5.下载并提取eigen 3.2.10头文件

eigen只包含头文件,没有要编译或链接的二进制lib

cd ~
wget http://bitbucket.org/eigen/eigen/get/3.2.10.tar.bz2

注:若上述方法行不通,可直接在优快云下载压缩包,若压缩包下载需要积分可以在淘宝中找代替下载,并解压后命名为eigen.

6.下载g2o

cd ~/robot_ws/src
git clone https://github.com/felixendres/g2o.git
cd ~/robot_ws/src/g2o
mkdir ~/robot_ws/src/g2o/build
cd ~/robot_ws/src/g2o/build

7.配置g2o头文件

 gedit ~/robot_ws/src/g2o/CMakeLists.txt

将其中的第251行的

SET(G2O_EIGEN3_INCLUDE ${EIGEN3_INCLUDE_DIR} CACHE PATH "Directory of Eigen3")

替换为:

SET(G2O_EIGEN3_INCLUDE "<自己的路径>/eigen" CACHE PATH "Directory of Eigen3")

注意:将自己的路径替换上去

8.编译g2o

如果上一步出错,则编译将失败.

cd ~/robot_ws/src/g2o/build
cmake ../
make
sudo make install

9.下载PCL

可以先下载好,直接拷贝进文件夹

cd ~
wget https://github.com/PointCloudLibrary/pcl/archive/pcl-1.8.0.tar.gz
tar -xvzf pcl-pcl-1.8.0.tar.gz

10.用C++ 2011支持配置PCL编译

我们需要用c++2011支持来编译pcl,因为我们将用c++2011支持来编译rdbgslam,如果不这样做,rgbdslam将在启动时出错。
默认安装在Ubuntu16.04上的PCL1.7库不支持c++2011编译。

cd ~/pcl-pcl-1.8.0
gedit CMakeLists.txt

将以下内容添加到CMakeLists.txt的第146行(在endif()之后)

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

11.编译并安装PCL

cd ~/pcl-pcl-1.8.0
mkdir build
cd build
cmake ../

为了确认C++支持PCL,运行

make VERBOSE=1

如果编译过程中出现了"-stdc++11",那证明成功了,“-std=c++11"也可以。如果没有出现,那么应该就是修改CMakeList时出了问题。使用crtl+C打断编译过程.

sudo make install

12.配置RGBD-SLAM

cd ~/robot_ws/src/rgbdslam_v2
gedit CMakeLists.txt

找到第79行

find_package(PCL 1.7 REQUIRED COMPONENTS common io)

修改为:

find_package(PCL 1.8 REQUIRED COMPONENTS common io)

13.构建siftgpu库(与rgbdslam绑定)

cd ~/robot_ws/src/rgbdslam_v2/external/SiftGPU
sudo apt-get install libglew-dev
sudo apt-get install libdevil1c2 libdevil-dev
make

若执行第3条时出现下面错误,用下面指令解决。
在这里插入图片描述

sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock

14.建构rgbdslam

cd ~/robot_ws
gedit src/rgbdslam_v2/CMakeLists.txt

第六行加入:

add_compile_options(-std=c++11)

最低部加入:

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

编译:

cd ~/robot_ws
catkin_make

在这里插入图片描述

15.添加robot_ws工作空间到.bashrc文件下

$ echo "source ~/robot_ws/devel/setup.bash" >> ~/.bashrc$ 
source ~/.bashrc

16.测试数据集

下载数据集:

cd ~
mkdir bag-data
cd ~/bag-data
wget http://vision.in.tum.de/rgbd/dataset/freiburg1/rgbd_dataset_freiburg1_xyz.bag

修改 rgbdslam_v2 的 launch文件 rgbdslam.launch 中的 图像topic.

<param name="config/topic_image_mono"              value="/camera/rgb/image_color"/>
<param name="config/topic_image_depth"             value="/camera/depth/image"/>

打开一个终端:

$ roscore

打开一个终端:

roslaunch rgbdslam rgbdslam.launch

打开一个终端:

cd ~/bag-data
rosbag play rgbd_dataset_freiburg1_xyz.bag

在这里插入图片描述

<think>我们正在解决一个链接错误:`undefined reference to symbol '_ZN3g2o18get_monotonic_timeEv'`,这个符号是`g2o::get_monotonic_time()`函数。根据错误信息,链接器在`libg2o_stuff.so`中找到了这个符号,但是该库没有被正确链接到目标可执行文件`g2o_demo`中。 错误信息提示: ``` /usr/bin/ld: CMakeFiles/g2o_demo.dir/optimize.cc.o: undefined reference to symbol '_ZN3g2o18get_monotonic_timeEv' /usr/bin/ld: /opt/ros/noetic/lib/libg2o_stuff.so: error adding symbols: DSO missing from command line ``` 这通常意味着在链接命令中缺少了包含该符号的库(这里是`libg2o_stuff.so`)。此外,引用[1]和引用[3]提到,有时候还需要链接`pthread`库,因为一些系统函数(如时钟相关函数)需要`pthread`库。 ### 解决方案 #### 步骤1:确保链接了`g2o_stuff`库 在CMakeLists.txt中,我们需要确保`g2o_demo`目标链接了`g2o_stuff`库。通常,我们使用`find_package`来查找g2o,然后链接相应的组件。 如果还没有使用`find_package`查找g2o,请先添加: ```cmake find_package(G2O REQUIRED COMPONENTS core stuff types_slam3d solver_csparse csparse_extension) ``` 然后,在创建可执行文件后,链接这些库: ```cmake add_executable(g2o_demo optimize.cc) target_link_libraries(g2o_demo G2O::core G2O::stuff # 必须添加,因为get_monotonic_time在此库中 G2O::types_slam3d G2O::solver_csparse G2O::csparse_extension ) ``` 注意:在链接时,库的顺序也很重要。通常,被依赖的库放在后面。但是,使用现代CMake(目标模式)时,目标会处理依赖关系,所以顺序不太重要。不过,为了安全,我们可以按照依赖关系排列:`stuff`应该被`core`依赖,所以`stuff`应该放在`core`之前?实际上,在g2o中,`core`依赖于`stuff`,因此`core`应该放在`stuff`之后?但根据g2o的安装规则,通常使用目标模式会自动处理依赖,所以按组件顺序写即可。 #### 步骤2:添加pthread支持 引用[1]和引用[3]指出,类似错误可能是由于缺少`pthread`库。因此,我们可以在CMakeLists中添加对线程库的链接。 ```cmake # 在CMakeLists.txt中 find_package(Threads REQUIRED) # 然后在target_link_libraries中添加 target_link_libraries(g2o_demo ... # 其他库 Threads::Threads ) ``` #### 步骤3:检查g2o的安装和配置 确保系统上正确安装了g2o库。如果使用ROS noetic,那么g2o可能已经通过ROS安装。可以使用以下命令检查: ```bash ls /opt/ros/noetic/lib/libg2o_* ``` #### 步骤4:重新生成并构建 清理构建目录并重新构建: ```bash rm -rf build mkdir build cd build cmake .. make ``` ### 完整CMakeLists.txt示例 假设项目结构简单,一个源文件`optimize.cc`,CMakeLists.txt内容如下: ```cmake cmake_minimum_required(VERSION 3.10) project(g2o_demo) # 设置C++标准 set(CMAKE_CXX_STANDARD 11) # 查找g2o,需要组件:core, stuff, types_slam3d, solver_csparse, csparse_extension find_package(G2O REQUIRED COMPONENTS core stuff types_slam3d solver_csparse csparse_extension) # 查找线程库 find_package(Threads REQUIRED) # 创建可执行文件 add_executable(g2o_demo optimize.cc) # 链接库 target_link_libraries(g2o_demo G2O::core G2O::stuff G2O::types_slam3d G2O::solver_csparse G2O::csparse_extension Threads::Threads ) ``` ### 技术原理 1. **符号解析**:链接器在链接时,需要找到所有未定义的符号。如果某个符号在库A中,而库A没有在链接命令中给出,则会出现`undefined reference`错误。此处,`g2o::get_monotonic_time`在`libg2o_stuff.so`中,所以必须链接该库。 2. **依赖传递**:现代CMake的目标(如`G2O::stuff`)会带有依赖关系,比如依赖`Threads`,但有时需要显式添加。因为`g2o_stuff`可能使用了`pthread`的函数,所以我们也需要链接`pthread`库。 3. **DSO missing**:错误信息中的“DSO missing”通常意味着缺少一个动态库,或者库的顺序不对。但这里明确指出了缺少`libg2o_stuff.so`,所以首要任务是确保链接该库。 ### 相关问题 1. 如何检查一个库中是否包含某个符号? 2. CMake中如何正确使用`find_package`来查找第三方库? 3. 为什么链接库的顺序在CMake中很重要?现代CMake如何解决这个问题? 4. 在链接时,静态库和动态库有什么区别?如何指定使用静态库还是动态库? 5. 如何解决ROS项目中常见的链接错误? [^1]: 链接错误可能由缺少pthread库引起 [^3]: 需要添加-pthread编译选项</think>### 解决 CMake 链接错误:`undefined reference to symbol '_ZN3g2o18get_monotonic_timeEv'` #### 错误原因分析 1. **缺少关键库链接** `_ZN3g2o18get_monotonic_timeEv` 对应 `g2o::get_monotonic_time()` 函数,该函数位于 **g2o_stuff** 库中[^1]。错误表明此库未正确链接到目标。 2. **线程库缺失** 该函数依赖系统级线程支持(如 `pthread`),需显式链接线程库[^1][^3]。 3. **链接顺序错误** 库的链接顺序需符合依赖关系:被依赖的库应放在依赖它的库之后(如 `g2o_core` 依赖 `g2o_stuff`)[^2]。 --- ### 解决方案 #### 步骤 1:修改 CMakeLists.txt 添加 `g2o_stuff` 和 `pthread` 库: ```cmake # 确保包含所有必要的 g2o 组件 find_package(G2O REQUIRED COMPONENTS core stuff # 关键组件,包含 get_monotonic_time() types_slam3d solver_csparse csparse_extension ) # 添加线程支持 find_package(Threads REQUIRED) add_executable(g2o_demo optimize.cc) # 正确链接库(注意顺序) target_link_libraries(g2o_demo G2O::stuff # 必须放在 core 之前 G2O::core G2O::types_slam3d G2O::solver_csparse G2O::csparse_extension ${CMAKE_THREAD_LIBS_INIT} # 添加 pthread ) ``` #### 步骤 2:验证库路径 确保 CMake 能找到 g2o 库。若使用 ROS,添加 ROS 依赖: ```cmake find_package(roscpp REQUIRED) include_directories(${roscpp_INCLUDE_DIRS}) ``` #### 步骤 3:清理并重新构建 ```bash rm -rf build && mkdir build && cd build cmake -DCMAKE_BUILD_TYPE=Release .. make VERBOSE=1 # 查看详细链接命令 ``` #### 步骤 4:验证链接结果 ```bash ldd g2o_demo | grep g2o # 应输出类似: # libg2o_stuff.so => /opt/ros/noetic/lib/libg2o_stuff.so # libg2o_core.so => /opt/ros/noetic/lib/libg2o_core.so ``` --- ### 技术原理 1. **符号解析过程** 链接器按从左到右顺序解析符号。若 `g2o_core` 依赖 `g2o_stuff`,则链接顺序应为: $$ \text{stuff} \rightarrow \text{core} \rightarrow \text{types} $$ 错误顺序会导致符号未定义[^2]。 2. **线程库的必要性** `get_monotonic_time()` 使用系统时钟函数(如 `clock_gettime`),这些函数需要 `pthread` 库实现[^1][^3]。 3. **g2o 模块依赖关系** ```mermaid graph LR A[g2o_demo] --> B[g2o_types_slam3d] B --> C[g2o_core] C --> D[g2o_stuff] D --> E[pthread] ``` --- ### 相关问题 1. 如何检查二进制文件中的未解析符号? 2. CMake 中如何正确处理库的依赖顺序? 3. 为什么 `pthread` 需要显式链接而不是自动包含?[^1][^3] 4. 不同 g2o 模块的功能如何划分(如 core/stuff/types)? 5. 当同时存在多个 g2o 版本时如何避免冲突?[^5] [^1]: 缺少 pthread 库导致 GLIBC 符号未定义 [^2]: 库链接顺序错误导致符号解析失败 [^3]: 需要显式添加 -pthread 编译选项 [^5]: 动态库版本冲突导致符号未定义
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值