☰
宇树Go2与Livox Mid360点云链路配置实战
2026/10/7 5:16:20 网站建设 项目流程

如果你手里正好有一台宇树机器狗Go2,又想让它像扫地机器人一样“看懂”周围环境,那Livox Mid360这颗雷达几乎是绕不开的选择。Go2原厂并没有这颗雷达,但它的扩展接口和ROS生态让改装并不复杂——前提是把数据链路彻底打通。这篇内容就是围绕“宇树Go2 + Livox Mid360 + ROS PointCloud”这条主线,把从零配置的完整过程拆开讲清楚,让你在拿到雷达后不至于卡在环境、驱动、TF这些基础环节上。无论你是想做三维建图、自主导航,还是单纯想把点云数据接进自己的算法,这篇都适用。

需要先说明一点,标题里的“仿真实战”我理解成两层:先在虚拟环境里把软件栈验证一遍,再在真机上跑通实时点云。但其实更推荐直接以真机为准,因为Mid360的点云特征、时间戳、网络行为和仿真器里的模拟数据差异很大,仿真里好看的不代表真机能用。所以我后面所有步骤都按“真机落地”这个目标来写,你在Gazebo等仿真环境里也能复用大部分流程。

1. 先搞清楚这条点云链路:从Go2到Livox Mid360再到ROS

1.1 为什么是Mid360,它和其他雷达有什么不一样

Mid360是Livox推出的一颗非重复扫描固态激光雷达,水平和垂直视场角分别是360度和70度(垂直方向-7度到+52度),最大量程40米(80%反射率下),精度正负3厘米。很多人第一眼看到它会被“固态”两个字误导,以为它像相机一样固定安装,其实它内部有个棱镜机构在“画圈”,点云并不是像传统机械雷达那样一圈一圈稳定扫出来,而是随着时间累积逐渐覆盖视野。这个特性带来的直接好处是:只要雷达不动,物体边缘在点云里的连续性会越扫越好;坏处是每一帧点云(10Hz左右)内部其实跨越了200毫秒的累积时间,点与点之间的时间基准不完全一致。

这个“非重复扫描”的特性直接决定了后续算法选型。如果你打算用Fast-LIO、Point-LIO这类紧耦合LiDAR惯性里程计,Mid360是很成熟的搭配;但如果你非要用比较传统的Cartographer 2D栅格建图,那必须先把点云压成2D LaserScan,否则算法会懵。所以配置点云之前,先想清楚点云最终要给谁用,这会决定你在外参标定、时间同步上要不要做额外功课。

1.2 点云链路里都有谁:硬件、驱动、中间层和可视化

从Go2到屏幕上出现的第一帧彩色点云,中间有四个环节:雷达硬件、雷达驱动、机器人状态驱动、可视化工具。

  • 雷达到电脑:Mid360通过网口接电脑,驱动livox_ros_driver2负责解析雷达UDP广播数据包,并发布成ROS2的sensor_msgs/PointCloud2话题。
  • Go2到电脑:宇树官方的unitree_ros2驱动负责连接Go2主控,发布/imu、关节状态、里程计等话题,同时把Go2的base、imu坐标系的TF关系广播出来。
  • 中间层:如果你要把点云和Go2车体做坐标对齐,需要提供一个从base_link到livox_frame的静态TF,这一层最容易漏,也是最常见的“点云在RViz2里乱飞”的元凶。
  • 可视化:用rviz2查看话题,确认PointCloud2能稳定刷新。

所以本质上,你要做的事就是:把两个驱动各自跑起来,再把它们之间的TF桥搭好。听起来简单,但每一步都有坑,下面按顺序说。

2. 环境准备:Ubuntu、ROS2与两个核心仓库

2.1 版本选型:Noetic还是Humble

这是新手第一个会纠结的问题。Go2出厂时预装的是Ubuntu 20.04 + ROS1 Noetic,很多老教程都是基于这个组合写的;但如果你用的是Go2 Edu或比较新的固件,官方已经提供了unitree_ros2仓库,支持Ubuntu 22.04 + ROS2 Humble。我实际用下来,建议直接上Humble,原因有三个:第一,livox_ros_driver2对ROS2的支持比ROS1积极得多,Humble下编译几乎不会踩雷;第二,ROS1已经进入维护末期,新算法和工具链都在ROS2上;第三,Go2本体驱动在Humble下已经足够稳定,没必要为了“老教程多”而留在Noetic。

当然,如果你的目标是跑一些只有ROS1版的项目,那也可以装双系统或者用Docker隔离环境。我不太建议在同一台机器上同时给ROS1和ROS2混装一堆包,环境变量串味儿之后排查成本非常高。一台开发机就专注一个ROS版本,是最省心的做法。

