kitti点云地图拼接

本文介绍了Kitti数据集的坐标系和点云存储方式,并详细讲解了如何进行点云拼接,包括从相机坐标系到激光雷达坐标系的转换、bin格式点云的读取,以及基于ROS和MATLAB的点云拼接代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言:这段时间在学习坐标系变换相关的知识,同时尝试了利用kitti公开点云数据集以及对应的真实位姿,拼接出全局地图,如下图所示,我采用了kitti点云数据集的00序列来测试拼接地图。下面大致记录下点云拼接过程以及基于C++和Matlab的拼接代码,备忘。

1. 关于kitti数据集以及坐标系

kitti数据集是一个为立体,光流,视觉里程计,3D目标检测和3D跟踪等任务而开发采集的基准数据集。它利用了Annieway自动驾驶平台,配备了1个OXTS RT 3003,1台Velodyne HDL-64E激光扫描仪,2台Point Grey Flea 2(FL2-14S3M-C)一百四十万像素灰度相机,2台一百四十万像素彩色摄像头,以及4个4~8mm的可变焦镜头Edmund Optics NT59-917。根据 Are we ready for Autonomous Driving? The KITTI Vision Benchmark Suite 这篇文章的描述,相机,激光扫描仪以及定位系统全部都经过了校准和时间同步,且里程计的真值由GPS/IMU定位单元的输出投影到校准后的左侧相机得到。也就是说,在kitti提供的里程计真值是基于相机坐标系的,而根据上面kitti链接中的介绍,相机坐标系为:向前为z,向右为x,向下为y;而velodyne激光扫描仪坐标系则是:向前x,向左y,向上z。(需要注意的是,点云数据是在激光雷达坐标系下,而真值则是在相机坐标系下。)
在从官网上下载的真值位姿具有以下格式(kitti总共有编号为00~20的21个数据集序列,其中只有00~10序列公开了真值,序列11~20仅用来做为算法评估使用):

1.000000e+00 9.043680e-12 2.326809e-11 5.551115e-17 9.043683e-12 1.000000e+00 2.392370e-10 3.330669e-16 2.326810e-11 2.392370e-10 9.999999e-01 -4.440892e-16
9.999978e-01 5.272628e-04 -2.066935e-03 -4.690294e-02 -5.296506e-04 9.999992e-01 -1.154865e-03 -2.839928e-02 2.066324e-03 1.155958e-03 9.999971e-01 8.586941e-01
9.999910e-01 1.048972e-03 -4.131348e-03 -9.374345e-02 -1.058514e-03 9.999968e-01 -2.308104e-03 -5.676064e-02 4.128913e-03 2.312456e-03 9.999887e-01 1.716275e+00
9.999796e-01 1.566466e-03 -6.198571e-03 -1.406429e-01 -1.587952e-03 9.999927e-01 -3.462706e-03 -8.515762e-02 6.193102e-03 3.472479e-03 9.999747e-01 2.574964e+00

它们每一行有12个数据,它们记录了每一个时刻的位置和方向,对于上面的每一行, p 0 , p 1 , p 2 , . . . , p 11 p_0, p_1, p_2, ... , p_{11} p0,p1,p2,...,p11; 它们与(旋转+平移)欧式矩阵对应关系如下:
T = [ p 0 p 1 p 2 p 3 p 4 p 5 p 6 p 7 p 8 p 9 p 10 p 11 0 0 0 1 ] = [ R 3 × 3 t 3 × 1 0 1 × 3 1 ] (1.1) T = \left[\begin{matrix} p_0 & p_1 & p_2 & p_3 \\ p_4 & p_5 & p_6 & p_7 \\ p_8 & p_9 & p_{10} & p_{11} \\ 0 & 0 & 0 & 1 \end{matrix}\right] = \left[\begin{matrix} R_{3\times3} & t_{3\times1} \\ 0_{1\times3} & 1 \end{matrix}\right] \tag{1.1} T=p0p4p80p1p5p90p2p6p100p

### SLAM中稠密建图的点云拼接方法与实现 在SLAM系统中,稠密重建通常依赖于稀疏地图的关键帧信息来完成点云拼接。以下是关于如何通过关键帧数据进行点云拼接的具体方法和实现细节。 #### 关键帧的选择与处理 为了减少冗余并提高效率,在稠密重建过程中仅使用部分选定的关键帧作为输入[^1]。这些关键帧包含了相机姿态(位置和方向)、深度信息以及图像特征描述符等内容。通过对每一对相邻或者具有重叠区域的关键帧执行特征匹配操作可以获取它们之间的相对变换关系[^2]。 #### 坐标系转换与融合 当获得两幅或多幅图像之间精确的空间几何对应之后,则需要将其各自对应的三维坐标统一至全局参考框架下以便后续进一步加工利用。此过程涉及到将局部坐标下的点投影到世界坐标系中的步骤: - **四元数转旋转矩阵**:由于大多数情况下存储的是表示旋转角度变化量形式较为紧凑简洁高效的单位纯虚向量即所谓“四元数”,所以在实际应用前往往先要把它转化为标准正交基底构成的标准方阵——也就是所谓的SO(3)群成员之一 —— 旋转矩阵R。 转化公式如下所示: \[ R = \begin{bmatrix} w^2+x^2-y^2-z^2 & 2(xy-wz) & 2(xz+wy) \\ 2(xy+wz) & w^2-x^2+y^2-z^2 & 2(yz-wx)\\ 2(xz-wy) & 2(yz+wx) & w^2-x^2-y^2+z^2 \end{bmatrix} \] 其中w,x,y,z分别代表四元数值[^4]。 - **平移矢量T的应用**:除了考虑旋转外还需要加上由当前时刻传感器读取所得得到的实际移动距离d形成最终完整的仿射映射表达式\[P_{world}=RP_{local}+T\][^3]。 #### ROS环境下的具体实践案例分析 以开源项目ORB-SLAM2为例说明整个流程的操作方式: 1. 配置elas库用于计算密集视差图; ```bash git clone https://github.com/uzh-rpg/rpg_elas.git ~/catkin_ws/src/ ``` 2. 创建一个新的ROS包`pointcloud_mapping`, 并确保它能访问上述提到过的elas_ros模块; 3. 编辑launch文件使得能够加载KITTI数据集格式的同时开启必要的订阅者和服务端口监听来自前端视觉里程计估计出来的轨迹消息流; 4. 自定义回调函数内部逻辑结构从而支持动态调整参数选项满足不同场景需求比如最大迭代次数阈值设定等等; 5. 发布合成后的完整版模型供可视化工具展示效果验证正确与否. ```python import rospy from sensor_msgs.msg import PointCloud2, Image from cv_bridge import CvBridge, CvBridgeError import numpy as np import open3d as o3d def callback(data): try: bridge = CvBridge() img_left = bridge.imgmsg_to_cv2(data.left_image, desired_encoding="passthrough") img_right = bridge.imgmsg_to_cv2(data.right_image, desired_encoding="passthrough") disparity_map = compute_disparity(img_left,img_right) pcd = create_point_cloud(disparity_map,K) publish_pcl(pcd) except Exception as e: print(e) if __name__ == '__main__': rospy.init_node('dense_reconstruction', anonymous=True) sub = rospy.Subscriber("/stereo_images", StereoImagePair ,callback ) rate=rospy.Rate(10) while not rospy.is_shutdown(): pass ```
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值