【学习记录】autoware标定相机与激光雷达外参

news/2024/5/14 14:06:27

一、autoware选择

这里踩了好几个坑,首先autoware作为一个无人驾驶知名框架,其内部实际上是有两套标定的东西的,这一点绝大多数博客没有提到。其中最常用的是一个叫标定工具箱的东西,这个ros包已经在1.10往后的版本中被删掉了,所以网上的资料都是基于前人提取出来的代码进行单独编译然后运行,这种标定方法需要用到标定板,个人感觉比较麻烦,用这个标定工具箱,最好是在车上的工控机直接装好相应的程序,录制rosbag有时候提取效果并不好,而且对于标定板的位置和朝向都有许多讲究。

使用这种标定工具箱可以参考:

https://blog.csdn.net/qq_38988221/article/details/129161061
https://blog.csdn.net/mensan1998/article/details/118736810

除了这个方法,其实使用autoware自带的联合标定工具会更方便,这个标定工具在现在的版本里面都还有,其原理就是选择九对相机和点云中的点,然后计算外参矩阵。

使用联合标定工具可以参考:

https://blog.csdn.net/qq_40216084/article/details/108627919
https://blog.csdn.net/lemonxiaoxiao/article/details/107909149?utm_medium=distribute.wap_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-107909149-blog-108627919.237^v3^wap_relevant_t0_download&spm=1001.2101.3001.4242.1
https://blog.csdn.net/HelloJinYe/article/details/106863585?utm_medium=distribute.wap_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-4-106863585-blog-108627919.237^v3^wap_relevant_t0_download&spm=1001.2101.3001.4242.3

二、利用docker可视化界面运行autoware

由于autoware.ai本身已经不再更新了,许多库文件也好源代码也好官方管理的也乱七八糟,所以用docker是目前启动autoware最快捷方便的方法,这里额外记录一下用docker来启动autoware。有关docker的基本使用方法可以参考之前的博客

下载好官方的docker之后,内部是带有ros的,我们可以直接进入docker来启动ros,如果需要新建一个命令行界面,则可以在宿主机重新开一个终端,然后使用下面的指令再进入一次docker。

sudo docker exec -it 你的docker的ID bash

在运行autoware的过程中,一定会用到可视化界面,包括rviz以及autoware的可视化配置界面等内容,这种情况下,需要给docker配置可视化的设置才能将docker内部的东西显示在外面,可以参考链接:

https://blog.csdn.net/qq_42731705/article/details/130798908
https://www.cnblogs.com/jiftle/p/13584725.html

由于标定需要用到提前录制好的rosbag以及内参文件,这里推荐在启动docker时顺便做一下地址映射,这样子就可以很方便地在docker内外传递文件,我启动docker时的指令为:

sudo docker run -it -v /tmp/.X11-unix:/tmp/.X11-unix -v 宿主机文件夹位置:docker内部文件夹位置 -e=DISPLAY=$DISPLAY 镜像的名字

之后就可以利用autoware进行标定,标定在启动过程需要指定内参文件和图像的topic,之后就可以进入到下面的界面进行点的选择,个人推荐在合适的位置,按空格暂停rosbag的播放,然后点击图像的点,然后点击点云中的点,没有合适的就按空格继续播放rosbag,重复这套操作直到选择九对点。
在这里插入图片描述
这个过程中遇到的一个问题是内参文件的格式,最开始我是用ros自带的标定工具去用棋盘格标定的相机内参,然后直接导出为yaml文件,但是用这个文件使用autoware标定时,选完点之后一直报错,错误信息如下:
在这里插入图片描述
查了很多资料也没找出问题所在,后来在一个博客里面发现了别人标定时用的yaml文件,这才发现原来autoware标定时的内参文件和ros标定工具输出的格式是不一样的。

autoware需要的格式为:

