Astra深度相机在Ubuntu18.04系统下实现相机标定

news2024/11/27 1:27:46

问题:

当使用Astra相机的启动的指令启动相机后,使用rviz查看相机所发布的rgb数据时,在终端会出现如下的提示信息:

Camera calibration file /home/car/.ros/camera_info/rgb_Astra_Orbbec.yaml not found.

Camera calibration file /home/car/.ros/camera_info/depth_Astra_Orbbec.yaml not found.

可以看到提示的信息为相机的标定文件未能在 /home/car/.ros/camera_info/下找到,当我自己根据提示的路径去查找时,发现在/home/car/.ros/路径文件下,并没有camera_info这个文件夹,因此网上查询发现是因为自己没有对相机进行标定的缘故而导致。

下面就根据下面的步骤开始解决这个相机标定问题:

1、准备阶段

1)打印棋盘格,可在下面的这个网站链接中打印自己想要的尺寸的棋盘格,我设置的行列为7x10,大小为18mm的棋盘格

棋盘格网页链接:Camera Calibration Pattern Generator – calib.io

2)在Ubuntu18.04系统中安装标定功能包

sudo apt-get install ros-melodic-camera-calibration

2.1、标定彩色相机

1)启动相机节点

roslaunch astra_camera astra.launch

2)打开相机标定节点并指定话题(astra相机发布的彩色节点为:/camera/rgb/image_raw,可以使用 rostopic list 进行查看相机发布的节点名称

rosrun camera_calibration cameracalibrator.py --size 6x9 --square 0.018 image:=/camera/rgb/image_raw

其中的指令参考如下进行修改:

(1) size指的是:棋盘格内部的角点的行列数;

(注意:不是棋盘格的行列数,如我指定的行列为 7x10 ,则指令中的size就应就改为 6x9 ,因为这个对应的是棋盘格内部的角点的行列数。)

(2) square 是棋盘格每个格子的边长(可以自己用尺子量一下),我这里的是18mm,对应指令应输入0.018,因为指令的单位为米(m);

(3) image是图像话题名称,当Astra深度相机通常为/camera/rgb/image_raw,其他的相机可以通过 rostopic list 指令查看发布的相机节点名称。

3)在弹出的窗口相机视野中手持标定板,不断分别进行左右(X),上下(Y),远近(Size),倾斜(Skew)运动,尽量让这四个维度的进度条都为绿色。此过程要保证标定板上有彩色的条纹才为有效。这个过程中控制台也会打印出标定个数的日志。此过程也可以将标定板固定,然后移动相机。

(1)X:标定靶在摄像头视野中的左右移动;

(2)Y:标定靶在摄像头视野中的上下移动;

(3)Size:标定靶在摄像头视野中的前后移动;

(4)Skew:标定靶在摄像头视野中的倾斜转动

4)当右侧的CALIBRATE圆形按钮由灰色转为绿色时,说明数据采集完毕,此时点击CALIBRATE按钮,便开始读取之前保存的图片并执行标定计算,这里需要等待一会,因为计算需要时间。

5)有标定结果出来后,点击标定界面的SAVE按钮,再点commit按钮,标定结果保存在/tmp/calibrationdata.tar.gz这个压缩包中,到这里彩色相机的标定就结束了,关闭标定程序。

在终端中也会输出相应的标定结果。

6)保存后的标定文件为 /tmp/calibrationdata.tar.gz 的压缩包,将之解压,其中的 ost.yaml就是我们想要的标定结果。

打开ost.yaml,如下:

image_width: 640
image_height: 480
camera_name: narrow_stereo               #相机名称
camera_matrix:                                      #相机内参矩阵(相机坐标系->像素坐标系)
  rows: 3
  cols: 3
  data: [ 556.03872,    0.     ,  335.509  ,
            0.     ,  556.50706,  233.42121,
            0.     ,    0.     ,    1.     ]
distortion_model: plumb_bob
distortion_coefficients:                         #相机畸变系数
  rows: 1
  cols: 5
  data: [0.057411, -0.256237, 0.007304, 0.014521, 0.000000]
rectification_matrix:                             #矫正矩阵
  rows: 3
  cols: 3
  data: [ 1.,  0.,  0.,
          0.,  1.,  0.,
          0.,  0.,  1.]
