news 2026/9/27 3:04:31

禾赛AT128P激光雷达ROS驱动配置与网络调试实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
禾赛AT128P激光雷达ROS驱动配置与网络调试实战指南

1. 为什么选择禾赛AT128P搭配ROS做感知开发

禾赛AT128P这款激光雷达在自动驾驶和机器人感知圈子里热度一直不低,128线的垂直分辨率加上200米的探测距离,单回波模式下最高能到153万点每秒,这个数据放在中远距感知场景里相当能打。我第一次拿到这颗雷达的时候,第一反应是它跟早期机械式64线完全不是一个量级的东西——点云密度上来了,标定和建图的容错空间反而变小了,因为细节多了,任何外参偏差都会在点云里被放大得很明显。

ROS这边的情况大家也清楚,Ubuntu 20.04配Noetic是当前最稳的组合,Ubuntu 22.04配Humble也在快速成熟。禾赛官方提供了hesai_ros_driver这个功能包,支持ROS1和ROS2两套体系,底层走的是UDP协议把雷达的原始数据包收上来,再在驱动层做解码、去噪、坐标变换,最后以sensor_msgs/PointCloud2的格式发布出去。整个链路听起来简单,但真正卡人的地方往往不在驱动本身,而在网络配置这一环。

我见过太多人驱动装完了,roslaunch也跑起来了,结果rostopic hz一看点云频率是0,或者断断续续掉帧,折腾半天以为是驱动bug,最后发现是网卡没配对、防火墙没关、或者虚拟机的网络模式选错了。所以这篇东西我打算把重点放在“怎么让雷达和主机真正通上话”这件事上,顺带把驱动安装、参数配置、点云验证、常见故障排查都串一遍。不管你是刚接触ROS的新手,还是已经用过其他雷达想换禾赛的老手,应该都能从里面找到能直接抄的配置和踩过的坑。

2. 整体方案设计与选型思路拆解

2.1 硬件连接拓扑怎么定

AT128P的物理接口是一个航空插头,里面集成了电源线、网线、GPS/PPS同步线。供电要求是9到32V直流,典型功耗在12W左右,我用的是一个24V/5A的工业电源单独给它供电,不建议跟工控机共用一路电源,因为雷达上电瞬间的浪涌电流有可能让主机电压跌落,导致网卡重新枚举。网线这头直接插到主机的一块独立千兆网卡上,不要跟主机的上网网卡混用,这是第一条铁律。

为什么强调独立网卡?因为禾赛雷达出厂默认IP是192.168.1.201,子网掩码255.255.255.0,它期望主机在同一个网段里有一个固定IP,比如192.168.1.100。如果你用主机的WiFi或者DHCP网卡去接,路由表会打架,数据包可能从错误的接口出去,表现就是能ping通但收不到UDP数据。我自己的做法是给主机加一块USB千兆网卡或者PCIe网卡,专门跑雷达,系统里用ip addr能看到两个以上网络接口,心里就有数了。

2.2 操作系统与ROS版本怎么选

Ubuntu 20.04 + ROS Noetic是目前禾赛官方驱动测试最充分的组合,hesai_ros_driver的ROS1分支在这个环境下编译基本不会出问题。Ubuntu 22.04 + ROS2 Humble也可以用,但要注意ROS2的驱动包名和launch文件写法跟ROS1有差异,网上很多教程混着写,容易把人带偏。如果你是新装机器,我建议直接上Ubuntu 20.04,省掉很多依赖库版本冲突的麻烦。

ROS安装这块,国内用户绕不开“鱼香ROS一键安装”这个工具,它确实能把ROS的apt源、依赖、环境变量一次性配好,比手动一步步来快很多。但我要提醒一句:一键安装脚本会修改你的/etc/apt/sources.list和~/.bashrc,如果你机器上已经有其他ROS版本或者自定义环境变量,装之前先备份这两个文件。我自己习惯是先用一键脚本装好基础ROS,再单独编译禾赛驱动,这样出问题的时候排查范围小。

2.3 驱动获取方式的选择

禾赛官方在GitHub上维护了HesaiLidar_General_ROS仓库,里面同时包含ROS1和ROS2的驱动代码。获取方式有两种:一种是直接git clone源码到工作空间里用catkin_make编译,另一种是用apt安装预编译包。我推荐源码编译,原因有两个:一是可以自己改参数重新编译,二是能看到驱动内部到底怎么解析UDP包,出问题的时候知道去哪找日志。

