相机与激光雷达标定:gazebo仿真livox_camera_lidar_calibration---标定数据采集与处理

简介: ROS功能包:**livox_camera_lidar_calibration**提供了一个手动校准Livox雷达和相机之间外参的方法,已经在Mid-40,Horizon和Tele-15上进行了验证。其中包含了计算相机内参,获得标定数据,优化计算外参和雷达相机融合应用相关的代码。本方案中使用了标定板角点作为标定目标物,由于Livox雷达非重复性扫描的特点,点云的密度较大,比较易于找到雷达点云中角点的准确位置。相机雷达的标定和融合也可以得到不错的结果。

前言

ROS功能包:livox_camera_lidar_calibration提供了一个手动校准Livox雷达和相机之间外参的方法,已经在Mid-40,Horizon和Tele-15上进行了验证。其中包含了计算相机内参,获得标定数据,优化计算外参和雷达相机融合应用相关的代码。本方案中使用了标定板角点作为标定目标物,由于Livox雷达非重复性扫描的特点,点云的密度较大,比较易于找到雷达点云中角点的准确位置。相机雷达的标定和融合也可以得到不错的结果。

在前一篇中链接:相机与激光雷达标定:gazebo仿真livox_camera_lidar_calibration---标定数据采集与处理

最终得到了两个标定数据的文件 :

  • corner_lidar.txt
  • corner_photo.txt

这个两个数据的每行对应着同一个角点.

在这里插入图片描述
有了这么多组的同名点像素和三维坐标位置,下面就可以通过优化的思想,去求解两个传感器的外参了.

本篇博客主要介绍外参的标定计算,与结果验证

外参计算

外参计算节点会读取之前得到的data/corner_photo.txt和data/corner_lidar.txt中的标定数据来计算外参,数据需要保存成特定的格式才能被外参计算节点正确读取。

程序读取数据的时候,设置是这样的:
每行数据只有超过10个字母程序才会将其读取为计算的参数,所以上面的数据中用来编号的1 2 3 4 和标题,test0 test1 是不会被读的.
程序读到空行就会停止读取参数开始计算,所以保存时不要空行。

计算前在getExt1.launch文件中配置好外参初值(程序中的默认初值是根据Livox激光雷达自身坐标系,雷达和相机的相对位置设置的,要根据情况进行修改。如果初值差的很大可能会导致不好的优化结果。)

<?xml version="1.0" encoding="UTF-8"?>
<launch>
  
    <rosparam param="init_value">  [0.0, -1.0, 0.0, 0.2,
                                    0.0, 0.0, -1.0, 0.0,
                                    1.0, 0.0, 0.0,  0.0] </rosparam>  <!-- init value of roatation matrix(3*3 on the left) and the translation(3*1 vector on the right) -->

    <param name="intrinsic_path"    value="$(find camera_lidar_calibration)/data/parameters/intrinsic.txt" />  <!-- intrinsic file -->
    <param name="extrinsic_path"    value="$(find camera_lidar_calibration)/data/parameters/extrinsic.txt" />  <!-- extrinsic file -->
    <param name="input_lidar_path"  value="$(find camera_lidar_calibration)/data/corner_lidar.txt" />  <!-- get the lidar corner data -->
    <param name="input_photo_path"  value="$(find camera_lidar_calibration)/data/corner_photo.txt" />  <!-- get the photo corner data -->
    <param name="error_threshold"    type="int" value="12" />  <!-- the threshold of the reprojection error -->

    <node pkg="camera_lidar_calibration" name="getExt1" type="getExt1" output="screen"></node>

</launch>

输入指令开始计算外参

roslaunch camera_lidar_calibration getExt1.launch

终端会打印出ceres的迭代过程
在这里插入图片描述
可以从终端看到
初始的cost 是 3.496e4,优化后为5.749e1

同时优化相机内参和外参

getExt1节点只优化外参,而getExt2节点在计算的时候会将一开始计算的内参作为初值和外参一起优化。输入指令程序会得到一个新的内参和外参,并用新的参数来进行重投影验证。

roslaunch camera_lidar_calibration getExt2.launch

一般使用getExt1节点即可,如果在外参初值验证过,并且异常值已经剔除后,优化还是有较大的残差,那么可以使用getExt2试一试。使用的前提需要保证标定数据量较大,并且要充分验证结果。

