第 4.4 节

MID360与TF联调

作者:董佳辉

MID360与TF联调

检查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插件看各个坐标系。

测试mid360

修改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相关参数就改好了。

测试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 不显示

联合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环境应基本不动有正确里程计/定位后,环境也应基本不动