跳到正文

Wiki

MID360與TF聯調

約 8 分鐘閱讀

本文由簡體中文內容確定性轉換,並受版本化術語表保護。

1.MID360與TF聯調

1.1.檢查TF的生成情況

啟動robot_description,裡面有joint_state_publisher,robot_state_publisher,RViz2:

source install/setup.bash
ros2 launch robot_description robot_description_launch.py \
  robot_name:=reality_robot \
  use_sim_time:=false \
  use_rviz:=true

這裡需要顯式設定 robot_name:=reality_robot,因為描述包自身的預設入口仍是 default_value="simulation_robot"。 然後use_rviz預設就是true,可以不加。

啟動序列埠程式釋出/serial/gimbal_joint_state

source install/setup.bash
ros2 launch serial_comm serial_comm.launch.py
  1. chassis → gimbal_yaw(唯一實際yaw)
ros2 run tf2_ros tf2_echo chassis gimbal_yaw

手動往左轉雲臺:

如果定義正確,你應該看到 yaw 從:0 → 正值

向左90度:

向右90度:

  1. chassis → front_mid360
ros2 run tf2_ros tf2_echo chassis front_mid360

它應該同步跟著轉。

向左90度:

向右90度:

再抬頭/低頭時,不應該跟 pitch 改變

  1. gimbal_yaw → gimbal_pitch(實際pitch)
ros2 run tf2_ros tf2_echo gimbal_yaw gimbal_pitch

接近水平:

抬頭:

低頭:

應該隨 joint_pitch 變化。

直接在rviz2裡進行測試也是一樣的,在rviz2裡開啟TF外掛看各個座標系。

1.2.測試mid360

1.2.1.修改mid360相關配置檔案

sudo apt update
sudo apt install -y iproute2 iputils-ping arp-scan

首先你得知道宿主機的ip地址:

ip addr

得知宿主機拿到的ip地址是192.168.1.50:

然後你得知道mid360的ip地址:

掃描一下:

arp-scan --interface=enp3s0 192.168.1.0/24
# 或者
arp-scan --interface=enp3s0 --localnet

如下圖,掃出來是192.168.1.107:

可以ping一下:ping 192.168.1.107

專案裡至少有兩份 Mid360 配置,建議都改掉,避免以後單獨啟動驅動和整套 reality launch 用到不同 IP:

# 单独测试mid360的launch的配置(和导航无关)
src/pb2025_sentry_nav/livox_ros_driver2/config/MID360_config.json

# 集成于导航里的mid360真实的配置
src/pb2025_sentry_nav/pb2025_nav_bringup/config/reality/mid360_user_config.json

把下面這些

"ip": "192.168.1.146"

"cmd_data_ip": "192.168.1.50",
"push_msg_ip": "192.168.1.50",
"point_data_ip": "192.168.1.50",
"imu_data_ip": "192.168.1.50"

改為

"ip": "192.168.1.107"

"cmd_data_ip": "192.168.1.50",
"push_msg_ip": "192.168.1.50",
"point_data_ip": "192.168.1.50",
"imu_data_ip": "192.168.1.50"

最終:

Mid360
192.168.1.107
        ↕
工控机 enp3s0
192.168.1.50

現在為了單獨測試 Mid360,而/src/pb2025_sentry_nav/livox_ros_driver2/launch/msg_MID360_launch.py和實車程式碼reality/nav2_params.yaml不一樣,所以建議改一下,測試更好測試一下。

然後把msg_MID360_launch.py裡的:

publish_freq = 10.0
frame_id = 'livox_frame'

改成

publish_freq = 20.0
frame_id = 'front_mid360'

如此,我們的:

# 单独测试mid360
ros2 launch livox_ros_driver2 msg_MID360_launch.py
# 导航
ros2 launch pb2025_nav_bringup rm_navigation_reality_launch.py

這倆的mid360相關引數就改好了。

1.2.2.測試mid360是否正常開啟

修改完畢就可以:

source install/setup.bash
ros2 launch livox_ros_driver2 msg_MID360_launch.py

進行測試。

檢視mid360話題是否釋出了

