# Intel RealSense T265 在 Ubuntu/Jetson 上的 U 盘部署、位姿输出与摄像头画面显示
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-list、t265-pose、t265-view三个命令。
部署完成后,日常使用只需要:
t265-list # 检测设备
t265-pose # 输出位姿
t265-view # 显示画面
更多推荐
所有评论(0)