☰
宇树Go2四足机器人SLAM开发:Livox Mid360与Velodyne VLP16激光雷达点云建图实战
2026/10/6 11:26:04 网站建设 项目流程

1. 项目背景与核心需求拆解

宇树Go2这台四足机器狗,出厂自带的感知方案基本够用,但一旦你想做点正经的SLAM研究或者二次开发,原厂那套闭源的东西就不太够看了。我接手这个项目的出发点很直接:把Go2变成一个开放的SLAM实验平台,用Livox Mid360和Velodyne VLP16两种激光雷达分别跑通点云数据采集和建图流程,最终服务于自主导航和算法验证。

为什么选这两种雷达?Mid360是非重复扫描的代表,性价比高、体积小、重量轻,特别适合Go2这种对负载敏感的移动平台;VLP16则是机械旋转式雷达的经典款,16线、360度水平视场,点云规整、驱动成熟,是很多SLAM算法的默认输入格式。把这两种雷达都在Go2上跑通,等于同时覆盖了非重复扫描和机械旋转两大技术路线,后续换算法、换场景都不至于被硬件卡脖子。

这个项目适合谁?如果你手里有Go2,想用它做激光SLAM建图、自主导航、多传感器融合,或者单纯想把点云数据接出来自己玩,那这篇内容就是给你写的。不需要你是SLAM专家,但至少得懂Linux基础操作、ROS的基本概念,知道什么是话题、什么是TF变换。完全零基础的话,建议先补一下ROS入门,不然中间很多步骤会卡住。

核心需求其实就三个:第一,把雷达物理固定到Go2上,保证供电和数据传输稳定;第二,在ROS环境下把雷达驱动跑起来,拿到干净的点云数据;第三,验证点云质量,确保后续SLAM算法能正常吃进去。这三个需求看起来简单,但每一步都有坑,下面我按实际操作的顺序,把整个流程拆开讲。

2. 硬件选型与安装方案设计

2.1 两种雷达的特性对比与适用场景

Mid360和VLP16虽然都是激光雷达,但工作原理和输出特性差别很大,选哪个取决于你的具体任务。Mid360采用非重复扫描方式,视场角水平360度、垂直-7度到52度,等效线数会随着积分时间增加而提升,近距离点云密度非常高,但远距离点云会稀疏一些。VLP16是传统的16线机械旋转雷达,水平360度、垂直-15度到15度,每帧固定16线,点云分布均匀,远距离表现更稳定。

对比项Livox Mid360Velodyne VLP16
扫描方式非重复扫描机械旋转
水平视场360度360度
垂直视场-7度到52度-15度到15度
点云特性近密远疏,随积分时间变化均匀16线,每帧固定
重量约265克约830克
供电9-27V9-18V
数据接口以太网以太网
适用场景近距离建图、避障、室内远距离建图、室外、自动驾驶

从Go2的负载能力来看,Mid360明显更友好,265克的重量几乎不影响机器狗的运动性能。VLP16加上支架和线缆接近1公斤,装在Go2背上会让重心偏高,快速行走或上下坡时稳定性会打折扣。但VLP16的点云格式是很多开源SLAM算法(比如LeGO-LOAM、LIO-SAM)的默认输入,省去了格式转换的麻烦。

我的建议是:如果你主要做室内建图和避障,优先用Mid360;如果要做室外大场景建图,或者想直接跑现成的SLAM方案,VLP16更省事。当然,两个都上也不是不行,但Go2的算力和供电需要提前评估。

2.2 机械安装与供电方案

安装位置直接影响到点云质量和机器狗的运动平衡。Mid360我建议装在Go2背部靠近头部的位置,用3D打印的支架固定,高度尽量低,减少对机器狗重心的影响。VLP16因为体积大,只能装在背部中央,但要注意线缆的走线,避免机器狗运动时拉扯接口。

供电是第一个大坑。Go2自带的电池输出是24V左右,Mid360支持9-27V输入,可以直接从Go2的电源接口取电,但需要做一个降压模块把24V降到12V左右,因为Mid360虽然标称支持27V,但长期跑在24V以上发热会比较明显。VLP16的输入范围是9-18V,必须降压到12V,直接接24V会烧掉。我用的是一款宽压输入、12V/5A输出的DC-DC降压模块,体积小、效率高,固定在支架下方。

注意:Go2的电源接口定义和普通无人机不太一样,动手前务必用万用表确认正负极和电压,接反了雷达直接报废。我第一次做的时候没确认,差点把Mid360烧了,后来养成了先量电压再接线的习惯。

