1. 环境说明

本文记录一次在 Ubuntu 18.04 aarch64 / Jetson 系统上部署 Intel RealSense T265 的完整流程。目标是:

  • 尽量不占用系统盘空间;
  • 将 RealSense 工具放到 U 盘;
  • 能检测 T265 设备;
  • 能返回 T265 位姿数据;
  • 能显示 T265 摄像头画面;
  • 部署成简单命令和桌面快捷方式。

实际环境:

Linux ubuntu 4.9.337-tegra aarch64
Ubuntu 18.04.6 LTS

U 盘挂载位置:

/media/yhp/9ADF-BBCB

T265 设备识别信息:

Name             : Intel RealSense T265
Product Line     : T200
Pose             : 200Hz 6DOF
Fisheye 1/2      : 848x800 @ 30Hz Y8
Gyro             : 200Hz
Accel            : 62Hz

2. 先检查磁盘和 U 盘

系统盘空间很小,所以先确认磁盘占用和 U 盘挂载点:

df -h
lsblk -f
du -h -d 1 /home/yhp

本次发现:

/dev/mmcblk0p1   14G   13G   12M  100% /
/dev/sda1       116G  256K  116G    1% /media/yhp/9ADF-BBCB

也就是系统盘已经满了,U 盘有 116G 空间。

3. 将已有 librealsense 工程备份到 U 盘

原本系统中已有 librealsense-2.50.0,其中包含已经编译好的工具:

build/examples/pose/rs-pose
build/examples/capture/rs-capture
build/tools/enumerate-devices/rs-enumerate-devices
build/tools/fw-update/rs-fw-update

为了避免文件损坏,先打包到 U 盘,再校验:

mkdir -p /media/yhp/9ADF-BBCB/yhp-backup-2026-06-01

tar -C /home/yhp \
  -czf /media/yhp/9ADF-BBCB/yhp-backup-2026-06-01/librealsense-2.50.0.tar.gz \
  librealsense-2.50.0

gzip -t /media/yhp/9ADF-BBCB/yhp-backup-2026-06-01/librealsense-2.50.0.tar.gz
sync

校验通过后,再删除系统盘中的原目录释放空间。

4. 在 U 盘部署 librealsense

创建 T265 工具目录:

mkdir -p /media/yhp/9ADF-BBCB/realsense-t265

解压 librealsense:

tar -xzf /media/yhp/9ADF-BBCB/yhp-backup-2026-06-01/librealsense-2.50.0.tar.gz \
  -C /media/yhp/9ADF-BBCB/realsense-t265

注意:U 盘是 FAT/vfat 文件系统,不支持 Linux 符号链接,所以解压时可能出现类似提示:

无法创建符号连接: 不允许的操作

这不是源码或程序损坏,而是 FAT 文件系统不支持 symlink。解决方式是运行时把必要程序和库复制到 /tmp,并把真实库文件改成程序需要的库名。

5. 检查关键程序和库

关键文件如下:

/media/yhp/9ADF-BBCB/realsense-t265/librealsense-2.50.0/build/tools/enumerate-devices/rs-enumerate-devices
/media/yhp/9ADF-BBCB/realsense-t265/librealsense-2.50.0/build/examples/capture/rs-capture
/media/yhp/9ADF-BBCB/realsense-t265/librealsense-2.50.0/build/examples/pose/rs-pose
/media/yhp/9ADF-BBCB/realsense-t265/librealsense-2.50.0/build/librealsense2.so.2.50.0

程序依赖的库名是:

librealsense2.so.2.50

但 U 盘中真实文件是:

librealsense2.so.2.50.0

所以启动脚本中复制成:

cp "$USB_ROOT/build/librealsense2.so.2.50.0" "$RUN_DIR/librealsense2.so.2.50"

6. 创建 T265 设备检测脚本

文件:/media/yhp/9ADF-BBCB/realsense-t265/t265-list.sh

#!/usr/bin/env bash
set -euo pipefail

