文章目录
第一章内容的总结:
【内容仅供自己回顾使用,如有问题,请及时告知】
第一章作业
第一章:
1.终端快捷键:
ctrl + tab : 切换终端屏
ctrl + shift + 上下左右: 拉伸终端边界
ctrl + l: 清屏(留最新一行)
2.桌面美化:待定
3.cmake的使用: 用对应手册
作业:
2.熟悉linux:2h-2
- /bin - 重要的二进制 (binary) 应用程序
- /boot - 启动 (boot) 配置文件
- /dev - 设备 (device) 文件
- /etc - 配置文件、启动脚本等 (etc)
- /home - 本地用户主 (home) 目录
- /lib - 系统库 (libraries) 文件
- /lost+found - 在根 (/) 目录下提供一个遗失+查找(lost+found) 系统
- /media - 挂载可移动介质 (media),诸如 CD、数码相机等
- /mnt - 挂载 (mounted) 文件系统
- /opt - 提供一个供可选的 (optional) 应用程序安装目录
- /proc - 特殊的动态目录,用以维护系统信息和状态,包括当前运行中进程 (processes) 信息。
- /root - root (root) 用户主文件夹,读作“slash-root”
- /sbin - 重要的系统二进制 (system binaries) 文件
- /sys - 系统 (system) 文件
- /tmp - 临时(temporary)文件
- /usr - 包含绝大部分所有用户(users)都能访问的应用程序和文件
- /var - 经常变化的(variable)文件,诸如日志或数据库等
-
请描述 apt-get 安装软件的整体步骤,说明 Ubuntu 是如何管理软件依赖关系和软件版本的?
Linux安装程序的几种方式:
- 源码安装【可以随意配置,但注意配置步骤等】
- rpm包安装
- yum安装 (RedHat、CentOS)
- apt-get安装 (debian,ubuntu)【常用】
Apt全称Advanced Package Tool。Apt-get适用于deb包管理式的操作系统,主要用于自动从互联网的软件仓库中搜索、安装、升级、卸载软件或操作系统。
apt-get命令一般需要root权限执行,所以一般跟着sudo命令。
- 打开一个终端:
sudo apt-get update 更新源
sudo apt-cache search package 搜索软件包
- 如何找到软件的version,则通过 install 命令便可以安装
sudo apt-get install package 安装包
# (其他)常用指令如下 sudo apt-get remove package 删除包 sudo apt-get --purge remove package——卸载一个已安装的软件包(删除配置文件) sudo apt-get upgrade 更新已安装的包 apt-get source package 下载该包的源代码
Ubuntu 是如何管理软件依赖关系和软件版本的?
依赖:可以通过新立得包管理器,来对已知包名称的依赖进行管理 ;
软件版本:不同的版本可以同时安装,但同时只能使用其一版本。
-
什么是软件源?如何更换系统自带的软件源?如何安装来自第三方软件源中的软件?
软件源:就是利用终端指令,从制定网址下载。中的制定网址吧
如何更换:1. Software & Updates 中更换 ; 2.
/etc/apt/sources.list
文件中编辑# 手动更改 sources 文件步骤: lsb_release -a #查看自己ubuntu系统的Codename 找到想要更换的镜像源地址:阿里云、清华、中科大等等 ping + 地址 #(说实话,添加一种源即可,所以ping下,看看哪个更快) sudo cp /etc/apt/sources.list /etc/apt/sources.【标识-自己填个】.list # 备份原来的源信息 sudo gedit /etc/apt/sources.qinghua.list # 修改文件中源地址。 sudo apt-get update # 刷新源
-
除了 apt-get 以外,还有什么方式在系统中安装所需软件?除了 Ubuntu 以外,其他发行版使用什么软件管理工具?请至少各列举两种
1 .deb包安装
2 源代码安装
3 rpm包安装等
确实好多啊。
Debian/Ubuntu 的 apt、
openSUSE 的 zypp、Fedora 的 yum、
Mandriva 的 urpmi、
Slackware 的 slackpkg、
Archlinux 的 pacman、
Gentoo 的 emerge、
Foresight 的 conary、
Pardus 的 pisi
-
环境变量 PATH 是什么?有什么用途?LD_LIBRARY_PATH 是什么?指令 ldconfig 有什么用途?
系统级环境变量:
- /etc/environment: 是系统在登录时读取的第一个文件,用于为所有进程设置环境变量。
- /etc/profile: 是系统登录时执行的第二个文件,可以用于设定针对全系统所有用户的环境变量。该文件一般是调用/etc/bash.bashrc文件。
用户级环境变量:
1. ~/.profile: 是对应当前登录用户的profile文件,用于定制当前用户的个人工作环境。 2. ~/.bashrc: 是对应当前登录用户的bash初始化文件,当用户每次打开shell时,系统都会执行此文件一次。平时主要设置这个文件就可以了。、
(2). 定义新的环境变量:
sudo gedit ~/.bashrc # 终端打开 # 在打开的文件中添加如下: export PYTHONPATH=/home/lxq/learning/caffe/python:$PYTHONPATH # path采用:来分隔,冒号左右不需要空格. # :$PYTHONPATH在后面新添加的path优先搜索,$PYTHONPATH:在前面说明新添加的path后面搜索,不加代表新路径设置为PYTHONPATH路径。 source ~/.bashrc #终端执行,使其立即生效
PATH:环境变量。 可执行程序的查找路径。
(1). 查看当前环境变量: echo $PATH
(2). 修改当前环境变量:方法一: export PATH=PATH:/XXX 但是登出后就失效 ; 方法二:修改/.bashrc或/.bash_profile或系统级别的/etc/profile, 然后source .bashrc
LD_LIBRARY_PATH: 动态库的查找路径。
ldconfig : 命令需要/etc/ld.so.conf.d目录中的文件来配合使用,我们可以在这个目录中创建一个文本文件,里面写好第三方库文件的路径,然后运行ldconfig,这样程序在运行的时候,照样可以找到对应的第三方库。
-
Linux 文件权限有哪几种?如何修改一个文件的权限?
如果给所有人添加可执行权限:chmod a+x 文件名; 如果给文件所有者添加可执行权限:chmod u+x 文件名; 如果给所在组添加可执行权限:chmod g+x 文件名; 如果给所在组以外的人添加可执行权限:chmod o+x 文件名;
-
Linux 用户和用户组是什么概念?用户组的权限是什么意思?有哪些常见的用户组?
linux: 多用户、多任务: 所谓多用户,多任务就是指可以在同一时间,有多个用户登录同一个系统执行不同的任务而互不影响。
用户安装类型划分:
-
超级用户(管理员):享有最高权限,具备系统中的所有权限(一般为root),UID为0。
-
普通用户:有权限限制,只能对自己目录下的文件进行操作,可以登录系统,UID>=500
-
系统用户:别称“伪用户”,无法登录系统,一般系统默认持有如bin,nobody等,其主要作用是支撑系统运行,方便系统管理,UID为1-499(闭区间)
我们自己创建的用户一般就是普通用户,系统用户不用去管它。
用户组:用户组是具有相同特征用户的逻辑集合。 可以将所有需要访问这个文件的用户放入这个组里,给这个组授权,相应的这个组里的所有用户也拥有了相同的权限。
分类的话:
私有用户组(基本组)【只有一个用户吧】 和 普通用户组(附加组)。【多个用户】
当我们创建一个用户的时候,如果没有指定用户所属用户组,就会自动的创建一个同名的用户组,这个用户组的种类就是基本组,当有其他用户加入这个组时,私有用户组就会变成普通用户组(附加组)。
chgrp: 改变档案所属群组 chown: 改变档案拥有者 chmod: 改变档案的权限,SUID,SGID,SBIT等的特性 所以改变文件的所有者如下: chown xiang:xiang a.sh
-
-
常见的 Linux 下 C++ 编译器有哪几种?在你的机器上,默认用的是哪一种?它能够支持 C++ 的哪个标准?
VScode ; Clion ; KDevelop.
默认设置为:VScode。
它能够支持 C++ 的哪个标准?-std=c++11 14 17
等
3.SLAM综述文献阅读
-
SLAM 会在哪些场合中⽤到?⾄少列举三个⽅向。
增强现实AR、自动驾驶、三维重建等。
-
SLAM 中定位与建图是什么关系?为什么在定位的同时需要建图?
相互依赖吧。 如果要精确定位,那么就需要一个精准正确的地图;为了构造一个精准的地图,又需要每个位置的精确定位。
-
SLAM 发展历史如何?我们可以将它划分成哪⼏个阶段?
1.古典时代(1986-2004年)经典时代引入了SLAM的主要概率公式,包括基于扩展卡尔曼滤波器、RaoBlackwelled粒子滤波器和最大似然估计的方法 。
2.算法分析时代(2004-2015年)算法分析阶段研究了SLAM的基本性质,包括可观测性、收敛性和一致性。3.我们正在进入SLAM的第三个时代,即鲁棒感知时代。
-
从什么时候开始 SLAM 区分为前端和后端?为什么我们要把 SLAM 区分为前端和后端?
前端:进行特征提取和匹配,来获取相邻帧之间的位姿估计(主要) ; 后端:进行位姿和路标点等的优化。
[参考他人回答]: 最初的时候,传感器单一,过程简单,采集到的数据经过简单的处理便送给后端进行相应操作。 ; 由于传感器多样化,分支出不同的处理,甚至优化方式,为防止系统变得臃肿,所以划分出前端进行传感器处理,估计相邻帧的位姿吧。[不一定对]
-
列举三篇在 SLAM 领域的经典⽂献。
[1] Huang B , Zhao J , Liu J . A Survey of Simultaneous Localization and Mapping with an Envision in 6G Wireless Networks[J]. 2019.
[2] Mur-Artal R , Montiel J M M , Tardos J D . ORB-SLAM: A Versatile and Accurate Monocular SLAM System[J]. IEEE Transactions on Robotics, 2015, 31(5):1147-1163.
[3] Lee H , Song S , Jo S . 3D Reconstruction using a sparse laser scanner and a single camera for outdoor autonomous vehicle[C]// 2016 IEEE 19th International Conference on Intelligent Transportation Systems (ITSC). IEEE, 2016.
4.CMAKE练习:
迭代版本2 【还没测试其他用户使用,是否能够成立】
1.CMakeLists.txt
cmake_minimum_required(VERSION 3.4)
project(hello)
SET(CMAKE_BUILD_TYPE "Release")
# add include
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)
add_subdirectory(lib)
message(STATUS "the share lib is ok")
## 查找共享库
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules) # 加入cmake_modules的位置: FindHello.cmake
# list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules/) # 作用等同上面那句
find_package(hello123 REQUIRED) # 查找共享库
# add exe cpp
add_executable(sayhello useHello.cpp)
target_link_libraries(sayhello ${HELLO_LIBRARIES})
# sudo make install
# install(TARGETS hello123 LIBRARY DESTINATION /usr/local/lib)
install(FILES ${PROJECT_SOURCE_DIR}/include/hello.h DESTINATION /usr/local/include)
lib/CMakeLists.txt
# 生成共享库 libhello.so
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib) # 设置库输出位置
ADD_LIBRARY(hello123 SHARED ${PROJECT_SOURCE_DIR}/src/hello.cpp)
set_target_properties(hello123 PROPERTIES VERSION 1.2 SOVERSION 1) # 动态库版本号设置 , VERSION指代动态库版本,SOVERSION 指代 API 版本。
message(STATUS {PROJECT_SOURCE_DIR}/src/hello.cpp"--构建库完成")
## sudo make install
#install(TARGETS hello123 LIBRARY DESTINATION /usr/local/lib)
#install(FILES ${PROJECT_SOURCE_DIR}/include/hello.h DESTINATION /usr/local/include)
3.Findhello.cmake
# Try to find Hello library
# # 找到正确的头文件
# find_path(HELLO_INCLUDE_DIR NAMES hello.h PATHs ${PROJECT_SOURCE_DIR}/include
# ...)
# 找到正确的库文件
find_library(HELLO_LIBRARIES NAMES hello123
PATHS #/home/lxq/slam/深蓝学院/视觉SLAM-11期/第1章作业/PA1/code(复件)/lib
# /usr/local/lib
${PROJECT_SOURCE_DIR}/lib
...)
if(NOT HELLO_LIBRARIES)
message(FATAL_ERROR"hello.so not found!!!")
endif(NOT HELLO_LIBRARIES)
if( HELLO_LIBRARIES)
message(FATAL_ERROR"hello.so found!!!")
endif( HELLO_LIBRARIES)
迭代版本1
cmake_minimum_required(VERSION 2.8)
project(hello)
SET(CMAKE_BUILD_TYPE "Release")
# add include
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)
# 生成共享库 libhello.so
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib) # 设置库输出位置
ADD_LIBRARY(hello SHARED ${PROJECT_SOURCE_DIR}/src/hello.cpp)
# 加入cmake_modules的位置: FindHello.cmake
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules)
# 下面注释的作用等同上面那句
# list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules/)
# 查找共享库
find_package(hello REQUIRED)
# add exe cpp
add_executable(sayhello useHello.cpp)
target_link_libraries(sayhello ${HELLO_LIBRARIES})
# sudo make install
install(TARGETS hello LIBRARY DESTINATION /usr/local/lib)
install(FILES ${PROJECT_SOURCE_DIR}/include/hello.h DESTINATION /usr/local/include)
5.[附加题]gflags, glog, gtest 的使用
- glog 是日志打印工具,
- gflags 是参数管理工具,
- 而 gtest是单元测试工具。
1.请自行寻找这三个库的说明文档,并在系统中安装它们。请说明你是如何安装的。
6.理解ORB-SLAM2框架:
- 下载源代码
(a).
cd ORB_SLAM2
chmod +x build.sh
./build.sh
将会在 lib 文件中生成 1个 libORB_SLAM2.so 文件; 并会在 Examples 文件中创建6个可执行文件:mono_tum, mono_kitti, rgbd_tum, stereo_kitti, mono_euroc, stereo_euroc 。
(b).
/include 是ORB-SLAM2程序头文件存放位置
/src 是ORB-SLAM2程序源文件存放位置
/Examples 是ORB-SLAM2程序单目、双目、RGB-D文件:dataset的timestamps时间戳.txt,dataset相关参数.yaml,对应数据集.cc执行例程,6个可执行文件的存放位置
©.
opencv
Eigen
Pangolin
DBoW2
g2o
7.(选)使用摄像头或视频运行ORB-SLAM2
使用视频运行:(使用摄像头,需要进行相机参数标定,在已给出的yaml文件中有。)
与ORB-SLAM结合,加入myvideo
程序。
在最外层CMakeLists.txt
中加入:
# 设置输出路径
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/Examples/myvideo)
# 添加可执行程序 and 链接库
add_executable(myvideo
Examples/myvideo/myvideo.cpp)
target_link_libraries(myvideo ${PROJECT_NAME})
add_executable(myslam
Examples/myvideo/myslam.cpp)
target_link_libraries(myslam ${PROJECT_NAME})
同时修改myvideo.cpp
和myslam.cpp
文件中,.mp4 .ymal .txt 等文件的路径:(当前我用的是相对路径,终端需要cd到ORB_SLAM2/Examples/myvideo
路径下)
// 参数文件与字典文件
// 如果你系统上的路径不同,请修改它
string parameterFile = "./myvideo.yaml";
string vocFile = "../../Vocabulary/ORBvoc.txt";
// 视频文件
string videoFile = "./myvideo.mp4";
最后运行生成的可执行程序:
可视化界面显示效果: