激光雷达点云 相机图像 信息融合 联合标定


一、前期对于相关概念的理解

1、信息融合之前,第一步:激光雷达与相机联合标定

设备:livox雷达+DJI的云台相机H20T

①、为什么要进行标定,标定的目的:
参考资料:

  1. 【无人驾驶-激光雷达与相机联合校准–“5算法”】中提到标定的目的

标定的一些原理:
https://blog.csdn.net/xueluowutong/article/details/80950915

【立体视觉】世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的关系

在这里插入图片描述

在这里插入图片描述
上图中计算的是由三维点云到像素平面的转换,可以用来:

1、可以由点云计算得到某一点在像素坐标系中的位置u,v,进而获得此位置像素的rgb,将其赋给点云,便可实现点云着色

2、可以由点云计算出某一点在像素坐标系中的位置u,v,然后,在位置u,v,绘制一个点,如果愿意的话,可以按照距离给这个点着色,实现将点云投影到图像中

那么,当知道像素平面的一个点的坐标u,v,如何得到这个像素点的距离信息?


②、如何进行激光雷达相机的联合标定:

  1. 【激光雷达和相机的联合标定(Camera-LiDAR Calibration)之Autoware】

  2. 【autoware官网标定教程】【视频教程链接】

  3. ★★★【livox自家的:Lidar-Camera外参标定】

  4. 【Camera Laser Calibration Tool】

  5. ★★★★★【视觉激光雷达信息融合与联合标定】

  6. ★★★★【无人驾驶汽车系统入门(二十二)——使用Autoware实践激光雷达与摄像机组合标定】

  7. 【Camera-Lidar Calibration with Autoware】

  8. 【代码讲解lidar与camera融合】

  9. 【合集!自动驾驶 Camera-Lidar、Camera-IMU 等联合标定相关博客总结!】

  10. 【合集!标定合集】

  11. 【matlab官网标定教程Lidar and Camera Calibration】

  12. 【Autoware 标定工具 Calibration Tool Kit 联合标定 Robosense-16 和 ZED 相机!】


2、激光雷达的点云与相机的图像的信息融合

单一传感器不可避免的存在局限性,为了提高系统的稳健性,采取多传感器融合的方案,融合又包含不同传感器的时间同步空间同步

个人感觉,这是一种前融合。

参考资料:
【1】★★★ 激光雷达与相机融合(五)-------ros实时版点云投影到图像平面
【2】点云图像融合(点云着色):介绍了如何使用标定的结果进行相机图像与点云进行融合。
【3】无人驾驶传感器融合系列(十)—— 目标追踪之相机与激光雷达数据融合

一些介绍相机与点云融合的方法:
【1】https://github.com/LidarPerception/kitti_lidar_camera
【2】https://blog.csdn.net/qq_33801763/article/details/78959205
【3】Sensor fusion after intrinsic and extrinsic calibration - Autoware


二、激光雷达 相机 联合标定步骤

1、使用livox自家的标定程序

使用过程中,遇到的一些问题:
①、在计算相机内参的时候,cameraCalib.cpp中需要注释掉//imshow("Camera Calibration" , view_gray);,个人感觉主要原因还是NX板子上的opencv没有装好。
②、在计算图像角点的时候,需要将corner_photo.cpp中的104行-108行中涉及到opencv的代码注释掉,不然也无法正常计算下去。
③、ceres还是得安装1.14才能行。参考:https://blog.csdn.net/qq_41586768/article/details/107541917

2、使用autoware的标定模块进行相机、激光雷达的联合标定

参考链接:ubuntu16.04安装Autoware1.11和联合标定工具包calibration以及相关问题介绍(亲测有效)

遇到的一些问题的解决参考链接:使用calibration_toolkit时,编译的小问题。

终于编译完成了,接下来,对autoware的源码进行学习,看看是怎么将图像中检测到的目标物,在点云中产生三维检测框的。

进入标定的主界面,里面参数的意义为:

参考:

  1. 【Autoware 标定工具 Calibration Tool Kit 联合标定 Robosense-16 和 ZED 相机!】
  2. 【激光雷达和相机的联合标定(Camera-LiDAR Calibration)之Autoware】,里面会有相机内参的标定的相关介绍。

配置标定板棋盘格参数:

  1. Pattern Size(m):标定板中每个格子的边长,单位 m,我的标定板每个格子长 0.025 m
  2. Pattern Number:标定板长X宽的单元格数量 - 1,我的标定板是长有 12 个格子,宽有 9 个,所以填 11x8,减一是因为标定检测的是内部角点

三、标定之后,将激光点云与图像进行融合

如何将二维图像检测到的bounding box投影到三维点云得到三维检测框呢?

官网中相关的介绍为:

Requirements

Input Topics:

Camera intrinsics (sensor_msgs/CameraInfo)
Camera-LiDAR extrinsics (tf)
Object Detections results from a Vision Detector (autoware_msgs/DetectedObjectArray)
Object Detections results from a Range Detector (autoware_msgs/DetectedObjectArray)

