相机、雷达标定工具,以及雷达自动标定的思路

自动驾驶传感器标定工具与思路

本篇我们来看一下自动驾驶传感器配置一个非常重要的模块,也就是传感器的标定。这里主要是对我之前修改的功能包的使用进行一个介绍.
对应的资源也已经上传了,0积分下载

安装

首先整个项目是使用ros1来进行启动的,但是要想正常编译,需要先安装三个对应的库.为了便于安装,我已经将安装功能封装成了对应的脚本.中间那个install_noetic.sh不是,其余两个是.
在这里插入图片描述
同时这里也提供对应库的源项目,分别是jsoncpp,pybind11,和Pangolin.接下来看一下对应的脚本怎么进行的:
在这里插入图片描述
在这里插入图片描述
由于项目源文件已经有了,所以不需要git clone了,我们在运行这两个脚本之前,需要先将源文件中的build给删除(这是上一次安装生成的文件,所以最好是删除掉防止干扰),否则安装可能会失败.
在这里插入图片描述
正常安装完三个依赖项之后,就能正常进行编译了:
在这里插入图片描述
在对应的工作空间下执行catkin_make
在这里插入图片描述

雷达标定

对于雷达与雷达的标定,我们运行:

source devel/setup.bash
roslaunch lidar2lidar run_lidar2lidar.launch

在这里插入图片描述
调整右侧的参数,直到主点云和标定点云重合在一起.
可以看一下如何去启动的luanch:
在这里插入图片描述
需要配置的三个参数就比较明显了,分别就是主雷达,需要标定的雷达,以及初始的旋转平移矩阵,这是一个json文件,并且是将旋转平移矩阵完全展开了,是一个4×4的矩阵形式.比如这里是把p64标定到qt点云中
在这里插入图片描述
当然点云的pcd需要自己去转一下,使用pcl_ros 的工具即可转换话题为一个pcd,/your_pointcloud_topic改为对应的话题,当然,采集时是需要禁止的,点云不能运动:

rosrun pcl_ros pointcloud_to_pcd input:=/your_pointcloud_topic

如果没有的话需要先安装一下

sudo apt-get install ros-$ROS_DISTRO-pcl-ros

这样就能完成两帧点云的标定了.

自动标定思路

自动标定利用的其实就是两帧点云的匹配关系,也就是我们定位中使用的ndt算法,只要给一个大致的初始点云位姿,就能比较快速的收敛,也就完成了激光雷达点云的半自动标定过程.
至于这里的ndt的标定的过程,这里就不赘述了,是不需要使用原始的ndt定位的,ndt的实现中,是有直接对于两帧点云的处理的,然后可以只对那部分进行编写,当然,为了能够快速收敛,还是需要有初始位姿的,如果初始位姿比较奇怪,人当然也是很难给出这个初始位姿的大致的值的.除了雷达之间的关系并不大,不难也比较麻烦.所以这里先只需要停留在这个思路上.

雷达与相机的标定

这个外参的标定就是需要将图片与点云进行一个对应,所以在标定之前,最好是要让图片中的特征和点云的特征明显一点
启动方式

source devel/setup.bash
roslaunch lidar2camera run_lidar2camera.launch

在这里插入图片描述

此时这里的launch就表示为
在这里插入图片描述

这里有四个东西作为输入,一个是图片png,一个是雷达点云pcd,一个是相机的内参center_camera-intrinsic.json,以及雷达和相机的外参(也是初始参数,修改的时候变的就是这个)

