编译安装PCL点云库,Kinect2驱动,乐视Astra相机驱动

43 篇文章 1 订阅
1 篇文章 0 订阅

                                        编译安装PCL点云库

安装方法一

3d点云安装

apt-cache search pcl

安装

sudo apt install 上面查出来的

opencv不建议用以上方法因为需要 安装 opencv_contrib

安装方法二

官网及文档

源码官网:https://github.com/PointCloudLibrary/pcl

摄像头端口

ll /dev/video*

安装方式

方式一:编译源码安装(最稳妥)

1.准备编译环境及工具

sudo apt-get update
sudo apt-get install git build-essential linux-libc-dev
sudo apt-get install cmake cmake-gui 
sudo apt-get install libusb-1.0-0-dev libusb-dev libudev-dev
sudo apt-get install mpi-default-dev openmpi-bin openmpi-common
sudo apt-get install libpcap-dev
sudo apt-get install libflann1.9 libflann-dev
sudo apt-get install libeigen3-dev
sudo apt-get install libboost-all-dev
sudo apt-get install vtk6 libvtk6.3 libvtk6-dev libvtk6.3-qt libvtk6-qt-dev 
sudo apt-get install libqhull* libgtest-dev
sudo apt-get install freeglut3-dev pkg-config
sudo apt-get install libxmu-dev libxi-dev 
sudo apt-get install mono-complete
sudo apt-get install libopenni-dev libopenni2-dev
sudo apt install pcl-tools
# sudo apt-get install qt-sdk openjdk-8-jdk openjdk-8-jre

2.编译PCL(PointCloudLibrary)

下载源码:

git clone https://gitee.com/mirrors/pcl.git

3.进入下载后的pcl目录,创建并进入release目录,执行编译:

cd pcl
# 切换到指定版本v1.9.1再编译
非git下载可以不用执行这行
git checkout pcl-1.9.1 
# 创建目录
进入源码目录,在源码目录下
mkdir release
# 进入目录
cd release

# 配置cmake 不执行这行,执行下面一行
cmake -DCMAKE_BUILD_TYPE=None \
      -DCMAKE_INSTALL_PREFIX=/usr/local \
      -DBUILD_GPU=ON \
      -DBUILD_apps=ON \
      -DBUILD_examples=ON ..

# 配置cmake 控制台命令
cmake -DCMAKE_BUILD_TYPE=None -DCMAKE_INSTALL_PREFIX=~/pcl_env -DBUILD_GPU=ON -DBUILD_apps=ON -DBUILD_examples=ON ..

# 进行编译
make -j8

安装

sudo make install

未安装在这个/usr/local目录下的,安装成功后做一个软链接,方便导库
sudo ln -s ~/pcl_env /usr/local/share/pcl_env

工程引入库

CMakeLists.txt

cmake_minimum_required(VERSION 3.16)
project(pcl1)

set(CMAKE_CXX_STANDARD 14)

# 设置输出根目录为build/Debug
set(OUTPUT_DIRECTORY_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/build/${CMAKE_BUILD_TYPE})
# 设置可执行程序输出到build/Debug/bin目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${OUTPUT_DIRECTORY_ROOT}/bin" CACHE PATH "Runtime directory" FORCE)
# 设置库文件输出到build/Debug/lib目录
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${OUTPUT_DIRECTORY_ROOT}/lib" CACHE PATH "Library directory" FORCE)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${OUTPUT_DIRECTORY_ROOT}/lib" CACHE PATH "Archive directory" FORCE)



find_package(PCL REQUIRED)
# 包含头文件目录
include_directories(${PCL_INCLUDE_DIRS})
# 设置依赖库链接目录
link_directories(${PCL_LIBRARY_DIRS})
# 添加预处理器和编译器标记
add_definitions(${PCL_DEFINITIONS})

add_executable(pcl1 main.cpp)
target_link_libraries(pcl1 ${PCL_LIBRARIES})

  1. 测试

测试是否成功,打开窗口看到logo点云即为成功安装

在release目录执行以下命令,弹出窗口点云就算成功

pcl_viewer ../test/pcl_logo.pcd

方式二:在线安装(100M下载,释放后1G)

sudo add-apt-repository ppa:v-launchpad-jochen-sprickerhof-de/pcl
sudo apt-get update
sudo apt-get install libpcl-dev  # 或 libpcl-all

问题及处理

问题:没有pcl_viewer

  • 解决:

说明编译的时候,cmake参数有误,或install有问题,可以检查参数后重新执行cmake make

