cam_lidar_calibration标定速腾激光雷达和单目相机外参

news2025/4/21 19:45:30

目录

  • 一、资源链接
  • 二、代码测试
    • 2.1安装依赖
    • 2.2代码下载和修改
      • 2.2.1 optimiser.h文件
      • 2.2.2 feature_extractor.h文件
    • 2.3编译代码
    • 2.4测试数据集
      • 2.4.1迭代计算
      • 2.4.2查看校准结果
  • 三、标定自己激光雷达和相机
    • 3.1修改代码
      • 3.1.1camera_info.yaml配置文件
      • 3.1.2params.yaml配置文件
      • 3.1.3cam_lidar_calibration.rviz配置文件
    • 3.2录制数据集
    • 3.3正式标定
      • 3.3.1开启程序
      • 3.3.2播放数据集bag
      • 3.3.3分割标定板点云
      • 3.3.4评估参数和重投影误差
  • 参考资料


Windows 10(64bits) + VMware 16 Pro + Ubuntu 20.04 + Noetic
激光雷达:速腾聚创32线激光雷达 RS-LIDAR-32
单目相机:acA1920-40gc(GigE接口)


一、资源链接

代码:https://github.com/acfr/cam_lidar_calibration
论文:Optimising the selection of samples for robust lidar camera calibration
教程视频: youtube视频

二、代码测试

2.1安装依赖

sudo apt update && sudo apt-get install -y ros-noetic-pcl-conversions ros-noetic-pcl-ros ros-noetic-tf2-sensor-msgs
sudo apt install python3-pip   
pip3 install pandas scipy
sudo apt install ros-noetic-tf-conversions //如果缺少tf
sudo pip3 install -U catkin_tools  //如果报错“catkin:未找到命令”

2.2代码下载和修改

基本都是一些头文件问题,与opencv版本有关,对源码进行以下修改:

2.2.1 optimiser.h文件

修改
#include <opencv/cv.hpp> ————>  #include <opencv2/imgproc.hpp>
新增:
#include <opencv2/calib3d.hpp> 
#include <opencv2/core/core_c.h> 

2.2.2 feature_extractor.h文件

#include <opencv2/imgcodecs.hpp> 

2.3编译代码

注意:

  • 有博客教程用catkin_make编译,但是我有时会报以下错误:
  • 建议用catkin build编译
fatal error: cam_lidar_calibration/RunOptimiseAction.h: 没有那个文件或目录
   14 | #include <cam_lidar_calibration/RunOptimiseAction.h>

解决方法:

  • 删除build、devel文件夹,重新使用catkin build编译
mkdir -p cam_lidar_calibration_ws/src
cd cam_lidar_calibration_ws/src
git clone https://github.com/acfr/cam_lidar_calibration.git
cd ..
catkin build
source devel/setup.bash

2.4测试数据集

2.4.1迭代计算

测试作者提出的数据集,输入以下命令开始迭代计算

roslaunch cam_lidar_calibration run_optimiser.launch import_samples:=true

输出标定结果csv文件到路径:/cam_lidar_calibration_ws/src/cam_lidar_calibration-master/data/vlp,内容如下:
在这里插入图片描述
images文件夹里是进行标定的图片,pcd文件夹里是点云

2.4.2查看校准结果

点云投影到图像上

roslaunch cam_lidar_calibration assess_results.launch csv:="$(rospack find cam_lidar_calibration)/data/vlp/calibration_quickstart.csv" visualise:=true

在这里插入图片描述

三、标定自己激光雷达和相机

3.1修改代码

3.1.1camera_info.yaml配置文件

这个文件是相机内参,设置是否为鱼眼相机、像素宽和高、内参矩阵和失真系数。相机内参标定方法推荐采用ROS官方程序,camera_calibration。
这里有个疑问:接收了camera_info话题,已经包含了相机内参,为什么还要有个文件设置内参?

distortion_model: "non-fisheye"
width: 1920
height: 1208
D: [-0.094019, 0.09411, -0.001433, 0.000995]
K: [1407.08388, 0.0, 959.1316, 0.0, 1406.07625, 599.30022, 0.0, 0.0, 1.0]