编译之前确认几个依赖:libpcap-dev、libyaml-cpp-dev、ros-noetic-pcl-ros,这几个缺一个都会编译报错。libpcap是用来抓原始以太网帧的,禾赛驱动底层用它来绕过内核协议栈直接收包,这也是为什么它对网络配置这么敏感——它不走常规的socket接收路径。

3. 网络配置核心细节与避坑要点

3.1 主机静态IP配置的完整操作

网络配置是整件事里最容易翻车的环节,我把它拆成几个明确的步骤。首先用ip addr确认你的雷达网卡名字,通常是enp3s0、enxXXXXXXXX或者eth1这种。假设网卡名是enp3s0,接下来有两种配置方式。

第一种是临时配置,重启就失效,适合调试阶段:

sudo ip addr add 192.168.1.100/24 dev enp3s0 sudo ip link set enp3s0 up

这两条命令执行完,ip addr show enp3s0应该能看到inet 192.168.1.100。然后ping 192.168.1.201测试连通性。如果ping通了,说明物理链路和IP层没问题,可以继续跑驱动。

第二种是永久配置,Ubuntu 20.04用netplan,编辑/etc/netplan/01-network-manager-all.yaml或者新建一个/etc/netplan/10-lidar.yaml:

network: version: 2 renderer: networkd ethernets: enp3s0: addresses: - 192.168.1.100/24 dhcp4: no

写完执行sudo netplan apply。这里有个坑:如果你的系统用的是NetworkManager而不是networkd,renderer要改成NetworkManager,否则配置不生效。判断方法很简单,systemctl status NetworkManager看它是不是active。

注意:配置静态IP之前,先把雷达网卡从NetworkManager的管理列表里排除掉,否则NetworkManager会周期性地把IP改回去。在/etc/NetworkManager/NetworkManager.conf里加unmanaged-devices=interface-name:enp3s0,然后重启NetworkManager。

3.2 防火墙与内核参数调整

Ubuntu默认的ufw防火墙有时候会拦截UDP包,虽然理论上同网段通信不受影响,但实测下来关掉更省心:

sudo ufw disable

另外,禾赛雷达的数据包速率很高,内核的UDP接收缓冲区默认值可能不够用,导致丢包。可以临时调大:

sudo sysctl -w net.core.rmem_max=26214400 sudo sysctl -w net.core.rmem_default=26214400

要永久生效就写进/etc/sysctl.conf。这个参数我一开始没在意,后来发现点云偶尔缺一块,调大缓冲区之后就稳定了。丢包在点云上的表现是某些角度突然出现空白扇区,很容易被误判成雷达硬件问题。

3.3 虚拟机环境下的特殊处理

很多人是在VMware或者VirtualBox里跑Ubuntu做ROS开发,这时候网络配置要格外小心。虚拟机的网络模式必须选“桥接模式”,并且桥接到雷达实际插的那块物理网卡上。NAT模式绝对不行,因为NAT下虚拟机和雷达不在同一广播域,UDP包根本到不了。

桥接模式下还有一个细节:虚拟机的虚拟网卡要设置成“仅主机模式”或者手动指定IP,不要让它从路由器的DHCP拿地址。我遇到过虚拟机桥接后拿到了192.168.1.x的DHCP地址,跟雷达同网段但网关冲突,结果ping得通但驱动收不到数据。解决办法就是在虚拟机里同样配静态IP,并且确认ip route里没有多余的路由条目。

提示:虚拟机里跑雷达驱动,CPU性能损耗大概在10%到15%,如果主机配置一般,点云频率可能会掉。有条件的话还是用物理机或者工控机。

4. 驱动安装与参数配置实操

4.1 源码编译的完整流程

创建工作空间并拉取代码:

mkdir -p ~/hesai_ws/src cd ~/hesai_ws/src git clone https://github.com/HesaiTechnology/HesaiLidar_General_ROS.git

注意这个仓库默认分支可能同时包含ROS1和ROS2代码,ROS1用户要确认在正确的分支上,或者直接看目录结构里有没有catkin相关的CMakeLists.txt。确认无误后回到工作空间根目录编译:

cd ~/hesai_ws catkin_make source devel/setup.bash

编译过程中如果报Could not find libpcap,装一下sudo apt install libpcap-dev。如果报yaml-cpp相关错误,装libyaml-cpp-dev。编译成功后devel/lib目录下应该有hesai_ros_driver_node这个可执行文件。