USB_ROOT="/media/yhp/9ADF-BBCB/realsense-t265/librealsense-2.50.0"
RUN_DIR="/tmp/realsense-t265-run"

mkdir -p "$RUN_DIR"
cp "$USB_ROOT/build/tools/enumerate-devices/rs-enumerate-devices" "$RUN_DIR/"
cp "$USB_ROOT/build/librealsense2.so.2.50.0" "$RUN_DIR/librealsense2.so.2.50"
chmod +x "$RUN_DIR/rs-enumerate-devices"

LD_LIBRARY_PATH="$RUN_DIR${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" \
  "$RUN_DIR/rs-enumerate-devices"

运行:

bash /media/yhp/9ADF-BBCB/realsense-t265/t265-list.sh

7. 编写 T265 位姿输出程序

rs-pose 示例程序不一定直接在终端打印我们想要的 CSV 数据,所以单独写一个小工具,直接输出:

timestamp_ms,x,y,z,qx,qy,qz,qw,vx,vy,vz

文件:t265-print-pose.cpp

#include <librealsense2/rs.hpp>

#include <chrono>
#include <csignal>
#include <iomanip>
#include <iostream>

static volatile std::sig_atomic_t keep_running = 1;

static void stop(int) {
    keep_running = 0;
}

int main() {
    std::signal(SIGINT, stop);
    std::signal(SIGTERM, stop);

    rs2::pipeline pipe;
    rs2::config cfg;
    cfg.enable_stream(RS2_STREAM_POSE, RS2_FORMAT_6DOF, 200);

    try {
        std::cerr << "Starting T265 pose stream...\n";
        pipe.start(cfg);
        std::cerr << "Pose stream started.\n";

        std::cout << "timestamp_ms,x,y,z,qx,qy,qz,qw,vx,vy,vz\n" << std::flush;
        std::cout << std::fixed << std::setprecision(6);

        while (keep_running) {
            rs2::frameset frames = pipe.wait_for_frames();
            rs2::pose_frame pose_frame = frames.first_or_default(RS2_STREAM_POSE);
            if (!pose_frame) {
                continue;
            }

            rs2_pose pose = pose_frame.get_pose_data();
            std::cout
                << pose_frame.get_timestamp() << ','
                << pose.translation.x << ','
                << pose.translation.y << ','
                << pose.translation.z << ','
                << pose.rotation.x << ','
                << pose.rotation.y << ','
                << pose.rotation.z << ','
                << pose.rotation.w << ','
                << pose.velocity.x << ','
                << pose.velocity.y << ','
                << pose.velocity.z << '\n' << std::flush;
        }

        pipe.stop();
        return 0;
    } catch (const rs2::error& e) {
        std::cerr << "RealSense error: " << e.what() << '\n';
        return 2;
    } catch (const std::exception& e) {
        std::cerr << "Error: " << e.what() << '\n';
        return 1;
    }
}

编译:

g++ -std=c++11 /tmp/t265-print-pose.cpp \
  -I/media/yhp/9ADF-BBCB/realsense-t265/librealsense-2.50.0/include \
  -L/media/yhp/9ADF-BBCB/realsense-t265/librealsense-2.50.0/build \
  -l:librealsense2.so.2.50.0 \
  -pthread \
  -o /tmp/t265-print-pose

复制到 U 盘:

cp /tmp/t265-print-pose /media/yhp/9ADF-BBCB/realsense-t265/
cp /tmp/t265-print-pose.cpp /media/yhp/9ADF-BBCB/realsense-t265/

8. 创建位姿输出脚本

文件:/media/yhp/9ADF-BBCB/realsense-t265/t265-pose.sh

#!/usr/bin/env bash
set -euo pipefail

USB_ROOT="/media/yhp/9ADF-BBCB/realsense-t265/librealsense-2.50.0"
RUN_DIR="/tmp/realsense-t265-run"