如果经过验证getExt2计算的结果确实更好,那么把新的内参更新在data/parameters/intrinsic.txt中。

结果验证

获得外参后我们可以用两个常见的应用看一下融合的效果。第一个是将点云投影到照片上,第二个是点云的着色

在相机和livox雷达前方放一个大的物体,看下最后的效果
我是在前面放了一个房子,照片如下图:
在这里插入图片描述
点云如下图:
在这里插入图片描述

投影点云到照片

优化前的图片:
在这里插入图片描述
优化后的图片:
在这里插入图片描述
右上角可以看出优化效果

点云着色

下面是点云着色优化前后的对比

优化前的点云:
在这里插入图片描述

优化后的点云:
在这里插入图片描述
看房顶的左边,效果是很明显的.

相关文章
|
数据采集 数据可视化 Ubuntu
相机和livox激光雷达外参标定:ROS功能包---livox_camera_lidar_calibration 使用方法
该功能包提供了一个手动校准Livox雷达和相机之间外参的方法,已经在Mid-40,Horizon和Tele-15上进行了验证。其中包含了计算相机内参,获得标定数据,优化计算外参和雷达相机融合应用相关的代码。本方案中使用了标定板角点作为标定目标物,由于Livox雷达非重复性扫描的特点,点云的密度较大,比较易于找到雷达点云中角点的准确位置。相机雷达的标定和融合也可以得到不错的结果。
相机和livox激光雷达外参标定:ROS功能包---livox_camera_lidar_calibration 使用方法
|
2月前
|
运维 测试技术 Nacos
说一下nacos心跳机制
Nacos心跳机制是服务注册与发现的核心,服务实例通过定时发送心跳包(默认5秒一次)向Nacos表明存活状态。Nacos通过记录最后心跳时间并设置超时策略(15秒未收到标记为不健康,30秒剔除),确保服务列表的准确性。采用UDP协议减少性能开销,支持动态调整心跳频率,适应不同部署场景,提升系统稳定性和服务调用可靠性。
147 0
|
存储 SQL 分布式计算
SparkSQL优化策略大盘点
SparkSQL优化策略大盘点
200 0
|
机器学习/深度学习 自然语言处理 Java
HanLP — 词性标注
HanLP — 词性标注
178 1
|
机器学习/深度学习 计算机视觉
字节豆包全新图像Tokenizer:生成图像最低只需32个token,最高提速410倍
【7月更文挑战第1天】新方法将图像转为1D token序列,减少计算复杂度,提高生成效率。在保持高画质(如gFID: 1.97 on ImageNet 256x256)的同时,TiTok比现有模型快410倍。虽有资源需求及token限制问题,但展示了图像处理的新方向。[论文链接](https://arxiv.org/abs/2406.07550)
574 7
|
监控 算法 vr&ar
鱼眼矫正,实时视频与3D的融合案例分享
#鱼眼摄像头画面矫正及与3D融合 鱼眼摄像头是一种广角镜头,捕捉的视频画面呈现出弯曲或球形。通过鱼眼矫正算法,可以将鱼眼相机拍摄的视频转换为更接近于标准透视的视频,使用户能够直接获得更自然的视频效果。 经过鱼眼矫正后的实时视频,适用于与3D场景实时融合,即视频孪生 = 视频+数字孪生。 视频孪生是现阶段数字孪生的天花板。将分散、割裂的实时视频在数字孪生世界中做三维还原,虚实共生,虚实互补,为用户提供立体、直观、实时真实的动态的系统。只有通过动态的视频,才能实现真正的虚实共生。
747 0
|
Linux Docker 容器
Docker安装实例
Docker安装实例
178 0
|
算法 NoSQL Java
8. 「Java大师」教你如何用Spring Boot轻松实现高效「限流」!
8. 「Java大师」教你如何用Spring Boot轻松实现高效「限流」!
538 0
解决com.microsoft.sqlserver.jdbc.SQLServerException: '@P1' 附近有语法错误。
解决com.microsoft.sqlserver.jdbc.SQLServerException: '@P1' 附近有语法错误。
291 0
|
Java 关系型数据库 MySQL
SpringBoot 依赖管理和自动配置---带你了解什么是版本仲裁(上)
SpringBoot 依赖管理和自动配置---带你了解什么是版本仲裁(上)
550 0
SpringBoot 依赖管理和自动配置---带你了解什么是版本仲裁(上)