视觉SLAM第一章内容框架作业

第一章内容的总结:

【内容仅供自己回顾使用,如有问题,请及时告知】
在这里插入图片描述

第一章作业

第一章:

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)文件,诸如日志或数据库等
  1. 请描述 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 是如何管理软件依赖关系和软件版本的?

    依赖:可以通过新立得包管理器,来对已知包名称的依赖进行管理 ;

    软件版本:不同的版本可以同时安装,但同时只能使用其一版本。

  2. 什么是软件源?如何更换系统自带的软件源?如何安装来自第三方软件源中的软件?

    软件源:就是利用终端指令,从制定网址下载。中的制定网址吧

    如何更换: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      # 刷新源
    
  3. 除了 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

  4. 环境变量 PATH 是什么?有什么用途?LD_LIBRARY_PATH 是什么?指令 ldconfig 有什么用途?

    系统级环境变量:

    1. /etc/environment: 是系统在登录时读取的第一个文件,用于为所有进程设置环境变量。
    2. /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,这样程序在运行的时候,照样可以找到对应的第三方库。

  5. Linux 文件权限有哪几种?如何修改一个文件的权限?

    如果给所有人添加可执行权限:chmod a+x 文件名;
    如果给文件所有者添加可执行权限:chmod u+x 文件名;
    如果给所在组添加可执行权限:chmod g+x 文件名;
    如果给所在组以外的人添加可执行权限:chmod o+x 文件名;
    
  6. Linux 用户和用户组是什么概念?用户组的权限是什么意思?有哪些常见的用户组?

    linux: 多用户、多任务: 所谓多用户,多任务就是指可以在同一时间,有多个用户登录同一个系统执行不同的任务而互不影响。

    用户安装类型划分:

    1. 超级用户(管理员):享有最高权限,具备系统中的所有权限(一般为root),UID为0。

    2. 普通用户:有权限限制,只能对自己目录下的文件进行操作,可以登录系统,UID>=500

    3. 系统用户:别称“伪用户”,无法登录系统,一般系统默认持有如bin,nobody等,其主要作用是支撑系统运行,方便系统管理,UID为1-499(闭区间)

    我们自己创建的用户一般就是普通用户,系统用户不用去管它。

    用户组:用户组是具有相同特征用户的逻辑集合。 可以将所有需要访问这个文件的用户放入这个组里,给这个组授权,相应的这个组里的所有用户也拥有了相同的权限。

    分类的话:

    私有用户组(基本组)【只有一个用户吧】 和 普通用户组(附加组)。【多个用户】

    当我们创建一个用户的时候,如果没有指定用户所属用户组,就会自动的创建一个同名的用户组,这个用户组的种类就是基本组,当有其他用户加入这个组时,私有用户组就会变成普通用户组(附加组)。

    chgrp: 改变档案所属群组
    chown: 改变档案拥有者
    chmod: 改变档案的权限,SUID,SGID,SBIT等的特性
    
    所以改变文件的所有者如下:
    
    chown xiang:xiang a.sh
    
  7. 常见的 Linux 下 C++ 编译器有哪几种?在你的机器上,默认用的是哪一种?它能够支持 C++ 的哪个标准?

VScode ; Clion ; KDevelop.

默认设置为:VScode。

它能够支持 C++ 的哪个标准?-std=c++11 14 17

3.SLAM综述文献阅读
  1. SLAM 会在哪些场合中⽤到?⾄少列举三个⽅向。

    增强现实AR、自动驾驶、三维重建等。

  2. SLAM 中定位与建图是什么关系?为什么在定位的同时需要建图?

    ​ 相互依赖吧。 如果要精确定位,那么就需要一个精准正确的地图;为了构造一个精准的地图,又需要每个位置的精确定位。

  3. SLAM 发展历史如何?我们可以将它划分成哪⼏个阶段?

    1.古典时代(1986-2004年)经典时代引入了SLAM的主要概率公式,包括基于扩展卡尔曼滤波器、RaoBlackwelled粒子滤波器和最大似然估计的方法 。
    2.算法分析时代(2004-2015年)算法分析阶段研究了SLAM的基本性质,包括可观测性、收敛性和一致性。

    3.我们正在进入SLAM的第三个时代,即鲁棒感知时代。

  4. 从什么时候开始 SLAM 区分为前端和后端?为什么我们要把 SLAM 区分为前端和后端?

    前端:进行特征提取和匹配,来获取相邻帧之间的位姿估计(主要) ; 后端:进行位姿和路标点等的优化。

    [参考他人回答]: 最初的时候,传感器单一,过程简单,采集到的数据经过简单的处理便送给后端进行相应操作。 ; 由于传感器多样化,分支出不同的处理,甚至优化方式,为防止系统变得臃肿,所以划分出前端进行传感器处理,估计相邻帧的位姿吧。[不一定对]

  5. 列举三篇在 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)


  1. 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框架:
  1. 下载源代码

在这里插入图片描述

​ (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.cppmyslam.cpp文件中,.mp4 .ymal .txt 等文件的路径:(当前我用的是相对路径,终端需要cd到ORB_SLAM2/Examples/myvideo路径下)

// 参数文件与字典文件
// 如果你系统上的路径不同,请修改它
string parameterFile = "./myvideo.yaml";
string vocFile = "../../Vocabulary/ORBvoc.txt";

// 视频文件
string videoFile = "./myvideo.mp4";

最后运行生成的可执行程序:

在这里插入图片描述

可视化界面显示效果:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于视觉SLAM第3章的作业,任务主要包括实现基于特征的视觉里程计(Visual Odometry)算法。视觉里程计是一种利用相机获取的图像序列来估计相机相对位置和姿态变化的技术。 在该作业中,我们需要实现一个基本的视觉里程计算法,其主要步骤如下: 1. 特征提取与匹配:从连续的图像序列中提取特征点,并进行特征匹配。常用的特征提取算法包括Harris角点检测、FAST角点检测以及ORB等。匹配可以使用描述符匹配或光流法。 2. 运动估计:利用特征点的匹配关系,通过求解基础矩阵、本质矩阵或单应矩阵,估计相机之间的运动关系。这可以通过利用RANSAC算法排除错误的匹配点,并使用最小二乘法进行估计。 3. 姿态计算:由于我们估计的是相机相对位置和姿态变化,所以需要根据相机的运动关系,计算相机的姿态变化,通常使用旋转矩阵或四元数表示。 4. 位置估计:根据相机的姿态变化和运动关系,我们可以估计相机的位置变化,即相机的移动距离。 5. 可视化与评估:最后,我们可以将估计的相机轨迹和真实的相机轨迹进行可视化比较,并计算评估指标,如平均重投影误差、路面重建误差等。 在实现上述步骤时,我们需要考虑如何处理图像的畸变校正、图像的尺度恢复以及维护地图点等问题。此外,还需要处理局部地图的优化,如图像平面到空间3D点云的投影、地图点的融合和筛选等。 总之,视觉SLAM第3章作业的目标是实现一个基于特征的视觉里程计算法,通过对图像序列进行特征提取和匹配,估计相机之间的运动关系以及姿态变化,从而计算相机的位置和轨迹变化。这是一个非常重要且基础的SLAM算法,对于实现实时地图构建和定位导航系统具有重要意义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值