当前位置: 首页 > news >正文

【学习总结】激光雷达与相机外参标定:代码(cam_lidar_calibration)

前段时间尝试了一款激光雷达和相机标定的代码,总结了博客:
【学习总结】激光雷达与相机外参标定:原理与代码

但总觉得那个代码太差劲,而且精度不行,于是又找了些新的代码,体验比之前的好很多,在此做记录。而且精度目测比之前的代码高不少,主要是因为会自动筛选最合适的位姿组合。

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

这个代码的参数配置比之前那个清晰很多,只有一个yaml文件,而且提供的可视化工具也很完善,调试起来解决一些小的接口问题就能够直接运行,好评。

代码使用方法

  1. 运行雷达、相机节点,发布雷达数据,图片数据以及camera info数据;
  2. 运行主要程序节点,通过rqt_config工具,截取xyz坐标轴,使rviz中的点云尽量只保留棋盘格区域;
  3. 点击capture进行一次截取;
  4. 更换棋盘格位置或重新载入下一个rosbag,再点击capture;
  5. 重复3-4,包括至少3个位姿,可以更多;如果某次截取效果不好,可以discard当次截取;
  6. 数量足够后,点击optimize按钮,后台开始优化;
  7. 优化结果输出到命令行与指定路径,并可进行可视化显示误差与结果。

xxx开始截取前的界面,黄色圆圈部分是棋盘格的点云;

在这里插入图片描述修改1中的区间,使仅保留棋盘格点云如2所示,再点击3处的capture

在这里插入图片描述如果成功检测,节点会发布图像中检测的棋盘格和角点,同时点云的窗口会框出棋盘格边界线。如果标定的不准,可以放弃这次截取。

在这里插入图片描述再开始下一次截取。可以后台更换rosbag,所以原始数据可以每次保持静止,搞一个rosbag后调整位置,再录制。

在这里插入图片描述点击optimise后,后台开始优化。后台会将所有位姿任选3个进行组合,计算voq得分,然后选取得分最高的一组,进行后续优化。关于voq的含义查看论文。由于这次只录制了3组,所以只有1种组合。优化后的结果是“旋转向量+平移向量”形式,目测是从Lidar系到camera系的变化。其中旋转向量可以转成XYZ欧拉角,如下:
在这里插入图片描述

代码原理

代码原理也比较简单,虽然代码很多,但需要简单查看就可以发现主线很是清晰:

1. 接收图片和点云数据
在这里插入图片描述最开始程序会接收image和雷达pc两个数据,并通过message_filter进行时间上的同步,所以务必要保证雷达点云和相机的时间戳是基本同步的。同步接收后,会进入extractRegionOfInterest回调。

在这里插入图片描述进入回调后,会首先对点云进行滤波即根据rqt设定的动态参数截取棋盘格区域。之后当点击 capture 按键后进入flag内的代码,进行一次请求。

在这里插入图片描述对于图像检测chessboard就没啥特殊的了。这里重点关注一下点云的处理:首先根据雷达扫描的ring的信息,提取每条ring的最大y值和最小y值,然后第一个和最后一个作为这条ring的起止点。所有的ring处理完后,就得到了棋盘格的四条边。之后四条边进行ransac拟合直线,再计算棋盘格角点。
可以看出,这种计算方法:1)需要雷达具备ring信息(如果不具备请参考上一篇帖子:【将镭神C32激光雷达的PointXYZ数据转化为PointXYZIR格式 - 附代码】;2)要求这条ring不要扫到非棋盘格的点,即上一步进行区域筛选时不要有非棋盘格以外的点。

为了达到 2)这个要求,棋盘格一般与周围物体分离。例如代码作者采用三脚架固定:
在这里插入图片描述
而我这边则是“挂起来”:
在这里插入图片描述

注意事项

  1. 使用时需要按照代码要求,修改参数以及topic的名称;
  2. 如果相机不能自己发布camera_info消息,则需要手动发送。手动造camera_info的方法之前也踩过坑:【ROS中生成CameraInfo消息】
  3. 如果雷达不具备ring的信息,则需要手动添加。手动计算ring信息的方法前连天踩的坑:【将镭神C32激光雷达的PointXYZ数据转化为PointXYZIR格式 - 附代码】
  4. 注意但凡涉及了点云,需要将frame_id设置成一致的,否则容易出问题;

附我这边运行时的 rqt_graph 示意:
在这里插入图片描述

相关文章:

【学习总结】激光雷达与相机外参标定:代码(cam_lidar_calibration)

前段时间尝试了一款激光雷达和相机标定的代码,总结了博客: 【学习总结】激光雷达与相机外参标定:原理与代码 但总觉得那个代码太差劲,而且精度不行,于是又找了些新的代码,体验比之前的好很多,在…...

车载技术开发—{Android CarFrameWork}

Android Automotive平台 Android Automotive是通过Android的通用框架,语言和API来实现的一个全栈,开源,高度可定制的平台。 Android Automotive与整个Android生态系统的关系 Android Automotive是Android的一部分。 Android Automotive不是…...

多城市二手车买卖发布管理小程序开发

多城市二手车买卖发布管理小程序开发 功能特性: 为你介绍二手车微信小程序的功能特性。 车辆分类搜索,支持按品牌、售价、年龄、上牌时间、排量等筛选。 车源发布,支持用户一键发布二手车,平台审核上线,发布可编辑、删除等操作。…...

企业级信息系统开发学习笔记1.2 初探Spring——利用组件注解符精简Spring配置文件

文章目录零、本讲学习目标一、课程引入二、打开项目 - SpringDemo三、利用组件注解符精简Spring配置文件(一)创建新包(二)复制四个类(三)修改杀龙任务类(四)修改救美任务类&#xff…...

