硬件:jetson agx xavier,系统 ubuntu 18.04.

1. Azure kinect 简介

Azure Kinect DK 文档
github: Azure-Kinect-Sensor-SDK
github:Azure_Kinect_ROS_Driver

深度相机与 rgb 相机的简要说明

Azure Kinect DK 硬件规格
深度相机的视场:
Narrow Field of View (NFOV) :窄视场深度模式。适合于 X,Y 维度范围小,Z 维度范围大的场景。
Wide Field of View (WFOV) :宽视场深度模式。适合于 X,Y 维度范围大,Z 维度范围小的场景。

Azure Kinect DK 集成了 Microsoft 设计的 1 兆像素时差测距 (ToF) 深度相机,该相机使用符合 ISSCC 2018 的图像传感器。 深度相机支持如下所述的模式:
在这里插入图片描述
深度相机可选模式解析:
WFOV_UNBINNED:深度图分辨率1024x1024,带畸变
WFOV_2X2BINNED:深度图分辨率512x512,带畸变
NFOV_UNBINNED:深度图分辨率640x576,去畸变
NFOV_2X2BINNED:深度图分辨率320x288,去畸变

Azure Kinect DK 包含 OV12A10 12MP CMOS 滚动快门传感器。 下面列出了 Color camera 支持的工作模式:
在这里插入图片描述

坐标系

每个传感器设备有关联的独立坐标系,使用校准函数可以转换这些坐标系之间的点。 转换函数转换坐标系之间的整个图像。

2. 安装 Azure Kinect Sensor SDK

直接根据官网 Azure Kinect 传感器 SDK 下载 的步骤安装即可。
目前,唯一支持的Linux 系统分发版是 Ubuntu 18.04。

2.1 安装步骤:

  1. 配置Microsoft的包存储库 (Ubuntu 18.04)
curl -sSL https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
sudo apt-add-repository https://packages.microsoft.com/ubuntu/18.04/prod
sudo apt-get update

若没有 curl 命令,则先安装 curl:

sudo apt install curl

  1. 安装所需的包
  • k4a-tools 包,其中包含 Azure Kinect 查看器Azure Kinect 录制器Azure Kinect 固件工具。安装该包运行:sudo apt install k4a-tools

  • libk4a<major>.<minor>-dev包。<major>.<minor>是版本号,比如(上述)官方说明文档中给出的是1.1,即libk4a1.1-dev,而目前github上最新release已经是1.4了,即libk4a1.4-dev。
    说明:libk4a<major>.<minor>-dev 包中包含针对 libk4a 生成的头文件以及 CMake 文件。 libk4a<major>.<minor> 包中包含共享对象,运行依赖于 libk4a 的可执行文件时需要这些对象。
    安装libk4a1.4-dev 包指令:sudo apt install libk4a1.4-dev

如果该命令成功,则表示 SDK 可供使用。

一个可能对 jetson AGX Xavier 有用的资源链接:#1093 ,libk4a1.4 deb arm64 版 手动下载地址。

2.2 使用测试

在电脑中找到一个叫k4a-tools.list的文件(通常文件路径为/var/lib/dpkg/info/k4a-tools.list),打开,查看 k4aviewer文件的路径(通常为
/usr/bin/k4aviewer)。
打开终端输入以下命令即可打开Azure Kinect 查看器

cd /usr/bin
sudo k4aviewer

其实在任意路径下执行sudo k4aviewer命令都可以打开Azure Kinect 查看器。

使用Azure Kinect DK 录制器,录制mkv文件。

k4arecorder output.mkv

可能有用的参考:
Azure Kinect DK 深度相机,Ubuntu 18.04系统安装SDK
注意:可能需要安装NVIDIA的显卡驱动
Azure Kinect DK + Ubuntu 18.04,从相机获取图像和点云数据

3. 安装 ROS package : Azure_Kinect_ROS_Driver

有文章引用了Azure-Kinect-Sensor-SDK/docs/usage.md,中的一句话,开始费心扒拉的编译Azure Kinect Sensor SDK源码。

If you are making changes to the SDK, you can build your own copy of the SDK from source。

请不要听信此等过气言论!!!
Building the Azure Kinect ROS Driver 中说只要将Azure Kinect Sensor SDK安装在了默认位置,即可自动被 located。根本不需要编译 SDK 源码!

