ANROT 教學文件

ROS2 串列埠讀取教學

在 Ubuntu 20.04 與 ROS2 Foxy 下,把 ANROT 串列資料轉成標準 IMU topic 的最小公開流程。

最後更新 2025年1月1日 對應產品 6
  • ros2
  • ubuntu
  • cplusplus
  • tutorial

ROS2 Foxy 串列埠範例

協議支援

協議 / frame支援狀態這份 example 的處理方式
0x91 IMUSOL支援發布 /Imu_data (sensor_msgs/msg/Imu)。
0x62 GWSOL只解析、不發布ch_serial0x62 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 改成該名稱。