其他分享
首页 > 其他分享> > 机器人抓取(三)—— Azure Kinect SDK 及 ROS 驱动安装

机器人抓取(三)—— Azure Kinect SDK 及 ROS 驱动安装

作者:互联网

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

1. Azure kinect 简介

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

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. 安装所需的包

如果该命令成功,则表示 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 深度相机,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_iamge_view 查看图像

在这里插入图片描述

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

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

4. find_object_2d

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

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

4.1 安装

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

4.2 使用

4.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 # 可执行权限

4.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的单应性矩阵。这个矩阵可以根据下图的公式找到目标的当前位置和方向。
在这里插入图片描述

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

标签:image,sudo,Kinect,Azure,ROS,Sensor,SDK
来源: https://blog.csdn.net/zxxxiazai/article/details/108152376