%YAML:1.0
---
CameraExtrinsicMat: !!opencv-matrixrows: 4cols: 4dt: ddata: [ 1., 0., 0., 0., 0., 1., 0., 0., 0., 0., 1., 0., 0., 0., 0.,1. ]
CameraMat: !!opencv-matrixrows: 3cols: 3dt: ddata: [ 6.0930328797947482e+02, 0., 3.1031651266062545e+02, 0.,6.0899238994475002e+02, 2.4626671682512318e+02, 0., 0., 1. ]
DistCoeff: !!opencv-matrixrows: 5cols: 1dt: ddata: [ 8.6431249579251121e-02, -1.4704874856941597e-01,-5.5439696020033046e-04, -1.9515514445514945e-03,-2.6628324052679192e-01 ]
ImageSize: [640, 480]
Reprojection Error: 0.0
DistModel: plumb_bob

ros直接输出的格式为:

image_width: 640
image_height: 480
camera_name: narrow_stereo
camera_matrix:rows: 3cols: 3data: [410.73262,   0.     , 318.33938,0.     , 411.97988, 190.16781,0.     ,   0.     ,   1.     ]
distortion_model: plumb_bob
distortion_coefficients:rows: 1cols: 5data: [0.009894, 0.015771, -0.011451, -0.007740, 0.000000]
rectification_matrix:rows: 3cols: 3data: [1., 0., 0.,0., 1., 0.,0., 0., 1.]
projection_matrix:rows: 3cols: 4data: [420.87268,   0.     , 312.09444,   0.     ,0.     , 421.67639, 184.16815,   0.     ,0.     ,   0.     ,   1.     ,   0.     ]

我们需要把下面的内容调整到上面的格式中,其实就是将distortion_coefficients和camera_matrix复制到上面,CameraExtrinsicMat保持不动就行,这个部分标定完autoware会把外参信息填在这里。

标定完可以参考博客对标定结果验证,博客里面提到了默认情况下激光雷达的topic名称是写死的,其实我们也可以不用重新在docker内部编译,可以直接在播放rosbag的时候对topic进行重命名,指令为:

rosbag play calibration.bag -l /lidar/point:=/points_raw

标定完之后效果如下,完美搞定标定任务!
在这里插入图片描述

三、多相机标定

这里最后再补充记录一个标定过程遇到的问题,由于我们的采集设备是一个激光雷达和三个激光雷达,上图为中间相机和激光雷达的外参检验结果,由于基本在一条线上,所以可以看到投影的结果十分准确,但是在标定左右相机的时候,投影的结果明显不一样,左右相机的投影结果如下。
在这里插入图片描述
在这里插入图片描述
本来以为是标定没操作好,和师兄交流的过程中突然就悟道了,第一张图为左相机的投影结果,由于相机在激光雷达左边,所以部分被遮挡的地方向左投影时就是空的,反过来,右边的相机则是右边出现了空。所以在这种情况下,只要边缘位置准确就可以。

四、用autoware标定固态激光雷达

在我们使用的采集车上,除了机械式激光雷达,还同时配备了固态激光雷达,但是由于扫描方法的不同,固态激光雷达输出的点云是不稳定而且稀疏的,这导致选点的过程并不准确,所以固态激光雷达没法直接用autoware标定。本来是让师弟用算法去标定,但是标出来的结果没法直接拿到autoware里面验证,尝试了很多种方法也没能成功,最后在查看livox的说明手册的时候注意到了一句话,积分时间会影响点云密度。瞬间就来了灵感,我写了一个rospy的脚本,将livox输出的点云五帧叠加为一帧,这样子只要环境中拿板子的人移动不快,叠加后的点云就可以在保证清晰的前提下,大幅度提高点云密度。事实证明这种叠加的方法确实有用,叠加后的效果如图:
在这里插入图片描述
用叠加后的rosbag继续用原来的方法进行标定,需要注意的是由于叠加降低了点云的输出频率,在选点时尽量在点云边缘清晰的时候暂停rosbag播放。选择九个点进行标定后,得到结果并验证,在叠加点云上的投影结果为:
在这里插入图片描述
在原始点云上的投影结果为:
在这里插入图片描述