3.1.2params.yaml配置文件

这个文件配置标定程序接收的话题名称、点云选取初始范围和棋盘格参数
我采用了A2规格的标定板,生成棋盘格的matlab代码和图片
生成camera_info话题的方式

# Topics
camera_topic: "/camera_raw"      	#格式为:sensor_msgs/Image
camera_info: "/camera_info"			#格式为:sensor_msgs/CameraInfo
lidar_topic: "/rslidar_points"		#格式为:sensor_msgs/PointCloud2

# Dynamic rqt_reconfigure default bounds,点云的选取的初始范围
feature_extraction:
  x_min: -10.0
  x_max: 10.0
  y_min: -8.0
  y_max: 8.0
  z_min: -5.0
  z_max: 5.0
  
# Properties of chessboard calibration target,棋盘格参数
chessboard:
  pattern_size:		#棋盘的内部顶点7*5
    height: 10
    width: 7  
  square_length: 50
  board_dimension:		# 底板规格
    width: 430
    height: 580
  translation_error:
    x: 2
    y: 0

3.1.3cam_lidar_calibration.rviz配置文件

在rviz里手动修改比较麻烦,可以之间改rviz文件

62   Image Topic: /camera_raw
156  Fixed Frame: rslidar

3.2录制数据集

数据集录制建议:

  • 按照不同的位姿分别录制,这个程序支持后台换rosbag
  • 要求点云和图像的时间戳接近,程序的执行是通过ROS时间同步机制进入回调函数的
  • /rslidar_points符合点云格式要求,可以进入回调函数
  • 论文里录制的位姿数量为:50

3.3正式标定

3.3.1开启程序

运行命令:

source devel/setup.bash
roslaunch cam_lidar_calibration run_optimiser.launch import_samples:=false

会出现RVIZ和rqt_reconfigure窗口

3.3.2播放数据集bag

推荐使用循环播放的方式,采集很短的原始数据就可以,避免下一步分割标定板点云时,还没分割好就播放完了,同时,可以避免采集长时间数据导致bag文件过大。

rosbag play -l filename.bag

3.3.3分割标定板点云

分别调整rqt_reconfigure /feature_extraction的xyz坐标最大值最小值,使区域内仅有棋盘格点云,然后点击窗口左下角的capture sample,如果分割效果或点云扫描效果不佳,会影响RANSAC拟合平面,而在终端里报错,如下两种,都是因为RANSAC拟合不好:
报错1:

[pcl::SampleConsensusModel::getSamples] Can not select 0 unique points out of 1!
[pcl::RandomSampleConsensus::computeModel] No samples could be selected!
[pcl::RandomSampleConsensus::computeModel] RANSAC found no model.
[pcl::SACSegmentation::segment] Error segmenting the model! No solution found.
[ERROR] [1683812483.061709716]: RANSAC unsuccessful, discarding sample - Need more lidar points on board

报错2:

[ERROR] [1683812611.096828779]: Plane fitting error, LiDAR board dimensions incorrect; discarding sample - try capturing again

在这里插入图片描述

位姿数量足够多时,再点击rviz中的optimise进行优化求解,最终结果保存到“cam_lidar_calibration/data/日期时间” 路径下,包括采集的图像、点云pcd、位姿。计算完成后,rviz里还是显示optimising,而且三个图标是灰色,看终端里显示了“end”就表示计算完成了,可以放心关闭程序,查看结果了。
我采集了50组数据,但是只有20组数据能提取出绿色框(标定板)和蓝色箭头(平面法向量)。
在这里插入图片描述

3.3.4评估参数和重投影误差

输入以下指令进行重投影,弹出点云投影到图像的效果,终端里显示误差

roslaunch cam_lidar_calibration assess_results.launch csv:="$(rospack find cam_lidar_calibration)/data/2023-05-13_08-59-09/calibration_2023-05-13_10-13-18.csv" visualise:=true

请添加图片描述

参考资料

官方教程
激光雷达和相机联合标定之cam_lidar_calibration
【学习总结】激光雷达与相机外参标定:代码(cam_lidar_calibration)
cam_lidar_calibration相机与激光雷达标定在ros noetic 中编译
相机雷达联合标定cam_lidar_calibration

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/520794.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

