随着自主机器的发展,我们可以在生活中经常看到自主机器的应用。有传统应用的仓库工厂 amr、机械臂、银行酒店里面的服务机器人、家庭机器人、无人物流车、自主矿卡等等。不同的自主机器,软件架构的方案也不一样,但核心的模块定位、导航、感知、控制等都是相通的。
定位模块是自主机器最核心的模块之一,定位又包括全局定位和局部定位,对于自主机器,其精度需要达到厘米级别。
本文我们将讨论全局定位,即确定自主机器在全局下的位置。传统的低速自主机器,类似于 amr 等,其采用的定位方式通常以 slam(simultaneous localization and mapping)的方法进行同时建图和定位,但是该方法实现代价高、难度大,并不适用于室外自主机器——类似于无人物流车、园区接驳车等的实时高精度定位需求。这些室外自主机器行驶速度快、距离远、环境复杂,使得 slam 的精度下降,同时远距离的行驶将导致实时构建的地图偏移过大。因此,如果在已有高精度的全局地图的情况下进行自主机器的定位,将极大的简化该问题。
因此,将问题分为独立的两部分:建图 mapping 和定位 matching。ndt 是一种点云配准算法,可同时用于点云的建图和定位。
cuda-ndt
正态分布变换算法(normaldistributions transform, ndt)同 icp 算法的功能一致,即,用于计算两帧点云数据之间的坐标变换矩阵,从而能够使不同的坐标下的点云数据合并到同一个坐标系统中。不同的是 ndt 算法对初值不敏感,且不需要进行对应点的特征计算,所以速度较快。ndt 算法使用应用于 3d 点统计模型的标准优化技术来确定两个点云之间最可能的配准。
ndt 算法和 icp 算法可以结合使用,以提高配准精度和速度。首先,ndt 算法可用于粗配准,得到转换参数;然后使用 icp 算法结合参数进行精细配准。为了改进 ndt 算法在 nvidia jetson 上的性能,我们推荐使用基于 cuda 加速的 cuda-ndt。
使用 cuda-ndt
以下是 cuda-ndt 的使用实例。我们需要初始化相关的类对象,设置相关的参数,并调用接口函数。
cudandt ndttest(npcountm, nqcountm, stream);ndttest.setinputsource(source);ndttest.setinputtarget(target);ndttest.setresolution(resolution);ndttest.setmaximumiterations(nr_iterations);ndttest.settransformationepsilon(epsilon);ndttest.setstepsize(step_size); ndttest.ndt(cloud_source, npcount, cloud_target, nqcount, guess, transformation_matrix, stream);
cuda-ndt 计算的输出是 transformation_matrix,代表的含义如下:
源点云 (p)* transformation_matrix = 目标坐标系的点云 (q)
因为激光类型的输出点云的数量为固定值,所以 cuda-ndt 在输出化的时候,要求输入两帧点云的最大数量,从而分配计算资源。
class cudandt{public: /* npcountm and nqcountm are the maximum of count for input clouds they are used to pre-allocate memory. */ cudandt(int npcountm, int nqcountm, cudastream_t stream = 0); ~cudandt(void);void setinputsource (void *source);void setinputarget (void *target);void setresolution (float resolution);void setmaximumiterations (int nr_iterations);void settransformationepsilon (double epsilon);void setstepsize (double step_size); /* cloud_target = transformation_matrix * cloud_source when the epsilon of transformation_matrix is less than threshold, the function will return transformation_matrix. input: cloud_source, cloud_target: data pointer for points cloud npcount: the points number of cloud_source nqcount: the points number of cloud_target guess: initial guess of transformation_matrix stream: cuda stream output: transformation_matrix: rigid transformation matrix */ void ndt(float *cloud_source, int npcount, float *cloud_target, int nqcount, float *guess, void *transformation_matrix, cudastream_t stream = 0); void *m_handle = null;};
经过 cuda 加速的 ndt 速度对比微加速版本提升了 4 倍左右,请参考下表的性能对比,经过 ndt 匹配的点云效果对比请参考图 1 和图 2。
cuda-ndt
pcl-ndt
count of
points cloud
7000
7000
cost time(ms)
34.7789
136.858
fitness_score
0.538
0.540
cuda-ndt 与 pcl-ndt 的性能对比
开始使用 cuda-ndt
我们希望通过本文介绍使用 cuda-ndt 从而获得更好的点云注册性能。
因为 ndt 在 nvidia jetson 上无法使用 cuda 进行点云的加速处理,所以我们开发了基于 cuda 的 cuda-ndt。
复制链接,获得相关库和实例代码。
https://github.com/nvidia-ai-iot/cuda-pcl/tree/main/cuda-ndt
电气故障检修方法经验总结分享
运动控制系统的核心应用
电磁干扰测试探头的选择
我们究竟能否阻止机器人和AI战胜人类自身吗?
协同运力、算力、存力,加速迈向智能世界
CUDA-NDT的定义与使用实例
为什么电子设备开启护眼模式后,屏幕不是绿色却是黄色?
便携式负(氧)离子检测仪的工作原理及优势特点介绍
交流接触器的作用和工作原理 交流接触器的接线方法
AI是互联网下半场的黎明 只有百度华为真在做
用嵌入式系统作为中间件的现场总线远程监控系统
亚马逊机器人弄伤员工,机器事故该如何避免?【快拧】
iPhone两极分化, iPhone 8惨淡和硕忧,iPhone X加线富士康喜
天合光能推出新一代215kWh储能一体机Potentia蓝海
如何判断电子产品的传导电压法是否超标
明基BL2381T爱眼显示器怎么样 值不值得买
有机电解质如何提升锂硫电池稳定性的技术研究分析
Excel中的一些概念
行业政策利好,陕西源杰科技迎广阔发展空间
工业电机驱动IGBT过流和短路保护的问题及处理方法