目录
有错误或没说清楚的地方欢迎评论指正,我会修改的,谢谢大家
参考1:Kinect V2 在ros-noetic使用(ubuntu20.04)_noetic 对应的驱动libfreenect-CSDN博客
由于d435i点云太差,我后续改用了实验室现有的kinectv2,首先注意一点,kinectv2必须要插在usb3.0的接口上,使用
lsusb
lsusb -t
查看接口是不是插在3.0 的Foundation上,一定要连在root_hub 3.0上面。在usb3.0的问题上卡了我整整一天,除了重装usb驱动等软件层面的尝试,我甚至买了pciex1带4口usb3.0的扩展板,但是主板不行就是不行,所以小伙伴如果发现自己的usb有蓝色口,lsusb也有root_hub3.0,但是插上去就变成2.0的情况,请换其他电脑试试,不要想着装啥usb驱动或者改bios设置或者物理外接usb3.0,我都试过了,没用(小概率事件,我是因为主板太老,之后也是还一个新主板解决的)。
注意看同bus(物理接口)下的kinect的位置,我这里就是bus006,可以看bus006是3.0 root hub,这样就算可以了。
虚拟机我测试一下发现没法连接到设备,具体请看链接
所以有kinectv2的同学还是请使用双系统或者改用其他的深度相机好了。(如果有虚拟机使用v2成功的同学请一定要告诉我,我也很想用虚拟机连v2!)
安装驱动:
先apt安装必要组件:
sudo apt-get install build-essential cmake pkg-config
sudo apt-get install libusb-1.0-0-dev
sudo apt-get install libturbojpeg0-dev
sudo apt-get install libglfw3-dev
再下载libfreenect2并编译安装
git clone https://github.com/OpenKinect/libfreenect2.git
cd libfreenect2
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/freenect2
make
make install
应该没什么问题。
事先安装cuda后会编译报错
报错内容:
cuda_kde_depth_packet_processor.cu:39:10: fatal error: helper_math.h: 没有那个文件或目录
倒也是查到些帖子,但是不用点进去,因为没解决问题。链接1:http://t.csdnimg.cn/UJrXd
链接2:http://t.csdnimg.cn/qART4 链接3:http://t.csdnimg.cn/m8QPH
其实解决这个问题很简单,既然安装cuda之后会编译报错,那么卸载cuda之后再编译不就好了。卸载cuda参考链接:http://t.csdnimg.cn/fAfVF
我用的方法一,官方卸载程序总归是最好的。
卸载cuda方法:
找到cuda所在位置
/usr/local/cuda-11.x/bin
找到其中有cuda-uninstaller,右键此地打开终端
sudo ./cuda-uninstaller
卸载好之后把/libfreenect2/build里的东西删掉,然后重新编译
cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/freenect2
make
make install
卸载完cuda之后就编译通过了,配环境真是太好玩辣。就为了解决这个问题,中途使用了sudo apt autoremove命令导致显卡驱动崩溃后进不了系统。后续进win备份ubuntu的文件(使用linuxreader)+重作系统+安装各种东西耗时近一天。这个命令属实小白杀手,而且已经在很多博客里看到了,太坑了。
测试驱动:
新开终端
cd libfreenect2/build
sudo ./bin/Protonect
可以看到图像而且过程中不自动闪退就是没问题。
安装ros包:
cd ~/catkin_RealSense_ws/src/
git clone https://github.com/code-iai/iai_kinect2.git
cd iai_kinect2
注意下一步和参考不一样,原来的rosdep install -r --from-paths .会报错
lu@lu-linux:~/catkin_RealSense_ws/src/iai_kinect2$ rosdep install -r --from-paths .
ERROR: the following packages/stacks could not have their rosdep keys resolved
to system dependencies:
iai_kinect2: Cannot locate rosdep definition for [kinect2_registration]
kinect2_bridge: Cannot locate rosdep definition for [kinect2_registration]
kinect2_calibration: Cannot locate rosdep definition for [kinect2_bridge]
kinect2_viewer: Cannot locate rosdep definition for [kinect2_bridge]
Continuing to install resolvable dependencies...
#All required rosdeps installed successfully
解决方法的参考链接没保存,但是就是改为如下命令(注意改成自己的工作空间):
rosdep install --from-paths ~/catkin_RealSense_ws/src/iai_kinect2 --ignore-src -r
其实这步不走也行,因为鱼鱼的ros挺新加上这个iai_kinect2是个老包,所以更新一般都是没安装东西就success。
之后再运行剩余命令:
cd ~/catkin_RealSense_ws
catkin_make -DCMAKE_BUILD_TYPE="Release"
这时候会有报错,但是和上面链接中都有。参考:http://t.csdnimg.cn/od7KF
1.pcl报错
哪个包(注意我这里的包指的是ros包,也就是你xxx_ws里的一个个包,这里的报错一般是iai_kinect2里的kinect2_viewer这个包)的pcl报错就在哪个包的cmakelist.txt中添加如下语句,前面添加即可:
ADD_COMPILE_OPTIONS(-std=c++11 )
ADD_COMPILE_OPTIONS(-std=c++14 )
set( CMAKE_CXX_FLAGS "-std=c++11 -O3" )
2.cv报错
其中,要从CV_改为cv::的是(不要直接CV_批量替换cv::,精确到后续的字母再替换):
iai_kinect2/kinect2_calibration/src/kinect2_calibration.cpp中的
CV_IMWRITE_PNG_COMPRESSION
iai_kinect2/kinect2_bridge/src/kinect2_bridge.cpp(下面四个在一起的而且只出现过一次,一起改了就行)中的
CV_IMWRITE_JPEG_QUALITY
CV_IMWRITE_PNG_COMPRESSION
CV_IMWRITE_PNG_STRATEGY
CV_IMWRITE_PNG_STRATEGY_RLE
还有剩下几个rgb格式转换的如CV_BGRA2BGR这类不用改,在开头添加
#include <opencv2/imgproc/types_c.h>
iai_kinect2/kinect2_viewer/src/viewer.cpp中
开头添加下面语句来解决CV_AA报错:
#include<opencv2/imgproc/imgproc_c.h>
编译应该没问题了。
测试ros包:
先把launch中的publish_tf改一下,改为true,免得以后每次启动相机都要拖一个publish_tf:=true
新开终端
roslaunch kinect2_bridge kinect2_bridge.launch
rviz
发现usb权限不够,参考:http://t.csdnimg.cn/TMUrH
[Error] [Freenect2Impl] failed to open Kinect v2: @4:4 LIBUSB_ERROR_ACCESS Access denied (insufficient permissions)
[Info] [Freenect2Impl] found 0 devices
[ERROR] [1716947808.656803435]: [Kinect2Bridge::initDevice] no Kinect2 devices found!
[ERROR] [1716947808.658274517]: [Kinect2Bridge::start] Initialization failed!
[FATAL] [1716947808.679535272]: Failed to load nodelet '/kinect2_bridge` of type `kinect2_bridge/kinect2_bridge_nodelet` to manager `kinect2'
[kinect2_bridge-3] process has died [pid 517159, exit code 255, cmd /opt/ros/noetic/lib/nodelet/nodelet load kinect2_bridge/kinect2_bridge_nodelet kinect2 __name:=kinect2_bridge __log:=/home/lu/.ros/log/b1e85080-1d5e-11ef-b29a-313dc61e5df7/kinect2_bridge-3.log].
log file: /home/lu/.ros/log/b1e85080-1d5e-11ef-b29a-313dc61e5df7/kinect2_bridge-3*.log
解决方法:
新开终端+复制规则
cd libfreenect2/platform/linux/udev/
sudo cp 90-kinect2.rules /etc/udev/rules.d/
重新插拔kinect2的usb口
重新启动roslaunch
roslaunch kinect2_bridge kinect2_bridge.launch
rviz
成功
消除畸变参考我的另一篇文章,链接(我做了消除畸变之后对相机标定的效果改善不明显)。之后就是准备相机标定了。
重新安装cuda
之前卸载了cuda,重新安装其实也很简单,我之前安装的是cuda11.8:
下载链接:
https://developer.nvidia.com/cuda-11-8-0-download-archive?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=20.04&target_type=runfile_local
wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
sudo sh cuda_11.8.0_520.61.05_linux.run
只要之前nvcc -V成功,那么现在也就没问题,因为.bashrc里的path没有因为之前的卸载而消失。
如果是第一次安装cuda,那么在上面两步做完之后nvcc -V大概率是不显示上面内容的,这时候需要编辑.bashrc文件。
另开终端
sudo gedit ~/.bashrc
添加以下内容(通用,不需要管cuda版本)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64
export PATH=$PATH:/usr/local/cuda/bin
export CUDA_HOME=$CUDA_HOME:/usr/local/cuda
保存,另开终端,这时候nvcc -V就没问题了。