【笔记&问题解决】激光雷达和相机外部参数标定全流程(livox_camera_calib加载数据问题解决 [#85 Issue] & PCL无法创建KDTree问题解决 [#19 Issue])

这篇具有很好参考价值的文章主要介绍了【笔记&问题解决】激光雷达和相机外部参数标定全流程(livox_camera_calib加载数据问题解决 [#85 Issue] & PCL无法创建KDTree问题解决 [#19 Issue])。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

硬件设备

激光雷达:DJI Livox Avia混合固态激光雷达
相机:Intel Realsense D435i深度相机

外参标定

外参标定是进行多传感器融合的必要前提。

标定流程

livox_camera_calib是香港大学MaRS 实验室开发的一款的激光雷达和相机标定的算法。算法分为分为单场景标定(Single scene calibration)多场景标定(Multi scenes calibration),本文只探讨单场景标定。配置过程参考livox_camera_calib官网的流程即可。

cd ~/catkin_ws/src
git clone https://github.com/hku-mars/livox_camera_calib.git
cd ../
catkin_make
source ~/catkin_ws/devel/setup.bash

配置好环境后运行标定launch文件。过程如下:
(1)修改config/calib.yaml文件路径

# Data path. adjust them!
common:
    image_file: "/home/ggh/workdir/catkin_ws/src/livox_camera_calib/data/2.png" #你自己存放相机影像png的路径
    pcd_file: "/home/test/lidarimu/catkin_ws/src/livox_camera_calib/data/2.pcd" #你自己存放点云pcd的路径
    result_file: "/home/test/lidarimu/catkin_ws/src/livox_camera_calib/result/extrinsic.txt" #存放标定结果的路径

# Camera Parameters. Adjust them!
# 你自己相机的内参数和镜头畸变参数
camera:
    camera_matrix: [1364.45, 0.0,      958.327,
                0.0,     1366.46,  535.074,
                0.0,     0.0,      1.0     ]
    dist_coeffs: [0.0958277, -0.198233, -0.000147133, -0.000430056, 0.000000]

# Calibration Parameters.!
calib:
    calib_config_file: "/home/test/lidarimu/catkin_ws/src/livox_camera_calib/config/config_indoor.yaml" #连接的另外一个yaml的文件,视你的标定场景而定,这个会直接影响标定结果,一定要记得修改
    use_rough_calib: true # set true if your initial_extrinsic is bad

(2)运行单场景标定roslaunch文件

roslaunch livox_camera_calib calib.launch

经过一系列迭代优化得到标定结果,如下数图所示。

[pcl::kdtreeflann::setinputcloud] cannot create a kdtree with an empty input,笔记
[pcl::kdtreeflann::setinputcloud] cannot create a kdtree with an empty input,笔记
[pcl::kdtreeflann::setinputcloud] cannot create a kdtree with an empty input,笔记
[pcl::kdtreeflann::setinputcloud] cannot create a kdtree with an empty input,笔记

问题解决

问题一:运行calib.launch报错:[lidar_camera_calib-2] process has died [pid 26108, exit code -11, cmd

NODES
/
lidar_camera_calib (livox_camera_calib/lidar_camera_calib)
rviz (rviz/rviz)

auto-starting new master
process[master]: started with pid [26093]
ROS_MASTER_URI=http://localhost:11311

setting /run_id to 8bfc51c8-dc14-11ed-9ebe-0cc47a6c9e2b
process[rosout-1]: started with pid [26104]
started core service [/rosout]
process[lidar_camera_calib-2]: started with pid [26108]
process[rviz-3]: started with pid [26112]
pcd_file path:/home/lk/catkin_ws/src/livox_camera_calib/data/single_scene_calibration/0.pcd
[lidar_camera_calib-2] process has died [pid 26108, exit code -11, cmd /home/lk/catkin_ws/devel/lib/livox_camera_calib/lidar_camera_calib __name:=lidar_camera_calib __log:=/home/lk/.ros/log/8bfc51c8-dc14-11ed-9ebe-0cc47a6c9e2b/lidar_camera_calib-2.log].
log file: /home/lk/.ros/log/8bfc51c8-dc14-11ed-9ebe-0cc47a6c9e2b/lidar_camera_calib-2*.log”

从这段报错中除了能得到是在加载pcd文件时出错以外,看不出来任何有用信息。这时rviz被打开,发现在rviz软件界面显示未接收到任何点云或图片数据,大胆猜测是pcd数据没有加载失败
[pcl::kdtreeflann::setinputcloud] cannot create a kdtree with an empty input,笔记
忘了截图了,这里引用来自livox_camera_calib主页#85 Issue的图,在Issue中没有解决这个问题。

[pcl::kdtreeflann::setinputcloud] cannot create a kdtree with an empty input,笔记
图源:livox_camera_calib主页#85 Issue

经分析,直接问题断定为加载pcd点云文件失败,猜测问题本源在于opencv版本冲突。为了确定这一猜测,基于vscode配置ros代码调式,
[pcl::kdtreeflann::setinputcloud] cannot create a kdtree with an empty input,笔记
红框处为报错的地方(调试时忘记截图,在此处用红框标记之),由此猜测是 cv_bridge 与 opencv4版本冲突问题,因为我的系统是ubuntu 18.04,ROS版本为melodic,而 melodic 版本的 cv_bridge 功能包中所用 opencv 版本为 opencv3,我安装的是opencv4。考虑到noetic 版本的 cv_bridge 功能包使用的是 opencv4,所以提出
【解决方法】:通过安装noetic 版本的 cv_bridge ,将新的 cv_bridge 和 我自己功能包的依赖设为同一版本的 opencv,同时保留 melodic 版本的 cv_bridge 功能包(后面会说到为什么要同时保留)。具体安装过程参考这篇文章。
退回catkin工作空间,重新catkin_make,然后再次运行

roslaunch livox_camera_calib calib.launch

加载成功!
[pcl::kdtreeflann::setinputcloud] cannot create a kdtree with an empty input,笔记

问题二:运行自己的标定数据报错:[pcl::KdTreeFLANN::setInputCloud] Cannot create a KDTree with an empty input cloud!

[ INFO] [1691133251.022876409]: Sucessfully load calib config file
[ INFO] [1691133251.636212259]: Sucessfully load image!
[ INFO] [1691133251.640953018]: Sucessfully extract edge from image, edge size:15957
[ INFO] [1691133251.640971292]: Loading point cloud from pcd file.
[ INFO] [1691133281.547540320]: Sucessfully load pcd, pointcloud size: 9936000
[ INFO] [1691133281.547566909]: Building Voxel
[ INFO] [1691133285.886021869]: Extracting Lidar Edge
[ INFO] [1691133292.414024597]: Finish prepare!
Initial rotation matrix:
 0 -1  0
 0  0 -1
 1  0  0
Initial translation:0 0 0
[pcl::KdTreeFLANN::setInputCloud] Cannot create a KDTree with an empty input cloud!
Rough calibration min cost:1
[pcl::KdTreeFLANN::setInputCloud] Cannot create a KDTree with an empty input cloud!
[pcl::KdTreeFLANN::setInputCloud] Cannot create a KDTree with an empty input cloud!
[pcl::KdTreeFLANN::setInputCloud] Cannot create a KDTree with an empty input cloud!
[pcl::KdTreeFLANN::setInputCloud] Cannot create a KDTree with an empty input cloud!
[pcl::KdTreeFLANN::setInputCloud] Cannot create a KDTree with an empty input cloud!
[pcl::KdTreeFLANN::setInputCloud] Cannot create a KDTree with an empty input cloud!
[pcl::KdTreeFLANN::setInputCloud] Cannot create a KDTree with an empty input cloud!

[pcl::kdtreeflann::setinputcloud] cannot create a kdtree with an empty input,笔记

导致无法进入优化程序,具体表现为没有输出点云-图像残差图以及没有点云叠加的优化窗口,如下图所示。
[pcl::kdtreeflann::setinputcloud] cannot create a kdtree with an empty input,笔记[pcl::kdtreeflann::setinputcloud] cannot create a kdtree with an empty input,笔记
排除了点云路径错误点云话题名称错误以及点云密度过于稀疏等livox_camera_calib项目网站上#19 Issue和#84 Issue中提到的可能的错误,即能读取并在rviz上显示就说明点云路径和话题名称没错,能提取到足够多的线特征(红色的线条)就说明点云密度达到标定要求(为此我还对比了项目demo中3.pcd的点云密度,我采集的点云数量远高于demo中的点云数量),如下图所示。但是问题依然没有得到解决。
[pcl::kdtreeflann::setinputcloud] cannot create a kdtree with an empty input,笔记

那么问题该如何解决呢?需要说明的是,我采集的标定数据设置的分辨率为640480,项目demo中给的影像分辨率是19201080。于是,我将我的D435i的RGB影像分辨率设置为与demo一致的1920*1080,并且将影像话题发布频率降低为30Hz(否则会硬件报错),该操作在realsense_camera包的rs_camera.launch中进行,如图所示:
[pcl::kdtreeflann::setinputcloud] cannot create a kdtree with an empty input,笔记
重新录制ros包,从中提取png格式影像,重新运行calib.launch,pcd加载完成后,进入优化模式,问题解决!
[pcl::kdtreeflann::setinputcloud] cannot create a kdtree with an empty input,笔记

相机内参标定

在标定激光雷达和相机外部参数之前,我们必须尽可能地知道相机准确的焦距、像主点偏移以及镜头畸变等相机内部参数。最直接的,我们在修改config/calib.yaml文件时,相机内参是必须由我们自己给定。因此,在开始外参标定前,我们首先要标定相机内参。

标定流程

对于Intel Realsense D435i相机的标定,我们可以参考这篇文章,即使用ETHZ出品的Kalibr工具包来标定。由于这篇文章已经写得非常详细,在此我就不过多赘述了。使用Intel Realsense D435i的同学可以无脑照着这篇文章操作,使用别的系列或者别的品牌的同学注意要在有些关键地方需要根据自身设备作出修改。
需要注意的一点是,文章中运行标定ros功能包时有一个小错误,即文章中给的运行命令是

kalibr_calibrate_cameras --target ~/kalibr_ws/src/Kalibr/data/checkerboard.yaml --bag ~/kalibr_ws/src/Kalibr/data/camd435i.bag --models pinhole-equi --topics /color --show-extractio

如果同学们按照这个命令输入会发现会报错:找不到kalibr_calibrate_cameras包,这时不要慌张,在前面加上rosrun等操作即可

rosrun kalibr kalibr_calibrate_cameras --target ~/kalibr_ws/src/Kalibr/data/checkerboard.yaml --bag ~/kalibr_ws/src/Kalibr/data/camd435i.bag --models pinhole-equi --topics /color --show-extractio

问题解决

问题一:运行kalibr_calibrate_cameras报错:UnicodedecodeError:‘ascii’ codec can’t decode byte oxco in position 0: ordinalnot in range(128)

[pcl::kdtreeflann::setinputcloud] cannot create a kdtree with an empty input,笔记
这红框中可知,这是因为当前的python版本(我装的是python2.7)与noetic版本的cv_bridge冲突所致,这是不要慌,在这个包里用回原来的melodic版本的cv_bridge就OK了,这也就是为何我在上文中说要同时保留这两个版本的cv_bridge的原因。具体操作如下:
找到catkin工作空间下python文件夹下cv_bridge下的_init_.py文件,一般路径是:~/workdir/catkin ws/devel/lib/python2.7/dist-packages/cv bridge/init .py ,修改扩展路径_extended_path为melodic版本的cv_bridge的python路径即可
[pcl::kdtreeflann::setinputcloud] cannot create a kdtree with an empty input,笔记
重新运行ROS功能包,问题解决!
[pcl::kdtreeflann::setinputcloud] cannot create a kdtree with an empty input,笔记文章来源地址https://www.toymoban.com/news/detail-761651.html

到了这里,关于【笔记&问题解决】激光雷达和相机外部参数标定全流程(livox_camera_calib加载数据问题解决 [#85 Issue] & PCL无法创建KDTree问题解决 [#19 Issue])的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深度相机和激光雷达的融合标定(Autoware)

    深度相机和激光雷达是智能汽车上常用的传感器。但深度相机具有特征难以提取,容易受到视角影响。激光雷达存在数据不够直观且容易被吸收,从而丢失信息。因此在自动驾驶领域,需要对于不同传感器做数据的融合和传感器的标定。 内参标定的原理和方法比较简单,由于

    2024年02月10日
    浏览(40)
  • 【Ubuntu18.04】激光雷达与相机联合标定(Livox+HIKROBOT)(一)相机内参标定

    Livox Lidar + HIKROBOT Camera 联合标定 参考链接:相机雷达标定文档 安装ROS环境,参考笔者的博客:【ROS】Ubuntu18.04安装Ros 参考链接:海康Camera MVS Linux SDK二次开发封装ROS packge过程记录(c++) 海康的相机没有ros驱动,且对linux开发不太友好(但支持windows),因此需要重写了sdk接口

    2024年02月04日
    浏览(36)
  • 虚拟机(Ubuntu1804)相机与激光雷达联合标定实现过程记录

    在智能小车录制的点云数据在rviz打开一定要修改Fixed Frame为laser_link,这样才能看到点云,注意此时用的是雷神激光雷达,话题名是lslidar_,可采用rostopic list查看具体名称 1、新建一个终端打开roscore 2、在文件夹libratia中新建一个终端 【注意】这里的--pause可以暂停,当后面需要

    2024年02月16日
    浏览(39)
  • autoware标定工具进行固态激光雷达与相机的联合标定并运用标定结果进行投影(C++)

    本文主要介绍速腾聚创的RS-LIDAR-M1固态雷达激光与小觅相机左眼的联合标定过程,并介绍标定过程中的一些技巧与避雷,加快标定效率。最后给出运用标定结果进行投影的关键代码。 一、安装autoware(为了标定完成后的可视化,可选,本文并未用到) 参考https://blog.csdn.net/qq

    2024年02月08日
    浏览(34)
  • MATLAB - 激光雷达 - 相机联合标定(Lidar-Camera Calibration)

          激光雷达 - 相机标定建立了三维激光雷达点和二维相机数据之间的对应关系,从而将激光雷达和相机输出融合在一起。 激光雷达传感器和相机被广泛用于自动驾驶、机器人和导航等应用中的三维场景重建。激光雷达传感器捕捉环境的三维结构信息,而相机则捕捉色彩、

    2024年02月20日
    浏览(34)
  • ICRA 2023 | 最新激光雷达-相机联合内外参标定,一步到位!

    点击下方 卡片 ,关注“ 自动驾驶之心 ”公众号 ADAS巨卷干货,即可获取 今天自动驾驶之心很荣幸邀请到石头,为大家分享ICRA 2023最新的激光雷达-相机的联合标定方法,可同时标定内参和外参。如果您有相关工作需要分享,请在文末联系我们! 点击进入→ 自动驾驶之心【多

    2024年02月12日
    浏览(28)
  • 【文献分享】基于线特征的激光雷达和相机外参自动标定

    论文题目: Line-based Automatic Extrinsic Calibration of LiDAR and Camera 中文题目: 基于线特征的激光雷达和相机外参自动标定 作者:Xinyu Zhang, Shifan Zhu, Shichun Guo, Jun Li, and Huaping Liu 作者机构:清华大学汽车安全与能源国家重点实验室 论文链接:https://www.researchgate.net/publication/354877994_

    2024年02月06日
    浏览(31)
  • 激光雷达与相机外参标定(附open3d python代码)

    现在的激光雷达与相机的标定程序基本都是Ubuntu框架下面的,并且都是C++代码,需要安装的依赖也比较复杂,于是自己写了一个python版本的标定程序,依赖非常简单,Windows系统也可以运行。并且代码简单一个文件搞定,符合python简单易行的风格。 先上最后标定后的效果图​

    2024年02月11日
    浏览(28)
  • 自动驾驶感知——激光雷达基本概念|激光雷达点云|激光雷达的标定

    激光探测及测距系统(Light Detection and Ranging,LiDAR) 激光雷达是一种通过发射激光束探测目标的位置、速度等特征量 的雷达系统 激光波段位于0.5μm-10μm,以光电探测器为接收器件,以光学望远镜为天线。 特点 • 角分辨率、距离分辨率高 • 抗干扰能力强 • 三维坐标、反射率

    2024年02月02日
    浏览(34)
  • 激光雷达标定(坐标系转换)

    由于激光雷达获取的点云数据的坐标是相对于激光雷达坐标系的,为了使车最终得到的点云数据坐标是在车坐标系下的,我们需要对点云中每一个点的坐标进行坐标转换。 首先是需要对坐标系进行旋转变换,先以二维平面的单位向量坐标转换为例,假设两坐标系中的旋转矩阵

    2023年04月16日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包