项目要标定雷达和相机,这里记录下我标定过程,用的速腾 Robosense - 16 线雷达和 ZED 双目相机。

一、编译安装 Autoware-1.10.0

我没有安装最新版本的 Autoware,因为新版本不带雷达和相机的标定工具,我安装的是 1.10.0 版本!

1.1 下载 Autoware-1.10.0 源码

不建议官方的 git check 安装方式,因为不熟悉 git 可能会遇到问题,直接在GitLab 仓库选择 1.10.0 版本下载即可:

1.2 编译 Autoware-1.10.0

编译过程比较容易,我也没遇到编译错误,解压下载的 autoware-1.10.0,在该目录下执行以下命令:

# 1. 进入 autoware 的 ros 目录下
cd autoware-1.10.0/ros # 2. rosdep 安装依赖
rosdep update
rosdep install -y --from-paths src --ignore-src --rosdistro $ROS_DISTRO # 3. 编译
./catkin_make_release

我的台式机配置比较低,大概编译了 1 个小时,好的配置应该编译的更快。

1.3 启动 Autoware-1.10.0

首先还是要进入 ros 目录下,然后 source 环境,之后执行 run 程序即可启动主界面:

# 1. 进入 autoware 的 ros 目录下
cd autoware-1.10.0/ros # 2. source 环境,zsh 或 bash
source devel/setup.zsh[.bash] # 3. 启动主界面
./run

可能需要输入 root 密码,然后启动的主界面如下:

至此 Autoware 就安装好了,后面我们需要用它提供的标定工具包来进行内参和外参的标定,以及标定结果的融合效果测试。

二、标定 ZED 相机内参

2.1 内参标定准备

内参标定需要准备标定板,我用的是我们实验室自己购买的 12x9,棋盘格为 2.5cm 的专业标定板,比较精准,如下:

然后录制一个相机左右话题的 Bag:

rosbag record -O zed_calibration.bag /camera/left/image_raw /camera/right/image_raw

为了得到好的标定结果,录制过程中需要在相机视野里面移动标定板,建议位置如下:

  • X 轴标定:移动到视野的最左边,最右边
  • Y 轴标定:移动到视野的最上方,最底部
  • 倾斜标定:改变标定板的角度,斜着拿
  • Size 标定:移动标定板充满整个相机视野
  • X,Y 和 Size 一起标定:保持标定板倾斜启动到视野的最左,最右,最上,最下

然后我拷贝 Bag 到台式机上回放,但是有问题提示需要 rogbag reindex

rosbag reindex zed_calibration.bag

执行修复下就 OK,速度很快,不过后面的数据会少一些,可能是拷贝过程中的错误导致的,无伤大雅。

1.2 内参标定过程

内参标定比较简单,基本都是自动执行,先 source Autoware 环境以使用标定工具:

cd autoware-1.10.0/ros/

source devel/setup.zsh

启动 roscore:

roscore

启动标定工具 autoware_camera_lidar_calibrator,但是这个工具同时标定双目得到的标定 YAML 文件不能直接作为后面外参标定的输入,因为文件格式有些不同,我也是做实验发现的,因此我单独标定左右相机,这样就会生成可用的 Autoware 格式的 YAML 文件:

rosrun autoware_camera_lidar_calibrator cameracalibrator.py --square 0.025  --size 11x8  image:=/camera/left/image_raw

参数如下:

  • --square:标定板单元格的边长(m),我的标定板是 2.5cm,也就是 0.025m
  • --size:标定板长x宽的格子数减一,我的标定板是 12x9,所以填 11x8
  • image:要标定的相机话题,左或者右

启动后就是一个黑窗口:

然后开始回放内参标定 Bag,默认暂停启动,按空格继续:

rosbag play --pause zed_calibration.bag

标定过程如下,标定工具会根据棋盘格位置自动检测角点:

当右上角的 X、Y、Size、Skew 变为绿色时,标定按钮「CALIBRATE」可用,点击即可计算内参矩阵:

结果在 Shell 中打印出来,点击「SAVE」可保存到 home 目录下:

注意这里会多保存一个 Autoware 类型的 YAML 文件格式,也就是后面外参标定要导入的文件!内容如下:

下面开始标定雷达和相机的外参!

三、ZED 相机和 Robosense-16 线雷达联合标定外参

3.1 联合标定准备

联合标定也要准备标定板和录制 bag 包,标定板用的也是内参标定的棋盘格,另外因为我是在电脑上安装的 Autoware,所以需要在小车上录制雷达和相机的 Bag 数据包,然后再拷贝到我的电脑上回放用于标定工具的话题输入。

我录制 bag 包的命令如下,录制的是ZED 左右相机话题、雷达话题:

rosbag record -O zed_lidar_calibration.bag /camera/left/image_raw /camera/right/image_raw /rslidar_point

录制的时候,因为我是 16 线雷达,所以我拿标定板的时候离雷达不能太远,不然就不能清楚地看到标定板了,录制时建议的站位如下:

  • 近处左边,近处中间,近处右边
  • 中间左边,中间中间,中间右边
  • 远处左边,远处中间,远处右边

每个位置移动改变标定板的姿态,每个姿势停留 1 - 2 秒左右,防止模糊:

  • 上仰,下俯
  • 左偏,中间不动,右偏

我录了挺多次的,也是自己摸索的,因为有的录制的不好,我也没有每个位置都录很久,有时候觉得差不多够了就停了,建议你第一次可以录久些,每个位置停留久一点,保证标定板不会因为移动而模糊!我总结的录制标定包的关键就是:

  • 录制多个位置
  • 改变拿标定板的姿势
  • 必须保证能清楚的看到标定板!

录制完后,我拷贝到台式机上,还是提示我要 reindex 一下,我估计是小车系统的问题:

rosbag reindex zed_lidar_calibration.bag

修复完查看下 info,没有问题:

rosbag info

回放 Bag 使用如下命令,加上 --pause 意思是启动即暂停,防止跑掉数据,按空格继续回放:

rosbag play --pause zed_lidar_calibration.bag

下面我们开始使用 autoware_camera_lidar_calibrator 工具标定雷达和相机。

3.2 标定过程

首先启动 roscore,也可以不用启动,后面 roslaunch 会自动启动:

roscore

接着初始化 Autoware 环境:

cd autoware-1.10.0/ros/

source devel/setup.zsh

然后启动标定工具,这里我标定 ZED 左相机图像和雷达,使用右相机同理:

roslaunch autoware_camera_lidar_calibrator camera_lidar_calibration.launch intrinsics_file:=xxx.yaml image_src:=/camera/left/image_raw
  • intrinsics_file:前面标定 ZED 的 YAML 内参文件路径
  • image_src:要标定的相机话题,这里用的 left image,有需要也可以用 right image

遇到的第一个错误,启动失败提示找不到 image-view2

直接 apt 安装即可:

sudo apt-get install ros-kinetic-jsk-common

遇到的第二个错误,提示找不到 libopencv_core3.so.3.3

我在系统中查找 libopencv_core3.so 这个库:

locate libopencv_core3.so

发现它在如下位置:

/opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_core3.so

然后我这个目录下的所有 opencv 库复制一份到上一级 lib 目录下,解决了这个问题:

sudo cp /opt/ros/kinetic/lib/x86_64-linux-gnu/libopencv_* /opt/ros/kinetic/lib

之后我就可以启动这个标定工具了,界面如下就是一个图片查看器:

然后开始回放 Bag 数据,记得按空格开始回放:

rosbag play --pause zed_lidar_calibration.bag

上面的 image-view2 就会出现相机画面,然后我们按空格暂停回放,准备标定:

标定还需要启动 rviz:

rosrun rviz rviz

点击 Add 添加要订阅的 Image 和 PontCloud2 话题:

分别设置每个订阅话题的 topic、FixedFrame 设置为 rslidar 不然会没有点云显示、切换点云查看视角,用鼠标滑轮调整点云距离,确保能看到我这样的标定板:

然后我们同时切换出 image-view2 的界面,点击工具栏放大图像,然后按照如下步骤手动选择一个像素点和点云进行单次标定:

  1. 观察图像和点云,并在 image-view2 中用鼠标选择一个像素点
  2. 点击 rviz 工具栏的 Publish Point
  3. 然后在 rviz 中选择一个对应的点云数据点(要尽量选择准确),当你的鼠标右下角出现一个浅红色的路标记号时即可点击该数据点
  4. 观察 image-view2 的窗口是否出现 points 的提示信息

重复以上步骤,选择 9 个不同的像素-点云对,因为需要足够的数据才能计算外参矩阵,当第 9 个点选择完后,该工具会自动计算外参标定矩阵:

最终的标定文件保存在 home 目录下,以下是外参文件内容,第一个就是 4x4 的外参矩阵:

四、标定结果测试

标定矩阵有了之后,我们来利用 autoware 提供的融合工具来看下标定的效果如何,先来回放数据:

rosbag play --pause zed_lidar_calibration.bag /rslidar_points:=/points_raw

这里要把雷达的话题换成 points_raw,因为 autoware 订阅的话题名是这个!然后启动 Autoware 主界面,启动方法跟前面一样,切换到 Sensing 标签页,配置如下:

  • Camera ID:我选择的是 left 图像
  • target_frame:默认 velodyne 即可,因为我们已经将雷达话题名改为 velodyne 订阅的名字
  • Ref:选择上一步的外参标定文件
  • image topic source:因为 Camera ID 已经指定了,所以这里只需要填 topic 名即可

点击 OK 关闭窗口(查看终端是否会输出红色错误信息,一般不会),然后再点击 Points Image 选择相机 ID 为 left,点击 OK 确定(此时终端再输出一些信息,但不会报红色错误),如果你的终端出现红色错误信息,就要查看配置是否正确了:

再点击下面的 Rviz 启动 rviz,注意不要单独在终端中 rosrun 启动 rviz,单独启动没有 image-view2 的插件,在 autoware 中启动提供融合的插件 ImageViewerPlugin:

进行如下选择:

  • Image Topic:/camera/left
  • Point Topic:/points_image

然后切换到回放 Bag 终端,按空格继续回放数据,即可出现融合效果,我这里效果一般般,后面打算再重新标定:

五、可能遇到的问题

5.1 Autoware 编译失败

我的编译过程比较顺利,如果你遇到的编译错误,可以先阅读报错信息,看看是否是缺少某个依赖库,然后在网上搜索安装方法,最好用英文 + Google!如果是一些看不懂的错误,可以直接复制报错信息到搜索引擎,有时也能找到答案。

5.2 Rviz 不显示点云

检查 FixedFrame 是否设置为雷达的 frame_id。

5.3 标定结果不准

选点的时候仔细点,多标定几次。

以上就是我的雷达相机内外参标定总结,希望能帮助要标定雷达和相机的朋友,后面我会再写一篇用 Autoware 的 Calibration Tool Kit 工具来标定的博客,可以持续关注我!

