Semantic SLAM 文章收集

截至目前 Semantic SLAM (注意不是 Semantic Mapping)工作还比较初步,可能很多思路还没有打开,但可以预见未来几年工作会越来越多。语义 SLAM 的难点在于怎样设计误差函数,将 Deep Learning 的检测或者分割结果作为一个观测,融入 SLAM 的优化问题中一起联合优化,同时还要尽可能做到至少 GPU 实时。

这一篇博客我将尽力收集一些有代表性的文章,提供下载和简单思路的理解,但个人精力、能力有限也欢迎大家随时提供更多更好的文章。

1、《Probabilistic Data Association for Semantic SLAM》 ICRA 2017

screen-shot-2018-08-07-at-13-08-42

语义 SLAM 中的概率数据融合,感觉应该算开山鼻祖的一篇了。这篇也获得了 ICRA 2017 年的 Best Paper,可见工作是比较早有创新性的。文章中引入了 EM 估计来把语义 SLAM 转换成概率问题,优化目标仍然是熟悉的重投影误差。这篇文章只用了 DPM 这种传统方法做检测没有用流行的深度学习的检测网络依然取得了一定的效果。当然其文章中有很多比较强的假设,比如物体的三维中心投影过来应该是接近检测网络的中心,这一假设实际中并不容易满足。不过依然不能掩盖其在数学上开创性的思想。

文章下载:probabilistic-data-association-for-semantic-slam

2、《VSO: Visual Semantic Odometry》 ECCV 2018

screen-shot-2018-08-07-at-13-40-01

既然检测可以融合,把分割结果融合当然是再自然不过的想法,而且直观看来分割有更加细粒度的对物体的划分对于 SLAM 这种需要精确几何约束的问题是更加合适的。ETH 的这篇文章紧随其后投到了今年的 ECCV 2018。这篇文章依然使用 EM 估计,在上一篇的基础上使用距离变换将分割结果的边缘作为约束,同时依然利用投影误差构造约束条件。在 ORB SLAM2 和 PhotoBundle 上做了验证取得了一定效果。这篇文章引入距离变换的思路比较直观,很多人可能都能想到,不过能够做 work 以及做了很多细节上的尝试,依然是非常不容易的。但仍然存在一个问题是,分割的边缘并不代表是物体几何上的边缘,不同的视角这一分割边缘也是不停变化的,因此这一假设也不是非常合理。

文章下载:vso-visual-semantic-odometry

3、《Stereo Vision-based Semantic 3D Object and Ego-motion Tracking for Autonomous Driving》 ECCV 2018

screen-shot-2018-08-07-at-16-15-28

港科大沈邵劼老师团队的最新文章,他们的 VINS 在 VIO 领域具有很不错的开创性成果。现在他们切入自动驾驶领域做了这篇双目语义3D物体跟踪的工作,效果还是很不错的。在沈老师看来,SLAM 是一个多传感器融合的框架,RGB、激光、语义、IMU、码盘等等都是不同的观测,所以只要是解决关于定位的问题,SLAM 的框架都是一样适用的。在这篇文章中,他们将不同物体看成不同的 Map,一边重建一边跟踪。使用的跟踪方法仍然是传统的 Local Feature,而 VIO 作为世界坐标系的运动估计。语义融合方面,他们构造了4个优化项:

screen-shot-2018-08-07-at-16-13-39

最终取得了很好的效果。

演示地址:https://www.youtube.com/watch?v=5_tXtanePdQ
文章下载:stereo-vision-based-semantic-3d-object-and-ego-motion-tracking-for-autonomous-driving

4、《Long-term Visual Localization using Semantically Segmented Images》CVPR 2018

screen-shot-2018-08-17-at-13-54-51