数据线方面,两种雷达都是以太网接口,但Go2内部没有多余的网口,需要把网线从雷达引到Go2的算力模块上。我用的是超六类屏蔽网线,自己压的水晶头,长度控制在30厘米以内,减少信号衰减。如果走线太长,建议用工业级网线或者加一个网络交换机。

2.3 算力平台与软件环境规划

Go2自带的算力模块性能有限,跑SLAM算法比较吃力。我的方案是外挂一台NUC或者Jetson Orin NX,通过网线连接雷达,USB或者串口连接Go2的运动控制接口。这样雷达驱动和SLAM算法都跑在外挂算力上,Go2只负责运动,分工明确。

软件环境统一用Ubuntu 20.04 + ROS Noetic,这是目前最稳定的组合,两种雷达的驱动都有现成的ROS包。如果你用Ubuntu 22.04 + ROS2 Humble,驱动也能跑,但很多SLAM算法还是ROS1的生态更成熟,新手建议从ROS1开始。

网络配置是第二个大坑。Mid360和VLP16的默认IP地址不一样,Mid360是192.168.1.1xx网段,VLP16是192.168.1.201。外挂算力的网卡需要配置成同一网段的静态IP,否则雷达和电脑根本通信不了。我建议给雷达单独配一个USB网卡,专门用于雷达通信,不要和Go2的控制网络混在一起,避免IP冲突。

3. 雷达驱动配置与点云数据获取

3.1 Livox Mid360驱动安装与配置

Mid360的驱动安装相对简单,Livox官方提供了ROS版本的SDK。首先从Livox的GitHub仓库下载livox_ros_driver2,注意要选对分支,ROS1用master分支,ROS2用ros2分支。下载后放到工作空间的src目录下,用catkin_make编译。

编译之前需要修改配置文件,主要是雷达的IP地址和主机IP地址。在livox_ros_driver2/config目录下找到MID360_config.json,把lidar_configs里的ip改成雷达的实际IP,host_net_info里的host_ip改成外挂算力网卡的IP。这一步如果填错,驱动启动后会一直报“no data”错误。

# 编译livox_ros_driver2 cd ~/catkin_ws catkin_make source devel/setup.bash # 启动Mid360驱动 roslaunch livox_ros_driver2 msg_MID360.launch

启动成功后,用rostopic list应该能看到/livox/lidar和/livox/imu两个话题。点云数据在/livox/lidar上,格式是livox_ros_driver2/CustomMsg,不是标准的sensor_msgs/PointCloud2。如果要给SLAM算法用,需要写一个转换节点,把CustomMsg转成PointCloud2。Livox官方提供了一个转换脚本,但我觉得自己写一个更灵活,可以顺便做点云滤波和降采样。

实操心得:Mid360的点云数据量很大,一帧可能有几万个点,直接转PointCloud2会占用大量带宽。我一般会在转换节点里加一个体素滤波,把点云降采样到0.1米的分辨率,数据量减少70%以上,SLAM算法跑起来更流畅。

3.2 Velodyne VLP16驱动安装与配置

VLP16的驱动更成熟,ROS包是velodyne_pointcloud,直接apt安装或者源码编译都行。我习惯用源码编译,方便改参数。安装完成后,需要修改launch文件里的雷达IP和端口号。VLP16默认IP是192.168.1.201,数据端口是2368,位置端口是8308。

# 安装velodyne驱动 sudo apt-get install ros-noetic-velodyne # 启动VLP16驱动 roslaunch velodyne_pointcloud VLP16_points.launch

启动后,/velodyne_points话题上就是标准的sensor_msgs/PointCloud2格式,直接就能给SLAM算法用。VLP16的点云比较规整,每帧大约3万个点,数据量比Mid360小,但远距离点云更稳定。

VLP16有一个需要注意的地方:雷达的转速会影响点云密度。默认转速是600RPM,也就是每秒10帧,每帧360度。如果降到300RPM,每秒5帧,但每帧的点云密度翻倍。做建图的时候,我一般用600RPM,保证帧率;做精细扫描的时候,降到300RPM,提高点云质量。

3.3 点云数据可视化与质量检查

驱动跑起来之后,第一件事是用RViz看點云。Mid360的点云在RViz里需要把Fixed Frame设成livox_frame,VLP16设成velodyne。如果点云显示不出来,先检查TF变换有没有发出来,再用rostopic hz看一下话题有没有数据。

点云质量检查主要看三个方面:一是点云有没有明显的缺失或者畸变,二是点云的密度是否均匀,三是远距离点云是否稳定。Mid360在近距离(5米以内)点云非常密,但10米以外会明显稀疏;VLP16在20米以内点云都比较均匀,但垂直分辨率只有16线,地面和天空的点云会有分层。

