ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

ROS2驱动Livox Mid-360实战:从固定IP到点云可视化全流程

ROS2驱动Livox Mid-360实战:从固定IP到点云可视化全流程 1. 开箱后的第一件事搞清楚Mid-360的通信方式1.1 为什么这块雷达不插USB反而要插网线第一次把Livox Mid-360从包装盒里拿出来的时候我以为最折腾的环节肯定是ROS2驱动编译。真正动手之后才发现最让我卡了一个下午的反而是IP配置。这块雷达不走USB、不走串口、不走WiFi它的数据出口就是一颗标准RJ45网口所有点云数据、IMU数据、设备状态信息全部走以太网协议传输。所以你在ROS2里看不到类似/dev/ttyUSB0这样的设备节点看到的是一条实实在在的网卡链路。这意味着一个很多人一时转不过来的事实装好驱动之后雷达能不能被ROS2发现首先取决于你的电脑和雷达是不是在同一个网段里。这就像两个人打电话拨号规则都不一致后面的一切都是白搭。很多新手在Gazebo里跑惯了仿真雷达第一次接真机时总是下意识去找串口设备结果半个小时过去还在怀疑驱动没装好而实际上只需要打开网卡配置看一眼就明白了。Mid-360的网口输出的是标准UDP数据包驱动通过广播或指定IP来发现雷达。它和常见的USB摄像头这类即插即用设备不一样必须在系统层面先把网络配置好ROS2那层才会变得顺利。这也是为什么网上那些“装完驱动直接就能跑”的说法不完全适用——人家默认你已经把IP配好了。1.2 连接方式与IP规划直连还是交换机Mid-360的接线方式可以很简单直接用一根网线把雷达和电脑的有线网口连起来。这是最推荐的开发调试方案因为链路里只有两个设备没有广播风暴、没有别的设备抢IP排查问题非常方便。如果你的场景里已经有一台交换机或路由器也可以把雷达、电脑都接到交换机上。这样做的好处是以后要加第二台雷达、或者和别的传感器做时间同步时不用再重新布线。但代价是你得注意交换机端口是不是有隔离设置有些管理型交换机的端口隔离策略会把雷达的广播包挡掉导致驱动检测不到设备。IP规划建议如下设备IP地址子网掩码说明Mid-360雷达192.168.1.1以设备标签为准255.255.255.0出厂默认若多雷达则分别配置不同IP开发主机有线网卡192.168.1.50255.255.255.0可自行在1.2~1.254间任选避开雷达占用的IP网关不填不填直连雷达时不需要网关很多教程里会直接告诉你“把IP改成192.168.1.50”但不会解释为什么是50而不是任意数字。其实只要和雷达处于同一个192.168.1.x网段即可选50只是因为它不容易和路由器默认网段冲突也方便记忆。有一点需要特别提醒雷达出厂IP不一定是192.168.1.1不同批次、不同固件版本可能不一样。请先看一眼包装盒或雷达铭牌上的标注或者用Livox官方提供的Viewer工具先扫描一下。如果确实不确定可以先给网卡配置一个192.168.1.x的静态IP然后用ping命令依次试探192.168.1.1到192.168.1.200或者用sudo arp-scan -l扫描整个网段很快就能找到设备。1.3 供电和硬件接线里的坑Mid-360的接口不只是网口还有一个供电接口。我得重点说一句供电没接好前面所有网络配置都是白谈。雷达本体需要12V直流供电而且启动瞬间的电流需求并不低。我用的是官方配的电源转接板这部分比较稳妥。如果你是自己手工接线请一定看清楚线序。正负极接反轻则雷达不启动重则烧掉核心板。接线之前拿万用表量一下电源输出是否稳定在12V左右这个检查十秒钟但能省下换一块雷达的钱。另外很多人容易犯一个低级错误雷达的网口用了一根普通网线电脑那边却插到了USB转网口的小尾巴上。USB网卡本身不是不能用但由于部分廉价USB网卡对广播帧和大量UDP数据包的接收能力很差轻则点云掉帧重则驱动一直报“Device offline”。做开发调试时优先使用主板自带的千兆有线网口。如果笔记本没有网口也尽量买个稍微好一点的USB 3.0转千兆网卡别在几十块钱的转换器上省这个钱。网线方面也有讲究。近距离直连时超五类网线没问题但如果雷达装在实际机器人上线缆要走关节、走底盘建议用带屏蔽层的工业网线并且做好固定。这个细节看起来很基础但雷达点云突然丢了又恢复、有时候怎么ping都ping不通往往就是线缆接触不良造成的。2. 固定IP配置实战桌面版、服务器版和nmcli三种方法2.1 先找到你的有线网卡叫什么名字配置IP之前第一步是搞清楚系统里的有线网卡叫什么名字。Ubuntu 22.04用的还是Predictable Network Interface的命名规则有线网卡通常是enp3s0、enp2s0、eth0这一类名字具体取决于你的主板和PCIe槽位。先执行这条命令ip addr输出里会列出所有网络接口找到状态为UP或DOWN的有线网卡。通常网卡名里带en前缀的就是以太网接口。如果你看到一堆docker0、virbr0、vethxxxx之类的虚拟接口直接忽略它们只关心那个en开头的实体网卡。如果这块网卡显示DOWN先把它拉起来sudo ip link set enp3s0 up然后再看一遍ip addr确认接口状态变成了UP。有些主板出于省电策略会默认关闭有线网卡尤其是一些迷你主机不手动打开的话后面怎么配置都没用。2.2 有桌面的UbuntuNetworkManager图形界面配置如果你用的是Ubuntu Desktop版在桌面上点右上角的网络图标进入设置里的“网络”面板就能看到有线连接。选择“有线”旁边的齿轮图标进入IPv4选项卡把“自动(DHCP)”改成“手动”然后添加一条地址记录地址192.168.1.50掩码255.255.255.0图形界面里有时会自动补成24网关留空即可因为我们是直连雷达不需要路由器网关点“应用”之后把有线连接开关关掉再打开让配置生效。这个步骤看起来简单但还是有人会遇到问题。最常见的情况是在图形界面里改了IP却仍然收到“以太网没有有效IP配置”的提示。原因在于系统之前一直尝试通过DHCP向路由器要地址而雷达不会给你分配IP它就反复报错。解决方法就是上面说的手动指定IP只要地址和网段写对了这个报错就会消失。如果你在连接信息里看到IPv4地址显示为空或者出现169.254开头的自动地址说明网卡没有拿到有效的静态配置。改成手动后如果还是不生效就执行一下这个命令sudo systemctl restart NetworkManager重启网络管理服务再刷新看看。2.3 没有桌面的系统netplan与nmcli很多人的开发平台其实是Ubuntu Server或者干脆就是安装了欧拉、麒麟这类国产Linux系统的工控机。这时候没有图形界面用netplan配置静态IP是最标准的方法。在Ubuntu 22.04里netplan的配置文件一般在/etc/netplan/目录下。先看看这个目录里有什么文件ls /etc/netplan/通常会有一个01-network-manager-all.yaml或者00-installer-config.yaml。用sudo编辑它sudo vim /etc/netplan/00-installer-config.yaml写入如下内容network: version: 2 renderer: networkd ethernets: enp3s0: dhcp4: false addresses: - 192.168.1.50/24注意enp3s0要替换成你自己网卡的名字地址后面的/24就是子网掩码255.255.255.0的CIDR写法。保存后执行sudo netplan apply如果配置写错了导致网络断开别慌netplan提供了一个很有用的回滚命令sudo netplan try执行后如果没在倒计时内确认配置会自动回滚不会让你被锁死在断网状态。我第一次操作时手忙脚乱靠这个命令救回好几次。如果你用的是这类yaml文件但渲染器是NetworkManager那renderer那一行要改成NetworkManager或者直接用下面这种更通用的nmcli命令nmcli connection show找到有线连接的名字可能是“Wired connection 1”这样的名字然后执行nmcli connection modify Wired connection 1 ipv4.method manual ipv4.addresses 192.168.1.50/24 nmcli connection up Wired connection 1nmcli的好处是不依赖图形界面也不依赖netplan版本差异。不管是Ubuntu、Debian还是各种国产Linux发行版只要系统里装了NetworkManager这套命令都能用。对需要在现场快速调试机器人的工程师来说这个方式最顺手。2.4 配置完以后怎么确认自己没配错不管用哪种方法配好了IP都需要做一次完整的链路验证确认无误再进入ROS2阶段。按顺序检查这几项ip addr show enp3s0确认网卡上的IP确实是192.168.1.50。ping 192.168.1.1这是最关键的一步。如果能ping通说明网线和雷达供电都没问题。如果ping不通多半不是IP配置的问题而是物理链路的问题比如网线没插好、雷达供电不足、或者网卡没启用。有些人到了这一步还会顺带配置一个“网关”或者“DNS”这没必要。雷达是纯本地局域网设备不经过网关也不需要域名解析。写多了反而可能影响系统路由导致优先级错乱。这时候再回头看看系统会不会又弹“以太网没有有效IP配置”如果还弹但ping已经通了就直接忽略它。这个报错本质上只是NetworkManager检测到链路里没有DHCP服务属于虚惊一场。我个人遇到过这种迷惑行为最后发现Ping完全正常点云也一样刷纯粹被这个提示吓到了。3. 把livox_ros_driver2编译到Humble依赖、源码与编译坑3.1 ROS2 Humble环境的自检在拉驱动源码之前先确认ROS2 Humble环境是好的source /opt/ros/humble/setup.bash ros2 --version如果提示ros2: command not found说明ROS2环境还没source或者压根没装好。很多新手在这一步就被劝退其实不是驱动的问题是shell环境变量没有加载。可以直接把source命令写进~/.bashrcecho source /opt/ros/humble/setup.bash ~/.bashrc source ~/.bashrc之后每次打开终端就不用再手动执行source了。这里多说一句ROS2的源码安装和二进制安装都行但对于只想用雷达的人来说用官方编译好的二进制包也就是apt装的Humble最省事没必要自己从源码编ROS2编译要花不少时间不说还可能因为依赖关系把系统搞乱。在正式开始之前还可以顺手确认一下colcon有没有安装colcon version-check如果提示找不到colcon就执行sudo apt install python3-colcon-common-extensions。这是因为编译ROS2工作空间必须用colcon而不是ROS1时代的catkin。3.2 下载驱动源码并编译Livox官方针对ROS2提供了livox_ros_driver2仓库它同时支持ROS1和ROS2但在ROS2下用的是ros2分支。创建一个专门给雷达用的工作空间避免和别的功能包混在一起mkdir -p ~/livox_ws/src cd ~/livox_ws/src git clone -b ros2 https://github.com/Livox-SDK/livox_ros_driver2.git cd ~/livox_ws colcon build --packages-select livox_ros_driver2编译的时候会自动处理livox_ros_driver2内部对SDK的依赖不需要手动额外安装一个单独的SDK。这一点比老版的livox_ros_driver那套清爽不少。编译完成后把工作空间的setup文件加载进来source ~/livox_ws/install/setup.bash同样建议写进~/.bashrc放在/opt/ros/humble/setup.bash那行的下面。注意顺序先source ROS2基础环境再source你的工作空间否则可能出现find_package找不到依赖的情况。3.3 编译报错的常见原因和对应解法我在不同机器上分别编过这个驱动遇到过几次编译失败分享几个最典型的。内存不足导致编译被杀。如果编译到一半进程突然被kill掉多半是内存不够。工控机或虚拟机常见这个问题。解决办法是限制编译并行度colcon build --packages-select livox_ros_driver2 --parallel-workers 2--parallel-workers 2让colcon最多同时编译两个包内存压力会小很多。虽然编译时间变长但至少能编完。缺少rclcpp相关依赖。如果你用的是刚装好的ROS2环境理论上Humble二进制安装包会自带rclcpp但如果之前手动卸载过某些包可能出现找不到头文件的错误。这时候用rosdep处理依赖cd ~/livox_ws rosdep install --from-paths src --ignore-src -r -y如果rosdep因为网络原因卡住老读者都懂一般是因为没有初始化或更新不上去可以多试几次sudo rosdep init rosdep update实在不行就根据报错信息手动apt install对应的ros-humble-*包。驱动本身依赖不多这也是为什么我推荐给雷达单独建工作空间的原因——一旦出问题只需看这一个包。编译时开了多个ROS2工作空间导致环境混乱。如果你以前还编译过别的功能包比如nav2或cartographer建议在编译驱动时只保留基础环境不要同时source其他工作空间避免出现符号冲突。我之前遇到过undefined reference这类链接错误排查了很久最后发现是同时source了另一个旧版驱动的工作空间函数签名对不上导致的。另外如果README里提到Fast-DDS相关的注意事项一般只影响使用Fast-DDS的RMW配置。Humble默认用的是rmw_fastrtps_cpp不需要额外安装Fast-DDS库。除非你刻意切换成rmw_cyclonedds或rmw_fastdds否则直接用默认RMW跑就可以了。4. 启动雷达并在Rviz2里看到真正的点云4.1 选择合适的launch文件与配置驱动编译成功不代表马上就能启动还得选对launch文件。不同型号的Livox雷达launch文件名称和配置不一样。先看看驱动目录里有哪些launch文件ls ~/livox_ws/src/livox_ros_driver2/launch你会看到一堆launch文件分别对应不同的雷达型号。Mid-360对应的配置文件在config目录下一般是mid360_config.yaml。不同版本文件名会有差异不用硬背重点是理解启动逻辑launch文件会读取对应的yaml配置告诉驱动“你的雷达IP是多少、发布什么话题、输出什么格式的点云”。启动方式一般是ros2 launch livox_ros_driver2 对应你雷达型号的launch文件名比如你看到rviz_mid_360.launch.py这种文件直接用它就行。如果某些版本里没有mid360专用的launch就打开mid360_config.yaml确认里面的参数没问题然后启动基础的launch文件。启动之后留意终端输出。如果出现类似Device online或者不断打印点云数据长度变化的日志说明驱动已经和雷达握手成功了。这时候你可以在另一个终端敲ros2 topic list正常情况下应该能看到/livox/lidar点云话题和/livox/imuIMU话题这样的名字。如果话题列表里啥都没有大概率是IP配置或者launch文件选错了。4.2 Rviz2的显示参数设置Frame与话题眼看驱动跑起来了点云也有了接下来就是可视化。启动Rviz2ros2 run rviz2 rviz2打开以后默认界面是空的需要手动配置三样东西。Fixed Frame。在左侧Displays面板里找到Global Options把Fixed Frame从map改成livox_frame。这一步极其关键。Mid-360驱动发布的消息里用的是livox_frame作为雷达坐标系如果你用Rviz默认的map哪怕话题有数据也什么都看不见因为TF树里找不到map到点云的坐标变换。添加PointCloud2显示。点击左下角的“Add”按钮选择“By topic”找到/livox/lidar话题它的话题类型是sensor_msgs/msg/PointCloud2双击添加。如果你在Add面板里看不到这个话题说明数据没进来先回到终端检查驱动状态。调整点云尺寸。添加成功后可能看到一团颜色怪异但稀疏的散点在Displays面板里找到PointCloud2对应的条目展开Point Size或者叫Size把默认的1或2改成0.03左右。太小看不见太大感觉像一堆实心球。实测下来0.03对Mid-360来说显示效果比较舒服。做完这三步正常情况下你应该能在Rviz里看到雷达周围环境的轮廓了。Mid-360是近处盲区很小的非重复扫描雷达点云分布比较均匀转动雷达或者人走动点云都会实时跟着变化。4.3 点云不刷新时优先检查时间同步点云有了但有时会出现一种很奇怪的现象Rviz里能看到点云但画面是静止的动一下雷达画面完全不变。或者点云过几秒才跳一下卡得离谱。这多半不是网络丢包问题而是时间同步问题。Mid-360自带IMU点云消息带有时间戳如果雷达的时间和你电脑的系统时间差距太大ROS2的消息过滤机制会认为这帧数据是“过期数据”直接丢弃或者延后处理。解决方法是校准时间sudo apt install ntpdate sudo ntpdate time.windows.com或者用chronysudo apt install chrony sudo chronyd -q校准完系统时间后重启驱动节点再回到Rviz看看。点云应该就恢复正常刷新了。我在实际项目里遇到过一次特别隐蔽的情况电脑连了外网之后系统时间被ntp自动校准到UTC但雷达内部时钟走的是本地时间两者差8小时。驱动一直报时间戳异常点云一帧都刷不出来。当时排查了很久最后用date -u和date对比了一下才发现问题。如果你是多传感器融合项目建议以后统一用chrony做PTP或NTP时间同步别只靠手动校准。但如果只是为了把点云在Rviz里显示出来ntpdate这条命令已经足够了。5. 从“ping不通”开始的完整排查链路5.1 链路层排查网卡、网线、供电和防火墙这是很多人最容易放弃的地方但只要按顺序排查大部分问题十分钟内就能定位。第一步看雷达指示灯。Mid-360上电后正常情况下网口附近会有状态灯闪烁。如果指示灯完全不亮先怀疑供电用万用表量一下输入电压。这一步能排除一半的物理问题。第二步看网卡状态。执行ip addr show enp3s0确认网卡显示UP并且IP地址是你配置的192.168.1.50。如果你看到的是别的网段比如192.168.137.x之类的那是Windows共享网络自动分配的和雷达不在一个网段肯定不通。第三步ping雷达。执行ping 192.168.1.1。通了就往下走驱动流程不通就继续下一步。第四步检查防火墙。Ubuntu默认防火墙通常是关闭的但如果你之前手动开过ufw它可能会丢UDP广播包sudo ufw status如果状态是active可以先临时关闭测试sudo ufw disable确认是防火墙问题后再考虑细化规则不要一直关着防火墙跑公网但在纯内网雷达调试场景下问题不大。第五步换一根网线试试。不要小看这一步我遇到过网线内部接触不良导致丢包严重的情况点云时断时续ping时通时不通花了大半天排除了每个软件环节最后才发现是网线问题。5.2 软件层排查source、launch、话题和Frame链路通了驱动也启动成功了但就是看不到点云这时候按这个顺序往下查。终端里有没有ros2命令没有就说明没source ROS2环境执行source /opt/ros/humble/setup.bash再不行就检查~/.bashrc里的source行有没有被注释掉。ros2 topic list里有没有/livox/lidar如果没有回头确认launch启动日志有没有报错。很多情况下是选错了launch文件驱动起来后一直在试图连不存在的雷达IP。比如你在mid360的yaml里留了错误的IP地址驱动也会启动但永远找不到设备。ros2 topic echo /livox/lidar有没有数据执行ros2 topic hz /livox/lidar如果显示频率在10Hz左右说明数据在正常发布。这时候问题肯定出在Rviz显示层重点检查Fixed Frame是不是livox_frame话题添加的是不是PointCloud2类型。Rviz2打不开或闪退怎么处理有一类比较特殊的问题是点云数据没问题但Rviz2一旦打开就卡死或者白屏。这通常和OpenGL驱动有关尤其在虚拟机或者远程桌面环境下很常见。可以试试软渲染LIBGL_ALWAYS_SOFTWARE1 ros2 run rviz2 rviz2如果这样能正常打开说明是显卡驱动适配问题。这时候可以考虑更新GPU驱动或者干脆在后续使用中都加这个环境变量。开发调试用软渲染性能差一点但至少能干活。5.3 一些特殊场景虚拟机、多雷达、国产系统最后聊几个容易把人逼疯的非典型场景。虚拟机里跑Mid-360我建议别折磨自己。虽然理论上VMware的桥接模式可以把USB网卡或PCIe网卡桥接给虚拟机但实测下来经常出现广播包收不到、点云缺帧的情况。如果你只是在学习ROS2用仿真雷达就行如果你必须用真机数据尽量在物理机上跑。真有一定道理雷达的UDP点云数据量不小虚拟网卡的中断处理和时序精度很难保证。多雷达场景的IP冲突。如果你在一个机器人上装了两台Mid-360最简单的做法是把每台雷达的IP改成不同的值比如一台192.168.1.101另一台192.168.1.102。但注意官方的Livox Viewer和驱动支持的是通过广播包默认255.255.255.255来发现雷达多雷达时需要修改launch里的yaml配置分别指定各自的IP。否则可能出现两台雷达抢同一网段的情况在Rviz里表现为两台雷达点云混在一起或者一台在线一台离线。国产Linux系统比如欧拉、麒麟的兼容性。操作系统本身没有太大障碍网络配置原理完全一样。如果你遇到netplan不存在的内核版本就退回到nmcli命令。我还遇到过一种情况系统默认装了NetworkManager但管理的是一个不生效的“有线连接”导致手工设置的IP被系统里另一个连接配置覆盖。排查时用nmcli connection show把所有连接列出来把不需要的连接禁用掉问题就解决了。核心思路就是一个网卡只留一个有效的connection配置别让多个配置互相打架。关于“rgv”这类点云加密或前端工具的问题。如果你在后续开发中想用rviz插件或自定义的3D显示工具记得确认它们读取的话题类型是不是sensor_msgs/PointCloud2。Mid-360驱动默认输出的就是这个标准格式绝大多数可视化工具都能直接消费不需要额外转换。如果你用的是老版本ROS1习惯可能会下意识去查sensor_msgs/PointCloud不带2这两个消息类型不一样千万别搞混。我现在的习惯是接上雷达后先花十秒钟ping一下通了再启动驱动。这十秒钟省掉了我无数次在Rviz里拉扯面板、怀疑人生。等你把这套流程跑顺了从插上网线到看到满屏幕点云整个链路大概只需要几分钟。后面再去做导航、建图、避障这些基础功夫都通用。
返回列表