GPGPU 编程(CUDA / OpenGL GLSL)

GPGPU(通用GPU)编程利用图形处理器上数以千计的并行核心来执行非图形计算。稠密RGB-D SLAM是该领域的杀手级应用:像KinectFusion这样的流水线中的每一个阶段——逐像素深度滤波、逐体素TSDF融合、逐像素光线投射——都是对像素或体素的**易并行(embarrassingly parallel)**映射运算,正是GPU所擅长的。在CPU上根本无法实现30 Hz的实时稠密SLAM;一旦把这些循环搬到GPU上,它就变得可行了。

CUDA 简介

CUDA(NVIDIA的GPGPU平台)把GPU暴露为一个由大量轻量级线程组成的网格,它们都运行同一个核函数(kernel)

典型的SLAM核函数包括:深度图的双边滤波、由深度计算顶点图和法向图、TSDF融合(相机视锥内每个体素对应一个线程,将体素投影到深度图像中并更新加权滑动平均),以及为frame-to-model跟踪对TSDF进行光线投射。

**并行归约(parallel reduction)**是另一个关键模式:投影数据关联ICP通过对数十万个像素上的项 JiTJiJ_i^T J_iJiTriJ_i^T r_i 求和,来计算一个 6×66 \times 6 的高斯-牛顿系统。每个线程计算其局部乘积;共享内存中的树形归约按block求和;最后一次汇总(或使用原子操作)合并各block的结果。只有这个很小的 6×66 \times 6 系统会被拷回CPU并在那里求解。

作为计算载体的 OpenGL GLSL

在CUDA出现之前以及与之并存的时期,GPGPU是通过图形流水线并借助GLSL着色器来实现的,若干有影响力的RGB-D系统(尤其是ElasticFusion)就是这样编写的——它还有一个好处,即与CUDA不同,它是厂商中立的:

实践指南

对SLAM的意义

动手实践

相关条目