37、基于51单片机乒乓球比赛系统设计

摘要 乒乓球游戏电路是一个对输入信号、输入时机正确与否的8个LED表示乒乓球球台和乒乓球,用数码管模拟显示器,显示比赛局数比分和每局玩家得分的电路。电路并不复杂,整体分为两个模块:一,游戏主模块;二&a…...

VMware虚拟机安装Win11最详细过程以及遇到的这台电脑无法运行Windows11的问题

准备工作 在使用VMware虚拟机安装Win11之前我们先把准备工作做好,以免后续思绪混乱导致出错。 1. 到VMware官网或点击链接下载正版VMware Workstation 16 Pro。 2. 双击打开安装包,点击下一步。 3. 阅读用户许可协议,勾选我接受许可协议中的…...

centos误删python2后怎么重新安装

此教程为离线安装 一. 先查询系统版本 cat /proc/version Linux version 3.10.0-1127.el7.x86_64 (mockbuildkbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) ) #1 SMP Tue Mar 31 23:36:51 UTC 2020 二. 安装python2.7.5(已知原python版…...

Qt 开发使用VSCode 笔记2

在之前有写过使用VSCode开发QT的笔记 Qt 开发使用VSCode 在以前的基础上继续学习记录写下《Qt 开发使用VSCode 笔记2》 该笔记相比之前的Qt 开发使用VSCode新加了如下内容: 工作区的使用使用Natvis进行Qt感知对象可视化通过vscode创建QT Quick项目 工作区的使用 …...

查找算法复习

先序在了解查找算法之前,需要熟悉几个概念,不然后面容易产生理解错误。查找表:即被查找的对象,通常由几个关键字组成。关键字:就是数据项、字段的意思。关键字有主次之分,其中主关键字取值是唯一的。查找长…...

腾讯前端必会面试题(必备)

如何提取高度嵌套的对象里的指定属性? 有时会遇到一些嵌套程度非常深的对象: const school {classes: {stu: {name: Bob,age: 24,}} }像此处的 name 这个变量,嵌套了四层,此时如果仍然尝试老方法来提取它: const {…...

探访上汽通用武汉奥特能超级工厂

上汽通用汽车在电动化和智能网联化新技术领域投入了700亿大洋,武汉奥特能超级工厂就是其中一个重点项目。这个工厂已经投产,将成为上汽通用汽车的新能源生产基地,加速奥特能平台车型的推出。 最近别克推出了Electra E5,它是别克第…...

【Linux】线程函数和线程同步详细整理(金针菇般细)

目录 一,线程函数 1.获取当前线程ID 2.创建线程 3.退出线程 4.阻塞线程 5.分离线程 6.取消线程 7.线程比较 8.测试代码(线程函数总结) 二,线程同步 1.互斥锁 2.读写锁 3.条件变量 4.信号量 一,线程函数 …...

Python学习笔记6:抽象

抽象 函数 判断某个对象是否可调用,可使用内置函数callable >>> import math >>> x 1 >>> y math.sqrt >>> callable(x) False >>> callable(y) True斐波那契数组 def fibs(num): result [0, 1] for i i…...

自己手写一个redux

提起 Redux 我们想到最多的应该就是 React-redux 这个库,可是实际上 Redux 和 React-redux 并不是同一个东西, Redux 是一种架构模式,源于 Flux。 React-redux 是 Redux 思想与 React 结合的一种具体实现。 在我们使用 React 的时候,常常会遇…...

mysql调优参数

my.conf [client] port 端口 socket sokcet位置 [mysqld] basedir mysql位置 port 3306 socket sokcet位置 datadir data目录 pid_file mysqld.pid位置 bind_address 0.0.0.0 lower_case…...

JavaEE简单示例——再插入的同时获取插入的主键列

简单介绍: 在某些时候,我们在插入完成一条语句之后,我们会想要返回之前插入的这条语句的主键列的数据,进行下一步的展示或者修改,我们就可以使用MyBatis的主键回写功能,帮助我们获取插入成功的一条数据的主…...

sql语句练习

一、现有以下两张表:第一张表名为cust,其表结构如下:第二张表名为mark,其表结构如下:1) [5分]请写出计算 所有学生的英语平均成绩的sq|语句。2) [5分]现有五 个学生,其学号假定分别为11,22,33,44,55;请用一条SQL语句实现列出这五个…...

广州蓝景—结合chatGPT下的教育模式变化

最近爆火的人工智能AI聊天工具ChatGPT,不仅在互联网,更是在各行各业中,得到了广泛的传播,应该没有哪一个不知道它的存在,但其实你又是否知道,其实ChatGPT是一类模型的统称,随着人工智能的快速发…...

大数据框架之Hadoop:MapReduce(三)MapReduce框架原理——shuffle机制

3.3.1Shuffle机制 Map方法之后,Reduce方法之前的数据处理过程称之为Shuffle。 3.3.2Partition分区 1、问题引出 要求将统计结果按照条件输出到不同文件中(分区)。比如:将统计结果按照手机归属地不同省份输出到不同文件中&#…...

4|无线传感器网络与应用|无线传感器网络原理及方法-许毅版|第3章:无线传感器网络通信-3.1协议结构 3.2物理层|青岛科技大学|课堂笔记

第3章:无线传感器网络通信3.1协议结构3.1.1 OSI参考模型1.网络通信协议MAC层和物理层采用IEEE 802.15.4协议*(1)物理层wsn物理层负责信号的调制和数据的收发,传输介质:无线电、红外线、光波等。(2)数据链路层wsn数据链路层负责数据成帧、帧检…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

2025季度云服务器排行榜

在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...

云原生安全实战:API网关Kong的鉴权与限流详解

🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...