ubuntu 16.04/14.04 ORK 在 Kinect v2和 Kinect v1的安装(物体位姿估计)

环境:ubuntu16.06 ROS kinetic / ubuntu14.04 ROS indigo
摄像头: Kinect v1 / kinect v2 / realsense
ORK是object recognition kitchen的简称,开源的物体辨识库。ORK包含LINE-MOD算法 / tabletop算法 / TOP算法 / transparent object算法

参考链接:
kinect V2安装教程:https://www.ncnynl.com/archives/201703/1439.html
kinect V2修改教程:https://blog.csdn.net/u012057432/article/details/84068928
ork官网:http://wg-perception.github.io/object_recognition_core/
realsense修改教程:https://blog.csdn.net/weixin_40799950/article/details/81911877


目录


一. Kinect V1安装

1. 安装freenect_camera功能包(启动Kinect v1驱动的ROS launch)
$ sudo apt-get install ros-kinect-freenect-*
2. 安装驱动
$ git clone https://github.com/avin2/SensorKinect.git
$ cd Sensor/Bin
$ tar xvf SensorKinect093-Bin-Linux-x86-v5.1.2.1.tar.bz2
$ sudo ./install.sh
3. 测试

启动驱动

$ roslaunch freenect_launch freenect.launch

方法一 rviz显示

$ rosrun rviz rviz

方法二 rqt_image_view 订阅相关话题,例如/camera/rgb/image_color

$ rqt_image_view 

方法三 直接开启节点,订阅相关话题

$ rosrun image_view image_view image:=/camera/rgb/image_color

二. Kinect V2安装

1. 无ROS驱动安装

1)安装其他依赖:

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

2)下载libfreenect2驱动:

$ cd ~
$ git clone https://github.com/OpenKinect/libfreenect2.git
$ cd libfreenect2
$ cd depends; ./download_debs_trusty.sh

3)安装libusb

$ sudo dpkg -i debs/libusb*deb

4)安装 TurboJPEG

$ sudo apt-get install libturbojpeg libjpeg-turbo8-dev

5)安装GLFW3

$ sudo apt-get install libglfw3-dev

6)如果上面安装GLFW3安装不了,使用如下方法:

$ cd libfreenect2/depends
$ sh install_ubuntu.sh
$ sudo dpkg -i libglfw3*_3.0.4-1_*.deb

7)安装OpenGL的支持库(不打算使用GPU,这一步直接跳过)

$ sudo dpkg -i debs/libglfw3*deb; sudo apt-get install -f; sudo apt-get install libgl1-mesa-dri-lts-vivid

8)安装OpenCL的支持库 (不打算使用GPU,这一步直接跳过)

$ sudo apt-add-repository ppa:floe/beignet; sudo apt-get update; sudo apt-get install beignet-dev; sudo dpkg -i debs/ocl-icd*deb

9)编译libfreenect2,默认安装到/usr/local/目录下

$ cd ~/libfreenect2
$ mkdir build && cd build
$ cmake .. 
$ make
$ make install

如果想指定安装目录:

cmake ..  -DCMAKE_INSTALL_PREFIX=$HOME/freenect2

10)建立别名(这步不做也ok)

cd ~/libfreenect2
sudo cp platform/linux/udev/90-kinect2.rules /etc/udev/rules.d/

11)驱动测试测试, 一般会显示4张图片

cd ~/libfreenect2/build
sudo ./bin/Protonect
2. ROS驱动安装
$ cd ~/catkin_ws/src/
$ git clone https://github.com/code-iai/iai_kinect2.git
$ cd iai_kinect2
$ rosdep install -r --from-paths .
$ cd ~/catkin_ws
$ catkin_make -DCMAKE_BUILD_TYPE="Release"

启动ROS驱动,订阅话题方式与Kinect V1相同

$ roslaunch kinect2_bridge kinect2_bridge.launch

三. ORK安装

建议源码安装,否则无法修改代码,尤其是Kinect V1之外的摄像头

1. 下载源码,编译

1)安装依赖,DISTRO可以修改为所需要的ROS版本

export DISTRO=kinetic
sudo apt-get install libopenni-dev ros-${DISTRO}-catkin ros-${DISTRO}-ecto* ros-${DISTRO}-opencv-candidate ros-${DISTRO}-moveit-msgs
source /opt/ros/${DISTRO}/setup.sh

2)建立工作空间

mkdir -p ork/src && cd ork/src

3)下载源码
ORK相关包

$ git clone http://github.com/wg-perception/object_recognition_core
$ git clone http://github.com/wg-perception/capture
$ git clone http://github.com/wg-perception/reconstruction
$ git clone http://github.com/wg-perception/linemod
$ git clone http://github.com/wg-perception/ork_renderer
$ git clone http://github.com/wg-perception/tabletop
$ git clone http://github.com/wg-perception/tod
$ git clone http://github.com/wg-perception/transparent_objects