mkdir -p "$RUN_DIR"
cp "/media/yhp/9ADF-BBCB/realsense-t265/t265-print-pose" "$RUN_DIR/"
cp "$USB_ROOT/build/librealsense2.so.2.50.0" "$RUN_DIR/librealsense2.so.2.50"
chmod +x "$RUN_DIR/t265-print-pose"

LD_LIBRARY_PATH="$RUN_DIR${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" \
  "$RUN_DIR/t265-print-pose"

运行:

bash /media/yhp/9ADF-BBCB/realsense-t265/t265-pose.sh

输出示例:

Starting T265 pose stream...
Pose stream started.
timestamp_ms,x,y,z,qx,qy,qz,qw,vx,vy,vz
1780314325372.686279,0.000000,0.000000,0.000000,-0.449490,0.039524,-0.075521,0.889209,0.000000,0.000000,0.000000

Ctrl+C 停止。

9. 创建摄像头画面显示脚本

文件:/media/yhp/9ADF-BBCB/realsense-t265/t265-view.sh

#!/usr/bin/env bash
set -euo pipefail

USB_ROOT="/media/yhp/9ADF-BBCB/realsense-t265/librealsense-2.50.0"
RUN_DIR="/tmp/realsense-t265-run"

mkdir -p "$RUN_DIR"
cp "$USB_ROOT/build/examples/capture/rs-capture" "$RUN_DIR/"
cp "$USB_ROOT/build/librealsense2.so.2.50.0" "$RUN_DIR/librealsense2.so.2.50"
chmod +x "$RUN_DIR/rs-capture"

LD_LIBRARY_PATH="$RUN_DIR${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" \
  "$RUN_DIR/rs-capture"

运行:

bash /media/yhp/9ADF-BBCB/realsense-t265/t265-view.sh

该程序需要桌面显示环境。

10. 部署 udev 规则

RealSense 的 udev 规则文件在:

/media/yhp/9ADF-BBCB/realsense-t265/librealsense-2.50.0/config/99-realsense-libusb.rules

部署到系统:

sudo cp \
  /media/yhp/9ADF-BBCB/realsense-t265/librealsense-2.50.0/config/99-realsense-libusb.rules \
  /etc/udev/rules.d/99-realsense-libusb.rules

sudo udevadm control --reload-rules
sudo udevadm trigger

如果当前会话不能输入 sudo 密码,可以手动在终端执行上面的命令。执行后建议重新插拔 T265。

11. 部署成系统命令

为了不用每次输入完整 U 盘路径,可以把脚本复制到用户命令目录:

mkdir -p ~/.local/bin

cp /media/yhp/9ADF-BBCB/realsense-t265/t265-list.sh ~/.local/bin/t265-list
cp /media/yhp/9ADF-BBCB/realsense-t265/t265-pose.sh ~/.local/bin/t265-pose
cp /media/yhp/9ADF-BBCB/realsense-t265/t265-view.sh ~/.local/bin/t265-view

chmod +x ~/.local/bin/t265-list ~/.local/bin/t265-pose ~/.local/bin/t265-view

确认 ~/.local/bin 在 PATH 中:

echo "$PATH"

之后可以直接运行:

t265-list
t265-pose
t265-view

12. 创建环境配置文件

文件:~/.config/t265-env.sh

#!/usr/bin/env bash

export T265_USB_ROOT="/media/yhp/9ADF-BBCB/realsense-t265"
export T265_LIBREALSENSE_ROOT="$T265_USB_ROOT/librealsense-2.50.0"
export PATH="$HOME/.local/bin:$PATH"

13. 创建桌面快捷方式

检测设备快捷方式:~/Desktop/T265-List.desktop

[Desktop Entry]
Type=Application
Name=T265 List
Comment=List Intel RealSense T265 device capabilities
Exec=gnome-terminal -- bash -lc 't265-list; echo; echo "Press Enter to close."; read'
Terminal=false
Categories=Utility;

位姿输出快捷方式:~/Desktop/T265-Pose.desktop