五、图像反投影到点云

在对照博客去反投影验证效果的时候一直提示“Waiting for Image frame to be available”的错误,按照博主的修改方法也没调通,仔细检查了一下输出的信息,发现在launch文件里面修改的图像的topic没能正确传到节点里面,这里直接暴力将“core_perception/pixel_cloud_fusion/src/pixel_cloud_fusion.cpp”里面的image_src修改为了自己图片topic的名字。此外,因为我们使用的相机的frame并不是camera,在启动calibration_publisher.launch时需要对camera_frame进行修改,不然也会找不到坐标系,我的启动指令为:

roslaunch runtime_manager calibration_publisher.launch image_topic_src:=/rgbd/color/image file:=/media/data/[0]calibration/result/extrinsic_param/lidar2rgbd.yaml camera_frame:=Vzense_color_frame target_frame:=rslidar

可以使用下面的指令查看frame信息:

rostopic echo 需要查看的topic名称 | grep frame_id

最后利用rviz可以查看反投影的结果,可以把反投影的点云设置大一些,这样子可视化效果更明显。
在这里插入图片描述

六、标定过程中使用的脚本

可参考本人的gitte主页,包含了叠加点云的脚本和数据集处理的一些脚本。

https://gitee.com/zhang_zhi_he/rosbag_extraction_toolkit

http://www.mrgr.cn/p/06634357

相关文章

【1431】java学习网站系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 学习网站系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&…

双塔模型在召回和粗排的区别

答案参考:推荐系统中,双塔模型用于粗排和用于召回的区别有哪些? - 知乎 召回和粗排在不同阶段面临样本不一样,对双塔来说样本分布差异会使召回和粗排采取不一样的方式。召回打分空间是全部item空间,曝光只有很少一部分&#xff0…

eclipse 如何创建python文件

一、准备 1.平台要求: 电脑除了要安装eclipse软件和Python语言包之外,还需要将Python集成到eclipse软件中,网上有很多的方法,这里就不细细介绍如何集成了。 在下面界面中可以看到自己已经安装了继承插件。具体方法见步骤2&…

Linux网络编程---Socket编程

一、网络套接字 一个文件描述符指向一个套接字(该套接字内部由内核借助两个缓冲区实现。) 在通信过程中,套接字一定是成对出现的 套接字通讯原理示意图: 二、预备知识 1. 网络字节序 内存中的多字节数据相对于内存地址有大端和小端之分 小端法&…

【C语言】贪吃蛇详解(附源码)

一、贪吃蛇实现效果 【C语言】贪吃蛇(控制台) 二、源码 🎈🎈🎈Snake 残风也想永存/C语言项目 - 码云 - 开源中国 (gitee.com)🎈🎈🎈 三、如何使用C语言去实现一个贪吃蛇&#xff1f…

Python数据分析 DataFrame 笔记

08,DataFrame创建 DataFrame是一个【表格型】的数据结构,可以看做是【由Series组成的字典】(共用同一个索引)。DataFrame由按一定顺序排列的多列数据组成。设计初衷是将Series的使用场景从一维拓展到多维。DataFrame既有行索引,也有列索引。行索引:index 列索引:columns…

【介绍下分布式系统】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

同事上班这样摸鱼,我坐边上咋看他都在专心写代码啊

我边上有个同事,我坐他边上,但是每天看着他都眉头紧锁,忙的不亦乐乎,但终于有一天,我发现了他上班摸鱼的秘诀。 我劝你千万不要学会这4招,要不就该不好好上班了。 目录 1 上班看电影? 2 上班…

使用joinjs绘制流程图(五)-流程图绘制