跳槽,如果没有更好的选择,可以去美团试试···

在美团干了半年&#xff0c;说一下自己的感受&#xff0c;美团是一家福利中等&#xff0c;工资待遇中上&#xff0c;高层管理团队强大&#xff0c;加班强度一般&#xff0c;技术不错&#xff0c;办公环境一般&#xff0c;工作氛围中上&#xff0c;部门差距之间工作体验差距巨大…

阿里巴巴官方上线!号称国内Java八股文天花板(终极版)首次开源

铜三铁四已经结束了&#xff0c;但还是有很多Java程序员没有找到工作或者成功跳槽&#xff0c;跳槽成功的也只是从一个坑中&#xff0c;跳入另一个坑中…… 在LZ看来&#xff0c;真正有意义的就业与跳槽&#xff0c;是要进入到一个有绝对潜力的行业或者薪资能实现爆炸式增长的。…

Science Advances:宋艳课题组发现经颅近红外激光刺激可提升人类工作记忆

图1. 新闻稿封面 工作记忆——在几秒钟内主动“记住”有用信息的能力——在许多高级认知活动中起着至关重要的作用。由于工作记忆能力的个体差异可以预测流体智力和广泛的认知功能&#xff0c;这使得提高工作记忆能力成为干预和增强的有吸引力的目标。 美国食品及药品管理局声…

SpringSecurity 一文彻底掌握

文章目录 前言一、SpringSecurity Web方案&#x1f353;Test Controller 测试请求控制器&#x1f923;SpringSecurity 基本原理&#x1f30d;代码底层流程&#xff1a;重点看三个过滤器FilterSecurityInterceptor 方法级的权限过滤器ExceptionTranslationFilter 异常过滤器User…

智能玩具机器人语音识别方案——NRK3301离线语音IC

机器人玩具已经成为儿童玩具和教育用品的主流&#xff0c;它不仅能充分激发和满足了儿童消费群体的好奇心&#xff0c;同时还能强化了消费群体和玩具的互动体验。 机器人玩具主要是通过语音识别技术&#xff0c;让我们可以与玩具对话&#xff0c;可以用语音对玩具发出命令&…

ENVI实现基于像元方法的栅格图像镶嵌拼接(所有图像无需地理信息)

本文介绍基于ENVI软件&#xff0c;利用“Pixel Based Mosaicking”工具实现栅格遥感影像镶嵌拼接的方法。 首先需要说明的是&#xff0c;本文需要镶嵌的遥感影像并不含地理参考信息&#xff0c;因此仅可以使用ENVI中的“Pixel Based Mosaicking”工具&#xff08;该工具可以对…

SpringMVC简介、请求与响应、REST风格、SSM整合、拦截器

目录 SpringMVC简介 SpringMVC概述 入门案例 入门案例工作流程分析 Controller加载控制 PostMan 请求与响应 设置请求映射路径 五种类型参数传递 JSON数据传输参数 JSON对象数据 JSON对象数组 日期类型参数传递 响应 REST风格 REST风格简介 RESTful入门案例…

前后端分离实现社区销售系统

在当今的互联网时代&#xff0c;社区销售系统越来越普及。这种系统可以方便地管理商品、订单以及会员等信息&#xff0c;使得销售过程更加高效和便利。本文将介绍如何通过前后端分离的方式实现一个社区销售系统。 需求分析 社区销售系统主要包括会员管理、商品管理、订单管理…

C++ ---- 类和对象(中)

目录 类的默认成员函数介绍 构造函数 构造函数概念 构造函数特性 析构函数 析构函数概念 析构函数特性 拷贝构造 拷贝构造概念 拷贝构造特点 赋值重载 赋值重载介绍 赋值重载特性 取地址重载和const取地址重载 const成员 取地址和const取地址重载 类的默认成员函…

【致敬未来的攻城狮计划】— 连续打卡第三十天:总结与回顾