ROS相关包

$ git clone http://github.com/wg-perception/object_recognition_msgs
$ git clone http://github.com/wg-perception/object_recognition_ros
$ git clone http://github.com/wg-perception/object_recognition_ros_visualization

4)编译

cd ../ && catkin_make

NOTE: Kinect V2或者 realsense 需要修改代码
问题1的原因是关于mesa库的问题导致的,简单给出解决方法是,修改ork_renderer程序包中的CMakeList.txt文件。将mesa的方法替换为GLUT
[外链图片转存失败(img-O0qrvic1-1564021934781)(./img/ork_q1.png)]

https://github.com/JimmyDaSilva/ork_renderer/commit/4bdd53e3c418e7d02be0212ece04598619b4323a

find_package(catkin REQUIRED)

option(USE_GLUT "Use GLUT instead of OSMesa" OFF)
find_package(GLUT QUIET)

if (${USE_GLUT})
find_package(GLUT)
set(${PROJECT_NAME}_depends GLUT)
if (${GLUT_FOUND})
  message(STATUS "Using GLUT")
  add_definitions(-DUSE_GLUT=1)
  set(USE_GLUT TRUE)
  set(${PROJECT_NAME}_depends GLUT)
endif()

catkin_package(INCLUDE_DIRS include

问题2的原因是因为KinectV2的特殊分辨率导致的,具体的修改办法是
[外链图片转存失败(img-li7tEcnJ-1564021934783)(./img/ork_q2.png)]

https://github.com/wg-perception/linemod/issues/28

// detector_ = cv::linemod::getDefaultLINEMOD();
static const int T_LVLS[] = {4, 15};
std::vector< cv::Ptr<cv::linemod::Modality> > modalities;
modalities.push_back(new cv::linemod::ColorGradient());
modalities.push_back(new cv::linemod::DepthNormal());
detector_ = new cv::linemod::Detector(modalities, std::vector<int>(T_LVLS, T_LVLS +2));

training.ork:

renderer_width: 960
renderer_height: 540

上述是QHD的,可以参考链接修改为sd的,但HD似乎是不支持的

问题3:Kinect V2需要修改订阅的话题, realsense类似
detection.ros.ork

    rgb_frame_id: 'kinect2_rgb_optical_frame'
    rgb_image_topic: '/kinect2/qhd/image_color_rect'
    rgb_camera_info: '/kinect2/qhd/camera_info'
    depth_frame_id: 'kinect2_ir_optical_frame'
    depth_image_topic: '/kinect2/qhd/image_depth_rect'
    depth_camera_info: '/kinect2/qhd/camera_info'

或者在摄像头节点运行后

$ rosrun topic_tools relay /kinect2/qhd/image_depth_rect /camera/depth_registered/image_raw 
$ rosrun topic_tools relay /kinect2/qhd/image_color_rect /camera/rgb/image_rect_color
$ rosrun topic_tools relay /kinect2/qhd/camera_info /camera/rgb/camera_info
$ rosrun topic_tools relay /kinect2/qhd/camera_info /camera/depth_registered/camera_info
$ rosrun topic_tools relay /kinect2/qhd/points /camera/depth_registered/points
$ rosrun tf static_transform_publisher 0 0 0 0 0 0 kinect2_ir_opticalrame camera_depth_optical_frame 40

#####2. 使用linemod识别物体
1)安装数据库

$ sudo apt-get install couchdb
$ curl -X GET http://localhost:5984
$ rosrun object_recognition_core push.sh

2)在数据库中添加待训练物体信息

$ rosrun object_recognition_core object_add.py -n coke -d "A universal can of coke" --commit

http://localhost:5984/_utils/database.html?object_recognition/_design/objects/_view/by_object_name可以观察具体信息

3) 添加物体模型(.stl/.obj),YOUR_OBJECT_ID为上一步得到的模型ID,上句命令行
执行后会出现,或者在链接中可以查看

$ rosrun object_recognition_core mesh_add.py YOUR_OBJECT_ID `rospack find object_recognition_tutorials`/data/coke.obj --commit

在http://localhost:5984/or_web_ui/_design/viewer/meshes.html中,可以观察模型

4)训练

$ rosrun object_recognition_core training -c `rospack find object_recognition_linemod`/conf/training.ork

5) 启动Kinect V1 ROS驱动

$ roslaunch freenect_launch freenect.launch

启动Kinect V2 ROS驱动

$ roslaunch kinect2_bridge kinect2_bridge.launch

6)检测物体

$ rosrun object_recognition_core detection -c  `rospack find object_recognition_linemod`/conf/detection.ros.ork

