使用iai_kinect2标定kinectV2相机

2023-05-16

实验背景:因为需要制作bundlefusion需要的数据集,所以需要使用kinectV2相机获取rgbd图像,年前的时候在我的笔记本上安装了libfreenect2库和iai_kinect2,标定过一次kinecv2相机,然后使用kinectv2相机实时获取的图像实现elasticfusion稠密重建.但是由于当时时间紧迫,很多东西都没有搞明白,所以趁这次机会将一些问题整理一下,记录一下.

环境搭建:

1. 安装了ROS的kinetic版本

libfreenect2和iai_kinect2的安装参考文章: https://www.cnblogs.com/li-yao7758258/p/7445429.html

2. 下载libfreenect2

$ cd Downloads
$ git clone https://github.com/OpenKinect/libfreenect2.git

3.安装libfreenect2的依赖

sudo apt-get install build-essential cmake pkg-config libturbojpeg libjpeg-turbo8-dev mesa-common-dev freeglut3-dev libxrandr-dev libxi-dev

安装libusb
sudo apt-add-repository ppa:floe/libusb
sudo apt-get update
sudo apt-get install libusb-1.0-0-dev
 
安装GLFW3
cd libfreenect2/depends 
sh install_ubuntu.sh
sudo dpkg -i libglfw3*_3.0.4-1_*.deb

4.  继续安装libfreenect2库

$ cd libfreenect2
$ mkdir build 
$ cmake ../
$ make -j4
$ sudo make install

5. 使用lsusb指令测试kinectv2相机有没有链接成功.

6. 编译iai_kinect2

$ cd ~/ROS  #在/home/yunlei下创建了一个ROS文件夹,专门盛放ros的工程
$ mkdir -r ./iai_kinect2_ws/src/
$ cd ./iai_kinect2/src
$ git clone https://github.com/code-iai/iai_kinect2.git
$ cd iai_kinect2
$ rosdep install -r --from-paths .
$ cd ~/ROS/iai_kinect2
$ catkin_make -DCMAKE_BUILD_TYPE="Release"
$ rospack profile

7. 测试kinectv2相机是否链接成功

$ cd Download
$ cd libfreenect
$ cd build/bin
$ ./Protonect

如果一切正常的话,相机拍摄的画面将映入眼帘. 

 8. 测试kinectv2图像数据

$ cd ~/ROS/iai_kinect2_ws
$ source ./devel/setup.bash
$ roslaunch kinect2_bridge kinect2_bridge.launch

# open a new terminal
$  rosrun kinect2_viewer kinect2_viewer(但是我这里执行失败) 

9. 查看此时发布的与kinect相关的topics

/kinect2/bond
/kinect2/hd/camera_info
/kinect2/hd/image_color
/kinect2/hd/image_color/compressed
/kinect2/hd/image_color_rect
/kinect2/hd/image_color_rect/compressed
/kinect2/hd/image_depth_rect
/kinect2/hd/image_depth_rect/compressed
/kinect2/hd/image_mono
/kinect2/hd/image_mono/compressed
/kinect2/hd/image_mono_rect
/kinect2/hd/image_mono_rect/compressed
/kinect2/hd/points
/kinect2/qhd/camera_info
/kinect2/qhd/image_color
/kinect2/qhd/image_color/compressed
/kinect2/qhd/image_color_rect
/kinect2/qhd/image_color_rect/compressed
/kinect2/qhd/image_depth_rect
/kinect2/qhd/image_depth_rect/compressed
/kinect2/qhd/image_mono
/kinect2/qhd/image_mono/compressed
/kinect2/qhd/image_mono_rect
/kinect2/qhd/image_mono_rect/compressed
/kinect2/qhd/points
/kinect2/sd/camera_info
/kinect2/sd/image_color_rect
/kinect2/sd/image_color_rect/compressed
/kinect2/sd/image_depth
/kinect2/sd/image_depth/compressed
/kinect2/sd/image_depth_rect
/kinect2/sd/image_depth_rect/compressed
/kinect2/sd/image_ir
/kinect2/sd/image_ir/compressed
/kinect2/sd/image_ir_rect
/kinect2/sd/image_ir_rect/compressed
/kinect2/sd/points