projection_matrix:                               #投影矩阵(世界坐标系->图像坐标系)
  rows: 3
  cols: 4
  data: [ 547.36389,    0.     ,  345.97145,    0.     ,
            0.     ,  559.91687,  235.82042,    0.     ,
            0.     ,    0.     ,    1.     ,    0.     ]

【参数说明】

   camera_matrix:相机内参矩阵 (固有参数)

   distortion_coefficients:相机畸变系数 (固有参数)

   rectification_matrix:矫正矩阵(一般为单位阵 )

   projection_matrix:投影矩阵(世界坐标系到图像坐标系)

 7)然后将得到的标定文件 ost.yaml 进行名称的修改,此时的更改是根据刚刚报错的终端提文件名进行修改即可,刚刚终端提示的第一条是

Camera calibration file /home/car/.ros/camera_info/rgb_Astra_Orbbec.yaml not found.

然后我们将刚刚彩色相机得到的标定文件 ost.yaml 的名称修改为 rgb_Astra_Orbbec.yaml ,并且还需要将该 yaml 文件中的 camera_name 也修改为 rgb_Astra_Orbbec ,不然后续运行的过程中会出现如下的提示:

[rgb_Astra_Orbbec] does not match name narrow_stereo in file /home/car/.ros/camera_info/rgb_Astra_Orbbec.yaml

因为标定文件中默认的名称为 narrow_stereo ,而我们已经将彩色相机的标定文件修改为了 ost.yaml 的名称修改为 rgb_Astra_Orbbec.yaml ,因此为了保证不出现错误提示,还需要将 yaml 中的 camera_name 也修改为 rgb_Astra_Orbbec 便可解决此问题。

8)将刚刚修改的 rgb_Astra_Orbbec.yaml 移动到 /home/car/.ros文件下的/camera_info/文件夹中,由于我的 /home/car/.ros文件下没有/camera_info/文件夹,因此需要创建并移入

cd /tmp/calibrationdata/

mkdir -p ~/.ros/camera_info

mv rgb_Astra_Orbbec.yaml ~/.ros/camera_info/ 

到此处对于 Astra 相机的彩色部分标定完成。接下来对深度相机(红外相机)部分进行标定操作

2.2、标定红外相机

 1)标定ir红外相机与标定rgb彩色相机相比,除了第一步的image参数不同,其他都一样。

由于其深度数据的成像即为红外相机的投影光斑分析得到的,ir红外的相机标定结果即是深度相机的标定结果。

运行红外相机标定节点:

# 启动相机
roslaunch astra_camera astra.launch

# 运行红外标定
rosrun camera_calibration cameracalibrator.py --size 6x9 --square 0.018 image:=/camera/ir/image

目前测试,在Ubuntu18.04下melodic预览图像内容是黑色的,如下图。但是在rviz下却可以正常查看。

原因是由于默认的IR图像数据是16-bit的,如果想清晰的显示出来,我们需要将之归一化成一个数值范围为0-255范围的8-bit图片。而rviz已经帮我们做了这样的归一化操作。

根据这个思想,我们实现一个图像类型转换节点,即订阅 /camera/ir/image 话题,将得到的16-bit的图片转换成8-bit,然后输出到 /camera/ir/image_mono8,想要输出为 /camera/ir/image_mono8的节点需要使用如下的转换文件才可以,网盘下载链接如下:

image_transformer.zip官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘

将此文件保存到catkin_ws/src文件下,然后使用 catkin_make 指令对刚刚的 image_transformer进行编译操作,编译完成后再次执行如下操作即可实现对红外相机的标定工作。

也可以通过如下指令进行克隆指令

cd catkin_ws/src
git clone https://gitee.com/tangyang/image_transformer

注意,一定得按照我下面的启动顺序依次启动运行指令,不然会出错

# 1)启动相机
roslaunch astra_camera astra.launch

# 2)启动image_transformer转换节点
cd catkin_ws
source ./devel/setup.bash
rosrun image_transformer gray_image_transformer

# 3)运行红外标定
rosrun camera_calibration cameracalibrator.py --size 6x9 --square 0.018 image:= /camera/ir/image_mono8

运行完 rosrun image_transformer gray_image_transformer 指令后,使用 rostopic list 指令便可以查询到转换后的8-bit节点,如下图所示:

运行红外标定指令后的图像如下:

然后便可以在标定程序中查看到如彩色相机标定的类似画面,其中标定的步骤和彩色相机部分一致,并且此处需注意,标定红外相机标定文件保存路径也是在/tmp/下,并且名称也是calibrationdata.tar.gz 的文件,需提前将前面的彩色相机的 calibrationdata.gz 的文件保存到其他地方,不然在红外相机标定文件保存时会将其覆盖。