2.2 用fishros快速把ROS2 Humble配好

Ubuntu装ROS2最麻烦的就是一堆软件源、密钥、依赖的配置。很多人的教程里第一步就是sudo apt install一连串包,但实际执行时总是因为网络、源的问题卡住。这里我推荐直接用fishros一键安装脚本,社区里也叫“鱼香ROS”,它对Ubuntu 22.04 + Humble的支持很成熟,基本能在几分钟内把ROS2核心、编译工具、RViz2这些常用组件一口气装好。

wget http://fishros.com/install -O fishros && . fishros

执行后按提示选择ROS2 Humble版本,再选“安装ROS2完整版”或者“最小版+常用工具”都可以。装完记得新开一个终端验证:

ros2 --version

如果输出类似ros2 0.24.x的版本号,说明ROS2环境已经就绪。这里有个容易忽视的细节:fishros脚本会在~/.bashrc里写入一堆source命令,如果你自己后来又手动装了别的ROS版本,要注意别让两个版本的setup.bash互相覆盖。我在一台机器上曾经同时source了Noetic和Humble,结果话题类型老是报错,排查了半天才发现是环境变量打架。

2.3 拉取unitree_ros2与livox_ros_driver2并编译

环境装好后,创建工作空间。我习惯把Go2驱动和雷达驱动放在同一个工作空间里,但编译时分开构建,可以避免msg包生成顺序带来的烦人问题。

mkdir -p ~/go2_ws/src cd ~/go2_ws/src git clone https://github.com/unitreerobotics/unitree_ros2.git git clone https://github.com/Livox-SDK/livox_ros_driver2.git cd ~/go2_ws colcon build --symlink-install

如果直接一把梭colcon build,有一定概率会报Could not find a package configuration file provided by "livox_interfaces"这类错误,原因是livox驱动内部的msg接口还没有被先生成出来。这时候不要慌,按顺序分步编译就好:

source /opt/ros/humble/setup.bash cd ~/go2_ws colcon build --packages-select livox_interfaces livox_ros_driver2 source install/setup.bash colcon build --packages-select unitree_go2 unitree_api unitree_ros2 source install/setup.bash

这里有个实操心得:--symlink-install这个参数强烈建议带上,它会用符号链接方式安装Python和Launch文件,以后改launch不用重新编译,直接重启节点就能生效,对调试来说省下大量时间。

编译完记得把source ~/go2_ws/install/setup.bash加进~/.bashrc。如果你还单独建了别的workspace,注意source顺序,让后source的覆盖先source的,一般把Go2工作空间放最后。

3. 驱动配置与点云启动:外参、IP与launch文件

3.1 网络拓扑:Go2、电脑和雷达怎么接

这是整个配置过程里最容易被低估的一步。Go2机身自带网口,默认IP是192.168.123.161;Mid360雷达出厂默认IP是192.168.1.5。如果你的电脑只有单网口,直接插Go2,再想把雷达接上去就发现网段冲突了。我见过不少人在这一步卡住,以为是驱动没写对,其实纯粹是网络没通。

推荐有两种接法:

  • 方案A:电脑有双网口。一口接Go2(设置IP为192.168.123.162/24),另一口接Mid360(设置IP为192.168.1.100/24)。这种方式最稳,因为两个设备完全隔离,互不干扰。
  • 方案B:电脑只有一个网口,用一个千兆小交换机把Go2和Mid360都接到电脑上,同时给网口配置两个静态IP(一个123段、一个1段)。Linux下可以用ip addr add添加第二个IP,但要注意ROS2多播发现偶尔会串网卡,如果后面发现连不上话题,考虑把其中一个设备挪到独立网卡。

我自己用的是方案A,因为后续还要用网口转发图像流和点云数据,独立网卡在带宽和稳定性上都更可控。网卡配置完,先用ping 192.168.123.161和ping 192.168.1.5验证连通性,再往下面走。

3.2 修改雷达静态IP与驱动配置

如果不改IP,Mid360的默认网段(192.168.1.x)和Go2网段(192.168.123.x)是隔离的,每次都要折腾双IP太麻烦。建议直接用Livox Viewer(Windows软件)把雷达的静态IP改成192.168.123.15,和Go2保持同一网段。

具体操作很简单:把电脑网卡临时改成192.168.1.100/24,用Livox Viewer连接雷达,在设备列表里找到Mid360,进入设置页面,把静态IP改成192.168.123.15,子网掩码255.255.255.0,网关可以不填。保存后断电重启雷达,再把电脑网卡改回192.168.123.162/24,重新ping一下确认新IP生效。

