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 | 雷达IP | 192.168.1.201 | 出厂默认,改过就填改后的 |
| host_ip | 主机IP | 192.168.1.100 | 必须跟主机网卡一致 |
| lidar_port | 雷达数据端口 | 2368 | 一般不用改 |
| device_port | 设备控制端口 | 9347 | 用于配置雷达参数 |
| frame_id | 坐标系名称 | hesai_lidar | 跟TF树对应 |
| pcldata_type | 点云类型 | 0 | 0是XYZI,1是XYZIRT |
| publish_pcl2 | 是否发布PointCloud2 | true | 建图必须开 |
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 点云收不到数据的排查顺序
这个问题我被问过不下几十次,总结一个固定的排查顺序,照着走基本能定位:
ping 192.168.1.201能不能通。不通就是IP层问题,检查主机IP、网线、雷达供电。- 能ping通但驱动没数据,用
sudo tcpdump -i enp3s0 udp port 2368抓包。有包说明雷达在发,问题在驱动配置;没包说明雷达没往这个IP发,检查host_ip配置。 - 抓包有数据但驱动收不到,检查防火墙和
libpcap权限。驱动需要root权限或者CAP_NET_RAW能力才能抓包,用sudo跑roslaunch试试。 - 以上都正常但点云频率低,调大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被改过又忘了的情况下特别管用。