0%

2019年12月16日 下午5:29
微鉴道长SLAM学习笔记(目录)
SLAM14讲学习笔记(一) 李群李代数基础
SLAM14讲学习笔记(二)相机模型总结
SLAM14讲学习笔记(三)非线性优化基础
SLAM14讲学习笔记(四)视觉里程计(特征点法)和重难点总结
SLAM14讲学习笔记(五)视觉里程计(光流法和直接法)和对于雅克比矩阵的理解
SLAM14讲学习笔记(六)后端(最难一章:卡尔曼滤波器推导、理解以及扩展)
SLAM14讲学习笔记(七)后端(BA与图优化,Pose Graph优化的理论与公式详解、因子图优化)
SLAM14讲学习笔记(八)回环检测
SLAM14讲学习笔记(九)单目稠密重建、深度滤波器详解与补充
SLAM14讲学习笔记(十)建图与SLAM开源方案对比
SLAM14讲学习笔记(十一)g2o图优化中的要点与难点(前端VO中雅克比矩阵的定义)
SLAM14讲学习笔记(十二)ch9设计前端(代码详述)
SLAM14讲学习笔记(十三)ch10 后端1(代码详述)
SLAM14讲学习笔记(十四)ch13 建图(代码详述带注释)
SLAM14讲学习笔记(十五)卡尔曼滤波器的直观理解
SLAM就业问题汇总复习(持续更新中)

2019年12月15日 下午11:07
linux lsof命令详解 - 星火spark - 博客园
系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

2019年12月15日 下午10:56
正态分布为什么常见? - 阮一峰的网络日志

  1. 根据中心极限定理,如果一个事物受到多种因素的影响,不管每个因素本身是什么分布,它们加总后,结果的平均值就是正态分布。
    1. 举例来说,人的身高既有先天因素(基因),也有后天因素(营养)。每一种因素对身高的影响都是一个统计量,不管这些统计量本身是什么分布,它们和的平均值符合正态分布。(注意:男性身高和女性身高都是正态分布,但男女混合人群的身高 不是 正态分布。)
    2. 许多事物都受到多种因素的影响,这导致了正态分布的常见。
  2. 读到这里,读者可能马上就会提出一个问题:正态分布是对称的(高个子与矮个子的比例相同),但是很多真实世界的分布是不对称的。
    1. 比如,财富的分布就是不对称的,富人的有钱程度(可能比平均值高出上万倍),远远超出穷人的贫穷程度(平均值的十分之一就是赤贫了),即财富分布曲线有右侧的长尾。相比来说,身高的差异就小得多,最高和最矮的人与平均身高的差距,都在30%多。
    2. 原来,正态分布只适合各种因素累加的情况,如果这些因素不是彼此独立的,会互相加强影响,那么就不是正态分布了。一个人是否能够挣大钱,由多种因素决定,但这些因素都不是独立的,会彼此加强。如果出生在上层家庭,那么你就有更大的机会接受良好的教育、找到高薪的工作、遇见好机会,反之亦然。也就是说,这不是 1 + 1 = 2 的效果,而是 1 + 1 > 2

2019年12月15日 下午10:49
如何降低软件的复杂性? - 阮一峰的网络日志

  1. 复杂性的来源主要有两个:代码的含义模糊和互相依赖。
    • 模糊指的是,代码里面的重要信息,看不出来。依赖指的是,某个模块的代码,不结合其他模块,就会无法理解。
    • 复杂性的危害在于,它会递增。你做错了一个决定,导致后面的代码都基于前面的错误实现,整个软件变得越来越复杂。”我们先把产品做出来,后面再改进”,这根本做不到。
  2. 复杂性的隔离
    • 降低复杂性的基本方法,就是把复杂性隔离。“如果能把复杂性隔离在一个模块,不与其他模块互动,就达到了消除复杂性的目的。”
  3. 接口和实现:
    • 模块分成接口和实现。接口要简单,实现可以复杂。
  4. 减少抛错
    • 有些软件设计者喜欢抛错,一遇到问题,就抛出一个 Exception。这也导致了复杂性,用户必须面对所有的 Exception。”反正我告诉你出错了,怎么解决是你的事。”
    • 正确的做法是,除了那些必须告诉用户的错误,其他错误尽量在软件内部处理掉,不要抛出。

2019年12月14日 上午11:46

Python 异步编程入门 - 阮一峰的网络日志

  1. 有了 多线程(threading)和多进程(multiprocessing) ,就没必要一定支持异步了。如果一个线程(或进程)阻塞,新建其他线程(或进程)就可以了,程序不会卡死。
  2. 但是,多线程有”线程竞争”的问题,处理起来很复杂,还涉及加锁。对于简单的异步任务来说(比如与网页互动),写起来很麻烦。
  3. asyncio 模块最大特点就是,只存在一个线程,跟 JavaScript 一样。
    由于只有一个线程,就不可能多个任务同时运行。
    • asyncio 是”多任务合作”模式(cooperative multitasking),允许异步任务交出执行权给其他任务,等到其他任务完成,再收回执行权继续往下执行,这跟 JavaScript 也是一样的。
    • 由于代码的执行权在多个任务之间交换,所以看上去好像多个任务同时运行,其实底层只有一个线程,多个任务分享运行时间
    • 表面上,这是一个不合理的设计,明明有多线程多进程的能力,为什么放着多余的 CPU 核心不用,而只用一个线程呢?但是就像前面说的,单线程简化了很多问题,使得代码逻辑变得简单,写法符合直觉。
  4. asyncio 模块在单线程上启动一个事件循环(event loop),时刻监听新进入循环的事件,加以处理,并不断重复这个过程,直到异步任务结束。事件循环的内部机制,可以参考 JavaScript 的模型 ,两者是一样的。
  5. 总结:
    • 最关键的:其实底层只有一个线程,多个任务分享运行时间
    • 让我不经思考,程序本身就是串行执行的,异步编程也是串行执行。也就说,所谓的异步编程是可以直接转化为串行的程序的
    • 那么,异步编程的意义是什么❓
      • 编程单元,这个概念是我自己编的,意思是虽然我们正常的程序就可以完成异步编程的工作,但是使用异步编程之后,我们还可以保证依然是已函数为我们编程的单元,使代码更加调理,自己编程的时候也更容易将复杂功能抽象模块化