这篇论文讲得比较有意思,它不是一个完整的SLAM系统,不能解决Mapping的问题。它解决的问题是,当我已经有了一个很好的3D地图后,我用这个地图怎么来定位。在传统方法中,我们的定位也是基于特征匹配的,要么匹配 Local Feature 要么匹配线、边等等几何特征。而我们看人在定位时的思维,其实人看不到这么细节的特征的,通常人是从物体级别去定位,比如我的位置东边是某某大楼,西边有个学校,前边有个公交车,我自己在公交站牌的旁边这种方式。当你把你的位置这样描述出来的时候,如果我自己知道你说的这些东西在地图上的位置,我就可以基本确定你在什么地方了。这篇文章就有一点这种意思在里边,不过它用的观测结果是分割,用的定位方法是粒子滤波。它的地图是三维点云和点云上每个点的物体分类。利用这样语义级别的约束,它仍然达到了很好的定位效果。可想而知这样的方法有一定的优点,比如语义比局部特征稳定等;当然也有缺点,你的观测中的语义信息要比较丰富,如果场景中你只能偶尔分割出一两个物体,那是没有办法work的。

文章下载:long-term-visual-localization-using-semantically-segmented-images

Posted in SLAM | Leave a comment

阿里云 MySQL 频繁挂掉的解决方法

timg

阿里云如果使用低配的服务器,随着访问量增大,上面的 MySQL 经常被系统停掉。除了升级内存硬盘等系统资源外,还可以使用如下方法尝试解决下:

1、降低数据库 InnoDB 引擎的缓冲区大小
找到 MySQL 的配置文件,一般在 /etc/mysql/my.cnf 或者 /etc/my.cnf 这种位置。编辑配置文件,修改或添加下列行:

2、添加 SWAP 分区
阿里云服务器默认不带 SWAP 分区,我们可以自己创建。请在 Shell 中依次执行以下命令:

说明:创建一个有 1024 个块的区,每块 1M,总的来说就是创建一个 1024M 的区;接下来将该区设为 swap 分区;再接着启用 swap 分区。

3、SWAP 分区自启动
添加下面这行到 /etc/fstab,让刚才创建的 SWAP 分区随系统重启:

4、重启 MySQL
使用如下命令重启 MySQL:

采用以上操作后可以观察下是否还有频繁挂掉的现象。如果仍然存在可以尝试以下更多操作限制 MySQL 连接数。

更多操作
除了上述这些,我们还可以进一步限制 MySQL 的连接数。还是修改 MySQL 配置文件,添加或者修改下面这一行:

如果这些操作都做了还是不行,请考虑升级你的机器内存、CPU等配置或者购买阿里云的数据库服务:)

参考文献
[1] https://my.oschina.net/cenchy/blog/740259
[2] https://oldtang.com/138.html

Posted in 后台技术 | Leave a comment

欧拉积分、中点积分与龙格-库塔积分

在 SLAM 系统中经常用到各种不同的数值积分方法,工程上最常见的有三种:欧拉积分(Euler method)、中点积分(Midpoint method)和龙格-库塔法积分(Runge–Kutta methods)。他们的区别就是如何用数值方法模拟一个斜率。这里简单总结如下:

一、欧拉积分

设有如下微分方程:

\(y'(t)=f(t,y(t))\)

并且 \(t_n\) 和 \(t_{n+1}\) 时刻的差为 \(t_{n+1} – t_n = \Delta t\),则欧拉积分定义为:

\(y_{n+1}=y_n + \Delta t\cdot f(t_n, y_n)\)

也就是说用 t 时刻的斜率作为整个 \(t\rightarrow t+\Delta t\) 时刻的导数。

二、中点积分

设有如下微分方程:

\(y'(t)=f(t,y(t))\)

并且 \(t_n\) 和 \(t_{n+1}\) 时刻的差为 \(t_{n+1} – t_n = \Delta t\),则显式中点积分定义为:

\(y_{n+1}=y_n + \Delta t\cdot f(t_n + \frac{1}{2} \Delta t, y_n + \frac{1}{2}\Delta t \cdot f(t_n, y_n))\)

隐式中点积分定义为:

\(y_{n+1}=y_n + \Delta t\cdot f(t_n + \frac{1}{2} \Delta t, \frac{1}{2}(y_n + y_{n+1}))\)

也就是说用 \(t_n + \frac{1}{2} \Delta t\) 时刻的斜率作为整个 \(t\rightarrow t+\Delta t\) 时刻的导数。

欧拉积分与中点积分都是一阶近似并没有本质不同,二者只是一阶导数所取位置不同,他们的性能也有差别,如下图所示,作为一阶积分近似方法来讲,中点积分有时会稍好一些(带来更快的收敛速度)。

图示为方程 \(y'=y, y(0)=1\) 的数值积分。蓝色为欧拉法,绿色为中点法,红色为精确解 \(y=e^{t}\)。所用步长为 h=1.0。
图示为方程 \(y’=y, y(0)=1\) 的数值积分。蓝色为欧拉法,绿色为中点法,红色为精确解 \(y=e^{t}\)。所用步长为 h=1.0。

三、龙格-库塔积分

龙格-库塔法(Runge-Kutta methods)是用于非线性常微分方程的解的重要的一类隐式或显式迭代法。在工程中最常用的是四阶龙格-库塔积分,也就是 RK4 积分,它的计算方式如下:

设有如下微分方程:

\(y'(t)=f(t,y(t))\)

并且 \(t_n\) 和 \(t_{n+1}\) 时刻的差为 \(t_{n+1} – t_n = \Delta t\),则 RK4 积分定义为:

\(y_{n+1}=y_n + \frac{\Delta t}{6} \cdot (k_1 + 2k_2 + 2k3 + k_4)\)

其中:

k1是时间段开始时的斜率;
k2是时间段中点的斜率,通过欧拉法采用斜率k1来决定y在点tn + h/2的值;
k3也是中点的斜率,但是这次采用斜率k2决定y值;
k4是时间段终点的斜率,其y值用k3决定。
其数学公式如下:

\(k_1 = f(t_n, y_n)\)
\(k_2 = f(t_n + \frac{\Delta t}{2}, y_n + \frac{\Delta t}{2} \cdot k_1)\)
\(k_3 = f(t_n + \frac{\Delta t}{2}, y_n + \frac{\Delta t}{2} \cdot k_2)\)
\(k_4 = f(t_n + \Delta t, y_n + \Delta t \cdot k_3)\)

从公式中可以看出两个中点的斜率具有更大的权重。

龙格-库塔法的示意图如下,它也是一种更高阶的逼近方法,通常也具有更好的逼近效果,总累计误差为 \(\Delta t^4\) 阶。

image399

RK4 算法在 SLAM 中也有很好的应用,特别是 VIO 中的预积分部分,比如张腾将王京的 VI ORB SLAM2 代码改成 RK4 积分后,精度也得到了一定的提升:
https://github.com/RomaTeng/ORB-VINS_RK4

当然 RK4 算法比起欧拉积分、中点积分计算量要大不少,SLAM 中影响精度的地方非常多,紧靠 RK4 改进其对于精度的提升程度通常也不会特别大,不过对于速度要求不高而精度要求很高的场合还是值得尝试的。

参考文献
[1] https://en.wikipedia.org/wiki/Euler_method
[2] https://en.wikipedia.org/wiki/Midpoint_method
[3] https://en.wikipedia.org/wiki/Runge%E2%80%93Kutta_methods
[4] https://www.maplesoft.com/support/help/maple/view.aspx?path=Student%2FNumericalAnalysis%2FRungeKutta

Posted in 数学基础 | Leave a comment

[C++11] C++11 中的回调

timg
之前写 Java 和 OC 非常羡慕其中的回调机制,之前的博客也介绍了一个使用 fast delegate 回调的 C++ 机制(参见:[C++] 简单高效的 delegate 方法)。现在 C++11 已经普及了,也同样支持了回调,虽然比高阶的语言 Java 和 OC 之类还稍显繁琐,但是基本功能已经都有了,这里简单说明如下。

1、回调基本函数
在 C++11 中使用 std::function 定义回调函数和参数类型,使用 std::bind 绑定回调函数。示例如下:

如果你的程序运行没有问题则会显示如下输出:

这就是回调函数定义和使用的基本方式。其中使用回调函数特性需要引入头文件:

定义带参数的回调需要使用 std::placeholders 来作为占位符,你可以根据参数多少任意增加 std::placeholders::_1、std::placeholders::_2 等等。

2、回调对象中的函数
示例代码如下:

如果你的程序运行没有问题则会显示如下输出:

3、回调中的多个参数和返回值

如果你的程序运行没有问题则会显示如下输出:

Posted in C++ | Leave a comment

GLog & GFlags 的安装

0、系统环境
Ubuntu 16.04
GCC 5.4

1、安装步骤
1)安装 GFlags
运行如下指令:

2)安装 GLog:
安装编译工具:

运行如下指令安装:

常见问题
1、使用 GLog 报错:libglog.a: error adding symbols: Bad value
在使用 GLog 的工程中遇到了如下错误:

产生该问题的可能原因是在 64位系统中,不能链接 GLog 生成动态库。修改方法是 GLog 需要使用如下方式编译,加入 -fPIC 编译选项:

代替:

2、错误:undefined reference to `google::FlagRegisterer::FlagRegisterer
如果你在编译 GLog 时遇到如下错误:

可以尝试先卸载 GFlags:

然后重新编译
另一种可能的解决方案是,在编译 GLog 时请使用:

代替:

3、错误:Make error: failed to link with libgflags.a
产生该问题的原因有可能是需要使用动态库方式编译 GFlags
将 GFlags 编译时选项改成动态库:

并重新编译 GFlags 和 GLog。

4、错误:something wrong with flag ‘flagfile’ in file ‘XXX.cc’
请参照 3 中的解决方案重新编译 GFlags 和 GLog。

Posted in 其他工具 | Leave a comment

VI ORB SLAM2 与 VINS 对比实验

一、实验说明

之前做了一些 VI ORB SLAM2 与 VINS Mono 性能的对比试验,由于 VI ORB SLAM2 并没有官方的版本,我们主要使用王京实现的一个版本(https://github.com/jingpang/LearnVIORB)来做测试(我们加入了双目 VIO 部分,但不论单目还是双目该版本实现与官方版本性能有较大差距)。VINS Mono (https://github.com/HKUST-Aerial-Robotics/VINS-Mono)是港科大开源的一个单目 VIO 算法,速度快而且性能不错,同样受到很大关注。本篇博客我们对二者进行了一些粗浅的实验对比。

说明如下:
1、实验主要指标为 RMSE:
\(RMSE = \sqrt{\frac{1}{n}\Sigma_{i=1}^{n}{\Big(\frac{d_i -f_i}{\sigma_i}\Big)^2}}\)

2、实验采用 EuRoC 测试集(https://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets)。以下是一些初步的实验结果,做一记录。因为没有深入研究和调试,试验次数也比较有限,不一定具有代表性。如大家有任何改进建议或者疑问欢迎留言。

二、实验结果

1、ORB 与 VI ORB 对比
以下表格是 ORB 与 VI ORB 两个实验对比结果:

EuRoC ORB Mono ORB Stereo VIORB Mono VIORB Stereo VIORB Mono Paper
RMSE RMSE RMSE RMSE RMSE
MH_01_easy 0.015 0.038 0.092 0.072 0.023
MH_02_easy 0.020 0.048 0.089 0.054 0.027
MH_03_medium x 0.038 0.091 0.053 x
MH_04_difficult 0.015 0.103 0.773 0.15 0.018
MH_05_difficult 0.017 0.056 0.286 0.099 0.024
V1_01_easy x 0.087 0.094 0.09 0.047
V1_02_medium 0.070 0.065 0.118 0.067 0.068
V1_03_difficult 0.066 0.085 x 0.075 0.073
V2_01_easy 0.071 0.064 0.242 0.07 0.071
V2_02_medium 0.081 0.06 0.104 0.118 0.087
V2_03_difficult 0.060 x x x 0.060

在以上表格中,均使用 RMSE 均方根误差作为评测指标,其中 ORB Mono 和 ORB Stereo 是原始 VO 版本的单目和双目 SLAM 算法;VIORB Mono 和 VIORB Stereo 是王京和我们修改后的 VIO 版本的单目和双目 SLAM 算法;最后 VI ORB Mono Paper 是作者论文中的算法。

从中可以看出,相对于作者论文中的算法效果,在我们所使用的开源版本中并没有完全达到。而王京的代码是基本实现了作者论文中的主要思想的,因此猜测差距主要来自于调参和一些论文中没有公布的细节。

双目 VIO 比单目 VIO 效果要更好也更稳定,不过加入 IMU 的版本均不如原始双目版本的精度。应该是原始 VO 的优化已经比较彻底,IMU 误差项的加入给优化结果造成了更多的不稳定性。这一点在作者论文中也能看到,加入 IMU 的版本并没有比原始单目精度更高。

2、VI ORB 与 VINS Mono 对比(开启闭环)
以下表格是 VI ORB 与 VINS Mono 两个实验对比结果:

EuRoC VIORB Mono VIORB Stereo VIORB Mono Paper VINS Mono
RMSE RMSE RMSE RMSE
MH_01_easy 0.092 0.072 0.023 0.06
MH_02_easy 0.089 0.054 0.027 0.066
MH_03_medium 0.091 0.053 x 0.135
MH_04_difficult 0.773 0.15 0.018 0.056
MH_05_difficult 0.286 0.099 0.024 0.058
V1_01_easy 0.094 0.09 0.047 0.098
V1_02_medium 0.118 0.067 0.068 0.061
V1_03_difficult x 0.075 0.073 0.064
V2_01_easy 0.242 0.07 0.071 0.052
V2_02_medium 0.104 0.118 0.087 0.174
V2_03_difficult x x 0.060 0.140

从中可以看出 VINS Mono 精度与 ORB 作者论文中的单目精度比是明显不如的,但是与开源版本比精度要高一些,比我们修改的双目版本略低。

VI ORB 是不能完全跑过全部测试集的,特别是快速运动的 V2_03_difficult 测试集结尾阶段会跟丢(原作者不丢),这一点不难理解,因为光流是比较简单的像素级别跟踪,是不容易丢失的,而 ORB 虽然是很弱的描述子依然比类似光流、模板匹配要严格很多,相对来说光流还是很易丢失的(我们简单地用二者的纯前端来实验了下,VINS的光流跟踪在所有测试集未发生跟丢的情况,ORB有跟丢)。

3、VI ORB 与 VINS Mono 对比(关闭闭环)
以上 2 小节中的测试均开启了闭环。虽然 VINS Mono 看起来也实现了比较好的精度,但是其本身对于闭环依赖较大,在关闭闭环后,VINS Mono 的性能是下降较多的:

EuRoC VIORB Mono Paper VIORB Stereo VINS Mono
No Loop Loop No Loop Loop No Loop Loop
RMSE RMSE RMSE RMSE RMSE RMSE
V1_02_medium 0.028 0.027 0.07 0.065 0.105 0.066
V2_02_medium 0.041 0.024 0.092 0.102 0.103 0.058
MH_04_difficult 0.217 0.087 0.288 0.243 0.300 0.174

三、实验小结

由于水平精力所限并未对实验结果进行详细分析,初步小结如下:

1、在没有闭环情况下,VINS Mono 精度应该略低于 VIORB,而在有闭环情况下,二者精度差距并不大。

2、由于开源 VIORB 版本并非官方实现,与作者版本肯定有很多不同之处,因此没有办法测试真实官方 VIORB 的性能,但基本可以看出对于 ORB SLAM2 这一框架来说,IMU 的引入主要是在快速运动时能够减少一些丢失,而精度上与 VO 相近或略有下降;

3、以光流做为前端的 VINS Mono 比描述子作为前端的 VIORB 具有更好的鲁棒性,在快速运动时更不容易丢失。因此在类似于无人机这样的场景,VINS 应该是比 VIORB 更好的选择;而对于精度要求较高、场景更大而运动较慢的场景,VIORB 仍然更合适;

4、不论是否引入 IMU,双目对于精度和鲁棒性都会有一定的提升,但目前 VINS 并没有提供双目的版本,精力所限也没有进行实现,相信如有同学用双目改造下 VINS 会有不错的效果;

5、除前端差别较大外(比如光流与ORB、滑窗与局部地图),虽然都是预积分二者后端算法与实现亦有较大不同(李代数与四元数参数化不同、积分方式不同、g2o与ceres实现差别等),因此造成性能差异的原因很复杂,水平所限无法进行更深入分析。如有大神进行过研究,还望批评指教。

Posted in SLAM | 16 Comments

Tmux 虚拟终端使用

在我们进行深度学习训练时,经常需要好几天,这时肯定是不能随便关闭窗口就让会话挂了的。我们可以采用很多方法来让会话后台运行,同样 Tumx 也是一个很方便的会话后台运行工具,我们可以在 Tmux 中更好地实现类似的效果。

screenshot-from-2017-12-27-11-06-14

一、什么是Tmux?
Tmux 是一个工具,用于在一个终端窗口中运行多个终端会话。不仅如此,你还可以通过 Tmux 使终端会话运行于后台或是按需接入、断开会话。

二、安装 Tmux
在 Ubuntu 上安装使用如下命令:

在 CentOS 上安装使用如下命令:

在 Mac 上安装使用如下命令:

或者下载源码编译安装:https://tmux.github.io/

三、使用 Tmux
1、新建会话
执行如下命令:

2、管理会话
1)查看会话列表
执行如下命令:

2)恢复会话
执行如下命令:

3)关闭会话
执行如下命令:

4)关闭全部会话
执行如下命令:

四、常用快捷键
使用如下快捷键时先按组合键 Ctrl + b,再松开按如下按键即可。这里仅列出常用的一些快捷键:

功能 快捷键 备注
切换会话 s
帮助列表 ? 按 q 退出
创建新窗口 c
列出所有窗口 w 按 q 退出
上一窗口 p
下一窗口 n
切换窗口 l
查找窗口 f
离开窗口(窗口保留) d
关闭窗口(窗口删除) &
水平分割窗格
垂直分割窗格 %
切换窗格 方向键
关闭窗格 x
滚动窗口 [ 进入复制模式,就可以用上下键或者鼠标滚轮进行翻页;使用Ctrl + c离开复制模式。

参考文献
[1] http://blog.jobbole.com/87584/
[2] https://gist.github.com/ryerh/14b7c24dfd623ef8edc7
[3] https://linux.cn/article-3952-1.html
[4] http://cenalulu.github.io/linux/tmux/

Posted in 其他工具 | Leave a comment

[ROS] 在 Ubuntu 16.04 系统上安装 ROS Kinetic

ROS 的发行版很多,之前的文章中我们介绍过在 Ubuntu 14.04 上安装 indigo
时光荏苒,Ubuntu 和 ROS 的长期支持版本都已经更新了,对于最新的 Ubuntu 16.04 通常情况下我们更多地使用其稳定版本 Kinetic。这篇文章就讲下 Kinetic 版本在 Ubuntu 下的安装。

0、安装环境:
Ubuntu 16.04 LTS

1、配置源:

使用 ROS 官方源:

使用国内镜像源:

设置Key:

PS:如果上述地址有问题,可以换成 hkp://pgp.mit.edu:80 或者 hkp://keyserver.ubuntu.com:80 重试。

更新安装包:

升级安装包(通常情况下不需要这一步):

2、安装 ROS:
推荐新手安装 Desktop-Full 版本,其他版本都有一些东西不全。安装命令如下:

或者直接点击:
点击这里

其他版本安装方式参见 [1]

3、初始化 rosdep:
使用以下命令初始化 rosdep:

4、环境配置:
为了方便每次系统重启时可以自动配置好 ros 相关环境,在 ~/.bashrc 文件末尾增加如下代码:

或者直接运行以下命令:

运行如下命令使配置生效:

这样以后每次重启都可以自动配置好环境了。

5、安装开发工具:
很多常见包都使用 rosinstall 等工具,使用如下命令安装:

到此安装结束,开始你的 ROS 之旅吧!

常见问题:
1、64位系统下:Some packages could not be installed. 错误
在很多64位机器上如果安装 ros-kinetic-desktop-full 会出现如下错误:
Reading package lists... Done
Building dependency tree
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
ros-kinetic-desktop-full : Depends: ros-kinetic-desktop but it is not going to be installed
Depends: ros-kinetic-simulators but it is not going to be installed
E: Unable to correct problems, you have held broken packages.

解决这一问题的方法一个是只安装核心库 ros-kinetic-desktop 或者可以尝试先卸载下面的组件:

2、错误:default sources list file already exists
在运行 sudo rosdep init 时可能出现如下错误:
ERROR: default sources list file already exists:
/etc/ros/rosdep/sources.list.d/20-default.list
Please delete if you wish to re-initialize

通常这是因为你之前曾经安装过 ROS 系统的某个版本,只需按照提示删除已经存在的初始化文件即可:

然后再重新运行 sudo rosdep init 就没有问题了。

3、错误:cannot download default sources list
在运行 sudo rosdep init 是可能出现如下错误:
ERROR: cannot download default sources list from:
https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list
Website may be down.

有可能是没有安装证书库所致,可以尝试如下命令:

其实这个文件也比较简单,这一行所做的命令只是下载这个文件放到 /etc/ros/rosdep/sources.list.d/20-default.list 下面,因此你也可以自行保存下面的内容:

然后你可以运行:

参考文献:
[1] http://wiki.ros.org/kinetic/Installation/Ubuntu

Posted in ROS | Leave a comment

使用 evo 工具评测 VI ORB SLAM2 在 EuRoC 上的结果

screen-shot-2017-11-02-at-16-56-19
最近把 ORB SLAM2 作者融合 IMU 版本的算法 《Visual-Inertial Monocular SLAM with Map Reuse》 论文读了一遍,作者没有开放源代码,所以我是使用王京实现的一版开源代码(https://github.com/jingpang/LearnVIORB)进行了一些实验。LearnVIORB 代码有一些崩溃的 bug,在 Mac 上面编译有问题,不过实现了作者文中的基本思想,是非常好的一份实现。

由于只有 EuRoC 测试集有 VIO 的数据,我使用了 EuRoC 测试集进行测试,不过在实际运行中遇到了几个问题。

0、系统环境
macOS Sierra v10.12.6

1、evo 安装
以下 1) 或 2)任选一种方式即可:

1)使用 pip3 安装
执行如下命令:

2)使用源代码安装:
执行如下命令:

2、修改 System 保存 TUM 观测值
由于 ORB SLAM2 并没有提供单目相机或者 VIO 保存 EuRoC 形式数据的方式,这里我们仍然使用 SaveTrajectoryTUM 方法保存观测值。
不过需要注意的是,由于 SaveTrajectoryTUM 不允许保存单目相机数据,我们修改一下创建一个新的函数 SaveTrajectory 用来保存单目 VIO 数据。

1)在 System.h 中添加函数头:

2)在 System.cc 中添加函数体:

3、修改 VIO 测试代码 EuRoC 时间戳 (可选)
在我们运行时由于 EuRoC 时间戳超过了 int64 的位数,所以如果你不是 ROS 环境而是使用自己写的 main 函数来读取 imu 时间戳会有问题。
这里面我的处理方式是将时间戳的前五位舍弃,保留后面的内容,然后再乘以 \(1e-9\) 转换成以s为单位的数据。相关代码参考:

以及:

最后在 VIO 运行完毕后使用这一函数保存数据到 Data/EuRoC/CameraTrajectory.txt。

4、修改 EuRoC 真值的时间戳(可选)
如果你像我一样为了防止数据溢出范围做了步骤3中的操作,则你同样需要对 EuRoC 的真值进行相应的修改,我这里提供了一个简单的代码进行这一操作。
下载地址:convert_euroc_csv-py

代码如下:

然后只要运行这一转换脚本即可:

5、使用 evo 进行评估
按照步骤3 中操作,我们得到了运行的结果 Data/EuRoC/CameraTrajectory.txt,按照步骤4 中操作,我们得到了转换时间戳后的真值 Data/EuRoC/V1_01_easy/state_groundtruth_estimate0/data2.csv。

使用以下命令来运行 evo_ape 评估 Average Pose Error:

其中 evo_ape 是评估工具,euroc 表示后面输入参数是 euroc 的真值格式。我们输入的就是类似 TUM 的形式即可。
更详细的使用说明可以参见 evo 的官方说明:
https://github.com/MichaelGrupp/evo

运行后得到如下结果:
screen-shot-2017-11-02-at-16-44-28

并且生成了如下两幅图:
wechatimg431
wechatimg432

可以看出我们的 VIO 曲线拟合基本正确,但是最大误差大约在 0.3m 左右,平均误差 0.14m 左右。这一误差还是不小的,与作者论文中的结论还有一些差距,应该还需要一些细致的优化工作。

可能有同学会疑惑,EuRoC 数据集不是坐标系为 IMU/Body 坐标系嘛?为什么我们没有输入 \(T_{CB}\) 的标定参数呢?原来,在 evo 框架中,并不关心标定问题,它使用了 Umeyama 算法对两个轨迹做拟合,用拟合的结果来进行评估。

好了,evo 评估 VI ORB SLAM 的真值方法就到这里,总体感觉这一工具还是非常实用的,对于做 VSLAM 研究的人来说会有很大帮助。

常见问题:
1、错误:You are using pip version 9.0.3, however version 10.0.1 is available.
如果在安装 evo 时遇到如下问题:
You are using pip version 9.0.3, however version 10.0.1 is available.
并且无法使用 pip(比如网络差)升级命令:

或者:

进行升级。请尝试以下步骤

1)在官网下载 pip:
https://pypi.org/project/pip/#files

下载其中的 tar.gz 包,或者下载 pip-10-0-1-tar

2)解压后进入 pip 所在目录运行:

参考文献:
https://michaelgrupp.github.io/evo/

Posted in SLAM | 5 Comments

[Git] Git 使用技巧整理

1、批量删除指定文件名的所有文件
可以执行如下文件,其中 ‘*.c’ 是要删除文件的通配符,请自行修改:

2、使用多个 SSH Key
1)生成一个公司用的SSH-Key
运行如下命令,使用默认设置:

在~/.ssh/目录会生成id-rsa和id-rsa.pub私钥和公钥。 我们将id-rsa.pub中的内容粘帖到公司gitlab服务器的SSH-key的配置中。

2)生成一个github用的SSH-Key
运行如下命令,注意这次保存到 ~/.ssh/github

在~/.ssh/目录会生成github-rsa和github-rsa.pub私钥和公钥。 我们将github-rsa.pub中的内容粘帖到github服务器的SSH-key的配置中。

3)添加私钥
运行如下命令:

如果执行ssh-add时提示”Could not open a connection to your authentication agent”,可以现执行命令:

然后再运行ssh-add命令。

# 可以通过 ssh-add -l 来确私钥列表

# 可以通过 ssh-add -D 来清空私钥列表

4)修改配置文件
在 ~/.ssh 目录下新建一个config文件

添加内容:

5)目录结构
screen-shot-2017-10-12-at-14-55-37

6)测试
运行如下命令:

输出
Hi skylook! You've successfully authenticated, but GitHub does not provide shell access.

就表示成功的连上github了.也可以试试链接公司的gitlab.

参考文献:
https://my.oschina.net/stefanzhlg/blog/529403

Posted in Git | Leave a comment
Optimization WordPress Plugins & Solutions by W3 EDGE