
T265 在 ROS 2 跑通
Intel T265 已停产停止支持
前言#
T265 是一颗内置 Movidius VPU 芯片的双目鱼眼追踪相机——两个鱼眼镜头 + 200Hz IMU,芯片内部跑 VIO,USB 直接输出 6-DOF 位姿。Intel 2023 年宣布停产、2025 年停止软件支持。
实验室刚好有一颗,记录一下配置和学习过程。
环境:Ubuntu 22.04,ROS 2 Humble,librealsense v2.50.0。
一、硬件识别#
插上 T265,lsusb 显示:
Bus 003 Device 007: ID 03e7:2150 Intel Myriad VPU [Movidius Neural Compute Stick]plaintext这不是神经网络加速棒。 T265 内部的 Movidius Myriad 2 芯片在固件上传前处于 bootloader 模式,USB PID 为 2150。固件上传后芯片进入相机模式,PID 变为 0B37。
系统自带的 librealsense 2.58 完全检测不到设备——因为 Intel 在 v2.55 之后从源码中移除了 T265 支持。rs-enumerate-devices 和 realsense-viewer 都输出 No RealSense devices were found!。
二、SDK 版本选择#
Intel 官方对 T265 的支持时间线:
AI给我的图:
| 版本 | T265 支持 | 状态 |
|---|---|---|
| v2.50.0 | ✅ 完整支持 | 我选的是这个 |
| v2.54.2 | ⚠️ 官方称支持,但固件下载代码不完整 | 不可用 |
| v2.55+ | ❌ 源码完全移除 | 不可用 |
| v2.58(系统当前) | ❌ | 不可用 |
可以独立编译一个目录下,比如我在 ~/桌面/OpenCV/cameras/t265/ 下,和系统的 2.58 互不干扰:
cd ~/桌面/OpenCV/cameras/t265
git clone https://github.com/IntelRealSense/librealsense -b v2.50.0 librealsense
cd librealsense && mkdir build && cd build
cmake .. \
-DFORCE_RSUSB_BACKEND=true \
-DCMAKE_INSTALL_PREFIX=$HOME/桌面/OpenCV/cameras/t265/librealsense/install \
-DCMAKE_BUILD_TYPE=Release
make -j$(nproc)
make installbashFORCE_RSUSB_BACKEND=true 跳过内核模块,直接用 libusb 读写设备——不需要 dkms,不会和系统 librealsense 冲突。
编译完成后验证:
export LD_LIBRARY_PATH=~/桌面/OpenCV/cameras/t265/librealsense/install/lib:$LD_LIBRARY_PATH
~/桌面/OpenCV/cameras/t265/librealsense/install/bin/rs-enumerate-devicesbash输出:
Device info:
Name : Intel RealSense T265
Serial Number : 230322110123
Firmware Version : 0.2.0.951
Product Id : 0B37 ← 相机模式!
Stream Profiles supported by Tracking Module
Supported modes:
stream resolution fps format
Fisheye 1 848x800 @ 30Hz Y8
Fisheye 2 848x800 @ 30Hz Y8
Gyro N/A @ 200Hz MOTION_XYZ32F
Accel N/A @ 62Hz MOTION_XYZ32F
Pose N/A @ 200Hz 6DOFplaintext四个流——两路鱼眼灰度图、200Hz 陀螺仪、62Hz 加速度计、200Hz 内置 VIO 位姿。
三、ROS 2 的 T265#
ROS 1 :完美支持#
T265 上市于 2019 年,正值 ROS 1 的黄金年代。官方 realsense-ros 提供了完整的 T265 支持:
# ROS 1 下一条命令启动 T265
roslaunch realsense2_camera rs_t265.launchbash自动发布两路鱼眼图、IMU 数据、6-DOF 位姿、TF 树——全部开箱即用。Kaliibr 联合标定、ORB-SLAM3 双目模式、VINS-Fusion,教程遍布全网。
ROS 2 没赶上#
2019 T265 上市,ROS 1 驱动成熟
2021 T265 累计出货量不理想
2022 ROS 2 Humble 发布
2023 Intel 宣布 T265 停产
2025 realsense-ros ROS 2 版适配完 D400 系列,T265 源码被删plaintextT265 赶上了 ROS 1 的末班车,没赶上 ROS 2 的头班车。realsense-ros 的 ROS 2 分支(ros2-master、ros2-development)从未包含 rs_t265.launch——它们在 2023 年后才稳定,而那时 T265 已经停产、SDK 里的通信代码也被移除了。
为什么不能直接用#
系统 apt 的 ros-humble-realsense2-camera 是 v4.57.7,链 librealsense 2.57——没有 T265 通信代码。实测:固件加载后跑 ros2 launch realsense2_camera rs_launch.py,输出 No RealSense devices were found!。
有尝试者试图把 v4.51 的 realsense-ros 源码(最后一个含 T265 支持的版本)搬到 Humble 下编译——但它的 CMake 消息定义(rosidl_generate_interfaces)和 Humble 的 rosidl_cmake 不兼容,报 list index out of range。
最终方案#
ROS 1 的 rs_t265.launch 做了三件事:调 SDK 读数据流 → 包成 ROS 消息 → 发话题。我在 ROS 2 下做完全一样的事——写 了个 t265_driver 节点,直接链 v2.50 SDK,不依赖 realsense-ros。
// 核心:用 v2.50 API 遍历帧,按流类型分发到 ROS 话题
for (auto f : frames) {
auto stream = f.get_profile().stream_type();
auto index = f.get_profile().stream_index();
if (stream == RS2_STREAM_FISHEYE) {
if (index == 1) publish_fisheye(...); // → /camera/fisheye1/image_raw
if (index == 2) publish_fisheye(...); // → /camera/fisheye2/image_raw
}
}
// IMU 和 Pose 同理cppcolcon 包结构:
cameras/t265/ws/src/t265_driver/
├── CMakeLists.txt ← 链 v2.50 librealsense + ROS 2
├── package.xml
└── t265_node.cpp plaintext踩过的 API 兼容坑#
v2.50 的 C++ API 和 v2.58 有两个差异:
① first_or_default 签名不同
// v2.58(能用)
frames.first_or_default(RS2_STREAM_FISHEYE, 1); // 第二参数是 stream_index
// v2.50(不能用)
frames.first_or_default(RS2_STREAM_FISHEYE, RS2_FORMAT_ANY); // 第二参数是 format
// stream_index 要从 frame.get_profile().stream_index() 取cpp② 帧迭代返回右值
for (auto& f : frames) { ... } // v2.58 OK,v2.50 编译报错
for (auto f : frames) { ... } // v2.50:按值拷贝cpp四、完整运行方式#
编译#
cd ~/桌面/OpenCV/cameras/t265/ws
source /opt/ros/humble/setup.bash
colcon build --symlink-install \
--packages-select t265_driver \
--cmake-args -DCMAKE_PREFIX_PATH=$HOME/桌面/OpenCV/cameras/t265/librealsense/installbash运行#
source ~/桌面/OpenCV/cameras/t265/ws/install/setup.bash
export LD_LIBRARY_PATH=$HOME/桌面/OpenCV/cameras/t265/librealsense/install/lib:$LD_LIBRARY_PATH
ros2 run t265_driver t265_nodebash验证#
ros2 topic list | grep camera
# /camera/fisheye1/image_raw ← 30Hz 鱼眼灰度
# /camera/fisheye2/image_raw ← 30Hz 鱼眼灰度
# /camera/imu ← 200Hz
# /camera/odom ← 200Hz 内置 VIO 位姿
ros2 topic hz /camera/fisheye1/image_raw
# average rate: 59.753 ← 正常 60Hzbash也可以用 SDK 自带的图形工具直接看鱼眼画面:
~/桌面/OpenCV/cameras/t265/librealsense/install/bin/realsense-viewerbash简单看——ROS 2 看鱼眼图:
终端:T265 跑着的同时
ros2 run rqt_image_view rqt_image_viewplaintext选 /camera/fisheye1/image_raw 好看点——T265 SDK 自带的 viewer:
export LD_LIBRARY_PATH=$HOME/桌面/OpenCV/cameras/t265/librealsense/install/lib:$LD_LIBRARY_PATH
~/桌面/OpenCV/cameras/t265/librealsense/install/bin/realsense-viewerplaintext这两个都能直接看到两路鱼眼画面。先试试。
五、和 D435i 共存#
T265 用自编译 v2.50 SDK,D435i 用系统 apt 安装的 v2.58。两者通过环境变量隔离:
# 用 D435i(默认——系统 SDK)
ros2 launch realsense2_camera rs_launch.py
# 用 T265(source 自编工作区 + LD_LIBRARY_PATH)
source ~/桌面/OpenCV/cameras/t265/ws/install/setup.bash
export LD_LIBRARY_PATH=~/桌面/OpenCV/cameras/t265/librealsense/install/lib:$LD_LIBRARY_PATH
ros2 run t265_driver t265_nodebash两个相机插在同一台机器上同时跑,互不影响。
六、踩坑清单#
| 坑 | 现象 | 根因 | 解决 |
|---|---|---|---|
| 系统 SDK 不认设备 | rs-enumerate-devices 无输出 | 2.58 删了 T265 支持 | 自编译 v2.50 |
| 2.54 固件缺失 | 编译通过但检测不到 | CMakeLists 未下载 TM2 固件 | 换 v2.50.0 |
| ROS 驱动不兼容 | list index out of range | realsense-ros 新分支和 Humble rosidl 冲突 | 手写最小节点 |
| v2.50 API 签名差异 | invalid conversion from int to rs2_format | first_or_default 参数顺序不同 | 遍历 frame 用 stream_index() |
| 帧是右值 | cannot bind non-const lvalue reference | v2.50 返回右值 | auto f 替代 auto& f |
| 固件上传前 | lsusb 显示 Neural Compute Stick | Movidius 在 bootloader 模式 | v2.50 SDK 启动时自动上传 |
后续#
就这样吧,先记录着,后面再看看怎么优化。
参考#
- T265 产品页面(已归档):Intel RealSense T265 ↗
- librealsense v2.50.0 源码:realsenseai/librealsense ↗
- T265 固件 v0.2.0.951 直链:
https://librealsense.intel.com/Releases/TM2/FW/target/0.2.0.951/target-0.2.0.951.mvcmd - 社区确认:ROS 2 Humble 需配合 SDK v2.51.1 + realsense-ros v4.51.1 才能使用 T265