ROS2 串列埠讀取教學
在 Ubuntu 20.04 與 ROS2 Foxy 下,把 ANROT 串列資料轉成標準 IMU topic 的最小公開流程。
- ros2
- ubuntu
- cplusplus
- tutorial
ROS2 Foxy 串列埠範例
協議支援
| 協議 / frame | 支援狀態 | 這份 example 的處理方式 |
|---|---|---|
0x91 IMUSOL | 支援 | 發布 /Imu_data (sensor_msgs/msg/Imu)。 |
0x62 GWSOL | 只解析、不發布 | ch_serial 有 0x62 case,但 ROS2 node 遇到 KItemGWSOL 不發布 topic。 |
0x63 GWSOL Compact | 不支援 | 沒有 compact gateway decoder。 |
0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xD1, 0xF0 | 部分支援 | parser 可解析鬆散欄位;主節點以單機 /Imu_data 輸出,pressure 不進入標準 IMU topic。 |
這份範例在 Ubuntu 20.04 + ROS2 Foxy 下讀取 ANROT 串列資料,並發布成 ROS2 標準 sensor_msgs/msg/Imu topic,適合先接進 ROS2 pipeline 做姿態資料驗證。
下載範例
瀏覽器下載並解壓縮: demo-ros2-en.zip
主要結構:
demo_ros2/
└── serial_imu_ws/
└── src/
└── serial_imu/
├── launch/imu_spec_msg.launch.py
├── src/serial_port.cpp
└── src/ch_serial.c / ch_serial.h
1. 確認串列埠
插入產品後確認新增的裝置名稱:
ls /dev/ttyUSB*
若需要臨時開啟權限:
sudo chmod 666 /dev/ttyUSB0
長期使用建議把帳號加入 dialout 群組。
2. 編譯 workspace
cd demo_ros2/serial_imu_ws
source /opt/ros/foxy/setup.bash
colcon build
source install/setup.bash
成功時會看到:
Starting >>> serial_imu
Finished <<< serial_imu
Summary: 1 package finished
3. 修改串列埠與波特率
範例預設讀取 /dev/ttyUSB0,baud rate 為 115200。若需要修改,請編輯 src/serial_imu/src/serial_port.cpp:
#define IMU_SERIAL ("/dev/ttyUSB0")
#define BAUD (B115200)
修改後重新執行:
colcon build
source install/setup.bash
4. 啟動節點
ros2 launch serial_imu imu_spec_msg.launch.py
成功後節點會發布 /Imu_data,內容為 sensor_msgs/msg/Imu。
header:
stamp:
secs: 1639099575
nanosecs: 538349240
frame_id: base_link
orientation:
x: -0.095125
y: -0.483649
z: 0.053130
w: 0.868454
angular_velocity:
x: -0.000816
y: -0.001057
z: 0.001062
linear_acceleration:
x: 8.110356
y: -2.125157
z: 5.013054
另開一個終端可檢查發布頻率:
source /opt/ros/foxy/setup.bash
source demo_ros2/serial_imu_ws/install/setup.bash
ros2 topic hz /Imu_data
常見問題
launch 找不到 package
請確認目前終端已執行:
source /opt/ros/foxy/setup.bash
source install/setup.bash
沒有 topic 或頻率為 0
確認 /dev/ttyUSB0 是否正確、權限是否足夠、波特率是否與產品端一致。
多個 USB 裝置導致 port 變動
可用 udev rule 建立固定 symlink,例如 /dev/anrot_imu,再把 IMU_SERIAL 改成該名稱。