10. 打开/home/yunlei/ROS/iai_kinect2_ws/src/iai_kinect2/kinect2_bridge/launch/kinect2_bridge.launch查看kinect相机的分辨率

 <!-- sd point cloud (512 x 424) -->
  <node pkg="nodelet" type="nodelet" name="$(arg base_name)_points_xyzrgb_sd" machine="$(arg machine)"
        args="load depth_image_proc/point_cloud_xyzrgb $(arg nodelet_manager)" respawn="$(arg respawn)">
    <remap from="rgb/camera_info"             to="$(arg base_name)/sd/camera_info"/>
    <remap from="rgb/image_rect_color"        to="$(arg base_name)/sd/image_color_rect"/>
    <remap from="depth_registered/image_rect" to="$(arg base_name)/sd/image_depth_rect"/>
    <remap from="depth_registered/points"     to="$(arg base_name)/sd/points"/>
    <param name="queue_size" type="int" value="$(arg queue_size)"/>
  </node>

  <!-- qhd point cloud (960 x 540) -->
  <node pkg="nodelet" type="nodelet" name="$(arg base_name)_points_xyzrgb_qhd" machine="$(arg machine)"
        args="load depth_image_proc/point_cloud_xyzrgb $(arg nodelet_manager)" respawn="$(arg respawn)">
    <remap from="rgb/camera_info"             to="$(arg base_name)/qhd/camera_info"/>
    <remap from="rgb/image_rect_color"        to="$(arg base_name)/qhd/image_color_rect"/>
    <remap from="depth_registered/image_rect" to="$(arg base_name)/qhd/image_depth_rect"/>
    <remap from="depth_registered/points"     to="$(arg base_name)/qhd/points"/>
    <param name="queue_size" type="int" value="$(arg queue_size)"/>
  </node>

  <!-- hd point cloud (1920 x 1080) -->
  <node pkg="nodelet" type="nodelet" name="$(arg base_name)_points_xyzrgb_hd" machine="$(arg machine)"
        args="load depth_image_proc/point_cloud_xyzrgb $(arg nodelet_manager)" respawn="$(arg respawn)">
    <remap from="rgb/camera_info"             to="$(arg base_name)/hd/camera_info"/>
    <remap from="rgb/image_rect_color"        to="$(arg base_name)/hd/image_color_rect"/>
    <remap from="depth_registered/image_rect" to="$(arg base_name)/hd/image_depth_rect"/>
    <remap from="depth_registered/points"     to="$(arg base_name)/hd/points"/>
    <param name="queue_size" type="int" value="$(arg queue_size)"/>

可以发现kinecv2相机可以直接获取的图像的分辨率有三个,分别是:hd(1920x1080), qhd(960x540), sd(512x424),每一种分辨率又对应了彩色图,灰度图,深度图,以及是否是经过去畸变处理的,深度图是否和彩色图配准.

11. 如果你想获取rect图像,那么你需要给定相应分辨率的相机内参数,而此时使用的是默认/iai_kinect2/kinect2_bridge/data下的相机参数,所以你需要标定你需要的分辨率的相机参数.

12.关于数据获取,如果我标定了960x540的相机内参数,获取了去畸变后的而图像,我直接使用rosbag record指令,录制相应的topic就可以了.所以现在最关键的是标定相机

13. iai_kinect2中也提供了标定工具,在/home/yunlei/ROS/iai_kinect2_ws/src/iai_kinect2/kinect2_calibration中,不过此时在/home/yunlei/ROS/iai_kinect2_ws/src/iai_kinect2/kinect2_calibration/src/kinect2_calibration.cpp文件中默认是标定1920x1080的图像,如果想要标定960x540的相机内参数,则需要将文件1349行中的HD改为QHD

将原来的

