熟悉Linux
问题1:描述apt-get安装软件的整体步骤,说明Ubuntu是如何管理软件依赖关系和版本的
apt-get安装软件的整体步骤:
-
reading package lists:获取软件的下载地址
-
building dependency tree:确定该软件包的依赖关系,
-
安装下载/更新此软件以及依赖软件的软件包(deb文件)
-
使用dpkg对下载下来的安装包进行安装
ubuntu管理软件依赖关系和版本:
ubuntu使用deb软件包来管理软件,因此对软件的版本管理可以看作是对deb软件包的管理。软件包的依赖关系一般都会在软件源中提供。当需要下载软件时,apt包管理工具可以直接从软件源中进行调用。
问题2:什么是软件源?如何更换系统自带的软件源?如何安装来自第三方软件源中的软件?
什么是软件源?
软件源就是一个应用程序安装库,很多很多的应用软件都在这个库里面。他可以是网络服务器,是光盘,甚至是硬盘上的一个目录。
如何更换系统自带的软件源?
可以修改 /etc/apt/sources.list 文件夹中的源地址,然后使用sudo apt-get update对软件源进行更新
如何安装来自第三方软件源中的软件
-
可以将第三方软件源的地址加入到/etc/apt/sources.list中
-
使用sudo apt-get update对软件元进行更新
-
使用sudp apt-get install对软件进行安装
问题3:除了 apt-get 以外,还有什么方式在系统中安装所需软件?除了 Ubuntu 以外,其他发行版使用什么软件管理工具?请至少各列举两种
除了 apt-get 以外,还有什么方式在系统中安装所需软件
-
使用源代码 make install命令进行安装
-
使用dpkg命令直接安装deb包
-
snap
除了 Ubuntu 以外,其他发行版使用什么软件管理工具
-
Pacman包管理器(适用于Arch Linux)
-
Portage包管理器(适用于Gentoo)
问题4:环境变量 PATH 是什么?有什么用途? LD_LIBRARY_PATH 是什么?指令 ldconfig 有什么用途?
PATH:可执行程序的查找路径 LD_LIBRARY_PATH:动态库的查找路径 ldconfig的用途:主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib.so),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为/etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表.
问题5:Linux文件权限有哪几种?如何修改一个文件的权限?
Linux文件权限有三种,分别是读、写、执行。可以通过chomd命令改变一个文件的权限
问题6:Linux 用户和用户组是什么概念?用户组的权限是什么意思?有哪些常见的用户组?
用户可以理解为使用这个系统的每一个个人单位,每个用户拥有一个与之对应的账号,可以通过这个账号使用系统。每个用户都有一个或多个用户组,系统可以对一个用户组中的所有用户进行集中管理。用户组权限指的是用户组中的每个用户都拥有的权限。
问题7:常见的 Linux 下 C++ 编译器有哪几种?在你的机器上,默认用的是哪一种?它能够支持 C++ 的哪个标准?
常见的编译器GCC、G++。默认使用g++,可支持C++11
SLAM综述文献阅读
问题1:SLAM 会在哪些场合中用到?至少列举三个方向
自动驾驶、增强现实、导航
问题2:SLAM 中定位与建图是什么关系?为什么在定位的同时需要建图?
定位:机器人必须知道自己在环境中位置;
建图:机器人必须记录环境中特征的位置(如果知道自己的位置);
问题3:SLAM 发展历史如何?我们可以将它划分成哪几个阶段?
-
传统时代classical age(1986-2004):SLAM问题的提出,并将该问题转换为一个状态估计问题,利用扩展卡尔曼滤波、粒子滤波及最大似然估计等手段来求解。
-
算法分析时代algorithmic-analysis age(2004-2015):研究SLAM的基本特性,包括观测性、收敛性和一致性。
-
鲁棒性-预测性时代robust-perception(2015-):鲁棒性、高级别的场景理解,计算资源优化,任务驱动的环境感知。视觉SLAM是在传统SLAM的基础上发展起来的,早期的视觉SLAM多采用扩展卡尔曼滤波等手段来优化相机位姿的估计和地图构建的准确性,后期随着计算能力的提升及算法的改进,BA优化、位姿优化等手段逐渐成为主流。
问题4:从什么时候开始 SLAM 区分为前端和后端?为什么我们要把 SLAM 区分为前端和后端?
我认为分前后端的原因主要是前后端由于所需信息量、执行频率的不同导致无法将二者融合成一个模块。
所需信息量不同:前端主要通过相邻帧之间的特征对应关系获取相邻帧的位姿对应关系,而后端则是需要综合多帧的观测数据,对多个姿态和地图进行联合优化,消除前端带来的累计误差。
执行频率不同:前端由于考虑数据量较少,因此计算速度快,执行频率高,后端由于需要处理的数据多,过程非线性,因此计算速率底,执行频率底。
问题5:列举三篇在 SLAM 领域的经典文献
-
Davison A J, Reid I D, Molton N D, et al. MonoSLAM: realtime single camera SLAM[J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2007, 29(6):1052-1067
-
Mourikis A, Roumeliotis S. A multi-state constraint Kalman filter for vision-aided inertial navigation[C] //Proceedings of IEEE International Conference on Robotics and Automation. Los Alamitos: IEEE Computer Society Press, 2007: 3565-3572
-
Shi J, Tomasi C. Good features to track[C] //Proceedings of IEEE Conference on Computer Vision and Pattern Recognition. Los Alamitos: IEEE Computer Society Press, 1994: 593-600
CMake练习
问题1-4:同时生成共享库以及可执行文件,通过camke install对动态库及头文件进行安装
./CMakeLists.txt
cmake_minimum_required(VERSION 2.8) project(HelloSLAM) add_subdirectory(src/)
./src/CMakeLists.txt
add_library(hello SHARED hello.cpp) # 生成动态库 add_executable(sayhello useHello.cpp) # 生成可执行文件 include_directories(../include/) # 添加头文件索引 target_link_libraries(sayhello hello) # 动态库链接 # 通过make install 将头文件和共享库安装到指定位置 install(TARGETS hello LIBRARY DESTINATION lib) install(FILES ../include/hello.h DESTINATION include)
运行结果和install 结果
install结果
可执行文件运行结果
问题5:编写.cmake文件并通过find_package进行导入
./CMakeLists.txt
cmake_minimum_required(VERSION 2.8) project(HelloSLAM) set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) # 指定FindHello.cmake所在位置 add_subdirectory(src/)
./src/CMakeLists.txt
# 通过FindHello.cmake 找到头文件及动态库 find_package(Hello) if(HELLO_FOUND) #找到文件 add_executable(sayhello useHello.cpp) include_directories(${HELLO_INCLUDE_DIR}) target_link_libraries(sayhello ${HELLO_LIBRARY}) endif(HELLO_FOUND)
./cmake/FindHello.cmake
FIND_PATH(HELLO_INCLUDE_DIR hello.h include) # 查找头文件所在位置 FIND_LIBRARY(HELLO_LIBRARY NAMES hello PATH lib) # 查找动态库所在位置 # 设置标志变量并输出提示信息 IF (HELLO_INCLUDE_DIR AND HELLO_LIBRARY) SET(HELLO_FOUND TRUE) ENDIF (HELLO_INCLUDE_DIR AND HELLO_LIBRARY) IF (HELLO_FOUND) IF (NOT HELLO_FIND_QUIETLY) MESSAGE(STATUS "Found Hello: ${HELLO_LIBRARY}") ENDIF (NOT HELLO_FIND_QUIETLY) ELSE (HELLO_FOUND) IF (HELLO_FIND_REQUIRED) MESSAGE(FATAL_ERROR "Could not find hello library") ENDIF (HELLO_FIND_REQUIRED) ENDIF (HELLO_FOUND)
cmake过程输出及可执行文件运行结果
camke过程输出
可执行文件运行结果
gflags, glog, gtest 的使用
问题1:请自行寻找这三个库的说明文档,并在系统中安装它们。请说明你是如何安装的
-
git clone命令下载源代码
-
cmake 对程序进行编译,生长makefile。其中,对gflags的编译需要加入特殊选项
-
make 生成动态库
-
make install 将头文件 库 .cmake文件放入系统指定位置
问题2:将上一题中的打印改为使用 glog 的打印方式,以替代 std::cout 的输出方式
camke
find_package(Glog REQUIRED) # 这里find_package后,保存头文件和库位置的变量不知为何是空的,自己手动把目录加进来 include_directories(/usr/local/lib/) include_directories(/usr/local/include/) add_executable(sayhello useHello.cpp) target_link_libraries(sayhello /usr/local/lib/libglog.so.1)
useHello.cpp
//#include "hello.h" #include <glog/logging.h> #include <iostream> int main( int argc, char** argv ) { google::InitGoogleLogging("HelloSLAM"); std::cout << "hello11" << std::endl; google::SetLogDestination(google::GLOG_INFO, "./log/"); //设置 google::INFO 级别的日志存储路径和文件名前缀 LOG(INFO) << "HELLO" << "ok!"; }
输出结果
Log file created at: 2022/01/30 02:03:03 Running on machine: sld-lenovo1 Running duration (h:mm:ss): 0:00:00 Log line format: [IWEF]yyyymmdd hh:mm:ss.uuuuuu threadid file:line] msg I20220130 02:03:03.508786 21700 useHello.cpp:11] HELLOok!
问题3:在 useHello.c 中增加一个 gflags 以指明打印的次数 print_times,默认为 1。当用户传递该参数时,即打印多少遍 Hello SLAM。
cmake
# 这里不知道什么原因find_package找不到头文件目录,进行手动添加 include_directories(/usr/local/include/) add_executable(sayhello useHello.cpp) # glog target_link_libraries(sayhello /usr/local/lib/libglog.so) # gflags target_link_libraries(sayhello /usr/local/lib/libgflags.a) # gtest target_link_libraries(sayhello /usr/local/lib/libgtest_main.a)
useHello.cpp
#include <glog/logging.h> #include <iostream> #include <gflags/gflags.h> // 声明gflags变量 DEFINE_int32(print_times, 1, "111"); int main( int argc, char** argv ) { // 用glog输出日志信息 google::InitGoogleLogging("HelloSLAM"); google::SetLogDestination(google::GLOG_INFO, "./"); //设置 google::INFO 级别的日志存储路径和文件名前缀 LOG(INFO) << "HELLO" << " SLAM"; // 根据print_times确定输出次数 gflags::ParseCommandLineFlags(&argc, &argv, true); for(int i = 0; i < FLAGS_print_times; i++) std::cout << "hello SLAM:" << i << std::endl; }
执行结果
gflags运行结果
问题4:书写一个 gtest 单元测试程序来测试你的工程能够正常运行。修改你的 CMakeLists.txt 来增加这
个单元测试
cmake
include_directories(/usr/local/include/) # 加一个gcc选项, 要不然编译gtest会报错 set(CMAKE_CXX_FLAGS "${CAMKE_CXX_FLAGS} -std=c++11 -pthread") add_executable(sayhello useHello.cpp) # 使用gtest的程序 add_executable(testGTest testGTest.cpp) # glog target_link_libraries(sayhello /usr/local/lib/libglog.so) # gflags target_link_libraries(sayhello /usr/local/lib/libgflags.a) # gtest target_link_libraries(testGTest /usr/local/lib/libgtest.a)
testGTest.cpp
#include<gtest/gtest.h> int add(int a,int b){ return a+b; } TEST(testCase,test0){ EXPECT_EQ(add(2,3),5); } int main(int argc,char **argv){ testing::InitGoogleTest(&argc,argv); return RUN_ALL_TESTS(); }
运行结果
gtest运行结果
理解 ORB-SLAM2 框架
问题1:下载源代码
orbslam2 下载完成截图
问题2:阅读CMakeLists.txt回答下列问题
ORB-SLAM2 将编译出什么结果?有几个库文件和可执行文件?
库文件:
-
ORB_SLAM2
可执行文件:
-
rgbd_tum
-
stereo_kitti
-
stereo_euroc
-
mono_tum
-
mono_kitti
-
mono_euroc
ORB-SLAM2 中的 include, src, Examples 三个文件夹中都含有什么内容?
include文件夹中主要是程序的头文件,src为SLAM部分的核心源文件,Examples包含一些根据不同相机的使用样例
ORB-SLAM2 中的可执行文件链接到了哪些库?它们的名字是什么
-
OpenCV
-
Eigen3
-
Pangolin