The Azure Kinect ROS Driver includes CMake files which will try to locate the installed location of the Azure Kinect Sensor SDK. Installing the SDK in a non-default location will result in compile failures when CMake is unable to locate the SDK.

过气参考:
知乎:Azure Kinect DK + ROS (ubuntu 16.04)
Ubuntu18.04+Azure Kinect DK配置全过程(SDK源码+ROS)
ubuntu16.04\18.04安装Azure Kinect SDK+配置ros版 超全详细踩坑记录

3.1 编译Azure-Kinect-Sensor-SDK源码(此节无用,务必跳过)

  1. 拷贝深度引擎文件ibdepthengine.so.2.0(此步似乎不需要,上一节安装完 libk4a1.4-dev 后文件已经在相应的文件夹中了)
cd /usr/lib/x86_64-linux-gnu/libk4a1.4
sudo cp libdepthengine.so.2.0 /usr/lib/x86_64-linux-gnu

jetson TX2 及 Xavier 应该在 /usr/lib/aarch64-linux-gnu 文件夹。

  1. Azure-Kinect-Sensor-SDK源码下载:
git clone -b https://github.com/microsoft/Azure-Kinect-Sensor-SDK.git

  1. 安装依赖
    在~/Azure-Kinect-Sensor-SDK/scripts/docker 路径下找到setup-ubuntu.sh文件,右击->属性->权限->勾选允许作为程序执行文件
    打开命令行,执行脚本文件:
sudo setup-ubuntu.sh

若依然无法执行,可直接打开脚本,手动sudo apt install
4. 编译 SDK
编译过程中需要在线下载额外的依赖包,下载的地址在~/Azure-Kinect-Sensor-SDK/.gitmodules中,libyuv包需要翻墙才能下载,在这里需要将其地址改为Github上的源。
在~/Azure-Kinect-Sensor-SDK/路径下按下Ctrl+h按键,显示隐藏文件,此时可以发现.gitmodules文件,找到libyuv对应的url,将其替换为下面地址即可。

url = https://github.com/lemenkov/libyuv.git

编译 SDK

mkdir build
cd build
cmake .. -GNinja -DCMAKE_BUILD_TYPE=Debug
ninja
# 安装到系统路径中,便于后续 SDK 开发
sudo ninja install

3.2 安装 Azure_Kinect_ROS_Driver

前提,装好 ros 和 Azure-Kinect-Sensor-SDK。

  1. 去掉运行SDK时的Root限制。
    这一步是必要的。因为Azure_Kinect_ROS_Driver 无法获取 root 权限,会报错Failed to open a K4A device. Cannot continue.
    下载Azure-Kinect-Sensor-SDK源码,进入源码根目录中 scripts 文件夹,复制99-k4a.rules文件至 /etc/udev/rules.d/ 。
git clone -b https://github.com/microsoft/Azure-Kinect-Sensor-SDK.git
cd Azure-Kinect-Sensor-SDK/scripts 
sudo cp 99-k4a.rules /etc/udev/rules.d/

重新插拔相机电源,测试。显示正常。

$ k4aviewer  # new terminal

在这里插入图片描述

附赠 jetson agx xavier 截图指令:gnome-screenshot -a -c ,-a表示截取区域屏幕,-c表示将截屏直接发送到剪贴板

  1. 安装 Azure_Kinect_ROS_Driver 包
# 下载Azure_Kinect_ROS_Driver源码
cd catkin_ws/src
git clone https://github.com/microsoft/Azure_Kinect_ROS_Driver.git

# 编译工作空间
cd  catkin_ws
catkin_make

  1. 测试
roslaunch azure_kinect_ros_driver driver.launch
# 新终端,启动rviz.   add -> by topic ->image 即可查看图像。
rviz # 或 rqt_image_view 查看图像

在这里插入图片描述

# 检查当前存在的Topic:
rostopic list
# 使用rosbag工具录制topic:
rosbag record -O image.bag /rgb/image_raw /depth_to_rgb/image_raw
# 回放包中数据:
rosbag play image.bag

depth_to_rgb / image_raw:深度图像,由Azure Kinect SDK转换为彩色相机坐标空间。 调整了该图像的大小以匹配彩色图像的分辨率。

在这里插入图片描述
在这里插入图片描述

4. Azure Kinect SDK 的 Python API