学习目标&#xff1a; 自2023年4月13日开始&#xff0c;我参加了为期一个月的【致敬未来的攻城狮计划】&#xff0c;今天是第三十天&#xff0c;做一个总结和回顾。 我参加的是【致敬未来的攻城狮计划】第二期&#xff08;攻城狮计划&#xff09; 在这里首先还是感谢 李…

【云服务器】关于UDP/TCP跨平台网络通信服务器无响应的情况及解决办法

关于跨平台网络通信服务器无反应的情况 一、问题出现二、云服务器Centos7防火墙开放端口2.1 检查防火墙状态2.2 开启防火墙2.3 在running 状态下&#xff0c;向firewall 添加需要开放的端口2.4 重新加载防火墙配置2.5 查看端口是否放开 三、云服务器防火墙配置开放端口3.1 进入…

决策树与随机森林

决策树解决回归问题时进行平均数计算。 决策树 (1)熵&#xff08;entropy)与特征节点 熵&#xff08;entropy&#xff09;&#xff0c;度量着信息的不确定性&#xff0c;信息的不确定性越大&#xff0c;熵越大。信息熵和事件发生的概率成反比。 ■信息熵代表随机变量的复杂度…

c++《list容器的使用》

本文主要介绍list的一些常见接口的使用 文章目录 一、list的介绍二、list的使用2.1 list的构造函数2.2 list迭代器的使用2.3 list相关的容量大小相关的函数2.4 list数据的访问相关的函数2.5 list的数据调整相关的函数2.6 list中其他函数操作 一、list的介绍 list是可以以O(1)的…

IOC理论推导

1.UserDao接口 package com.kuang.dao;public interface UserDao {void getUser(); }2.UserDaoImpl业务接口 package com.kuang.dao;public class UserDaoImpl implements UserDao{Overridepublic void getUser() {System.out.println("默认获取用户数据");} }3.Us…

【ChatGPT】国内免费使用的ChatGPT镜像

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 什么是ChatGPT镜像&#xff1f; 亲测&#xff1a; 一、二狗问答(AI对话) 二、AiDuTu 三、WOChat 四、ChatGPT(个人感觉最好用) 我们可以利用ChatGPT干什么&#xff1f; 一、三分…

基于Python3的tkinter Text文本框加滚动条显示信息

用tkinter进行界面程序开发中&#xff0c;经常需要将信息展示到界面上&#xff0c;给用户及时的反馈和想要看到的结果。Text控件允许用户以不同的样式、属性来显示和编辑文本&#xff0c;它可以包含纯文本或者格式化文本&#xff0c;同时支持嵌入图片、显示超链接以及带有 CSS …

C++ Primer Plus——第6章 分支语句和逻辑运算符

第6章 分支语句和逻辑运算符 6.1 if语句6.1.1 if else语句6.1.2 格式化if else语句6.1.3 if else if else结构 6.2 逻辑表达式6.2.1 逻辑OR运算符&#xff1a;||6.2.2 逻辑AND运算符&#xff1a;&&6.2.3 用&&来设置取值范围 6.1 if语句 if语句让程序能够决定是…

CSP-202212-2 训练计划

目录 一、题目 二、思路 三、C代码如下 一、题目 问题背景 西西艾弗岛荒野求生大赛还有 n 天开幕&#xff01; 问题描述 为了在大赛中取得好成绩&#xff0c;顿顿准备在 n 天时间内完成“短跑”、“高中物理”以及“核裂变技术”等总共 m 项科目的加强训练。其中第 i 项…

【源码解析】@ControllerAdvice实现异常捕获与响应增强处理的原理解析

全局异常处理 demo展示 Slf4j RestControllerAdvice public class GlobalExceptionAdvice {ExceptionHandler(RuntimeException.class)public R<Void> handleNotPermissionException(RuntimeException e, HttpServletRequest request) {String requestURI request.get…

卷土重来?我羊羊羊羊羊了!

大家注意&#xff1a;因为微信最近又改了推送机制&#xff0c;经常有小伙伴说错过了之前被删的文章&#xff0c;比如前阵子冒着风险写的爬虫&#xff0c;再比如一些限时福利&#xff0c;错过了就是错过了。 所以建议大家加个星标&#xff0c;就能第一时间收到推送。&#x1f44…