难道还需要点云的目标检测框才能做匹配吗?

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

在将点云转换到像素坐标系时,会出现一些点在转换之后,其在像素坐标系下的坐标已经超出了图片的尺寸,因此需要将这些点进行剔除:

pcl::PointCloud<pcl::PointXYZRGB>::Ptr fused_cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
for (int m = 0; m < uv.cols(); m++) 
{
    cv::Point point;
    point.x = uv(0, m);
    point.y = uv(1, m);

    // Store corners in pixels only of they are on image plane
    if (point.x > 0 && point.x < your_image_as_opencv_mat->cols) 
    {
        if (point.y > 0 && point.y < your_image_as_opencv_mat->rows) 
        {

            pcl::PointXYZRGB fused_3d_point;
            cv::Vec3b rgb_pixel = your_image_as_opencv_mat->at<cv::Vec3b>(point.y, point.x);
            // Get x,y,z values of this point from original raw point cloud
            fused_3d_point.x = matrix_lidar_points_in_lidar_frame(0, m);
            fused_3d_point.y = matrix_lidar_points_in_lidar_frame(1, m);
            fused_3d_point.z = matrix_lidar_points_in_lidar_frame(2, m);

            // get r,g,b value of this point from segmented image
            fused_3d_point.r = rgb_pixel[2];
            fused_3d_point.g = rgb_pixel[1];
            fused_3d_point.b = rgb_pixel[0];

            //put cicles into your image
            cv::circle(*your_image_as_opencv_mat, point, 1, cv::Scalar(0, 0, 255), 2, 8, 0);

            fused_cloud->points.push_back(fused_3d_point);
        }
    }
}

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

2021.05.22:

订阅多个话题,如何实现话题之间的同步处理(也即多传感器融合)?

在ROS节点中需要订阅两个及两个以上的话题时,这些话题的频率不一致,需要保持对这

些话题数据的同步,且需要同时接收数据一起处理然后当做参数传入到另一个函数中。

### 激光雷达相机传感器融合的技术难点及解决方案 #### 主要技术难点 1. **时空同步问题** 融合过程中,激光雷达相机的时间戳可能不同步,导致采集的数据无法匹配。此外,两者的坐标系也存在差异,需要进行精确的空间校准[^1]。 2. **数据维度差异** 激光雷达提供的是稀疏的3D点云数据,而相机则捕捉密集的2D图像信息。这种数据形式上的差异使得直接融合变得复杂[^4]。 3. **环境适应性差** 尽管激光雷达在夜间或低光照条件下的表现优于相机,但在雨雪、浓雾等极端天气下,其性能也会受到影响。相反,相机在这种环境下可能会失效,因此如何设计鲁棒性强的融合策略是一个挑战。 4. **计算资源需求高** 实现高效的多模态数据处理需要强大的硬件支持,尤其是当涉及到实时应用时,这对嵌入式系统的算力提出了较高要求[^3]。 5. **特征提取一致性** 不同类型的传感器捕获的信息具有不同的物理特性,找到一种统一的方法来表示这些异构数据并从中提取有意义的特征是一项艰巨的任务。 #### 解决方案概述 1. **时间同步机制优化** 开发先进的软硬件协同工作框架以确保两者之间高度一致的时间标记,并利用插值算法弥补因采样频率不均造成的时间偏差。 2. **几何配准改进** 使用标定板或其他专用工具完成初始外参估计之后,再借助ICP(Iterative Closest Point)或者基于学习的方法进一步精化内外参数配置,从而建立稳定可靠的转换关系。 3. **增强型滤波器设计** 针对特定应用场景定制开发卡尔曼滤波器(Kalman Filter),粒子滤波(Particle Filter)或者其他自适应过滤手段用于平滑噪声干扰以及补偿动态变化带来的误差累积效应。 4. **深度神经网络引入** 借助端到端训练好的卷积神经网络(Convolutional Neural Networks, CNNs) 或者其他架构模型自动挖掘隐藏于跨域信号背后的关联规律,进而提升整体决策质量。 5. **联合标定流程制定** 提供一套标准化操作指南帮助用户快速准确地调整各子系统之间的相互位置姿态约束条件,减少人为因素造成的不确定性影响。 ```python import numpy as np from scipy.spatial.transform import Rotation as R def calibrate_lidar_camera(lidar_points, camera_image): """ Perform calibration between lidar and camera. Args: lidar_points (np.ndarray): Array of 3D points from LiDAR sensor. camera_image (np.ndarray): Image captured by the camera. Returns: tuple: Transformation matrix T and rotation quaternion q. """ # Example transformation estimation process r = R.random() t = np.random.rand(3) T = np.eye(4); T[:3,:3] = r.as_matrix(); T[:3,3] = t return T, r.as_quat() T, quat = calibrate_lidar_camera(np.zeros((100,3)), np.zeros((640,480))) print(f"Transformation Matrix:\n{T}\nQuaternion:{quat}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值