4.2 配置文件的关键参数解读

禾赛驱动的参数放在config/config.yaml里,几个必须关注的字段:

参数名含义推荐值说明
lidar_ip雷达IP192.168.1.201出厂默认,改过就填改后的
host_ip主机IP192.168.1.100必须跟主机网卡一致
lidar_port雷达数据端口2368一般不用改
device_port设备控制端口9347用于配置雷达参数
frame_id坐标系名称hesai_lidar跟TF树对应
pcldata_type点云类型00是XYZI,1是XYZIRT
publish_pcl2是否发布PointCloud2true建图必须开

pcldata_type这个参数值得说一下。选0的话点云里只有x、y、z、intensity四个字段,数据量小,适合做SLAM前端。选1会额外带上ring和timestamp,做运动补偿和精确标定的时候需要,但带宽占用会高不少。我一般建图用0,标定用1。

4.3 启动驱动并验证点云

配置改好之后启动:

roslaunch hesai_ros_driver start.launch

如果一切正常,终端会打印雷达型号、固件版本、数据包接收统计。另开一个终端:

rostopic hz /hesai_lidar/points_raw

正常应该看到10Hz左右的频率,AT128P默认就是10Hz。如果频率是0或者远低于10,先回去检查网络配置。如果频率对但点云看起来不对,用rviz加载PointCloud2话题看一眼,正常情况下应该能看到清晰的环形扫描线,地面平整,建筑物轮廓分明。

注意:rviz里Fixed Frame要设成跟frame_id一致,否则点云不显示。很多人第一次跑的时候rviz一片黑,就是因为Fixed Frame还是默认的map。

5. 常见故障排查与实战经验

5.1 点云收不到数据的排查顺序

这个问题我被问过不下几十次,总结一个固定的排查顺序,照着走基本能定位:

  1. ping 192.168.1.201能不能通。不通就是IP层问题,检查主机IP、网线、雷达供电。
  2. 能ping通但驱动没数据,用sudo tcpdump -i enp3s0 udp port 2368抓包。有包说明雷达在发,问题在驱动配置;没包说明雷达没往这个IP发,检查host_ip配置。
  3. 抓包有数据但驱动收不到,检查防火墙和libpcap权限。驱动需要root权限或者CAP_NET_RAW能力才能抓包,用sudo跑roslaunch试试。
  4. 以上都正常但点云频率低,调大UDP接收缓冲区,检查网卡是不是千兆协商成功,ethtool enp3s0看Speed是不是1000Mb/s。

5.2 点云建图飘移的关联因素

“激光雷达建图飘”这个热搜词背后,很多时候不是雷达的问题,而是外参标定和时间同步没做好。AT128P支持PPS+GPRMC时间同步,如果你做多传感器融合,一定要把GPS模块接上,让雷达和IMU、相机共享同一个时间基准。没有硬件同步的话,雷达内部时钟跟主机时钟有漂移,建图的时候帧间匹配会累积误差。

另外,建图飘还有一个常见原因是点云去畸变没做。AT128P是旋转式扫描,一帧点云采集期间雷达本身在运动,如果不做运动补偿,高速运动下点云会明显扭曲。禾赛驱动里有个enable_motion_compensation参数,配合IMU数据可以开启,但需要额外配置。

5.3 网络配置速查表

现象可能原因解决方法
ping不通雷达主机IP不在同网段配静态IP 192.168.1.100/24
ping通但无点云防火墙拦截sudo ufw disable
点云断断续续UDP缓冲区太小调大rmem_max
虚拟机收不到数据网络模式是NAT改成桥接模式
点云频率只有几Hz网卡不是千兆换千兆网卡或检查协商
rviz不显示点云Fixed Frame不对改成hesai_lidar
编译报错找不到pcap缺依赖apt install libpcap-dev

5.4 几个我踩过的坑

第一个坑是网卡命名。Ubuntu 20.04默认用predictable network interface names,网卡名可能是enp3s0这种,但如果你插了USB网卡,名字可能变成enx00e04c680xxx,每次插拔还可能变。我的做法是在/etc/udev/rules.d/里写一条规则,把雷达网卡固定命名成lidar0,这样配置文件里写死lidar0就不会因为插拔顺序变化而出问题。

