【格式有些瑕疵 ; 部分借鉴网上大佬,如有侵权请及时告知】
预备知识:介绍本书基本信息; 课后题是一些自测题。
1. 有线性方程Ax=b, 若已知A,b, 需要求解x, 则该如何求解? 这对A和b有哪些要求? 提示:从A的维度和秩角度分析
解:
A x = b 1. r a n d ( A ) < r a n d ( A ∣ b ) , 则 无 解 。 2. r a n d ( A ) = r a n d ( A ∣ b ) = n , 则 有 唯 一 解 3. r a n d ( A ) = r a n d ( A ∣ b ) < n , 则 有 无 穷 解 Ax=b \\ 1.rand(A) < rand(A|b) , 则无解。\\ 2.rand(A) = rand(A|b) =n , 则有唯一解 \\ 3.rand(A) = rand(A|b) < n, 则有无穷解 Ax=b1.rand(A)<rand(A∣b),则无解。2.rand(A)=rand(A∣b)=n,则有唯一解3.rand(A)=rand(A∣b)<n,则有无穷解
2. 高斯分布?
参考附录A.1
3. C++
课程入门:看的黑马程序员
书籍使用:《C++ Primer》,看完一遍当字典用即可。
IDE推荐:写程序用VScode,ubuntu编译用CLion。
编译风格:建议看下谷歌等大厂代码编译风格要求,养成良好的编程习惯。
4.怎么书写c++程序
这个看下相关入门即可。 如菜鸟c++等一些教程
include:.h文件
src: .cpp 文件, 其中一个含main
5. c++11标准
了解不多,但一些关键点有用的。 c++14 、c++17等。
** 6. 7. 8.Linux **
推荐大家去网上找下 《linux-鸟哥》,比较全面,但我更倾向于遇到再查
Linux目录结构:(关注几个主要的即可)
- /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)文件,诸如日志或数据库等
Linux安装程序的几种方式:
- 源码安装【可以随意配置,但注意配置步骤等】
- rpm包安装 、deb包安装
- apt-get安装 (debian,ubuntu)【常用】
等等众多,不一一阐述,用到再查也可。
**9. 学习Vim **
vim使用不多,一般用gedit等文本编辑器打开。 不过vim也避免不了使用,熟悉常用的几个指令也可。
i (进入编辑模式)
esc(退出至命令模式)
wq(保存)
q(退出)
q!(强制退出)
初识SLAM:视觉SLAM框架的组成 ; 在Linux下搭建环境并编译运行一个程序 ; 掌握cmake的基本用法。
Cmake书籍推荐: CMake Practice.pdf,系统学习或者当字典都是不错的。
1.1. 经典的视觉SLAM框架,以及每部分作用:
视觉里程计只关系相邻图像的运动,所以误差比较大,容易出现累计漂移问题。解决思路:回环检测-检测是否原先到的过的位姿 ; 后端优化-主要解决SLAM中的噪声问题。 建图-分类以应对不同的需求。
1.2. SLAM的数据表述
运 动 方 程 : x k = f ( x k − 1 , u k , w k ) 观 测 方 程 : z k , j = h ( y j , x k , v k , j ) x : 位 姿 ; u : 传 感 器 的 输 入 ; w , v 分 别 代 表 各 自 过 程 中 的 噪 声 ; z : 观 测 数 据 ( 路 标 点 在 传 感 器 中 的 表 示 , 如 像 素 点 等 ) ; y : 路 标 点 运动方程: x_k = f(x_{k-1}, u_k,w_k) \\ 观测方程:z_{k,j} = h(y_j,x_k,v_{k,j}) \\ x:位姿 ; u:传感器的输入;w,v分别代表各自过程中的噪声;\\ z:观测数据(路标点在传感器中的表示,如像素点等); y:路标点 运动方程:xk=f(xk−1,uk,wk)观测方程:zk,j=h(yj,xk,vk,j)x:位姿;u:传感器的输入;w,v分别代表各自过程中的噪声;z:观测数据(路标点在传感器中的表示,如像素点等);y:路标点
SLAM的过程可以建模为:已知u、z,求解x(运动=定位)、y(路标点=建图)的过程。
1.3. 实践:编程基础
理解每一步的含义即可。
1.阅读文献[1],[14]【待续】
2.综述类文献[9,15~18]【待续】
3. g++
借鉴网上。
-o参数:g++ main.cpp -o main
-o:output(输出)的意思,指将main.cpp输出为main。如果不指名具体的执行文件名(g++ main.cpp),将会在同级目录下生产a.out文件
-E参数:g++ -E main.cpp -o main.i
-E:prEprocessing(预处理)的意思,该过程完成:宏替换、去注释、头文件展开、添加行号等动作
-S参数:g++ -S main.i -o main.s
-S:aSsemble(汇编)的意思。该过程将源码变为汇编代码
-c参数:g++ -c main.s -o main.o
-c:compile(编译)的意思。该过程将一系列的汇编代码,变成机器代码
当然我们可以在整个编译链接阶段加入额外的参数进行控制,如:
-g,产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。
-O,对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。
-O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。
-Idirname,将dirname所指出的目录加入到程序头文件目录列表中,是在预编译过程中使用的参数。C程序中的头文件包含两种情况∶
更改生成的文件名称
g++ old_name.cpp -o new_name
4. cmake编译过程
5. 加入语法错误
6. 忘了链接库
7. 阅读《cmake实践》
8. 完善Hello小程序
主要考察1.如何生成库 2.如何查找库 3.如何安装库。
明确以上目的,就方便完成任务了。
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)
9.阅读其他cmake教材
cmake会在接下来一段时间,一直使用,所以学会基本的操作,遇到啥查啥并总结即可。
10. KDevelop的特性
说实话,CLion比KDevelop用起来舒服多了。
11.略