Autoware 进行 Robosense-16 线雷达与 ZED 双目相机联合标定!的更多相关文章

  1. Autoware 标定工具 Calibration Tool Kit 联合标定 Robosense-16 和 ZED 相机!

    一.安装 Autoware & ZED 内参标定 & 外参标定准备 之前的这篇文章:Autoware 进行 Robosense-16 线雷达与 ZED 双目相机联合标定! 记录了我用 ...

  2. 相机标定问题-Matlab & Py-Opencv

    一.相机标定基本理论 1.相机成像系统介绍 图中总共有4个坐标系: 图像坐标系:Op    坐标表示方法(u,v)                 Unit:Dots(个) 成像坐标系:Oi      ...

  3. ubuntu16.04 Detectron目标检测库配置(包含GPU驱动,Cuda,Caffee2等配置梳理)

    Detectron概述 Detectron是Facebook FAIR开源了的一个目标检测(Object Detection)平台. 用一幅图简单说明下Object Detection.如Mask R ...

  4. monodepth 训练记录

    2019年2月22日13:52:37 https://zhuanlan.zhihu.com/p/29968267 这里有个tensorlfow代码的阅读博客: https://zhuanlan.zhi ...

  5. 显卡安装一直循环在登录界面——解决之-T450安装显卡驱动和cuda7.5发现的一些问题

    今天,在笔记本T450上,要装zed双目相机的驱动,需要显卡模块和cuda7.5,使用了三种方式,才成功. 1.使用 sudo ubuntu-drivers devices 来查看显卡支持驱动版本,因 ...

  6. Autoware 培训笔记 No. 4——寻迹

    1. 前言 好多初创公司公布出来的视频明显都是寻迹的效果,不是说寻迹不好,相反可以证明,寻迹是自动技术开始的第一步. 自动驾驶寻迹:一种能够自动按照给定的路线(通常是采用不同颜色或者其他信号标记来引导 ...

  7. Autoware 培训笔记 No. 3——录制航迹点

    1.前言 航迹点用于知道汽车运行,autoware的每个航迹点包含x, y, z, yaw, velocity信息. 航迹点录制有两种方式,可以开车录制航迹点,也可以采集数据包,线下录制航迹点,我分开 ...

  8. Autoware 培训笔记 No. 2——基于点云的定位

    1. 前言 构建出地图后,应该测试点云地图定位效果,这里用到ndt的scan_matching方法,这是一种scan-to-map方法.这里用的是我们自己采集的数据进行仿真. 本章内容有和No. 1重 ...

  9. Autoware 培训笔记 No. 1——构建点云地图

    1. 首记 相信许多刚开始玩无人驾驶的人都用过Autoware,对runtime manager都比较熟悉,虽然可以通过各种渠道了解到有些设置,甚至有些设置的app下参数的含义,但是,在真车的使用过程 ...

随机推荐

  1. 中国空气质量在线监测分析平台之JS加密、JS混淆处理

    中国空气质量在线监测分析平台数据爬取分析 页面分析:确定url.请求方式.请求参数.响应数据 1.访问网站首页:https://www.aqistudy.cn/html/city_detail.htm ...

  2. pyhton中的深浅copy

    深浅拷贝:数据分离情况 1. =赋值:数据完全共享(指向内存中的同一个对象)被赋值的变量指向的数据和原变量的数据都是指向内存中的同一个地址: (1)如果是不可变数据类型(数字.字符串等),修改其中的一 ...

  3. mysql小白系列_07 锁与事务

    1.MySQL参数autocommit生产环境设1还是0?为什么? 2.MySQL参数tx_isolation生产环境上大多数是设什么值,为什么? 3.与MySQL锁相关的有哪些因素? 1.MySQL ...

  4. YYTimer学习笔记

    参考资料: https://github.com/ibireme/YYKit/blob/master/YYKit/Utility/YYTimer.h https://www.jianshu.com/p ...

  5. 枚举 转化为可行性判定问题 网络流 poj3189

    Steady Cow Assignment Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6914   Accepted: ...

  6. Linux 下三种提高工作效率的文件处理技巧

    Linux 下三种提高工作效率的文件处理技巧 在 Linux 下工作,打交道最多的就是文件了,毕竟 Linux 下工作一切皆文件嘛.Linux 也为大家提供了多种用于处理文件的命令,合理使用这些命令可 ...

  7. css实现手机端导航栏左右滑动

    <html> <head> <meta charset="utf-8"> <meta name="viewport" ...

  8. spring的各种注入

    java package cn.ioc.student; import java.util.List; import java.util.Map; import java.util.Set; publ ...

  9. 实验四:Linux系统C语言开发环境学习

    项目 内容 这个作业属于哪个课程 班级课程主页链接 这个作业的要求在哪里 作业要求 学号-姓名 17043133-木腾飞 作业学习要求 1.学习Linux系统中如何查看帮助文档:2.在Linux系统中 ...

  10. 07 . Nginx常用模块及案例

    访问控制 用户访问控制 ngx_http_auth_basic_module 有时我们会有这么一种需求,就是你的网站并不想提供一个公共的访问或者某些页面不希望公开,我们希望的是某些特定的客户端可以访问 ...