ros2 topic list | grep livox
/livox/lidar
/livox/lidar/pointcloud
/livox/imu

然後檢視雷達和imu的頻率:

source install/setup.bash
ros2 topic hz /livox/lidar
ros2 topic hz /livox/imu
ros2 topic hz /livox/lidar/pointcloud

可以在電腦和工控機上都試一下,工控機全顯示就沒啥問題,電腦有不顯示的可能是資料包大小的問題,但DDS一般沒問題。

lidar和pointcloud應該是20hz,而imu是200hz。

比如說ros2 topic hz /livox/lidar可能在電腦上一直不顯示,但在工控機上顯示,則輸入下面這倆命令在電腦上:

ros2 topic echo /livox/lidar --once --field point_num
ros2 topic echo /livox/lidar --once --field timebase

如果這兩個能出來,就說明: /livox/lidar 實際上也能跨機器收到,只是 ros2 topic hz 這條 CLI 在你這個 CustomMsg 上表現不正常。

再確認點雲 frame:

ros2 topic echo /livox/lidar/pointcloud --once

確認下frame是咱們設定的frame_id: front_mid360。

然後開啟一個rviz2:

rviz2

然後在rviz2裡把Fixed Frame = front_mid360修改好。 然後在rviz2裡點By Topic,然後選擇/livox/lidar/pointcloud。

先確認能看到正常環境點雲。

如果都正常,那麼mid360就正常開啟了。

出現問題,雷達的hz特別的小:

這個現象很像不是 Mid360 真掉到 3 Hz,而是 RELIABLE 大點雲被遠端訂閱者拖慢了。 這版驅動的 /livox/lidar/pointcloud publisher 是預設 QoS,也就是你前面看到的那種 RELIABLE。一幀約 257 KB,20 Hz 單獨 PointCloud2 就約 41 Mb/s。ROS 2 的 DDS/QoS 本身支援不同可靠性策略;對這類高頻感測器資料,讓顯示/除錯端用“允許丟舊幀、優先拿最新幀”的方式通常更合適。ROS Documentation 而且一個慢的遠端 RELIABLE reader,可能讓 writer 做重傳、排隊甚至產生反壓。於是你會看到一個很反直覺的現象

电脑/RViz 收得慢
       ↓
RELIABLE 重传/积压
       ↓
工控机 publisher 也被拖住
       ↓
连工控机本地 ros2 topic hz 看起来都只剩 3 Hz

解決方案:

詳見ROS 2 遠端檢視 MID360 點雲導致降頻、延遲和 RViz 不顯示

1.2.3.聯合TF測試下是否整套是否成功

總體框架就是:

  • livox_ros_driver2和 serial_comm 由工控機開啟。
  • robot_state_publisher 由電腦或者工控機開啟。
                    工控机
STM32
  ↓
serial_comm
  ↓
/serial/gimbal_joint_state
             │
             │ DDS
             ▼
                    电脑
joint_state_publisher
  ↓
/joint_states
  ↓
robot_state_publisher
  ↓
TF
chassis → gimbal_yaw_odom → front_mid360


Mid360
  ↓ Ethernet
livox_ros_driver2        (工控机)
  ↓
/livox/lidar
/livox/lidar/pointcloud
/livox/imu
             │
             │ DDS
             ▼
           RViz          (电脑)

工控機:

source install/setup.bash
ros2 launch livox_ros_driver2 msg_MID360_launch.py
source install/setup.bash
ros2 launch serial_comm serial_comm.launch.py

電腦:

source install/setup.bash
ros2 launch robot_description robot_description_launch.py \
  robot_name:=reality_robot \
  use_sim_time:=false \
  use_rviz:=true

RViz 的 Fixed Frame 理解成 “我站在哪個座標系裡看整個世界?” 而點雲座標系是frame_id = front_mid360, 也就是說,每一幀原始點雲都是“以雷達自身為原點”描述的。

RViz Fixed Frame 你轉雲臺 yaw 時 你整車移動時
front_mid360 環境點雲會動/轉 環境也會動
chassis 環境應基本不動 環境會動
odom / map 環境應基本不動 有正確里程計/定位後,環境也應基本不動