IP改完后,启动livox驱动前要检查它的配置文件。配置文件在livox_ros_driver2/config/config_ROS2.json,重点看这几项:

{ "lidar_ip": "192.168.123.15", "topic_name": "/livox/lidar", "frame_id": "livox_frame", "time_sync_en": false }

这里有个细节值得展开:time_sync_en这个参数我建议先设为false。Mid360本身支持PTP等时间同步方式,但真机上往往没有额外的PTP主时钟,硬开容易导致点云时间戳跳动,反而让后续SLAM的IMU融合出问题。先用雷达内部时钟跑起来,验证链路通了再考虑精同步。

3.3 启动驱动并用RViz2验证PointCloud2

网络通了、配置改好了,就可以启动两个核心节点了。先启动Go2驱动:

ros2 launch unitree_go2 unitree_go2.launch.py

首次启动如果提示连接不上Go2,大概率是IP配置问题,检查一下电口IP。如果能看到/imu、/lf_leg等话题刷出来,说明Go2驱动正常。然后启动雷达驱动:

ros2 launch livox_ros_driver2 msg_Mid360.launch.py

等几秒钟,话题列表里应该出现/livox/lidar:

ros2 topic list | grep livox ros2 topic hz /livox/lidar

hz命令能看到PointCloud2话题发布频率,Mid360一般是10Hz左右。如果这里直接卡住没有话题,先别急着检查代码,重点排查网络:网线是否插紧、IP是否在同一网段、交换机是否千兆。雷达的点云数据量比较大,百兆交换机偶尔会丢包,如果点云在RViz2里断断续续,优先看网卡有没有大量丢包。

然后打开RViz2:

rviz2

点击左下角Add,选择By Topic,展开/livox/lidar,添加PointCloud2。这时候你大概率会看到两种情况:一种是什么都不显示,另一种是点云在原点附近疯狂旋转。这两种情况的根源基本都是Fixed Frame设错了。先用livox_frame作为Fixed Frame,应该能看到雷达原始点云;再切到base_link验证TF是否完整。如果你看到点云能显示但位置不对,说明外参还没配;这个我们下一节细说。

4. 坐标系、TF树与时间戳:点云能用和能建图之间的差距

4.1 让RViz2不再“闪”:把livox_frame挂到base_link下

很多人的点云链路在RViz2里看起来像“鬼畜”:点云一会儿在这边一会儿在那边,或者雷达转个方向点云就往反方向跑。这十有八九是TF树断了——Go2驱动发布了base_link到imu_link的TF,livox驱动发布了livox_frame这个单独的坐标系,但两者之间没有任何关系。RViz2在固定坐标系为base_link时找不到从base_link到livox_frame的变换,就会放弃显示或随机跳变。

最简单的临时办法是用tf2_ros发布一个静态TF。假设Mid360安装在Go2背部正上方、大致位于车体中心,先把三轴平移和旋转全部设成0来验证链路:

ros2 run tf2_ros static_transform_publisher 0 0 0 0 0 0 base_link livox_frame

如果点云立刻稳定显示在车体中心,说明TF通了。接下来再根据雷达的实际安装位置,把平移和旋转值填进去。一个很重要的实操提醒:Mid360如果装在Go2头部,点云会随着狗头转动而整体旋转,在RViz2里看起来“狗一动点云就满天飞”,而且建图时地图会扭曲。所以强烈建议把它固定在背部、四肢上方这个相对稳定的结构件上。先别急着精标,用直尺测量一下安装偏差(通常也就是几厘米、几个度级别),把平移旋转量写进这个静态TF命令里即可。对于一般导航任务,手工测量精度足够用;如果要跑紧耦合SLAM,再去做手眼标定。

4.2 Mid360的时间戳延迟怎么办

点云显示出来只是第一步,真正做SLAM时你会发现一个绕不开的问题:Mid360的每一帧PointCloud2,内部其实包含了跨越约200毫秒的点,而IMU话题的时间戳是实时的。如果你把这两个话题不做任何处理直接喂给LIO算法,会出现点云拖影,车一转弯地图就开始“甩尾”。

两个解决办法。第一种,在驱动侧不开时间同步,但在算法侧用message_filters做近似时间同步,把约10Hz的点云和约200Hz~400Hz的IMU按时间戳对齐;第二种,对点云时间戳做固定延迟补偿,先通过实验测出一个稳定偏移量,再在算法输入前统一加上。我实测下来Mid360在没有PTP同步时,点云时间戳和IMU时间戳之间会有一个相对固定的偏差,跑一段路后用日志反推偏移量,补偿后效果立竿见影。不过这个偏移会受网卡、CPU负载影响,严谨起见还是要做硬件同步或者用驱动里的时间同步功能。