std::string topicColor = "/" + ns + K2_TOPIC_HD + K2_TOPIC_IMAGE_MONO;
std::string topicIr = "/" + ns + K2_TOPIC_SD + K2_TOPIC_IMAGE_IR;
std::string topicDepth = "/" + ns + K2_TOPIC_SD + K2_TOPIC_IMAGE_DEPTH;

改为 

std::string topicColor = "/" + ns + K2_TOPIC_QHD + K2_TOPIC_IMAGE_MONO;
std::string topicIr = "/" + ns + K2_TOPIC_SD + K2_TOPIC_IMAGE_IR;
std::string topicDepth = "/" + ns + K2_TOPIC_SD + K2_TOPIC_IMAGE_DEPTH;

我刚开始改成了SD但是这种情况下,当你执行rosrun kinect2_calibration kinect2_calibration chess5x7x0.03 record color指令时,没有弹出图像窗口,无法保存图像,并且提示

[ERROR] Tried to advertise a service that is already advertised in this node [/kinect2_calib_1591865100768222736/compressed/set_parameters]
[ERROR] Tried to advertise a service that is already advertised in this node [/kinect2_calib_1591865100768222736/compressed/set_parameters]

我刚开始根据这个错误提示去搜索出了什么问题,但是有网友说这个不影响标定,(https://blog.csdn.net/weixin_30536513/article/details/94969881)但是我这里确实影响了.我折腾了好久,但是还是没有解决这个问题,当我想放弃的时候,突然想起来,我可以把上面的SD改为QHD试试.果然,当我改成了QHD后发现,虽然还是会有上面的错误的提示,但是此时弹出了图像窗口,当我拿着标定板进入相机的视野时,他可以检测到标定板子上的特征点,哇,我好开心.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用iai_kinect2标定kinectV2相机 的相关文章

随机推荐

  • 马斯克官宣:卸任推特CEO,继承者是她,网友:不会是女版的你吧!

    整理 朱珂欣 出品 CSDN程序人生 xff08 ID xff1a coder life xff09 推特公司 CEO 马斯克周四在推特上宣布 xff1a 为 X Twitter 公司聘请到了一位新 CEO xff0c 她将在大约 6 周后
  • 一款支持聚合支付,拿来就能用的支付系统,开源了!

    项目介绍 Jeepay是一套适合互联网企业使用的开源支付系统 xff0c 支持多渠道服务商和普通商户模式 已对接微信支付 xff0c 支付宝 xff0c 云闪付官方接口 xff0c 支持聚合码支付 Jeepay使用Spring Boot和A
  • 星标1.4k,一款国产开源数据同步中间件,支持多种数据源和预警功能!

    DBSyncer是一款开源的数据同步中间件 xff0c 提供MySQL Oracle SqlServer PostgreSQL Elasticsearch ES Kafka File SQL等同步场景 支持上传插件自定义同步转换业务 xff
  • 快速构建,一款轻量级的企业知识分享与团队协同软件开源了!

    今天给大家分享一款开源的轻量级的企业知识软件 xff0c 主打一个实用 xff01 介绍 MM Wiki 是一个轻量级的企业知识分享与团队协同软件 xff0c 可用于快速构建企业 Wiki 和团队知识分享平台 部署方便 xff0c 使用简单
  • “sudo: aptitude: command not found”问题解决办法

    caoxuepeng 64 caoxuepeng G3 3579 sudo aptitude install libhdf5 serial dev sudo aptitude command not found 问题描述 xff1a 命令不
  • apm软件仿真+QGC地面站 环境搭建

    本教程使用场景 xff1a apm软件仿真运行于虚拟机 ubuntu环境 qgc地面站位于windows 系统 两个环境在同一台电脑上 一 apm仿真环境搭建 1 安装vm虚拟机及ubuntu 18 2 ubuntu下 下载Ardupilo
  • GPS基础知识(四)、GPS信号结构

    GPS信号结构 xff08 三层 xff09 载波伪码数据码 一 xff0c 载波 载波是三层的基础 xff0c 伪码和数据码都是调制在载波上才能发送 GPS有两个载波频率 xff0c L1和L2 xff0c L1为1575 42MHz x
  • 简述四种干扰观测器(三)————基于扩张状态观测器的干扰观测器

    本节以最广泛应用的二阶系统为例介绍通用的线性观测器 非线性的扩张状态观测器将在将在自抗扰控制中介绍 观测器设计问题 xff0c 就是重新构造一个系统 xff0c 利用原系统中可以直接测量到的输出向量和输入向量作为它的输入信号 xff0c 并
  • Typora+PicGo+阿里云oss

    阿里云Oss图床 43 PicGo 43 Typora 之前用的gitee网上说可能会不稳定 xff0c 我就改成了阿里云OSS对象存储 参考 xff1a PicGo配置阿里云OSS 栗筝i的博客 CSDN博客 picgo 阿里云 1 注册
  • centos安装软件失败

    错误 xff1a 为仓库 appstream 下载元数据失败 Cannot prepare internal mirrorlist No URLs in mirrorlist 问题参考 CentOS Linux 8 AppStream 错误
  • Docker容器安装ssh

    Docker 容器里安装ssh和连接ssh 在服务器创建容器中安装了anaconda xff0c 为了方便敲代码 xff0c 用pycharm连接容器中的anaconda xff0c 我们需要安装ssh服务 前提 创建好docker容器 x
  • 阿里云创始人王坚正式回归阿里云

    5 月 11 日消息 xff0c 阿里云创始人王坚正式回归阿里云 据多名知情人士透露 xff0c 早在 2022 年底 xff0c 王坚其实就已经应张勇等人邀请 xff0c 以幕后顾问的角色进行考察和指导阿里云的工作 经过几个月的磨合和协商
  • random.seed()的用法

    random random 可以用来生成一个随机数 xff0c 如果在生成随机数之前 xff0c 先调用random seed x xff0c x可以是一个随机整数 xff0c 这时候在调用random random xff0c 则种子x和
  • PRGC: Potential Relation and Global Correspondence Based Joint Relational Triple Extraction

    标题 xff1a PRGC xff1a 基于潜在关系和全局对应的联合关系三元组抽取 摘要 联合抽取实体和关系的局限性 xff1a 关系预测的冗余性 xff0c 基于span抽取泛化能力差和效率低 本文从新角度将此任务分解为三个子任务 xff
  • 查看显存使用情况:nvidia-smi

    在装有nvidia驱动的机器终端输入nvidia smi xff0c 可以查看显卡的状况 xff0c 其输出界面如下 xff1a NVIDIA 系统管理接口 xff08 nvidia smi xff09 是一个命令行实用程序 xff0c 基
  • Docker更换Docker Root Dir目录

    原因 xff1a 我在加载自己的镜像时 xff0c 发现root空间不足 xff0c 无法加载 xff0c 所以需要更改Docker Root Dir目录 xff0c 才能放下我的镜像文件 具体方法 一 查看默认目录 执行docker in
  • PHP关于时间的整理

    year 61 date 34 Y 34 month 61 date 34 m 34 day 61 date 34 d 34 dayBegin 61 mktime 0 0 0 month day year 当天开始时间戳 dayEnd 61
  • 制作.sens数据集跑通bundlefusion

    1 主要参考这篇博客实现 https blog csdn net Wuzebiao2016 article details 94426905 2 首先就是将自己采集的RGBD图像的保存格式向Bundlefusion需要的格式对齐 xff0c
  • python之moviepy库的安装与使用

    目的 xff1a 因为需要保存一个大大的 mp4视频 xff0c 以防过程中设备出现异常导致整个长长的视频无法正常保存 xff0c 所以采用分段保存视频的方式 xff0c 每500帧保存一段 xff0c 然后再将视频合到一起 xff0e 最
  • 使用iai_kinect2标定kinectV2相机

    实验背景 xff1a 因为需要制作bundlefusion需要的数据集 xff0c 所以需要使用kinectV2相机获取rgbd图像 xff0c 年前的时候在我的笔记本上安装了libfreenect2库和iai kinect2 xff0c