{
    "center_camera-intrinsic": {
        "sensor_name": "center_camera",
        "target_sensor_name": "center_camera",
        "device_type": "camera",
        "param_type": "intrinsic",
        "param": {
            "img_dist_w": 1920,
            "img_dist_h": 1080,
            "cam_K": {
                "rows": 3,
                "cols": 3,
                "type": 6,
                "continuous": true,
                "data": [
                    [
                        2109.75,
                        0,
                        949.828
                    ],
                    [
                        0,
                        2071.72,
                        576.237
                    ],
                    [
                        0,
                        0,
                        1
                    ]
                ]
            },
            "cam_dist": {
                "rows": 1,
                "cols": 4,
                "type": 6,
                "continuous": true,
                "data": [
                    [
                        -0.10814499855041504,
                        0.1386680006980896,
                        -0.0037975700106471777,
                        -0.004841269925236702
                    ]
                ]
            }
        }
    }
}
{
    "top_center_lidar-to-center_camera-extrinsic": {
        "sensor_name": "top_center_lidar",
        "target_sensor_name": "center_camera",
        "device_type": "relational",
        "param_type": "extrinsic",
        "param": {
            "time_lag": 0,
            "sensor_calib": {
                "rows": 4,
                "cols": 4,
                "type": 6,
                "continuous": true,
                "data": [
                    [
                        0.0125908,
                        -0.999895,
                        -0.00713773,
                        -0.0322306
                    ],
                    [
                        0.0119283,
                        0.00728786,
                        -0.999902,
                        -0.352079
                    ],
                    [
                        0.99985,
                        0.0125045,
                        0.0120187,
                        -0.574468
                    ],
                    [
                        0,
                        0,
                        0,
                        1
                    ]
                ]
            }
        }
    }
}

同样的也是调整可视化界面中的参数的值,让特征能够对应上即可.

### 使用最小二乘法进行毫米波雷达相机联合标定 在毫米波雷达相机的联合标定中,最小二乘法是一种常用的优化方法,用于求解两者之间的矩阵。该过程的核心在于建立一个数学模型,使得雷达检测到的目标位置与其对应的相机图像平面中的投影位置尽可能一致。 #### 数学建模 假设雷达检测到的目标世界坐标为 \( P_w \),其对应于相机像素平面上的位置为 \( p_c \)。为了将这两者关联起来,需要先通过矩阵 \( T_{rc} \) 将雷达坐标系下的点转换至相机坐标系下: \[ P_c = T_{rc} \cdot P_w \] 其中,\( T_{rc} \) 是由旋转矩阵 \( R \) 和平移向量 \( t \) 组成的刚体变换矩阵[^3]。随后,利用相机内部数矩阵 \( K \),可以将三维空间点映射到二维图像平面上: \[ p_c = K \cdot [R | t] \cdot P_w \] #### 最小化误差函数 由于传感器存在噪声以及目标定位可能存在偏差,因此实际测得的像素位置 \( p_c^{measured} \) 可能会偏离理论值 \( p_c^{predicted} \)。定义残差项如下: \[ e_i = \| p_c^{measured}_i - p_c^{predicted}_i \| \] 对于多个匹配点对,可以通过最小化总平方误差来估计最优的矩阵 \( T_{rc} \): \[ T_{rc}^* = \arg \min_T \sum_{i=1}^N e_i^2 \] 此问题可通过标准的最小二乘法解决,具体实现可借助数值优化库完成。 #### ROS2 中的应用实例 在 ROS2 的环境中,“direct_visual_lidar_calibration” 提供了一种无需物理标定板的方式来进行激光雷达相机的联合标定[^4]。尽管该工具主要用于 LiDAR 和相机之间,但其实现原理同样适用于毫米波雷达相机的情况。以下是基于 Python 实现的一个简单示例代码片段,展示如何调用 SciPy 库执行最小二乘拟合: ```python from scipy.optimize import least_squares def error_function(params, radar_points, camera_points): # params 包含待估数 (如旋转和平移) predicted_camera_points = transform_radar_to_camera(radar_points, params) residuals = camera_points - predicted_camera_points return residuals.flatten() initial_guess = [...] # 初始猜测值 result = least_squares(error_function, initial_guess, args=(radar_points, camera_points)) optimized_params = result.x ``` 上述代码展示了如何构建误差函数并使用 `least_squares` 方法对其进行优化。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白云千载尽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值