我一般会用pcl_ros的工具做点云统计,比如计算点云的平均密度、最大距离、噪声点比例。如果噪声点太多,可以在驱动里加一个距离滤波,把太近和太远的点去掉。Mid360的最小探测距离是0.1米,VLP16是0.5米,太近的点往往是噪声,直接滤掉。

注意:RViz显示点云非常吃显卡,如果点云卡顿,可以把Decay Time调小,或者用PointCloud2的降采样显示。我刚开始用RViz的时候,点云一卡就以为驱动有问题,后来发现是显卡跟不上,换了个带独显的NUC就流畅了。

4. 点云数据后处理与SLAM建图验证

4.1 点云格式转换与预处理

Mid360的CustomMsg格式虽然包含了更多信息(比如每个点的反射率、标签),但大多数SLAM算法只认PointCloud2。转换的时候要注意,CustomMsg的时间戳是每个点独立的,转成PointCloud2后要保留这个信息,否则运动畸变校正会出问题。

我写了一个转换节点,核心逻辑是遍历CustomMsg的每个点,把x、y、z、intensity填到PointCloud2里,同时把每个点的时间偏移存到单独的通道里。这样SLAM算法在做去畸变的时候,可以根据每个点的时间戳做插值,精度比统一时间戳高很多。

预处理还包括降采样和滤波。降采样用体素滤波,分辨率设0.1米,既能保留细节又能减少数据量。滤波用直通滤波,把z轴方向太高和太低的点去掉,比如Go2身高0.4米,雷达装在0.5米高度,那z轴小于-0.5米和大于1米的点基本是地面反射或者天花板,直接滤掉。

4.2 基于LIO-SAM的建图实测

LIO-SAM是目前最流行的激光惯性SLAM算法之一,支持Mid360和VLP16。它的核心思想是用激光雷达做特征匹配,用IMU做运动先验,两者紧耦合,建图精度很高。我用Go2 + Mid360跑LIO-SAM,在室内走廊里建了一圈,回环检测很准,地图没有明显的重影。

配置LIO-SAM的时候,需要改params.yaml里的几个关键参数。雷达话题改成转换后的PointCloud2话题,IMU话题改成/livox/imu,点云降采样分辨率设0.2米,特征提取的曲率阈值设0.1。这些参数需要根据实际场景调,室内场景点云密,分辨率可以设小一点;室外场景点云稀,分辨率要设大一点。

VLP16跑LIO-SAM更简单,因为点云格式直接兼容,只需要改话题名和IMU话题。但VLP16没有内置IMU,需要外接一个,我用的是Go2自带的IMU,通过串口读出来,发布成sensor_msgs/Imu话题。Go2的IMU频率是200Hz,比雷达的10Hz高很多,正好可以做运动先验。

实操心得:LIO-SAM对IMU的噪声很敏感,如果IMU数据抖动大,建图会漂移。我建议先对IMU做校准,把零偏和噪声方差标定出来,填到params.yaml里。Go2的IMU出厂校准一般,我重新标定后,建图精度提升很明显。

4.3 建图效果对比与参数调优

Mid360和VLP16在同一个场景下建图,效果差异挺明显的。Mid360在近距离(10米以内)的建图细节更丰富,墙角、门框这些特征都能清晰还原;VLP16在远距离(20米以上)的建图更稳定,走廊尽头不会出现点云稀疏导致的断裂。

对比项Mid360建图效果VLP16建图效果
近距离细节丰富,特征清晰一般,有分层
远距离稳定性一般,点云稀疏稳定,点云均匀
回环检测准确,但依赖近距离特征准确,远距离特征也能用
建图帧率10Hz,数据量大10Hz,数据量适中
适用场景室内、近距离室内外、远距离

参数调优方面,Mid360的积分时间很关键。默认积分时间是100ms,点云密度和帧率平衡得比较好。如果场景运动快,可以降到50ms,减少运动畸变;如果场景静止,可以升到200ms,提高点云密度。VLP16的转速和帧率是绑定的,调转速就是调帧率,建图一般用600RPM。

5. 常见问题排查与避坑指南

5.1 驱动启动失败与网络配置问题

驱动启动失败最常见的原因是网络配置不对。Mid360和VLP16都要求电脑和雷达在同一网段,如果电脑有多个网卡,要确保雷达连接的那个网卡IP是静态的,而且和雷达同网段。我遇到过电脑同时连WiFi和网线,结果雷达数据发到了WiFi网卡上,驱动一直收不到数据。解决办法是禁用WiFi,或者用route命令指定路由。