第二个坑是雷达固件版本。AT128P早期固件和后期固件在UDP包格式上有细微差异,如果你用的驱动版本比较老,可能解析出来的点云坐标是错的。判断方法是看驱动启动日志里的固件版本号,然后去禾赛官方文档对照驱动兼容性列表。我遇到过点云整体偏移几十米的情况,换了新版驱动就好了。

第三个坑是电源干扰。雷达跟电机、驱动器共用电源的时候,点云里会出现规律性的噪点。后来给雷达单独加了一个隔离DC-DC模块,噪点就消失了。这个在机器人小车上特别常见,因为电机启停的时候电源纹波很大。

6. 点云数据后续处理与扩展方向

6.1 用Cartographer做建图的配置要点

“ros2+cartographer+激光雷达建图并保存”这个组合现在很流行,ROS1下用Cartographer也不复杂。关键是cartographer_ros的配置文件里num_laser_scans和num_point_clouds要设对,AT128P发布的是PointCloud2,所以num_point_clouds设1,num_laser_scans设0。tracking_frame一般设成imu_link或者base_link,published_frame设成base_link,provide_odom_frame设true。

建图保存用rosservice call /write_state,指定保存路径和pbstream文件名。之后可以用cartographer_pbstream_to_ros_map把pbstream转成pgm和yaml,方便在rviz里看或者导入其他工具。

6.2 点云目标检测的接入方式

AT128P的点云密度足够做目标检测,常见做法是把PointCloud2转成pcl::PointCloud<pcl::PointXYZI>,然后送进PointPillars或者CenterPoint这类网络。ROS里可以用pcl_ros做格式转换,检测结果再以visualization_msgs/MarkerArray发布出来。需要注意的是,AT128P的点云是非均匀分布的,近处密远处疏,做检测之前最好做一下体素降采样,不然计算量会很大。

6.3 多雷达融合的注意事项

如果你要同时接多个AT128P,每颗雷达的IP要改成不同地址,主机上要么用多块网卡,要么用一台交换机把雷达都接进来。多雷达融合最大的问题是时间同步,建议所有雷达都接同一个PPS源,驱动里开启时间同步功能。外参标定可以用autoware的标定工具,或者手动在rviz里调,调到点云重合度最高为止。

我在实际项目里用两颗AT128P做过前向和侧向的补盲,融合之后的点云覆盖角度从120度扩展到接近300度,效果很明显。但两颗雷达的数据量加起来对主机的网络和CPU压力不小,建议用千兆交换机并且主机至少四核以上。

7. 一些实操心得和最后的小建议

调试雷达这件事,最忌讳的就是一上来就改驱动代码。我自己的习惯是先把网络层彻底打通,用tcpdump确认数据包在流动,再跑驱动,再看点云,一层一层往上查。这样出问题的时候能快速定位是哪一层的事,不会眉毛胡子一把抓。

另外,配置文件改完一定要重启驱动,禾赛驱动不支持热加载参数。还有,roslaunch启动的时候加--screen参数,把日志打到终端上,方便看实时状态。如果日志里出现packet loss字样,说明网络在丢包,优先查网卡和缓冲区。

最后分享一个小技巧:如果你不确定雷达的IP是多少,可以用禾赛官方的HesaiLidar_General_SDK里的搜索工具,或者直接用arp-scan扫整个网段,找到MAC地址前缀是禾赛的那台设备。这个方法在雷达IP被改过又忘了的情况下特别管用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/27 3:01:20

VESC刷固件救砖指南:SWD与ST-Link的STM32CubeProgrammer实操

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/27 2:55:09

同样叫光子嫩肤,到店前最该问的不是价格

一张光子嫩肤海报通常能告诉你项目名和入口价&#xff0c;却不会告诉你谁来判断、设备是什么、哪些皮肤状态需要暂停。准备比较几家店时&#xff0c;先把这三件事问明白&#xff0c;再看价格&#xff0c;才不容易被一张低价图带着走。海报只回答了很小一部分暗沉、红印、毛孔和…

作者头像 李华
网站建设 2026/9/27 2:53:28

UFS生产状态感知(PSA)实战:让焊接质量可追溯

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/27 2:50:19

M1 Mac运行安卓12:Docker+Redroid容器化实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/27 2:48:42

GD32 IAP实战:串口Ymodem固件升级与Bootloader设计指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/27 2:42:40

I2C地址扫描实战:USB转I2C工具与Excel模板在100KHz下的板级调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华