4.3 从PointCloud2走向导航:点云转2D LaserScan

如果你的目标不是三维建图,而是让Go2在室内环境下做2D导航,那一堆3D点云对move_base来说过于复杂。常见的做法是把PointCloud2投影成2D LaserScan,用pointcloud_to_laserscan这个包就能实现。安装依赖后写一个launch,把/livox/lidar作为输入,限高把雷达上方(比如高于0.3米)和下方的点滤掉,输出/scan话题。转成LaserScan之后,你可以无缝接入Cartographer、move_base、AMCL这些经典2D导航栈。这一步做完,Go2才能算是真正“能走”的机器人。

一个细节:Mid360垂直视场有70度,安装角度稍微倾斜一点,地面点就会大量混进点云。做投影前先做个简单的直通滤波,只保留z在-0.1米到0.2米之间的点(假设雷达距地面约0.3米),能省掉很多后续调参的麻烦。

5. 常见问题与排查速查表

5.1 经典故障自查清单

我把实操中遇到的典型问题整理成一张表,按“现象→原因→解决方案”来看,很多坑其实一句话就能点醒。

现象常见原因解决办法
启动雷达launch后无话题电脑和Mid360不在同一网段ping 192.168.123.15,检查网卡IP和掩码
RViz2里点云不显示Fixed Frame错误或TF缺失先用livox_frame验证,再加base_link → livox_frame静态TF
点云频繁跳动/闪烁TF树不完整或外参错误确认ros2 run tf2_ros static_transform_publisher是否正确开启
Go2驱动连不上主控电脑IP不是192.168.123.x设置静态IP192.168.123.162/24
点云延时空转Mid360非重复扫描帧内累积时间做时间同步或用近似时间同步器
点云在RViz2里“断片”网卡丢包或交换机百兆检查ifconfig的RX errors,换千兆环境
编译时报livox_interfaces缺失包构建顺序问题colcon build --packages-select livox_interfaces livox_ros_driver2
修改雷达IP后找不到设备电脑网卡还留在旧网段把电脑IP同步改成新网段后再搜索

这里特别说一下“点云延时空转”这个问题,它不是bug,而是Mid360的工作方式决定的。第一次看到点云时以为驱动坏了,其实只要记住“点云是累加出来的,不是瞬间帧”这个概念,很多疑惑都会迎刃而解。

5.2 几个容易忽略但很要命的细节

  • Go2主控的网口速率问题:Go2机身自带网口规格有限,如果你同时通过这个口转发图像、点云和遥控协议,速率吃紧时驱动会偶发断连。实测下来把雷达单独接一路网卡,比什么都省心。
  • 雷达供电:Mid360需要稳定的12V供电,直接从Go2扩展口取电时,如果电流不够或者电压波动,点云会出现周期性“抽风”,表现为主机完全正常、话题频率正常,但点云内容每隔几秒跳一下。我遇到过几次,最后确认是供电模块质量不行,换了个独立稳压电源就稳定了。
  • 多个ROS2工作空间source顺序:如果~/.bashrc里source了好几个setup.bash,顺序反了会导致里面的msg类型对不上。编译完一个工作空间后重新开终端,确认ros2 interface list里能看到livox_interfaces相关的类型。
  • 天线/遥控干扰:Mid360的点云在Go2开机、遥控器频繁操作时偶尔出现抖动,排查后是无线模块的射频干扰导致网卡丢包。有条件的话把雷达网线和供电线与电机驱动线束分开走,别捆在一起。
  • 代码层面的坑:livox驱动默认发布的PointCloud2的is_dense字段可能为false,有些SLAM库读取时不会处理NaN点,需要自己做一次滤波。别小看这一步,跑FAST-LIO时如果点云里混了无效点,优化器可能直接发散。

结尾

这套Go2 + Livox Mid360的ROS PointCloud链路,我前前后后折腾了两天,其中一半时间花在“网络不通还以为是代码写错”这种低级问题上。现在回头看,真正让整套系统稳定跑起来的关键就三件事:先把网络拓扑理清楚,再把TF树搭完整,最后别忽略时间戳和非重复扫描带来的数据特性。当你第一次在RViz2里看到Go2周围被一圈彩色的点云包围时,那种感觉还是挺值的。如果你也是刚拿到Mid360准备往Go2上装,建议先别急着追求完美的外参标定,一切从“能让点云稳定刷出来”开始,链路通了再逐步加码。后面有时间我再单独写一篇关于Go2 + Mid360跑Fast-LIO建图的实践,感兴趣的可以先按这篇文章把点云基础打好。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询