或通过以下命令安装 bash sudo apt install pcl-tools

问题:加载pcd文件异常

描述:执行pcl::io::loadPCDFile<PointType>("./assets/xxxx.pcd", *cloud) == -1),控制台报错

 
Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
  • 解决:

此时,很可能是eigen3有问题,从此处下载离线版eigen3库

http://bitbucket.org/eigen/eigen/get/3.2.0.tar.bz2

http://eigen.tuxfamily.org/index.php?title=Main_Page 在该网站中,可以下载任意版本对应的文件,本例下载了Eigen 3.2.0. tar.bz2 格式压缩文件。 文件名:eigen-eigen-ffa86ffb5570.tar.bz2

执行如下操作:

  1. 卸载原有eigen3:
 
sudo apt-get remove libeigen3-dev --purge
  1. 重装eigen3

 
# 解压
tar -jxvf eigen3_3.2.0.orig.tar.bz2
# 重命名
mv eigen-eigen-ffa86ffb5570/ eigen3
# 复制到/usr/local/include/
sudo cp -r eigen3 /usr/local/include/eigen3
# 复制到/usr/include/
sudo cp -r eigen3 /usr/include/eigen3

问题:metslib cmake 错误

no metslib found.
  • 解决:
 
wget https://www.coin-or.org/download/source/metslib/metslib-0.5.3.tgz
tar xzvf metslib-0.5.3.tgz
cd metslib-0.5.3
./configure
make 
sudo make install

问题:libpq.solibvtkIO.so错误

 
[ 13%] Built target pcl_pcd_convert_NaN_nan
[ 13%] Linking CXX executable ../../bin/pcl_pcd_introduce_nan
//usr/lib/x86_64-linux-gnu/libpq.so.5: undefined reference to `SSL_get_peer_certificate@OPENSSL_1.0.0'
/usr/lib/libvtkIO.so.5.10.1: undefined reference to `TIFFReadDirectory@LIBTIFF_4.0'
//usr/lib/x86_64-linux-gnu/libpq.so.5: undefined reference to `CRYPTO_num_locks@OPENSSL_1.0.0'
//usr/lib/x86_64-linux-gnu/libpq.so.5: undefined reference to `SSL_get_current_compression@OPENSSL_1.0.0'
//usr/lib/x86_64-linux-gnu/libpq.so.5: undefined reference to `SSL_CTX_free@OPENSSL_1.0.0'
  • 解决:
 
sudo apt-get remove libpq5
sudo apt-get install libpq-dev

问题:make时libproj.so

 
 make[2]: *** No rule to make target '/usr/lib/x86_64-linux-gnu/libproj.so', needed by 'lib/libpcl_io.so.1.9.1.99'。 停止。CMakeFiles/Makefile2:499: recipe for target 'io/CMakeFiles/pcl_io.dir/all' failed
  • 解决:

建立软连接, 终端中输入:

sudo ln -s /usr/lib/x86_64-linux-gnu/libproj.so.9 /usr/lib/x86_64-linux-gnu/libproj.so
 

问题:libpng16.so错误

 
//home/ty/anaconda3/lib/libpng16.so.16: undefined reference to `inflateValidate@ZLIB_1.2.9'
collect2: error: ld returned 1 exit status
src/CMakeFiles/pcl_test.dir/build.make:253: recipe for target '../build/debug/bin/pcl_test' failed
make[3]: *** [../build/debug/bin/pcl_test] Error 1
  • 解决:

cd /usr/lib/x86_64-linux-gnu
sudo ln -sf ~/anaconda/lib/libpng16.so.16 libpng16.so.16
cd /usr/lib/
sudo ln -sf ~/anaconda/lib/libpng16.so.16 libpng16.so.16
sudo ldconfig

conda remove libpng
sudo apt-get install libpng16-16 --reinstall

实在不行编译安装源码:

 
wget https://download.sourceforge.net/libpng/libpng-1.6.37.tar.gz
tar -zxvf libpng-1.6.37.tar.gz
cd libpng-1.6.37/
./configure --prefix=/usr/local/
sudo make && make install

