ubuntu18.04(20通用)安装REALSENSE D435深度相机驱动

原版安装 教程(官网)

其他参考 链接


目录

  • 更新
  • 下载/克隆 librealsense github 存储库
  • 准备环境
  • 添加到包仓库列表
  • 测试( vscode )
  • RealSense SDK with Python

一、更新

如果你的系统有一更新就炸的危险,建议再三考虑后再更新,或者只 update 不 upgrade 。

sudo apt-get update
sudo apt-get upgrade

二、下载 / 克隆 librealsense github 存储库

建议直接下载第二条的,版本比较稳定

git clone https://github.com/IntelRealSense/librealsense.git

从master分支下载并解压缩最新的稳定版本https://github.com/IntelRealSense/librealsense/archive/master.zip

三、准备环境

1、记得拔摄像头

2、安装构建 librealsense 二进制文件和受影响的内核模块所需的核心软件包,特定于18的:

sudo apt-get install libglfw3-dev libgl1-mesa-dev libglu1-mesa-dev at

注意:

原链接里有个cmake注意,同样没跑这一步目前没坑

cmake 注意:某些 librealsense CMAKE 标志(例如 CUDA )要求版本 3.8+ ,而该版本目前无法通过 apt Manager 获得 Ubuntu LTS 的支持。转到 官方CMake网站 下载并安装该应用程序原链接原话注意:关于图形子系统利用率的注意事项:如果您计划构建SDK的启用OpenGL的示例,则需要 glfw3mesagtk 软件包。该 librealsense 核心库和一系列演示/工具是专为无头环境中进行部署。

3、从librealsense根目录运行Intel Realsense权限脚本:

cd /home/joyce/github/librealsense    //cd进你的librealsense目录

./scripts/setup_udev_rules.sh	    //注意最前面有个".",下同

注意:始终可以通过运行以下命令删除权限:./scripts/setup_udev_rules.sh --uninstall

4、为以下应用程序构建和应用修补的内核模块:

具有LTS内核的Ubuntu14/16/18:
./scripts/patch-realsense-ubuntu-lts.sh
 
带有 Ubuntu 的 Intel®Joule™ 基于 Canonical Ltd.提供的自定义内核。
这一步按道理应该不用跑,但是我跑了目前没坑:
./scripts/patch-realsense-ubuntu-xenial-joule.sh

5、TM1特定

(机翻)跟踪模块需要 hid_sensor_custom 内核模块才能正常运行。由于TM1的加电顺序限制,引导期间需要加载此驱动程序,以正确初始化硬件。

为了做到这一点,司机的姓名添加 hid_sensor_custom 到 / etc / modules 文件,例如:

echo 'hid_sensor_custom' | sudo tee -a /etc/modules

6、编译librealsense2 SDK

mkdir build		//创建一个名为build的文件夹

cd build		//cd进去,注意这两步一定要在librealsense2目录下

运行 CMake :

(2021-4-22)可以自行选择考虑跑这一条:

cmake ../ -DBUILD_PYTHON_BINDINGS:bool=true -DPYTHON_EXECUTABLE=/usr/bin/python3

因为这就顺便把 pyrealsense2 的也编译好了,不用再另外pip3了(arm64都能用)。当然如果这一条跑不动的话就跑下面第一小步的那条吧。

参考链接:https://shliang.blog.csdn.net/article/details/113618002妙算上没有 realsense2-viewer 的问题仍然没有解决,以防万一第四步那三条还是跑一下吧。

① 这一步将默认版本设置为在调试模式下生成核心共享库和单元测试二进制文件。用于-DCMAKE_BUILD_TYPE=Release优化构建。

cmake ../ 	

② 构建 librealsense 以及演示和教程

cmake ../ -DBUILD_EXAMPLES=true

③ 这一步对于没有 OpenGL 或 X11 的系统,仅构建文本示例

cmake ../ -DBUILD_EXAMPLES=true -DBUILD_GRAPHICAL_EXAMPLES=false

④ 重新编译并安装 librealsense 二进制文件:共享对象将安装在/usr/local/lib中的头文件中/usr/local/include。二进制演示,教程和测试文件将被复制到/usr/local/bin。

sudo make uninstall
make clean
sudo make install

⑤ make -jX并行编译,X代表cpu核心可用数量

