前言
关于T265的环境配置与安装,在前两期的ROS笔记中已经提及,包括英特尔本家的SDK安装,以及对应支持版本的ROS支持开发工具包。
ROS1系列学习笔记之Linux(Ubuntu)的环境安装、依赖准备、踩坑提示(硬件以T265为例)https://blog.csdn.net/2301_81315771/article/details/150229967?spm=1001.2014.3001.5501本期主要来讲讲T265的使用过程中遇到的问题的解答(持续更新)。
启动T265,调用例程的三个基本指令:
roslaunch realsense2_camera rs_t265.launch
rostopic list
rostopic echo /camera/odom/sample
订阅ros节点获取T265实时数据并通过串口输出:
首先运行ROS的T265节点:
roslaunch realsense2_camera rs_t265.launch
软件前提:需安装VSCode来运行以下代码!
t265数据按照通信规则输出:
#!/usr/bin/env python3
import rospy
import serial
import struct
from nav_msgs.msg import Odometry# 协议常量(按照匿名飞控的要求)
HEAD = 0xAA
D_ADDR = 0xFF
MSG_ID = 0x32 # 通用位置型传感器数据
DATA_LEN = 12 # 3个S32=12字节
INVALID_DATA = 0x80000000def calc_checksums(data_buf):"""双校验计算"""sumcheck = addcheck = 0for byte in data_buf:sumcheck = (sumcheck + byte) & 0xFFaddcheck = (addcheck + sumcheck) & 0xFFreturn sumcheck, addcheckdef odom_callback(msg):# 单位转换:m→mm,并处理无效值(S32范围检查)def convert_position(val):mm_val = int(round(val * 1000)) # m→mm转换if -2147483648 <= mm_val <= 2147483647:return mm_valreturn INVALID_DATA # 超出S32范围时标记无效pos_data = [convert_position(msg.pose.pose.position.x),convert_position(msg.pose.pose.position.y),convert_position(msg.pose.pose.position.z)]# 构建数据帧(小端序打包)frame_head = bytes([HEAD, D_ADDR, MSG_ID, DATA_LEN])frame_data = struct.pack('<3i', *pos_data) # 3个 S32结构frame = frame_head + frame_data# 计算校验(SC+AC)sumcheck, addcheck = calc_checksums(frame)frame += bytes([sumcheck, addcheck])# 发送完整协议帧ser.write(frame)# 调试输出(显示实际发送的毫米值)debug_info = " | ".join(f"{'X' if i==0 else 'Y' if i==1 else 'Z'}="f"{f'{val}mm' if val!=INVALID_DATA else 'INVALID'}"for i, val in enumerate(pos_data))rospy.loginfo(f"Sent ID:0x{MSG_ID:02X} Frame: {debug_info}")if __name__ == '__main__':# 初始化ROS节点rospy.init_node('position_sensor_protocol')# 串口配置ser = serial.Serial(port='/dev/ttyUSB0',baudrate=115200,bytesize=serial.EIGHTBITS,parity=serial.PARITY_NONE,stopbits=serial.STOPBITS_ONE,timeout=1)try:# 订阅Odometry话题rospy.Subscriber('/camera/odom/sample', Odometry, odom_callback)rospy.loginfo("Position sensor protocol transmitter started")rospy.spin()finally:ser.close()
在启动ROS节点之后,使用VSCode运行该代码,即可通过串口输出相应的数据,串口的相关参数也可以简单修改,通信格式也可以按照自己的需求修改。此处是按照凌霄飞控的通信协议写入指定参数使用的程序。
问题汇总:
问题描述:如何配置以上的功能(启动ros节点+订阅节点打开串口数据传输)的开机自启动?
在主目录下.bashrc文件中加入自启动命令,调试观察自启动现象
失败,提示权限不足或者环境错误
# 开机自启动T265
sleep 10 # 等待系统初始化
source /opt/ros/noetic/setup.bash
roslaunch realsense2_camera rs_t265.launch &
python3 /home/pi/t265.py # 修改为实际路径
始终没有办法进行开机自启动,发现是没有在启动时包含ros环境以及py依赖
报错:明确看到 t265.service
服务启动失败,报错 status=217/USER
。
这是典型的 用户权限或环境配置问题
自启动解决方案:
使用 systemd 服务,创建.service
sudo nano /etc/systemd/system/t265.service
1.检查脚本权限和路径
确认脚本的 所有权 和 执行权限:
ls -l /home/wheeltec/catkin_ws/t265/t265.py
确保用户是自己的用户名即可
2.补充 systemd 环境变量
编辑服务文件,显式加载所需环境变量(如 ROS、Python 虚拟环境、DISPLAY
等)
[Unit]
Description=T265 Python Program
After=network.target roscore.service # 如果依赖 ROS[Service]
Type=simple
User=wheeltec
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
Environment="PYTHONPATH=/home/wheeltec/catkin_ws/devel/lib/python3/dist-packages" # ROS Python 路径
Environment="DISPLAY=:0" # 如果脚本需要图形界面
ExecStart=/usr/bin/python3 /home/wheeltec/catkin_ws/t265/t265.py
Restart=on-failure
RestartSec=5s[Install]
WantedBy=multi-user.target
3. 重新加载并重启服务
sudo systemctl daemon-reload
sudo systemctl restart t265.service
sudo systemctl status t265.service # 检查状态
出现报错:
ModuleNotFoundError:No module named 'rospy'
1.手动加载 ROS 环境后运行 Python 测试
source /opt/ros/noetic/setup.bash # noetic
python3 -c "import rospy; print('rospy 导入成功')"
2. 修改 systemd 服务文件
[Unit]
Description=T265 ROS Node
After=network.target roscore.service[Service]
Type=simple
User=wheeltec
Environment="PYTHONPATH=/opt/ros/noetic/lib/python3/dist-packages" # 关键!
ExecStart=/bin/bash -c "source /opt/ros/noetic/setup.bash && /usr/bin/python3 /home/wheeltec/catkin_ws/t265/t265.py"
Restart=on-failure
RestartSec=5s[Install]
WantedBy=multi-user.target
3.重新加载并重启服务
sudo systemctl daemon-reload
sudo systemctl restart t265.service
sudo systemctl status t265.service # 检查状态
按照如上方式测试之后,可以实现自启动t265程序,并向串口发送位置数据。
问题描述:已跑通t265的ROS相关包,但是在读取参数时报错。
处理队列长度参数不对齐,导致无法启动
使用多种方法都无法找到对应参数:frame_queue_size,直接在服务器和终端中配置参数均失败……
尝试在rs_rtabmap.launch文件中修改参数,奈何其为只读文件缺少关键权限,使用指令强行写入:
sudo vim 文件名;i插入;;wq Enter;保存退出
问题解决!
再次启动ros查看T265的例程数据信息:
roslaunch realsense2_camera demo_t265.launch 可视化模型
调整queue size以适应响应速度和准度,同时兼顾效率和性能,在0-32之间。