相机与激光雷达标定: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 使用方法
|
Cloud Native 编译器 芯片
倚天平台业务访存及网络延时性能调优实践
本文主要内容是业务在倚天平台上的性能调优实践,重点基于芯片的 NUMA 特性和一些其他硬件特性,进行访存和网络延时方面的性能调优方法介绍。
|
7月前
|
人工智能 运维 安全
云栖专刊 | 深度解读阿里云网络全新能力升级,助力企业出海和AI创新
阿里云飞天洛神云网络在2025云栖大会发布全新升级,聚焦企业出海与AI创新,推出确定性网络、智能云网络及AI for Network三大能力,提升全球连接质量,构建高效、安全、智能的云网络底座。
901 8
云栖专刊 | 深度解读阿里云网络全新能力升级,助力企业出海和AI创新
|
12月前
小红书无限私信群发工具,小红书私信脚本插件,导入ID关注收藏评论留言
这是一款针对小红书平台开发的私信群发软件,可突破官方私信数量限制。通过这款插件,用户能够自由发送超过官方限制数量的私信
|
人工智能 API 开发工具
aisuite:吴恩达发布开源Python库,一个接口调用多个大模型
吴恩达发布的开源Python库aisuite,提供了一个统一的接口来调用多个大型语言模型(LLM)服务。支持包括OpenAI、Anthropic、Azure等在内的11个模型平台,简化了多模型管理和测试的工作,促进了人工智能技术的应用和发展。
1026 1
aisuite:吴恩达发布开源Python库,一个接口调用多个大模型
|
存储 Java 应用服务中间件
【Spring】IoC和DI,控制反转,Bean对象的获取方式
IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式
600 12
|
小程序 算法 Java
【技巧】Git提交描述骂了领导,不会删除提交记录咋办!
本文以一次git提交失误的故事为背景,详细介绍了如何使用`git revert`和`git reset`两个命令来撤销错误提交。`git revert`用于撤销提交并创建新提交以保留历史记录,而`git reset`则通过移动HEAD指针来修改提交历史,不创建新提交。文章通过实例演示了具体操作步骤,帮助读者在遇到类似问题时能够从容应对。
822 1
【技巧】Git提交描述骂了领导,不会删除提交记录咋办!
|
JSON 算法 数据可视化
Open3d-Point cloud (点云)
Open3d-Point cloud (点云)
1973 6
|
Ubuntu 机器人 Linux
Ubuntu查看ros版本-linux查看ros版本
通过上述方法,您可以轻松检查和确认您的Ubuntu或其他Linux系统上安装的ROS版本,以确保您的机器人项目能够顺利进行。
5463 0
|
XML 数据可视化 程序员
Qt 中的项目文件解析和命名规范
Qt 中的项目文件解析和命名规范