原链接内容:(这增强可能显著提高构建时间。但副作用是,它可能导致低端平台随机挂起。(注意:默认情况下,Linux构建配置当前配置为使用V4L2后端。注意:如果在编译过程中遇到以下错误gcc: internal compiler error它可能表明您的计算机上没有足够的内存或交换空间。尝试关闭消耗内存的应用程序,如果您正在VM中运行,请将可用RAM增加到至少2 GB。注意:您可以在 此Wiki页面 上找到有关可用配置选项的更多信息。)

sudo make uninstall

make clean

grep -c ^processor /proc/cpuinfo // 查询计算机核心数量最优解

make -j(x-1)	// x的值为上面查询到的计算机核心数量最优解,注意一定一定要-1!!比如我查询到我的值是12,那我跑的时候就是 『 make -j11 』
// (2021-7-9:不要跑满!内存会爆满!就打不开!!不要跑满!不要跑满!不要跑满!不要跑满!如果跑核心数量-1的时候仍然发现计算机出现卡死的情况请立即停止!确保计算机安全无误的情况下把x的值再往小调整!)

sudo make install

⑥ 添加动态库及相关环境变量(针对 python )

gedit ~/.bashrc

在~./bashrc中最后一行添加下面这一行:
export PYTHONPATH=$PYTHONPATH:/usr/local/lib:/usr/local/lib/python3.6/pyrealsense2

然后激活:
source ~/.bashrc

四、添加到包仓库列表

1、注册公钥:

sudo apt-key adv --keyserver keys.gnupg.net --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE || sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE

2、添加包仓库列表:

sudo add-apt-repository "deb https://librealsense.intel.com/Debian/apt-repo $(lsb_release -cs) main" -u

3、安装库以及开发包:

sudo apt-get install librealsense2-dkms librealsense2-utils librealsense2-dev librealsense2-dbg

csdn 链接原话:至此,驱动包安装完成,使用以下命令可以打开 RealSense 的预览插件,连接相机即可查看设备输出。PS:某些电脑在安装过程中会出现 configure UEFI Secure Boot 的窗口,意思是开启了 UEFI Secure Boot,而这会阻止你使用第三方的硬件驱动,不必更改这一模式,只需要按照窗口提示设定一个 Secure Boot 的密码确认,然后重启就会自动进入到 MOK 界面,选择第二项,yes 之后输入刚才设定的密码,即可重新进入系统,此时 RealSense 的驱动也就安装好了。


五、测试( vscode )

此时插入摄像头

realsense-viewer

但是这个相机有个挺苟的问题,那就是他只能用 USB3.0 的 typeC 线,用普通的充电线是用不了的,像刚刚上面那张图就是用的普通充电线。下面是 USB3.0 线的界面,会看到左边显示了参数。

这里要说明一下,如果你的主要开发需求是用代码调用深度相机而不是用 realsense-viewer ,那么如果发现 realsense-viewer 安装失败也不用太过担心,只要你在之前编译的时候没有出问题就行,因为这个对代码调用并没有影响。

因为在”添加到包仓库列表”这一大步的时候因为换源问题出错而装不上的概率比较高,至少我至今仍然没有研究出解决办法,但是确实不影响代码调用……

vscode 调用

1、因为我有用到 opencv ,所以我有一个 cpp_properties.json 文件(其实就是放头文件的地方)我直接在原来的基础上加上了 librealsense2/ 建议直接在你自己原来的配置文件中加,不要直接复制下面的,我下面给的只是我自己的,仅供参考下面加粗的就是我后面自己加上的这个 librealsense2 的库,其他的就是我原本的设置,后文的 task.json 也一样如果文件显示侧边栏没有(且你忘了怎么打开):最上面的任务栏->运行( Debug )->打开配置(C)->会弹出来

cpp_properties.json:

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**",
                "/usr/local/include/",
                "/usr/local/include/opencv4/",
                "/usr/local/include/opencv4/opencv2/",
                "/usr/include/librealsense2/" /*深度学习相机realsense2 D435的库*/
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "c11",
            "cppStandard": "c++11",
            "intelliSenseMode": "gcc-x64"
        }
    ],
    "version": 4
}

tasks.json:

找到 librealsense2.so 文件的目录,同样复制进去就行,如无例外,应该差不多是都在 / usr / local / lib 里面。如果文件显示侧边栏没有(且你忘了怎么打开):ctrl+shift+P,然后输入:Task->配置任务(中文)或者 Configure Task ,一般都能找到。

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",   /* 要与launch.json文件里的preLaunchTask的内容保持一致 */
            "type": "shell",/* 定义任务是被作为进程运行还是在 shell 中作为命令运行,默认是shell,即是在终端中运行,因为终端执行的就是shell的脚本 */
            "command": "g++",/* 这里填写你的编译器地址 */
            "args": [
                /* 说明整个项目所需的源文件路径(.cpp) */
                "-g", 
                "${file}", 
                "-std=c++11", // 静态链接
                "-o",   /* 编译输出文件的存放路径 */
                "${fileDirname}/${fileBasenameNoExtension}",/* 要与launch.json文件里的program的内容保持一致 */
                "-I","${workspaceFolder}/armor_pre/",
                //"-I","${workspaceFolder}/armor_test_avi/",
                "-static-libgcc",
                "-Wall",// 开启额外警告
                /* 说明整个项目所需的头文件路径(.h)*/
                "-I","${workspaceFolder}/",
                "-I","/usr/local/include/",
                "-I","/usr/local/include/opencv4/",
                "-I","/usr/local/include/opencv4/opencv2/",
                "/usr/local/lib/libopencv_*",   /* OpenCV的lib库 */
                "/usr/local/lib/librealsense2.so" /*深度学习相机realsense2 D435的库*/
            ]
        }
     ]
}

测试代码:

用深度相机自带的函数进行测距。

另一条手写测距的代码在这里: 链接

#include <iostream>
#include <librealsense2/rs.hpp>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;
using namespace rs2;