[Desktop Entry]
Type=Application
Name=T265 Pose
Comment=Print Intel RealSense T265 pose CSV
Exec=gnome-terminal -- bash -lc 't265-pose; echo; echo "T265 pose stopped. Press Enter to close."; read'
Terminal=false
Categories=Utility;

画面显示快捷方式:~/Desktop/T265-View.desktop

[Desktop Entry]
Type=Application
Name=T265 View
Comment=Show Intel RealSense T265 camera stream
Exec=gnome-terminal -- bash -lc 't265-view; echo; echo "T265 viewer stopped. Press Enter to close."; read'
Terminal=false
Categories=Utility;

赋予执行权限:

chmod +x ~/Desktop/T265-List.desktop
chmod +x ~/Desktop/T265-Pose.desktop
chmod +x ~/Desktop/T265-View.desktop

14. 验证结果

14.1 检测设备

t265-list

正常输出应包含:

Name                          : Intel RealSense T265
Product Line                  : T200
Pose                          : 200Hz 6DOF
Fisheye 1                     : 848x800 @ 30Hz Y8
Fisheye 2                     : 848x800 @ 30Hz Y8

14.2 输出位姿

t265-pose

正常输出:

timestamp_ms,x,y,z,qx,qy,qz,qw,vx,vy,vz

其中:

  • x,y,z 是平移位置;
  • qx,qy,qz,qw 是姿态四元数;
  • vx,vy,vz 是速度。

14.3 显示摄像头画面

t265-view

如果桌面环境正常,会打开 RealSense 的画面窗口或帧率显示程序。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

加粗样式

15. 常见问题

15.1 U 盘上程序不能直接执行

原因:U 盘是 FAT/vfat 文件系统,挂载参数中可能有 showexec,且 FAT 不支持 Linux 执行权限和符号链接。

解决:不要直接运行 U 盘上的二进制程序,使用本文的脚本。脚本会把程序复制到 /tmp/realsense-t265-run 后运行。

15.2 解压时报“无法创建符号连接”

原因:FAT 文件系统不支持 symlink。

解决:可以忽略这些链接错误,只要真实目标文件存在即可。本文脚本已经处理 librealsense2.so.2.50 的库名问题。

15.3 普通用户没有权限访问 T265

部署 udev 规则:

sudo cp \
  /media/yhp/9ADF-BBCB/realsense-t265/librealsense-2.50.0/config/99-realsense-libusb.rules \
  /etc/udev/rules.d/99-realsense-libusb.rules

sudo udevadm control --reload-rules
sudo udevadm trigger

然后重新插拔 T265。

15.4 t265-view 没有画面

检查是否有桌面显示环境:

echo "$DISPLAY"

如果通过 SSH 登录,需要 X11 转发或直接在带显示器的桌面环境运行。

16. 最终目录结构

U 盘目录:

/media/yhp/9ADF-BBCB/realsense-t265
├── README-T265.txt
├── install-t265-udev.sh
├── librealsense-2.50.0
├── t265-list.sh
├── t265-pose.sh
├── t265-print-pose
├── t265-print-pose.cpp
└── t265-view.sh

系统部署:

~/.local/bin/t265-list
~/.local/bin/t265-pose
~/.local/bin/t265-view
~/.config/t265-env.sh
~/Desktop/T265-List.desktop
~/Desktop/T265-Pose.desktop
~/Desktop/T265-View.desktop
/etc/udev/rules.d/99-realsense-libusb.rules

17. 总结

本方案适合系统盘空间紧张的 Jetson/Ubuntu 设备。核心思路是:

  • RealSense 工具和源码放 U 盘;
  • 运行时复制关键二进制和库到 /tmp
  • 使用 LD_LIBRARY_PATH 指定临时库路径;
  • 用自定义 C++ 程序输出 T265 位姿 CSV;
  • rs-capture 显示摄像头画面;
  • 用 udev 规则解决 USB 权限问题;
  • 最后部署为 t265-listt265-poset265-view 三个命令。

部署完成后,日常使用只需要:

t265-list   # 检测设备
t265-pose   # 输出位姿
t265-view   # 显示画面
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