在 github 上发现了一个项目pyk4a,封装了 Azure Kinect SDK 的 python3 接口。

linux安装方法:

pip install pyk4a

若安装不成功(比如安装时的报错:ERROR: Could not build wheels for pyk4a which use PEP 517 and cannot be installed directly)可先将文件下载到本地,然后编译安装。

git clone https://github.com/etiennedub/pyk4a.git
cd pyk4a
# pip install -r requirements-dev.txt
python setup.py install

一个简单的应用示例:

from pyk4a import Config, PyK4A
from matplotlib import pyplot as plt

# Load camera with the default config
k4a = PyK4A()
k4a.start()

# Get the next capture (blocking function)
capture = k4a.get_capture()
img_color = capture.color

# Display with pyplot
plt.imshow(img_color[:, :, 2::-1]) # BGRA to RGB
plt.show()

更多用法直接查看 main class PyK4A.

5. 补充内容:find_object_2d

参考:ros:find_object_2d
github:find-object
Ros中使用find_object_2d快速实现物体的检测识别
通过ROS控制真实机械臂(16) — 视觉抓取之find_object实现物体识别

find_object_2d是能对物体进行快速识别定位的功能包,该功能包是基于模板匹配算法(包括彩色图像或点云匹配)。实测效果比较差。无法用于复杂的抓取任务。

5.1 安装 find_object_2d

# ros melodic
sudo apt-get install ros-melodic-find-object-2d

5.2 使用

5.2.1 将 /rgb/image_raw 转换为 bgr8rgb8格式

azure kinect输出的/rgb/image_raw是bgra8格式,直接用于 find_object_2d 会报错:
find_object_ros: Encoding "bgra8" detected. Supported image encodings are bgr8 and rgb8...
因此首先要用cv_bridge将/rgb/image_raw转换为 bgr8rgb8格式。

参考:cv_bridge/ Tutorials/ ConvertingBetweenROSImagesAndOpenCVImagesPython

步骤:

  1. 在ros工作空间src文件夹下创建功能包 image_converter
catkin_create_pkg image_converter sensor_msgs cv_bridge rospy std_msgs

  1. 添加 image_converter_node.py 文件,将/rgb/image_raw转换为bgr8格式,并输出到 /rgb/image_color topic。
#!/usr/bin/env python
from __future__ import print_function
import sys
import rospy
import cv2
from std_msgs.msg import String
from sensor_msgs.msg import Image
from cv_bridge import CvBridge, CvBridgeError

class image_converter:
    def __init__(self):
        self.image_pub = rospy.Publisher("/rgb/image_color",Image)
        self.bridge = CvBridge()
        self.image_sub = rospy.Subscriber("/rgb/image_raw", Image, self.callback)

    def callback(self,data):
        try:
            cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")
            self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "bgr8"))
        except CvBridgeError as e:
            print(e)

def main(args):
    ic = image_converter()
    rospy.init_node('image_converter', anonymous=True)
    try:
        rospy.spin()
    except KeyboardInterrupt:
        print("Shutting down")
    cv2.destroyAllWindows()

if __name__ == '__main__':
    main(sys.argv)

  1. 可执行权限
chmod +x  image_converter_node.py # 可执行权限

5.2.2 测试 find_object_2d

roslaunch azure_kinect_ros_driver driver.launch
rosrun image_converter image_converter_node.py
rosrun find_object_2d find_object_2d image:=/rgb/image_color

在出现的界面左侧空白栏中鼠标右击选择 Add obejct from scene 从场景中选取待检测物体,将想要识别的物体置于场景当中,点击 take picture,然后左上角可以选择拍照的具体的区域或者角点,next之后确认无误end即可。

此时左侧空白处已经添加了一个待识别物体,当我们将该物体放到摄像头的视角当中的时候,待识别物体就会被框选出来。
在这里插入图片描述

查看物体位置:

rosrun find_object_2d print_objects_detected # 输出检测框四个角点坐标

rostopic echo /objects # 查看检测物体的完整信息

在这里插入图片描述

其中第二和第三个数字是被测物体的宽和高,后面的九个数字是一个3*3的单应性矩阵。这个矩阵可以根据下图的公式找到目标的当前位置和方向。
在这里插入图片描述

实测效果很差,被测物体姿态偏差稍大就很难被找到了。无法用于抓取操作。