这个博客是唯一一个能够让我编译成功的博客,其他的博客,相同的问题,解决方案各不相同,非常繁杂;
前面的操作过程:
cd ~/ros_ws/src/
git clone https://github.com/JakobEngel/dso_ros
cd ..
export DSO_PATH=~/dso
rosmake
遇到的最多的问题就是:
/usr/bin/ld: CMakeFiles/dso_live.dir/src/main.cpp.o: undefined reference to symbol '_ZN5boost6system15system_categoryEv'
/usr/lib/x86_64-linux-gnu/libboost_system.so: error adding symbols: DSO missing from command line
我知道你会百度这类问题的解决方式,你可能会查找到orbslam相关博客的类似问题,你会查到跟Boost这个库相关,然后告诉你怎么解决,比如添加链接库,添加库文件的地址,复制找不到的两个库文件到dso工程下的lib文件夹下去,相信我,你大概率不会解决掉这种问题。但Ubuntu14.04却不会遇到这类问题,但仔细想想,既然16.04是更高版本的Ubuntu,怎么会让问题变得复杂呢?我们又怎么傻乎乎的回到14.04的版本去呢?事情一定不是这样解决的。
直到我看到了文首那篇博客
我遇到了里面第二、三个问题。
按照上面的博客的解决方法,我逐步尝试,终于解决掉所有问题,在此记录:
对于上面那个最常见的问题,解决方式:
打开
ros工作空间/src/dso_ros/CMakeLists.txt
修改:
原命令行:
target_link_libraries(dso_live ${DSO_LIBRARY} ${Pangolin_LIBRARIES} ${OpenCV_LIBS})
编辑后:
target_link_libraries(dso_live ${DSO_LIBRARY} ${Pangolin_LIBRARIES} ${OpenCV_LIBS} GL glut GLU boost_system)
然后在ros工作空间/src/dso_ros/
就可以执行:
rosmake
如果没有那么不幸,就可以编译成功了,然后问题来了,你会发现你找不到dsolive
这个节点,原因是因为原版的CMakeLists.txt
中把dsolive
这个节点放在了/ros_ws/src/dso_ros/build/bin
文件夹下,而正确的放置位置应该在/ros_ws/src/dso_ros/bin
,因此你手动复制过去就可以找到这个可执行文件。有一个疑问,那就是为什么所有人编译运行DSO都会遇到问题呢?答案就是原作者开发的时候,使用的系统是14.04之前的,在14.04里面编译很简单。目前Ubuntu系统在16、18,如果想要运行就需要设置一番。
需要注意的是,运行时,你每次打开一个终端,都要进入cd ros_ws
执行一下:
source devel/setup.bash
当然你也可以把它写入到你的环境变量(在~/.bashrc
最后一行加入上述语句)里面去。
如果不想复制dsolive
这个可执行程序到那个指定文件夹,就要修改CMakeLists.txt
,
修改前:
set(EXECUTABLE_OUTPUT_PATH bin)
编辑后(指定可执行文件到前一个bin目录去,往前返回两级目录下的那个bin目录):
set(EXECUTABLE_OUTPUT_PATH ../../bin)
这样无需复制dsolive也可以运行成功。
rosrun dso_ros dso_live image:=/kinect2/qhd/image_color_rect calib=src/dso_ros/camera.txt mode=1