此外,这里所得到的红外相机的标定文件打开也是和彩色相机相同的命名方式,将 ost.yaml 的名称修改为 depth_Astra_Orbbec.yaml ,将 yaml 中的 camera_name 也修改为 depth_Astra_Orbbec,然后保存修改文件,并使用如下指令将 depth_Astra_Orbbec.yaml 移动到 /home/car/.ros/camera_info/ 路径下

cd /tmp/calibrationdata/

mv depth_Astra_Orbbec.yaml ~/.ros/camera_info/ 

至此,Astra 深度相机的整体标定已完成。

参考博客

奥比中光Astra相机(一)驱动安装及ROS标定 - 哔哩哔哩

使用标定文件出错:does not match name narrow_stereo in file /home/michael/.ros/camera_info/head_camera.yaml._[head_camera] does not match name narrow_stereo in-CSDN博客

Astra plus 深度相机校准标定-CSDN博客

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

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

相关文章

三星:HBM4的16层堆叠技术验证成功

随着人工智能、大数据分析、云计算及高端图形处理等领域对高速、高带宽存储需求的激增,下一代高带宽内存(High Bandwidth Memory, HBM)——HBM4已成为全球存储芯片巨头三星、SK海力士和美光竞相追逐的技术高地。 随着AI、机器学习以及高性能…

【JavaWeb】Day38.MySQL概述——数据库设计-DQL

数据库设计——DQL 介绍 DQL英文全称是Data Query Language(数据查询语言),用来查询数据库表中的记录。 查询关键字:SELECT 查询操作是所有SQL语句当中最为常见,也是最为重要的操作。在一个正常的业务系统中,查询操作的使用频次…

植物糖基转移酶数据库-23年-地表最强系列-文献精读-6

pUGTdb: A comprehensive database of plant UDP-dependent glycosyltransferases pUGTdb:植物UDP依赖糖基转移酶的全面数据库 一篇关于植物糖基转移数据库的综述,地表最强,总结的最全面的版本之一,各位看官有推荐请留言评论区~…

ML Kit:通过Mendix 集成人脸识别算法

预训练模型是一种已经使用训练数据集进行训练并包含执行模型所需所有参数的机器学习模型。这类模型常用于计算机视觉领域,比如可以在Mendix Studio Pro中导入ONNX模型后,可以在微流程中执行该模型。 本文讲述如何在Mendix应用程序中集成特定的人脸检测模…

fakebook-攻防世界

