前言
關于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之間。