另一个常见问题是防火墙。Ubuntu默认的ufw防火墙会拦截雷达的UDP数据包,导致驱动收不到数据。我一般直接关掉防火墙,或者加一条规则允许雷达端口的UDP流量。Mid360用的是UDP 55000端口,VLP16用的是UDP 2368和8308端口。

# 关闭防火墙 sudo ufw disable # 或者允许特定端口 sudo ufw allow 55000/udp sudo ufw allow 2368/udp sudo ufw allow 8308/udp

5.2 点云数据异常与排查思路

点云异常主要有几种表现:点云缺失、点云畸变、点云噪声大。点云缺失一般是数据丢包,检查网线质量和网络带宽,Mid360的数据量大约20Mbps,VLP16大约10Mbps,百兆网卡够用,但如果是USB网卡,要注意USB带宽是否足够。

点云畸变一般是时间戳不对,Mid360的每个点都有独立时间戳,如果转换的时候丢了,运动畸变校正就会出错。VLP16的每帧点云有一个统一时间戳,但雷达旋转过程中机器狗在运动,也会产生畸变,需要用IMU数据做去畸变。

点云噪声大一般是环境干扰,比如阳光直射、玻璃反射、雨雪天气。Mid360对阳光比较敏感,室外强光下噪声会明显增加;VLP16对雨雪敏感,雨滴会被当成点云。这些场景下,要么加滤波,要么换雷达。

5.3 建图漂移与回环检测失败

建图漂移是SLAM最常见的问题,原因很多:IMU噪声大、点云特征少、运动过快、回环检测失败。我的排查顺序是:先看IMU数据是否正常,再看点云特征是否足够,最后看回环检测有没有触发。

IMU噪声大的话,重新标定,把零偏和噪声方差填到配置文件里。点云特征少的话,换场景或者加人工标记,比如在走廊里放几个纸箱,增加特征点。运动过快的话,降低机器狗的速度,或者提高雷达帧率。回环检测失败的话,调回环检测的参数,比如降低回环检测的最小距离,或者提高回环检测的搜索半径。

避坑技巧:建图的时候,尽量让机器狗走“8”字形或者回环路线,这样回环检测更容易触发。我一开始走直线,建图漂移很严重,后来走“8”字形,回环检测一触发,地图就闭合了,精度提升非常明显。

5.4 常见问题速查表

问题现象可能原因排查方法解决方案
驱动启动后无数据网络配置错误检查IP和网段配置静态IP,禁用其他网卡
点云缺失数据丢包检查网线和带宽换屏蔽网线,减少线缆长度
点云畸变时间戳丢失检查转换节点保留每个点的时间戳
点云噪声大环境干扰检查场景加滤波,或换雷达
建图漂移IMU噪声大检查IMU数据重新标定IMU
回环检测失败特征少或参数不对检查点云特征调参数,走回环路线

6. 个人实操体会与后续扩展方向

这套方案我前前后后调了大概两周,中间踩了不少坑,也积累了一些文档里不会写的经验。Mid360的驱动虽然官方支持ROS,但配置文件里的IP地址一定要反复确认,我因为IP填错,折腾了一整天。VLP16的驱动更成熟,但转速和帧率的权衡需要根据场景调,不是默认值就最好。

点云数据拿到之后,不要急着跑SLAM,先用RViz仔细看一遍,确认点云质量没问题。我见过很多人驱动跑通了就直接上SLAM,结果建图效果差,回头排查发现是点云本身就有问题。点云质量检查这一步,花十分钟,能省后面十个小时的调试时间。

后续扩展的话,可以往多雷达融合方向走。Mid360和VLP16的点云特性互补,一个近密远疏,一个均匀分布,融合之后建图效果会更好。融合的方法可以用简单的点云拼接,也可以用卡尔曼滤波做状态估计。另外,Go2的运动控制接口是开放的,可以把SLAM建图的结果直接喂给导航模块,实现自主导航,这才是这套方案的最终目标。

最后分享一个小技巧:Go2的电池续航大概2小时,但雷达和算力模块加起来功耗不小,实际续航会降到1.5小时左右。如果要做长时间建图,建议外挂一块移动电源,给雷达和算力单独供电,这样Go2的电池只负责运动,续航能恢复到接近2小时。这个技巧是我在一次室外建图时发现的,当时建到一半Go2没电了,地图只建了一半,后来加了移动电源,再也没出现过中途断电的情况。

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

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

立即咨询