[外链图片转存失败(img-chjdqHmR-1564021934784)(./img/检测正确图片.png)]
7)rviz, 添加PonitCloud2/Image/OrkObject/OrkTable话题

$ rviz

[外链图片转存失败(img-YQEPwnPG-1564021934785)(./img/coke.png)]

8)检测桌子

$ rosrun object_recognition_core detection -c `rospack find object_recognition_tabletop`/conf/detection.table.ros.ork

四. LINEMOD论文解释

ORK主要基于LINEMOD+ICP的算法,对于无纹理物体识别和位姿估计具有较好的效果,即复杂背景下3D物体的实时检测与定位,用到了RGBD的信息,可以应对无纹理的情况,不需要冗长的训练时间。

LINEMOD方法是由Hinterstoisser在2011年提出,主要解决的问题是实时监测复杂场景中无纹理对象的多模态模板,多模态是指同时使用彩色图和深度图。对彩色图像提取梯度信息,对深度图像计算3D表面法向量。

[外链图片转存失败(img-cb0kDSwd-1564021934786)(./img/modalities.png)]
如上图所示,LINEMOD特征采用彩色图像的梯度信息结合物体表面的法向特征作为模板匹配的依据。LINEMOD可以实现在几千个模板在图片上滑窗搜索达到实时,这与算法的设计以及特征的选取都密不可分,文献[3]详细阐述了算法为何如此高效。模板是由m个图片中特征点及对应的位置组成。

参考文献
[1] Hinterstoisser S, Holzer S, Cagniart C, et al. Multimodaltemplates for real-time detection of texture-less objects in heavily clutteredscenes[C]// International Conference on Computer Vision. IEEE Computer Society,2011:858-865.
[2] Hinterstoisser S, Lepetit V, Ilic S, et al. Model BasedTraining, Detection and Pose Estimation of Texture-Less 3D Objects in HeavilyCluttered Scenes[C]// Asian Conference on Computer Vision. Springer-Verlag,2012:548-562.
[3] Hinterstoisser S, Cagniart C, Ilic S, et al. Gradientresponse maps for real-time detection of textureless objects.[J]. IEEETransactions on Pattern Analysis & Machine Intelligence, 2012,34(5):876-888.

1. 计算梯度方向

[外链图片转存失败(img-8dkXhVGq-1564021934786)(./img/ori.png)]
对彩色图像的每个通道单独计算梯度,取幅值最大,可以提高鲁棒性,一般是对彩色图像的边缘计算梯度;接着在3*3的领域内统计梯度的方向,数量超过5的梯度方向才会被采用。这里的方向都是无符号的,也就是只取上一半,将方向分为8个方向,将方向转换为二进制码,可以加速匹配的过程。如图所示,这种提取特征的方式对于梯度起到了主成分提取和放大的效果。相似性度量这里没看懂

2. 方向扩散

[外链图片转存失败(img-RLBuyWDU-1564021934787)(./img/spreedori.png)]
为了使得匹配有一定的容错度,对图像(非模板)提取完方向后得到了特征图后,在一定领域里让这个特征进行扩散,继而利用模板进行滑窗匹配时就有了一定的容错度。图中扩散的范围是T=3个像素,方向的个数n=5。一般在实际中T=8, n=8。

3. 预处理响应图

[外链图片转存失败(img-apNiQjYS-1564021934788)(./img/precompute.png)]
针对n(=8)个方向和2里得到的扩散图逐个像素进行匹配,匹配的结果是距离最近方向角度的余弦值。依照上面5个扩展方向,匹配的结果只有五种,用0,1,2,3,4表示。

如果有8个扩展方向,就有8张预处理的图,在利用模板进行匹配的时候就可以直接调用对应方向在对应像素的结果,避免了滑窗时重复的计算。

4. 线性存储3中预处理的结果

[外链图片转存失败(img-NDhHnlKO-1564021934789)(./img/response.png)]
在进行滑窗匹配计算匹配度时调用3中的数据都是有规律的,每隔滑窗的步长T采取一次数据,故而文章提出直接将3中的数据拉成 T 2 T^2 T2个“长条”,这样就可以将多个数据融合在一起进行加的操作从而减少算法的运行时间。

上文也提及到了匹配的结果只有0-4四种结果,一个char的长度是8位,最多能融合63个特征相加而不溢出,故而OpenCV实现的代码里最多只支持63个特征。

5. 扩展到深度图

[外链图片转存失败(img-qgodMDHb-1564021934789)(./img/depthori.png)]
深度图类似于彩色图,计算平面的法向,同样分为八个方向,可以融合到上述流程进行计算。这里采用了一种快速鲁棒的一阶泰勒展开的方式计算计算平面法向量。这里的相似性度量与彩色图像图梯度的相似性度量类似

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值