编译安装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})
- 测试
测试是否成功,打开窗口看到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
执行如下操作:
- 卸载原有eigen3:
sudo apt-get remove libeigen3-dev --purge
- 重装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.so
和libvtkIO.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奥比中光)乐视相机相关驱动,本教程针对Windows
和Ubuntu14.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
----------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------
导 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方向颜色