int main()
{
    rs2::frame color_frame;                  // 定义彩色图
    rs2::frame depth_frame;                  // 定义深度图
    pipeline pipe;                           // 创建数据管道
    
    // start() 函数返回数据管道的 profile
    pipeline_profile profile = pipe.start(); 

    for (;;)
    {
        // 堵塞程序直到新的一帧捕获
        frameset frameset = pipe.wait_for_frames();  

        // 获取颜色图
        rs2::video_frame video_src = frameset.get_color_frame(); 

        // 获取深度图
        rs2::depth_frame depth_src = frameset.get_depth_frame(); 

        // 获取深度图的尺寸,用于确定测距中心点
        float width = depth_src.get_width();
        float height = depth_src.get_height();

        // 获取颜色图的尺寸,用于转成 Mat 格式并显示
        const int color_width = video_src.as<video_frame>().get_width();
        const int color_height = video_src.as<video_frame>().get_height();

        // 转成 Mat 类型
        Mat frame(Size(color_width, color_height), CV_8UC3,             
        (void*)video_src.get_data(),Mat::AUTO_STEP);

        // 定义并获取距离数据(单位: m )
        float distance = depth_src.get_distance(width / 2, height / 2); 

        // 输出距离数据
        cout << "distance:" << distance << endl;  

        // 转 RGB
        cvtColor(frame, frame, COLOR_BGR2RGB);  
                        
        //中心点绘制
        line(frame, Point2f(frame.cols / 2 - 20, frame.rows / 2), 
        Point2f(frame.cols / 2 + 20, frame.rows / 2), Scalar(255, 255, 255), 2);

        line(frame, Point2f(frame.cols / 2, frame.rows / 2 - 20), 
        Point2f(frame.cols / 2, frame.rows / 2 + 20), Scalar(255, 255, 255), 2);

        imshow("frame", frame); // 显示
        int key = waitKey(1);   //按 Esc 退出程序
        if (char(key) == 27)
            break;
    }
}

人间奇迹现场:


六、RealSense SDK with Python

(在 C++ 环境的已经配置好的情况下)按道理来说,跑下面这一条就行:

pip3 install pyrealsense2

如果 pip3 出错:Defaulting to user installation because normal site-packages is not writeable

就试试这个:

sudo pip3 install pyrealsense2

或者这个:

sudo python3 -m pip install -U pip pyrealsense2

如果还不行,这个时候我们需要修改 /usr/bin/ 文件夹下的 pip3 文件,输入sudo vi /usr/bin/pip3命令,使用vi打开该文件(gedit 也行)

原文参考 链接

将原来的:

from pip import main
if __name__ == '__main__':
    sys.exit(main())

修改为:

from pip import __main__libxinerama1
if __name__ == '__main__':
    sys.exit(__main__._main())

如果还不行,那我救不了了orz

以防有需要,这里放一个安装包 地址

Python 测试示例

## License: Apache 2.0. See LICENSE file in root directory.
## Copyright(c) 2015-2017 Intel Corporation. All Rights Reserved.
###############################################
##      Open CV and Numpy integration        ##
###############################################
import pyrealsense2 as rs
import numpy as np
import cv2
# Configure depth and color streams
pipeline = rs.pipeline()
config = rs.config()
# Get device product line for setting a supporting resolution
pipeline_wrapper = rs.pipeline_wrapper(pipeline)
pipeline_profile = config.resolve(pipeline_wrapper)
device = pipeline_profile.get_device()
device_product_line = str(device.get_info(rs.camera_info.product_line))
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
if device_product_line == 'L500':
    config.enable_stream(rs.stream.color, 960, 540, rs.format.bgr8, 30)
else:
    config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)
# Start streaming
pipeline.start(config)
try:
    while True:
        # Wait for a coherent pair of frames: depth and color
        frames = pipeline.wait_for_frames()
        depth_frame = frames.get_depth_frame()
        color_frame = frames.get_color_frame()
        if not depth_frame or not color_frame:
            continue
        # Convert images to numpy arrays
        depth_image = np.asanyarray(depth_frame.get_data())
        color_image = np.asanyarray(color_frame.get_data())
        # Apply colormap on depth image (image must be converted to 8-bit per pixel first)
        depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.03), cv2.COLORMAP_JET)
        depth_colormap_dim = depth_colormap.shape
        color_colormap_dim = color_image.shape
        # If depth and color resolutions are different, resize color image to match depth image for display
        if depth_colormap_dim != color_colormap_dim:
            resized_color_image = cv2.resize(color_image, dsize=(depth_colormap_dim[1], depth_colormap_dim[0]), interpolation=cv2.INTER_AREA)
            images = np.hstack((resized_color_image, depth_colormap))
        else:
            images = np.hstack((color_image, depth_colormap))
        # Show images
        cv2.namedWindow('RealSense', cv2.WINDOW_AUTOSIZE)
        cv2.imshow('RealSense', images)
        cv2.waitKey(1)
finally:
    # Stop streaming
    pipeline.stop()

以上,over


发表回复 0

Your email address will not be published. Required fields are marked *