题目 先目录扫描一下 dirseach 打开flag.php是空白的 访问robots.txt,访问user.php.bak <?php class UserInfo { public $name ""; public $age 0; public $blog ""; public function __construct($name, $age, $blog) { …

缓存雪崩以及解决思路

缓存雪崩&#xff1a;缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机&#xff0c;导致大量请求到达数据库&#xff0c;带来巨大压力。 解决方案&#xff1a; 给不同的Key的TTL添加随机值 利用Redis集群提高服务的可用性 给缓存业务添加降级限流策略 给业务…

6.10物联网RK3399项目开发实录-驱动开发之SPI接口的使用(wulianjishu666)

嵌入式实战开发例程&#xff0c;珍贵资料&#xff0c;开发必备&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1149x7q_Yg6Zb3HN6gBBAVA?pwdhs8b SPI 使用 SPI 简介 SPI 是一种高速的&#xff0c;全双工&#xff0c;同步串行通信接口&#xff0c;用于连接微控制器、…

【CTF】rip--堆栈的简单认识

前言 最近在学二进制&#xff0c;准备拿BUUCTF的pwn试试手&#xff0c;还在摸索的阶段&#xff0c;有什么思路出错的地方还请指出。 解题思路 下载文件到kali&#xff0c;查看文件为 64-bit的ELF&#xff08;ELF为Linux下的可执行文件&#xff0c;相当于Windows的exe&#xff0…

ES6-数组、对象、函数扩展、Symbol

01- let声明变量 块级作用域 var是全局变量&#xff0c;let只作用于块级作用域内 每一次都是让一个新的i的值没有被释放掉不允许重复声明变量不提升&#xff08;声明没有提前&#xff09;暂存性死区不与顶层对象挂钩 02-const常量 常量必须初始化&#xff0c;初始化以后就不…

Linux addr2line介绍

打开linux调试选项 嵌入式 linux 经常要编译 linux 内核&#xff0c;默认情况下编译出的内核镜像是不带调试信息的&#xff0c;这样&#xff0c;当内核 crash 打印 PC 指针和堆栈信息时&#xff0c;我们需要反汇编来确认出错位置&#xff0c;不直观。 如果内核开启了调试选项&…

HarmonyOS实战开发-如何实现跨应用数据共享实例。

介绍 本示例实现了一个跨应用数据共享实例&#xff0c;分为联系人&#xff08;数据提供方&#xff09;和联系人助手&#xff08;数据使用方&#xff09;两部分&#xff1a;联系人支持联系人数据的增、删、改、查等功能&#xff1b;联系人助手支持同步联系人数据&#xff0c;当…

动态支付策略:Go 语言中策略模式的妙用

关注公众号【爱发白日梦的后端】分享技术干货、读书笔记、开源项目、实战经验、高效开发工具等&#xff0c;您的关注将是我的更新动力&#xff01; 在现代软件架构中&#xff0c;支付功能是不可或缺的一环。无论是在线购物还是虚拟服务&#xff0c;支付策略的选择直接影响用户体…

GitHub教程:最新如何从GitHub上下载文件(下载单个文件或者下载整个项目文件)之详细步骤讲解(图文教程)

&#x1f42f; GitHub教程&#xff1a;最新如何从GitHub上下载文件(下载单个文件或者下载整个项目文件)之详细步骤讲解(图文教程) &#x1f4c1; 文章目录 &#x1f42f; GitHub教程&#xff1a;最新如何从GitHub上下载文件(下载单个文件或者下载整个项目文件)之详细步骤讲解(图…

Android Framework学习笔记(2)----系统启动

Android系统的启动流程 启动过程中&#xff0c;用户可控部分是framework的init流程。init是系统中的第一个进程&#xff0c;其它进程都是它的子进程。 启动逻辑源码参照&#xff1a;system/core/init/main.cpp 关键调用顺序&#xff1a;main->FirstStageMain->SetupSel…

AI“复活”:慰藉心灵还是触碰禁忌?一文看懂技术与伦理的较量|TodayAI

随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;其应用领域也越来越广泛&#xff0c;不仅仅局限于数据分析、机器人自动化等传统领域&#xff0c;更是延伸到了一些人们曾经认为只存在于科幻小说中的领域。近年来&#xff0c;使用AI技术“复活”逝者的概念&a…

免费云服务器汇总,最长永久免费使用

随着云计算技术的快速发展&#xff0c;越来越多的企业和个人开始将业务迁移到云端。云服务器作为云计算的重要组成部分&#xff0c;以其灵活、高效、可扩展等特点受到广泛关注。然而&#xff0c;许多人在初次接触云服务器时&#xff0c;可能会对高昂的价格望而却步。为了帮助大…

替换空格(替换特定字符)

&#x1f600;前言 在字符串处理中&#xff0c;经常会遇到需要替换特定字符的情况。本文将介绍一道经典的字符串替换问题&#xff1a;将字符串中的空格替换成 “%20”。我们将探讨一种高效的解决方法&#xff0c;通过倒序遍历字符串来实现原地替换&#xff0c;避免额外空间的开…

电网的正序参数和等值电路(三)

本篇为本科课程《电力系统稳态分析》的笔记。 本篇这一章的第三篇笔记。上一篇传送门。 标幺制和电网等值电路 标幺制 标幺值的定义 标幺值是一种相对值&#xff0c;是某种物理量的有名值和所选定的与有名值同单位的基准值之比&#xff0c;即&#xff1a; 标幺值 有名值…

第四百四十八回

文章目录 1. 知识回顾2. 使用方法3. 代码与功能3.1 示例代码3.2 功能说明 4. 内容总结 我们在上一章回中介绍了"overlay_tooltip简介"相关的内容&#xff0c;本章回中将介绍OverlayTooltip用法.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 知识回顾 我们在上…

Mysql底层原理五:如何设计、用好索引

1.索引的代价 空间上的代价 时间上的代价 每次对表中的数据进⾏增、删、改操作时&#xff0c;都需要去修改各个B树索引。⽽且我们讲过&#xff0c;B树每层节点都是按照索引列的值从⼩到⼤的顺序排序⽽组成了双 向链表。不论是叶⼦节点中的记录&#xff0c;还是内节点中的记录&a…