本文将介绍如何手搓光线追踪。先上效果图: 代码仓库:handcraft-MVS。 实现了: 漫反射 基于菲涅尔定律的折射与反射 允许多光源 圆形物体 TODO: 长方体物体 另起一篇实现光栅化
Handcraft Ray Tracing
Handcraft Your Own Matrix Library
视觉惯性里程计的前后端的一些计算,涉及矩阵的运算,一些问题的求解,最终都会转变为方程组的求解, 也与矩阵的运算或线性代数相关,想要从零实现一个 VIO 的前端,主要涉及到 多视角几何(MVS), 而 MVS 中的问题的求解绝大部分也都是转换为方程组的求解,因此从零实现一个矩阵运算库就变成了必要条件。 本文将记录笔者用 C++ 实现一个简单的矩阵运算库(类似于 Eigen 库)的过程。 代码仓库:handcraft-MVS。 实现的功能有: 矩阵多种方式的构造(初始化)与析构 矩阵的操作或运算 加减乘,以及标量除法 赋值 矩阵的转置、L2...
Coding isn't Programming
Coding isn’t Programming(Leslie Lamport) 算法不应该被用特定的编程语言来表示, 应该关注想法,而不是使用哪种语言。 这是一种简化,因为具体的编程语言需要考虑 高效的执行 和 大型程序的组织 考虑一种比较难的场景,编写并发(concurrancy)的算法和程序。并发算法和程序都很难写,但算法更简单。 所以,我们需要抽象(abstraction),合理的抽象可以帮助我们把注意力放在真正重要的地方上,减少思考的负担, 但这是在有思考的前提下。引用 Lamport 的话: thinking before you code thinking...
Back to the Basics! Essentials of Modern C++ Style
在现代 C++ 中应该使用的一些默认写法。 tl;dr: loops: for( auto& e: c ) { ... use(e); ... } pointers & references: 在参数传递中默认使用原始的 */&...
Extraction, Update and Optimization of Domain Diretions and Structual Lines
本文将介绍在现有的里程计上,如何加入主方向的提取与结构线筛选、主方向的迭代更新、后端中的主方向约束因子。 整体框图如下: 前置内容 2D 线的表示、3D 线的表示以及之间的转换(投影:3D->2D;三角化:2D->3D)见 TODO 对环境结构的假设 考虑的环境是结构化环境,存在一个垂直主方向,多个水平主方向,多个倾斜主方向。所有水平主方向和垂直主方向垂直, 每个倾斜主方向都和某个水平主方向(可以不是同一个水平主方向)垂直。 主方向的表达 什么是主方向呢?我们可以认为,许多条平行的 3D 线的共同方向便是主方向(Domain Direction, 简称 DD) 因此对于一个 3D 空间中的方向,我们可以自然地将其表示为...
Representation of Paths
起始配置 和 目标配置之间的连续曲线,称为路径: \[y: [0, 1] \rightarrow \mathcal{C}\] $q_I = y(0)$ 是起始配置(initial configuration),$q_G = y(1)$ 是目标配置(goal configuration)。configuration 的含义是机器人某一时刻的一种可能的状态,例如机械臂各个关节的角度、速度、角速度等。 有许多类型的函数可以刻画一条曲线,下面介绍在机器人领域中最常用的三种类型。 分段线性表示(Piecewise-linear...
What is Motion Planning
什么是运动规划(motion planning) 运动规划:使用可计算的方法为机器人生成一套运动行为,以完成给定的任务。 Motion planning: the use of computational methods to generate a robot’s motion to achieve a specified task....
Transformer is a clustering machines
2012 2015 2018 2019 2020 2022 2023 Alex Res GPT GPT2 GPT3 chatGPT GPT4 BERT Chinchilla Llama2 Claude2 ResNets $x_0$...
Equivalence between Kalman Filter and Factor graph
本文将因子图优化和卡尔曼滤波联系起来:卡尔曼滤波等价于因子图优化在线性系统下只优化最新状态。 我们最根本的目标,是在给定测量值 $z$,找出使得联合概率密度函数 $p(x, z)$ 最大的 $x$。而 $p(x, z)$ 可以进行分解,以便我们写出具体的形式: \[p(x,z) = p(z|x)p(x)\] 假如我们考虑两个状态 $x_1, x_2$,以及一个测量 $z$(对 $x_2$ 的测量),则联合概率密度函数可以写为: \[p(x_2,...
AirSLAM Code Reading
代码实现 首先看一下 airslam 代码的整体思路。 对于视觉惯性里程计,其核心是三个并行的线程: ->(处理msg)->(前端)->(后端)-> 使用 生产者-消费者 的框架实现数据的有向流动。例如 map_builder.AddInput(data) 往里加数据,然后另外开一个线程消耗数据,提取特征,最后再开一个线程进行特征追踪匹配和后端优化。 参数的初始化 对于参数的配置,airslam 在 read_config.h 内定义了许多结构体,其中有三个最顶层的结构体,对应 airslam 的三大模块的参数,分别是: VisualOdometryConfigs MapRefinementConfigs...
Total views. cowboys. Hits