问题:/usr/bin/ld: cannot find -lxxx

  • `/usr/bin/ld: cannot find -lvtkproj4为例
  • 解决:

原因1:libvtkproj4.so的链接不正确或没有链接,注意规则是libxxx.so

 
cd /usr/lib
ll | grep -i vtkproj4
# 输出
lrwxrwxrwx   1 root root       21 4月   5  2016 libvtkproj4.so.5.10 -> libvtkproj4.so.5.10.1
-rw-r--r--   1 root root   312320 4月   5  2016 libvtkproj4.so.5.10.1

说明没有libvtkproj4.so链接,则执行以下命令即可:

 
sudo ln -s libvtkproj4.so.5.10 libvtkproj4.so

原因2:系统缺少对应的so库,即/usr/lib下找不到类似的so

则进行搜索并安装

sudo apt-cache search libvtkproj4-dev
sudo apt-get install libvtkproj4-dev

--------------------------------------------------------------------------------------------------------------------------------------------------------------

01-编译安装Kinect2驱动

下载源码

git clone https://gitee.com/Ausar/libfreenect2.git
# github源码在 https://github.com/OpenKinect/libfreenect2
cd libfreenect2

初始化环境

  • 安装编译工具

  • sudo apt-get install build-essential cmake pkg-config
    sudo apt-get install libusb-1.0-0-dev
    sudo apt-get install libturbojpeg libjpeg-turbo8-dev
    sudo apt-get install libglfw3-dev
    sudo apt-get install beignet-dev
    sudo apt-get install libturbojpeg0-dev

编译

在libfreenect2目录中执行:

mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/freenect2
make
make install

 用这个安装在home下

mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=~/freenect2
make -j8
make install

cmake .. -DCMAKE_INSTALL_PREFIX=~/freenect2 出现以下问题:

Could NOT find TurboJPEG (missing: TurboJPEG_INCLUDE_DIRS TURBOJPEG_WORKS)
Call Stack (most recent call first):
******************************************
-- Configuring incomplete, errors occurred!
See also "/home/sk/libfreenect2/build/CMakeFiles/CMakeOutput.log"

解决:

sudo apt-get install libturbojpeg0-dev

然后删除 build 重新cmake;

配置

配置udev规则以获取访问设备的权限:

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

随后拔插设备

测试

  • 运行测试程序:  ./bin/Protonect

其他

在安装kinect驱动时,如果libusb有问题,需要指定版本,其安装如下,

sudo apt-add-repository ppa:floe/libusb 
sudo apt-get update
sudo apt-get install libusb-1.0-0-dev

----------------------------------------------------------------------------------------------------------------------------------------------------------

Astra奥比中光相机驱动&SDK

Astra(orbbec奥比中光)乐视相机相关驱动,本教程针对WindowsUbuntu14.04=Ubuntu18.04系统版本

官网链接:https://orbbec3d.com/develop/

该深度相机是乐视与奥比中光合作的体感相机,对标微软Kinect,可用于三维重建,SLAM学习,也可以作为免驱UVC摄像头体感摄像头使用

相机参数:

Linux环境

依赖环境

 
sudo apt-get install build-essential freeglut3 freeglut3-dev
sudo apt-get install libsfml-dev

相机SDK&Samples

  • 执行环境安装
 
tar -zxvf AstraSDK-v2.0.18-05cfa52534-20191108T074013Z-ubuntu1604.tar.gz
cd AstraSDK-v2.0.18-05cfa52534-20191108T074013Z-Linux/install
sudo sh ./install.sh

输出结果包含以下两行,注意把倒数第二个路径里的install删掉:

export ASTRA_SDK_INCLUDE=/home/ty/Lesson/GrabObject/astra/AstraSDK-v2.0.18-05cfa52534-20191108T074013Z-Linux/install/include export ASTRA_SDK_LIB=/home/ty/Lesson/GrabObject/astra/AstraSDK-v2.0.18-05cfa52534-20191108T074013Z-Linux/install/lib

删掉install之后:

export ASTRA_SDK_INCLUDE=/home/ty/Lesson/GrabObject/astra/AstraSDK-v2.0.18-05cfa52534-20191108T074013Z-Linux/include export ASTRA_SDK_LIB=/home/ty/Lesson/GrabObject/astra/AstraSDK-v2.0.18-05cfa52534-20191108T074013Z-Linux/lib

  • 将输出结果复制到~/.bashrc尾部
 
gedit ~/.bashrc
  • 使之生效
 
source ~/.bashrc

Samples目录中即是示例程序,需要依赖include和lib目录

OpenNI相机测试工具

  • 安装OpenNI
 
unzip OpenNI_2.3.0.55.zip
cd OpenNI_2.3.0.55/Linux/OpenNI-Linux-x64-2.3.0.55
chmod +x install.sh
sudo ./install.sh
  • 重新拔插设备
  • 初始化OpenNI环境
 
source OpenNIDevEnvironment
  • 编译运行
 
cd Samples/SimpleViewer
make
cd Bin/x64-Release
./SimpleViewer

Windows环境

方式一:

安装驱动,运行OpenNI测试Demo

  • 相机驱动:

    http://dl.orbbec3d.com/dist/drivers/win32/astra-win32-driver-4.3.0.10.exe

  • OpenNI:

    http://dl.orbbec3d.com/dist/openni2/OpenNI_2.3.0.63.zip

首先双击安装相机驱动,astra-win32-driver-4.3.0.10.exe,然后解压OpenNI开发包,将相机插上USB口(建议使用USB3.0的插口),双击打开打开Astra OpenNI2 Development Instruction(x64)_V1.3\Tools\OBNiViewer目录下的OBNiViewer应用程序即可

方式二:

在VS下运行Demo

  • Orbbec Astra SDK:

    http://dl.orbbec3d.com/dist/astra/v2.0.18/AstraSDK-v2.0.18-05cfa52534-20191108T075451Z-vs2015-win64.zip

  • 使用Windows的AstraSDK需要安装微软的Visual Studio

    https://www.microsoft.com/en-us/download/details.aspx?id=48145

AstraSDK-v2.0.18-05cfa52534-20191108T075451Z-vs2015-win64.zip解压后,从VS打开OrbbecStreamSample示例程序,运行main.cpp即可

make报错

Makefile:28: *** OPENNI2_INCLUDE is not defined. Please define it or 'source' the OpenNIDevEnvironment file from the installation。 停止。

解决:

在这个/home/sk/Astra/OpenNI_2.3.0.63/Linux/OpenNI-Linux-x64-2.3.0.63目录下执行

source OpenNIDevEnvironment

在这个/home/sk/Astra/OpenNI_2.3.0.63/Linux/OpenNI-Linux-x64-2.3.0.63/Samples/SimpleViewer目录下执行

make

启动相机报错:

Error - expect color and depth to be in same resolution: D: 640x400, C: 640x480

在奥比中光上下载的最新版的OpenNI版的linux版本中出现Error - expect color and depth to be in same resolution: D: 640x400, C: 640x480 这个错误是因为其OpenNI的设备驱动那里设置读取图像和读取深度图的尺度出现了错误。

解决办法看这篇博客:
打开相机

/home/sk/Astra/OpenNI_2.3.0.63/Linux/OpenNI-Linux-x64-2.3.0.63/Samples/SimpleViewer/Bin/x64-Release

./SimpleViewer

./home/sk/Astra/OpenNI_2.3.0.63/Linux/OpenNI-Linux-x64-2.3.0.63/Samples/SimpleViewer/Bin/x64-Releas/SimpleViewer

----------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------------------

                                             导 Kinect2库,opencv库,pcl库

Findfreenect2.cmake   [Kinect2]

# 查找依赖库
FIND_LIBRARY(freenect2_LIBRARY freenect2
        PATHS ~/freenect2/lib
        NO_DEFAULT_PATH
        )
SET(freenect2_LIBRARIES ${freenect2_LIBRARY} pthread)

# 查找路径
FIND_PATH(freenect2_INCLUDE_DIR libfreenect2/libfreenect2.hpp
        PATHS ~/freenect2/include
        NO_DEFAULT_PATH
        )
SET(freenect2_INCLUDE_DIRS ${freenect2_INCLUDE_DIR})

FindOpenCV.cmake   [OpenCV]


# once done, this will define
#OpenCV_FOUND        -  whether there is OpenCV in the prebuilt libraries
#OpenCV_INCLUDE_DIRS -  include directories for OpenCV
#OpenCV_LIBRARY_DIRS -  library directories for OpenCV
#OpenCV_LIBRARIES    -  link this to use OpenCV

set(OpenCV_DIR ~/3rdparty/OpenCV-3.4.9)

unset(OpenCV_FOUND)

MESSAGE(STATUS "OpenCV_DIR TEST  ${PREBUILT_DIR}")

set(OpenCV_INCLUDE_DIRS "${OpenCV_DIR}/include" "${OpenCV_DIR}/include/opencv")
set(OpenCV_LIB_COMPONENTS opencv_core;opencv_ml;opencv_calib3d;opencv_highgui;opencv_superres;opencv_photo;
        opencv_imgcodecs;opencv_features2d;opencv_viz;opencv_flann;opencv_shape;opencv_stitching;opencv_dnn;
        opencv_videostab;opencv_imgproc;opencv_objdetect;opencv_video;opencv_videoio;opencv_reg;opencv_aruco;
        opencv_dpm;opencv_xobjdetect;opencv_xfeatures2d;opencv_surface_matching;opencv_plot;opencv_hfs;
        opencv_tracking;opencv_rgbd;opencv_text;opencv_dnn_objdetect;opencv_face;opencv_optflow;opencv_bgsegm;
        opencv_bioinspired;opencv_ximgproc;opencv_saliency;opencv_freetype;opencv_stereo;opencv_img_hash;
        opencv_fuzzy;opencv_ccalib;opencv_line_descriptor;opencv_hdf;opencv_datasets;opencv_phase_unwrapping;
        opencv_xphoto;opencv_structured_light)

find_path(OpenCV_INCLUDE_DIRS NAMES opencv.h HINTS ${OpenCV_DIR}/include NO_SYSTEM_ENVIRONMENT_PATH)

set(OpenCV_LIBRARY_DIRS ${OpenCV_DIR}/lib)

FOREACH(cvcomponent ${OpenCV_LIB_COMPONENTS})
  find_library(lib_${cvcomponent} NAMES ${cvcomponent} HINTS ${OpenCV_DIR}/lib NO_DEFAULT_PATH)

  set(OpenCV_LIBRARIES ${OpenCV_LIBRARIES};${lib_${cvcomponent}})
ENDFOREACH()

set(OpenCV_LIBS ${OpenCV_LIBRARIES})

set(OpenCV_INCLUDE_DIRS ${OpenCV_INCLUDE_DIRS};${OpenCV_INCLUDE_DIRS}/opencv)

if (OpenCV_INCLUDE_DIRS AND OpenCV_LIBRARIES)
  set(OpenCV_FOUND TRUE)
endif (OpenCV_INCLUDE_DIRS AND OpenCV_LIBRARIES)

if (OpenCV_FOUND)
  if (NOT OpenCV_FIND_QUIETLY)
    message(STATUS "Found OpenCV: ${OpenCV_LIBRARIES}")
  endif (NOT OpenCV_FIND_QUIETLY)
else(OpenCV_FOUND)
  if (OpenCV_FIND_REQUIRED)
    message(FATAL_ERROR "Could not find the OpenCV library")
  endif ()
endif (OpenCV_FOUND)

CMakeLists.txt

cmake_minimum_required(VERSION 3.16)
project(kinect2demo)

set(CMAKE_CXX_STANDARD 14)

set(OUTPUT_DIRECTORY_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/build/debug)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${OUTPUT_DIRECTORY_ROOT}/bin" CACHE PATH "Runtime directory" FORCE)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${OUTPUT_DIRECTORY_ROOT}/lib" CACHE PATH "Library directory" FORCE)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${OUTPUT_DIRECTORY_ROOT}/lib" CACHE PATH "Archive directory" FORCE)

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake)
#set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ~/3rdparty/OpenCV-3.4.9/share/OpenCV)

# -------------------------------------------------- 2
find_package(freenect2 REQUIRED)
find_package(OpenCV REQUIRED)
find_package(PCL REQUIRED)

include_directories(${freenect2_INCLUDE_DIR})
include_directories(${OpenCV_INCLUDE_DIRS})
include_directories(${PCL_INCLUDE_DIRS})

link_directories(${OpenCV_LIBRARY_DIRS})
link_directories(${PCL_LIBRARY_DIRS})

add_definitions(${PCL_DEFINITIONS})

add_subdirectory(src)
add_subdirectory(src/camera)


add_executable(kinect2demo main.cpp)

=============================================================================================

Astra奥比中光相机封装好的工具类

/home/sk/workspas/HandEyeCalibration/cmake/FindAstra.cmake

set(Astra_DIR ${PREBUILD_DIR}/astra)

# 声明头文件h所在目录
set(ASTRA_INCLUDE_DIRS ${Astra_DIR}/include)

# 声明so库文件所在目录
set(ASTRA_LINK_DIRS ${Astra_DIR}/lib)

# libastra.so, libastra_core.so ...
set(ASTRA_LIBRARIES astra;astra_core;astra_core_api;pthread)

/home/sk/workspas/HandEyeCalibration/src/camera/CMakeLists.txt

add_library(kinect_camera KinectCamera.cpp KinectCamera.h)
target_link_libraries(kinect_camera ${OpenCV_LIBRARIES} ${freenect2_LIBRARIES})

set(ASTRA_CAMERA_SOURCES AstraCamera.cpp AstraCamera.h)

add_library(astra_camera ${ASTRA_CAMERA_SOURCES} )
target_link_libraries(astra_camera ${ASTRA_LIBRARIES})

add_executable(AstraMain AstraMain.cpp )
target_link_libraries(AstraMain ${ASTRA_LIBRARIES} ${OpenCV_LIBRARIES} astra_camera)

/home/sk/workspas/HandEyeCalibration/CMakeLists.txt

cmake_minimum_required(VERSION 3.14)
project(HandEyeCalibration)

set(CMAKE_CXX_STANDARD 14)

set(OUTPUT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/build)
set(PREBUILD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty)

# 配置依赖目录及程序输出目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${OUTPUT_DIR}/bin" CACHE PATH "Runtime directory" FORCE)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${OUTPUT_DIR}/lib" CACHE PATH "Library directory" FORCE)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${OUTPUT_DIR}/lib" CACHE PATH "Archive directory" FORCE)

# 给当前cmake的查找路径添加一个额外的目录
#set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ~/3rdparty/OpenCV-3.4.9/share/OpenCV)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake)

# OpenCV
find_package(OpenCV REQUIRED)
# Kinect2 - freenect2
find_package(freenect2 REQUIRED)
# Aubo
find_package(AuBo REQUIRED)
# Astra
find_package(Astra REQUIRED) # FindXXX.cmake XXXConfig.cmake

# include dir
include_directories(${OpenCV_INCLUDE_DIRS})
include_directories(${freenect2_INCLUDE_DIRS})
include_directories(${AuBo_INCLUDE_DIRS})
include_directories(/usr/include/eigen3)
include_directories(${PREBUILD_DIR}/astra/common)
include_directories(${ASTRA_INCLUDE_DIRS})

# library dir
link_directories(${OpenCV_LIBRARY_DIRS})
link_directories(${AuBo_LINK_DIRS})
link_directories(${ASTRA_LINK_DIRS})

# config
#线程
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -lpthread -Wl,--no-as-needed  -g3 -Wall")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")

# subdir
add_subdirectory(src/robot)
add_subdirectory(src/tinyxml)
add_subdirectory(src/utils)
add_subdirectory(src/camera)
add_subdirectory(src/test)
add_subdirectory(src)

#MESSAGE(STATUS "OpenCV: " ${OpenCV_VERSION} " OpenCV_PATH: " ${OpenCV_INSTALL_PATH})
add_executable(HandEyeCalibration main.cpp)

/home/sk/workspas/HandEyeCalibration/src/camera/AstraCamera.cpp

//
// Created by ty on 20-7-2.
//

#include "AstraCamera.h"
#include <key_handler.h>

AstraCamera::AstraCamera() {

}
function<void(cv::Mat &, cv::Mat &)> astra_data_callback;

class SampleFrameListener : public astra::FrameListener {
private:
    using buffer_ptr = std::unique_ptr<astra::RgbPixel[]>;
    using buffer_depth_ptr = std::unique_ptr<int16_t[]>;
    buffer_ptr buffer_;
    buffer_depth_ptr buffer_depth_;
    int lastWidth_{};
    int lastHeight_{};
    int lastWidth_depth_{};
    int lastHeight_depth_{};

public:

    void on_frame_ready(astra::StreamReader &reader,
                        astra::Frame &frame) override {
        shared_ptr<cv::Mat> img = nullptr, depth = nullptr;

        const astra::ColorFrame colorFrame = frame.get<astra::ColorFrame>();
        get_color(colorFrame, img);

        const astra::DepthFrame depthFrame = frame.get<astra::DepthFrame>();
        auto depthStream = reader.stream<astra::DepthStream>();
        get_depth(depthFrame, depthStream.coordinateMapper(), depth);

        astra_data_callback(*img, *depth);
    }

    void get_color(const astra::ColorFrame &colorFrame, shared_ptr<cv::Mat> &img) {

        if (colorFrame.is_valid()) {
            int width = colorFrame.width();
            int height = colorFrame.height();
            // cout << "宽度:" << width << "---高度:" << height << endl;

            if (width != lastWidth_ || height != lastHeight_) {
                buffer_ = buffer_ptr(new astra::RgbPixel[colorFrame.length()]);
                lastWidth_ = width;
                lastHeight_ = height;
            }
            colorFrame.copy_to(buffer_.get());

//            int frameIndex = colorFrame.frame_index();
//            size_t index = ((width * (height / 2.0f)) + (width / 2.0f));
//            cout << "index为:" << index << endl;
//            astra::RgbPixel middle = buffer_[index];

//            std::cout << "color frameIndex: " << frameIndex
//                      << " r: " << static_cast<int>(middle.r)
//                      << " g: " << static_cast<int>(middle.g)
//                      << " b: " << static_cast<int>(middle.b)
//                      << " width: " << width << " height: " << height << std::endl;

            // 将buffer_ptr 中astra::RgbPixel[]数据类型转成Mat
//            shared_ptr<cv::Mat> img = new shared_ptr<cv::Mat>(new cv::Mat(height, width, CV_8UC3, cv::Scalar::all(0)));
            img = std::make_shared<cv::Mat>(height, width, CV_8UC3, cv::Scalar::all(0));
            for (int i = 0; i < height; ++i) {
                for (int j = 0; j < width; ++j) {
                    img->at<cv::Vec3b>(i, j)[0] = buffer_[i * width + j].b;
                    img->at<cv::Vec3b>(i, j)[1] = buffer_[i * width + j].g;
                    img->at<cv::Vec3b>(i, j)[2] = buffer_[i * width + j].r;
                }
            }

            cv::flip(*img, *img, 0);

        }
    }

    void get_depth(const astra::DepthFrame &depthFrame,
                   const astra::CoordinateMapper &mapper, shared_ptr<cv::Mat> &depthMat) {
        if (depthFrame.is_valid()) {
            int width = depthFrame.width();
            int height = depthFrame.height();
            int frameIndex = depthFrame.frame_index();

            //determine if buffer needs to be reallocated
            if (width != lastWidth_depth_ || height != lastHeight_depth_) {
                buffer_depth_ = buffer_depth_ptr(new int16_t[depthFrame.length()]);
                lastWidth_depth_ = width;
                lastHeight_depth_ = height;

            }
            depthFrame.copy_to(buffer_depth_.get());

//            float x = width / 2.0f + 10;
//            float y = height / 2.0f + 10;
//            size_t index = width * y + x;
//            short middle = buffer_depth_[index];

//            float worldX, worldY, worldZ;
//            float depthX, depthY, depthZ;
//            mapper.convert_depth_to_world(x, y, middle, worldX, worldY, worldZ);
//            mapper.convert_depth_to_world(0, 0, middle, worldX, worldY, worldZ);
//            mapper.convert_world_to_depth(worldX, worldY, worldZ, depthX, depthY, depthZ);


            // buffer_depth_ptr 中astra::int16_t[]数据类型转成Mat
            depthMat = std::make_shared<cv::Mat>(height, width, CV_32FC1, cv::Scalar::all(0));
            for (int i = 0; i < height; ++i) {
                for (int j = 0; j < width; ++j) {
                    short depth = buffer_depth_[i * width + j];
                    if (fpclassify(depth) == FP_INFINITE || fpclassify(depth) == NAN) {
                        depth = 0;
                    }
                    depthMat->at<float>(i, j) = depth;
                }
            }

        }
    }
};

SampleFrameListener listener;
astra::StreamReader reader;

int AstraCamera::start(bool getColor, bool getDepth) {


    //初始化库
    astra::initialize();

    set_key_handler();
    astra::StreamSet streamSet;
    reader = streamSet.create_reader();

    if (getColor) {
        // 配置并启动Color数据流
        astra::ColorStream colorStream = reader.stream<astra::ColorStream>();
        astra::ImageStreamMode colorMode;
        colorMode.set_width(1280);
        colorMode.set_height(720);
        colorMode.set_pixel_format(astra_pixel_formats::ASTRA_PIXEL_FORMAT_RGB888);
        colorMode.set_fps(30);
        colorStream.set_mode(colorMode);
        colorStream.start();
        std::cout << "colorStream -- hFov: " << colorStream.hFov() << " vFov: " << colorStream.vFov() << std::endl;
    }


    if (getDepth) {
        // 配置并启动Depth数据流
        auto depthStream = reader.stream<astra::DepthStream>();
        astra::ImageStreamMode depthMode;
        depthMode.set_width(640);
        depthMode.set_height(480);
        depthMode.set_pixel_format(astra_pixel_formats::ASTRA_PIXEL_FORMAT_DEPTH_MM);
        depthMode.set_fps(30);
        depthStream.set_mode(depthMode);
        depthStream.start();

        char serialnumber[256];
        depthStream.serial_number(serialnumber, 256);

        const astra_conversion_cache_t &data = depthStream.depth_to_world_data();

        //16082610454
        // conversion_data.xz: 1.12213 conversion_data.yz: 0.8416 conversion_data.hX: 320 conversion_data.hY: 240 - ty
        std::cout << "depthStream --"
                     " hFov: " << depthStream.hFov() << " vFov: " << depthStream.vFov() <<
                  " serial number: " << serialnumber <<
                  " serial number[0]: " << serialnumber[0] <<
                  " conversion_data.xz: " << data.xzFactor <<
                  " conversion_data.yz: " << data.yzFactor <<
                  " conversion_data.hX: " << data.halfResX <<
                  " conversion_data.hY: " << data.halfResY <<
                  std::endl;

    }


    //监听摄像头画面
    reader.add_listener(listener);

    // 循环更新数据
    do {
        astra_update();
    } while (shouldContinue);

    // 移除数据监听
    reader.remove_listener(listener);
    astra::terminate();
    return 0;
}

void AstraCamera::setListener(function<void(cv::Mat &, cv::Mat &)> lis) {
    astra_data_callback = lis;
}

void AstraCamera::release() {
    shouldContinue = false;
}

AstraCamera::~AstraCamera() {
    shouldContinue = false;
}

 /home/sk/workspas/HandEyeCalibration/src/camera/AstraCamera.h

//
// Created by ty on 20-7-2.
//

#ifndef CALIBRATIONHANDEYE_ASTRACAMERA_H
#define CALIBRATIONHANDEYE_ASTRACAMERA_H

#include <astra/astra.hpp>
#include <cstdio>

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <sstream>
#include <cstdlib>

using namespace std;
using namespace cv;

class AstraCamera {

public:
    AstraCamera();

    virtual ~AstraCamera();

public:

    virtual int start(bool getColor = true, bool getDepth = true);

    void setListener(function<void(cv::Mat&, cv::Mat&)>);

    virtual void release();

};

#endif //CALIBRATIONHANDEYE_ASTRACAMERA_H

/home/sk/workspas/HandEyeCalibration/src/camera/AstraMain.cpp

/**
 * @Author: PoplarTang
 * @CreateTime: 2019-12-16
 * @Description:
 */
#include "AstraCamera.h"

const int ACTION_ESC = 27;
const int ACTION_SPACE = 32;

AstraCamera* astraCamera;

void handle_image_data(cv::Mat &rgb, cv::Mat &depth){
    cv::imshow("rgb", rgb);
//    cv::imshow("depth", depth / 4500);

    int key = cv::waitKey(30) & 0xFF;

    if (key == ACTION_ESC || key == 'q') {
        astraCamera->release();
        cv::destroyAllWindows();

    } else if (key == ACTION_SPACE) {
        std::cout << "------------------- 保存图片和关节" << std::endl;
    }
}

//astraCamera->setListener([&](cv::Mat& rgb, cv::Mat& depth){
//cv::imshow("rgb", rgb);
//cv::imshow("depth", depth / 4500);
//cv::waitKey(50);
//});

int main(int argc, char **argv) {
    std::cout << "opencv:" << cv::getVersionString() << std::endl;
    astraCamera = new AstraCamera();
    astraCamera->setListener(&handle_image_data);
    astraCamera->start(true, false);
    return 0;
}

pcl控制台操作

 传入的参数  ./output/table_scene_0_ds.pcd
 控制台命令  ./03-TemplateRtMaker ./output/table_scene_0_ds.pcd
 控制台降采样命令 pcl_voxel_grid table_scene_0_ds.pcd table_scene_0_ds.pcd -leaf   0.003,0.003,0.003
 控制台显示点云图 pcl_viewer table_scene_0_ds.pcd
 控制台显示点云图 pcl_viewer -use_point_picking table_scene_0_ds.pcd    [shift + 鼠标左键可获取点云坐标]
 查看历史操作的命令 history
 /bin pcl_viewer ./data/chef.pcd
 /bin pcl_viewer ./data/rs1.pcd
 /bin pcl_viewer ./data/chef.pcd ./data/rs1.pcd
 /data1  pcl_viewer person.pcd object_template_*pcd
 按 u 标注尺
 按 1 切换颜色
 按 2 x方向颜色
 按 3 y方向颜色
 按 4 z方向颜色

  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_无往而不胜_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值