效果代码 <template><div class="app"><div ref="myholder" id="paper"></div></div> </template><script> import * as joint from @joint/core export default {data() {return {graph: null,}},mo…

洗地机哪个品牌好?四款性能王者巅峰对决推荐

洗地机的出现&#xff0c;让我们可以高效快速的完成地面清洁&#xff0c;家里干净卫生的同时还让我们有更多的时间去做其他事情。但是面多众多的机型&#xff0c;大家难免有些疑问&#xff0c;究竟哪个好用&#xff0c;怎么挑选到适合我的家用的洗地机&#xff1f;来&#xff0…

云原生Service Mesh服务网格简单介绍

serviceMesh是什么 Service Mesh是一个用于处理服务间通信的基础设施层&#xff0c;旨在实现云原生应用复杂服务拓扑中的可靠请求传递。其基本构成是一组与应用一起部署的轻量级网络代理&#xff0c;这些代理对应用来说是透明的。Service Mesh通过统一的方式来控制和处理服务间…

使用joinjs绘制流程图(二)-Paper对象的属性和方法

效果代码 <template><div class="app"><div ref="myholder" id="paper"></div></div> </template><script> import * as joint from @joint/core export default {data() {return {graph: null,}},mo…

使用joinjs绘制流程图(三)-Rect对象属性

效果代码 <template><div class="app"><div ref="myholder" id="paper"></div></div> </template><script> import * as joint from @joint/core export default {data() {return {graph: null,}},mo…

经典的目标检测算法有哪些?

一、经典的目标检测算法有哪些&#xff1f; 目标检测算法根据其处理流程可以分为两大类&#xff1a;One-Stage&#xff08;单阶段&#xff09;算法和Two-Stage&#xff08;两阶段&#xff09;算法。以下是一些经典的目标检测算法&#xff1a; 单阶段算法: YOLO (You Only Loo…

system -v 信号量的使用

本文介绍了,以图片的形式介绍了system -V IPC信号量的主要作用以及使用的例程,并且用买卖车为例子介绍了信号量的具体使用方法。信号量的作用 信号量是system -v IPC中的一种,通过P、V操作它体现了同步和互斥资源的分配机制。信号量的作用主要可以总结为如下:信号量是syste…

站立会议和燃尽图08

站立会议和燃尽图08 一、小组情况 组长:李宏威 组员:董泽豪 队名:隐约雷名 二、Scrum例会 时间:2024年4月26日 出席人员:李宏威,董泽豪 要求1 工作照片要求2 时间跨度 2024年4月26日 7:00 至 2024年4月26日 7:20 共计 20 分钟 要求3 地点 石家庄铁道大学 要求4 立会内容包…

业财一体化数字化

业财一体化有助于打破业务和财务之间的隔阂,助推企业做好业务洞察,而业财一体化数字化,则可以进一步助推财务业务一体化,提升业务财务的协同效率。这篇文章里,作者就对业财一体化的定义、挑战、以及业财一体化数字化等内容做了拆解,一起来看。 引子 销售人员老王签订了个…

站立会议和燃尽图06

站立会议和燃尽图06 一、小组情况 组长:李宏威 组员:董泽豪 队名:隐约雷名 二、Scrum例会 时间:2024年4月24日 出席人员:李宏威,董泽豪 要求1 工作照片要求2 时间跨度 2024年4月24日 7:00 至 2024年4月24日 7:20 共计 20 分钟 要求3 地点 石家庄铁道大学 要求4 立会内容包…

站立会议和燃尽图07

站立会议和燃尽图07 一、小组情况 组长:李宏威 组员:董泽豪 队名:隐约雷名 二、Scrum例会 时间:2024年4月25日 出席人员:李宏威,董泽豪 要求1 工作照片要求2 时间跨度 2024年4月25日 7:00 至 2024年4月25日 7:20 共计 20 分钟 要求3 地点 石家庄铁道大学 要求4 立会内容包…

智慧供热一站式热网平衡多功能集成系统

供热管理地域分散的现实&#xff0c;决定必须采用先进技术手段开发软件系统&#xff0c;使各管理单位互联互通。在多年技术积累的基础上&#xff0c;公司采用目前成熟而且领先的技术架构&#xff0c;研发了适用于多个组织机构集中式管理的供热管理软件。使管理在技术上不再受地…