跳到正文

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 環境應基本不動 有正確里程計/定位後,環境也應基本不動