news 2026/9/27 20:49:15

禾赛AT128P激光雷达ROS驱动配置与点云可视化实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
禾赛AT128P激光雷达ROS驱动配置与点云可视化实战指南

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

禾赛AT128P这款激光雷达在自动驾驶和机器人感知圈子里热度一直不低,128线的垂直分辨率加上200米的探测距离,放在园区物流车、无人清扫车、巡检机器人这类场景里,基本属于“一步到位”的配置。我第一次拿到这颗雷达的时候,第一反应是它比想象中轻,第二反应是——这玩意儿没有USB口,也没有网口转接线,只有一根航插线缆甩出来,里面藏着电源和以太网。也就是说,你没法像插U盘一样把它怼到电脑上,必须先把网络这关过了,才能谈ROS驱动。

这个项目要干的事情很明确:在Ubuntu系统上,通过ROS把AT128P跑起来,让点云数据能在RViz里正常显示,并且把网络配置这个最容易卡住新手的环节彻底讲透。适合谁看?如果你刚接触激光雷达,手里正好有一台AT128P,或者你在做ROS小车、SLAM建图、目标检测相关的开发,需要把雷达数据接进ROS生态,那这篇内容基本能帮你省掉至少一个周末的折腾时间。

我见过太多人卡在“雷达通电了、灯也亮了、但ifconfig里看不到设备”这一步,然后开始怀疑是不是雷达坏了。其实十有八九是网络配置的问题。AT128P出厂默认IP是192.168.1.201,主机需要配一个同网段的静态IP,比如192.168.1.100,子网掩码255.255.255.0。听起来很简单对吧?但Ubuntu从20.04开始网络管理换成了Netplan,22.04又有了新的图形化配置方式,再加上如果你用的是虚拟机或者工控机,网卡命名可能是enp3s0、eth0、enx开头的USB网卡名,每一步都有坑。下面我就按实际操作的顺序,把整个流程拆开讲。

2. 网络配置:整个项目最容易翻车的地方

2.1 先搞清楚你的网卡叫什么名字

很多人上来就改/etc/network/interfaces,结果发现Ubuntu 20.04之后这个文件根本不存在,或者改了没生效。原因是从Ubuntu 18.04开始,网络配置默认由Netplan接管,配置文件在/etc/netplan/目录下,通常是00-installer-config.yaml或者01-network-manager-all.yaml这种名字。

第一步不是急着改配置,而是先确认你的网卡名称。打开终端,输入:

ip link show

你会看到类似这样的输出:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 00:1b:21:3c:4d:5e brd ff:ff:ff:ff:ff:ff 3: wlp2s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether a4:5e:60:1f:2b:3c brd ff:ff:ff:ff:ff:ff

这里enp3s0就是有线网卡,wlp2s0是无线网卡。你要连雷达的是有线口,所以记住enp3s0这个名字。如果你用的是USB转网口,名字可能是enx开头的长串,比如enx00e04c6801a2,这个也要记下来。

注意:如果你在虚拟机里跑Ubuntu,网卡名字可能是ens33、ens160这种。虚拟机还需要额外配置网络模式,这个后面单独说。

2.2 Netplan配置静态IP的完整写法

确认网卡名之后,进入/etc/netplan/目录,看看里面有什么文件:

ls /etc/netplan/

通常会看到一个yaml文件。用sudo权限编辑它:

sudo nano /etc/netplan/01-network-manager-all.yaml

如果你希望有线网卡用静态IP连雷达,无线网卡继续DHCP上网,配置大概长这样:

network: version: 2 renderer: NetworkManager ethernets: enp3s0: dhcp4: no addresses: - 192.168.1.100/24 routes: - to: 192.168.1.0/24 via: 192.168.1.1 metric: 100 nameservers: addresses: [8.8.8.8, 114.114.114.114] wifis: wlp2s0: dhcp4: yes access-points: "你的WiFi名称": password: "你的WiFi密码"

这里有几个关键点。第一,renderer写NetworkManager还是networkd,取决于你系统里装了什么。桌面版Ubuntu一般用NetworkManager,服务器版可能用networkd。如果你不确定,可以先写NetworkManager,改完用netplan try测试,不行再换。

第二,addresses里的/24表示子网掩码255.255.255.0,这个必须和雷达的网段一致。AT128P默认是192.168.1.201,所以你的主机IP可以是192.168.1.100到192.168.1.254之间的任意一个,只要不跟雷达冲突就行。

第三,routes这一项其实可以省略,因为同网段通信不需要网关。但如果你同时要上网,保留默认路由指向WiFi的网关更稳妥。我一般会把有线口的metric设高一点(数值越大优先级越低),这样系统默认走WiFi上网,只有访问192.168.1.x的时候才走有线口。

改完之后执行:

sudo netplan try

这个命令会应用配置并等待120秒,如果网络断了你没确认,它会自动回滚。确认没问题后按回车,然后:

sudo netplan apply

2.3 验证网络通不通的三种方法

配置完先别急着插雷达,先自己ping一下自己的IP:

ping 192.168.1.100

能通说明网卡起来了。然后插上雷达,等雷达启动完成(大概30秒到1分钟,听到风扇转起来或者看到指示灯闪烁),再ping雷达:

ping 192.168.1.201

如果ping不通,按这个顺序排查:

排查项检查方法常见问题
网卡是否UPip link show enp3s0显示DOWN说明网卡没启用
IP是否配对ip addr show enp3s0看有没有192.168.1.100
网线是否插好看网口指示灯灯不亮换根线试试
雷达是否启动听风扇/看灯电源功率不够会反复重启
防火墙是否拦截sudo ufw status临时关闭测试sudo ufw disable

还有一个很多人忽略的点:如果你的电脑有多个网口,或者你之前配过其他静态IP,可能存在IP冲突。用arp-scan扫一下同网段:

sudo apt install arp-scan sudo arp-scan --interface=enp3s0 192.168.1.0/24

这个命令会列出同网段所有活跃设备,你能看到192.168.1.201是不是被雷达占用了。

实操心得:我习惯把主机IP设成192.168.1.100,因为好记。但如果你同时调试多个雷达,建议按雷达编号分配,比如雷达1用.100,雷达2用.101,避免IP冲突。另外,有些工控机有两个网口,一个连雷达一个连外网,这时候一定要确认你改的是连雷达的那个口。

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

如果你在VMware或VirtualBox里跑Ubuntu,网络配置会更绕一层。虚拟机的网卡是虚拟出来的,你需要先把物理网卡“桥接”给虚拟机,或者用NAT模式再做端口转发。

VMware下的推荐做法是:虚拟机设置里,网络适配器选“桥接模式”,并且勾选“复制物理网络连接状态”。这样虚拟机里的enp3s0就相当于直接连在物理网口上,雷达能直接ping通。

VirtualBox稍微麻烦一点,需要在“网络”设置里选“桥接网卡”,界面名称选你实际连雷达的那个物理网口。如果桥接后ping不通,检查一下VirtualBox的“混杂模式”是不是设成了“全部允许”。

还有一种情况是用WSL2跑ROS,这个我不推荐用来连雷达,因为WSL2的网络是NAT后的,虽然能通过端口转发收到部分数据,但组播和原始以太网帧支持不好,AT128P的数据流可能会丢包。老老实实用原生Ubuntu或者虚拟机。

3. ROS驱动安装与点云数据接收

3.1 ROS版本选择和基础环境准备

AT128P的官方ROS驱动对ROS1和ROS2都有支持,但ROS1 Noetic是最后一个ROS1版本,2025年5月已经停止维护了。如果你是新项目,我建议直接上ROS2 Humble或者Jazzy。但如果你手头有大量ROS1的代码要复用,Noetic也还能用,只是要注意安全更新问题。

Ubuntu 20.04对应Noetic,Ubuntu 22.04对应Humble,Ubuntu 24.04对应Jazzy。选哪个版本,先看你的Ubuntu版本,再看你的项目需求。

安装ROS本身,如果你觉得官方步骤太繁琐,可以用“鱼香ROS一键安装”脚本,这个在社区里口碑不错,能省掉配源、装依赖的很多步骤。但我要提醒一句:一键脚本方便是方便,但装完之后你最好还是知道ROS的安装路径、环境变量在哪配,不然出了问题不好排查。

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

运行后按菜单提示选对应版本就行。装完记得:

source /opt/ros/noetic/setup.bash

或者把它加到~/.bashrc里,省得每次开终端都要source。

3.2 禾赛官方驱动的获取和编译

禾赛的ROS驱动在GitHub上开源,仓库名叫HesaiLidar_General_ROS。ROS1和ROS2的代码在同一个仓库的不同分支里。

ROS1 Noetic的编译流程:

mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone https://github.com/HesaiTechnology/HesaiLidar_General_ROS.git cd .. catkin_make source devel/setup.bash

ROS2 Humble的编译流程:

mkdir -p ~/ros2_ws/src cd ~/ros2_ws/src git clone https://github.com/HesaiTechnology/HesaiLidar_General_ROS.git -b ros2 cd .. colcon build source install/setup.bash

编译过程中如果报错找不到某个包,大概率是依赖没装全。ROS1下常见缺的是ros-noetic-pcl-ros和ros-noetic-pcl-conversions,ROS2下是ros-humble-pcl-ros和ros-humble-pcl-conversions。用apt装上就行。

注意:禾赛的驱动仓库更新比较频繁,不同版本对应的雷达型号支持不一样。AT128P需要确认你clone的分支里包含AT128的配置。如果编译完发现没有AT128的launch文件,去仓库的README里看看是不是需要切到特定tag。

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

禾赛驱动的配置文件在config/目录下,AT128P对应的文件通常是config.yaml或者AT128P_config.yaml。这个文件里几个参数必须改对:

lidar: - driver: udp_port: 2368 ptc_port: 9347 host_ip: 192.168.1.100 lidar_ip: 192.168.1.201 frame_id: hesai_lidar model: AT128P correction_file_path: "path/to/correction_file.csv"

udp_port是数据端口,AT128P默认2368,这个一般不用改。ptc_port是控制端口,默认9347。host_ip是你主机的IP,lidar_ip是雷达的IP,这两个必须和实际配置一致。frame_id是点云在TF树里的坐标系名称,后面RViz里要对应上。

correction_file_path是角度校正文件,禾赛出厂时会提供,或者从官网下载。这个文件决定了点云的精度,如果路径不对或者文件缺失,点云可能会变形或者有分层。我遇到过有人忘了配这个,点云看起来像“两层楼”,就是校正文件没加载。

3.4 启动驱动并验证数据流

ROS1下启动:

roslaunch hesai_lidar hesai_lidar.launch

ROS2下启动:

ros2 launch hesai_lidar hesai_lidar_launch.py

启动后,先看终端有没有报错。正常的话会打印雷达型号、固件版本、数据包接收状态。然后开一个新终端,ROS1下:

rostopic list

你应该能看到/hesai_lidar/points_raw或者类似的话题。用rostopic hz看一下频率:

rostopic hz /hesai_lidar/points_raw

AT128P的典型帧率是10Hz或20Hz,如果你看到频率远低于这个,或者时有时无,说明网络丢包了。ROS2下用:

ros2 topic hz /hesai_lidar/points_raw

如果话题存在但没数据,检查防火墙和UDP端口。Linux默认的ufw可能会拦截UDP 2368,临时关掉测试:

sudo ufw disable

如果关掉就有数据了,说明需要加规则放行:

sudo ufw allow 2368/udp sudo ufw allow 9347/udp

4. RViz可视化与点云效果调优

4.1 RViz基础配置步骤

数据有了,接下来要在RViz里看到点云。启动RViz:

rviz

第一步,把Fixed Frame改成hesai_lidar,这个要和配置文件里的frame_id一致。如果这里报错说frame不存在,检查驱动有没有正常发布TF。

第二步,左下角Add一个PointCloud2,Topic选/hesai_lidar/points_raw。

第三步,调整点云大小和颜色。PointCloud2的Style选Points,Size设成0.01到0.05之间,太大画面会糊,太小看不见。Color Transformer选Intensity或者AxisColor,Intensity能看出反射率差异,AxisColor按Z轴高度着色,看地面和障碍物更直观。

如果点云显示出来是“一坨”而不是清晰的环境轮廓,大概率是校正文件没加载,或者frame_id配错了导致点云叠加了错误的变换。

4.2 点云“飘”和“分层”的排查

“激光雷达建图飘”是热搜里经常出现的问题,但飘的原因分两种:一种是RViz里看着飘,一种是SLAM建图后地图飘。前者通常是显示问题,后者是里程计和雷达外参标定问题。

RViz里点云飘,先看Fixed Frame是不是设成了odom或者map,而雷达的frame_id是hesai_lidar,如果TF树里没有hesai_lidar到odom的变换,RViz就会用默认值,导致点云位置乱跳。解决办法是把Fixed Frame改成hesai_lidar,先确认雷达自身数据是稳的。

点云分层,就是同一面墙出现上下两层点,通常是校正文件的问题。AT128P每个激光器的角度都有微小差异,校正文件就是补偿这些差异的。如果文件路径写错,驱动会用默认角度,点云就会分层。检查launch文件里的correction_file_path,确保指向正确的CSV文件。

还有一种分层是安装问题。如果雷达装歪了,比如俯仰角有几度偏差,点云也会看起来分层。这时候需要在TF里加一个静态变换来补偿:

rosrun tf static_transform_publisher 0 0 0 0 0.05 0 base_link hesai_lidar 100

这个命令的意思是,在base_link和hesai_lidar之间加一个绕Z轴旋转0.05弧度的变换,补偿安装偏差。具体数值需要根据实际安装角度调整。

4.3 点云数据录制和离线回放

调试阶段经常需要把数据录下来反复分析。ROS1下用rosbag:

rosbag record /hesai_lidar/points_raw -O at128p_test.bag

ROS2下用ros2 bag:

ros2 bag record /hesai_lidar/points_raw -o at128p_test

录的时候注意磁盘空间,AT128P单帧点云大概几十MB,10Hz录一分钟就是几百MB到1GB。建议录短一点,或者用--duration限制时长。

回放的时候,ROS1:

rosbag play at128p_test.bag --loop

ROS2:

ros2 bag play at128p_test

回放的同时开RViz,就能反复看同一段数据,方便调参和对比算法效果。

实操心得:我习惯在录bag的时候同时录一个/tf和/tf_static,这样回放的时候TF树是完整的,RViz不会报frame错误。命令是rosbag record /hesai_lidar/points_raw /tf /tf_static -O test.bag。

5. 常见问题速查与避坑经验

5.1 网络类问题速查表

现象可能原因解决方法
ping不通雷达主机IP不在同网段改主机IP为192.168.1.x
ping不通雷达网卡没启用sudo ip link set enp3s0 up
ping不通雷达防火墙拦截sudo ufw disable临时测试
能ping通但无数据UDP端口被占netstat -anu | grep 2368查占用
数据断断续续网线质量差换Cat6以上屏蔽线
虚拟机里ping不通网络模式不对改桥接模式,选对物理网口
IP冲突同网段有其他设备arp-scan扫描后改IP

5.2 ROS驱动类问题速查表

现象可能原因解决方法
编译报错找不到pcl依赖缺失装ros-*-pcl-ros
启动后无点云话题配置文件IP错检查host_ip和lidar_ip
点云分层校正文件未加载检查correction_file_path
点云频率低网络丢包检查网线、关防火墙
RViz报frame错误Fixed Frame不对改成hesai_lidar
点云位置乱跳TF树不完整检查是否有odom到雷达的TF
驱动启动即退出端口被占用杀掉占用2368的进程

5.3 那些文档里不会写的坑

第一个坑:AT128P的电源要求是9V到32V,典型功耗12W左右。如果你用USB供电或者劣质电源,雷达可能启动到一半就重启,表现是ping一会儿通一会儿不通。我建议用12V/2A以上的独立电源,别跟其他大功率设备共用。

第二个坑:网线。AT128P是千兆以太网,数据量很大,对网线质量敏感。我试过用一根便宜的扁平网线,ping通但点云丢包严重,换Cat6屏蔽线之后立刻稳定。如果你发现点云频率只有5Hz甚至更低,先换线。

第三个坑:主机IP不要设成192.168.1.1。有些路由器默认网关是.1,如果你主机也设.1,路由表会混乱。用.100之后的地址更安全。

第四个坑:如果你同时用多个雷达,每个雷达的IP要改成不同地址。禾赛提供了Web控制界面,浏览器输入雷达IP就能进配置页面改IP。但改完IP后,主机IP也要相应调整,或者加多个IP别名。

第五个坑:ROS2下启动驱动时,如果报“failed to create subscription”之类的错误,检查你的RMW实现。默认是FastDDS,但有些环境下CycloneDDS更稳定。切换方法:

export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp

然后重新启动驱动。

5.4 性能调优的几个实用参数

如果你发现点云数据量太大,RViz卡顿,可以在驱动配置里降采样。禾赛驱动支持设置publish_pointcloud_type,可以只发布部分点或者降低发布频率。

另外,ROS1下可以用nodelet方式加载驱动,减少进程间拷贝开销。禾赛的launch文件里通常有hesai_lidar_nodelet.launch,用这个启动比普通node方式CPU占用低一些。

对于SLAM建图,如果你用Cartographer,建议把点云先降采样再喂给SLAM。Cartographer的num_point_clouds参数控制每次处理的点云帧数,设成1到3之间比较平衡。太多会卡,太少会丢特征。

6. 从驱动到SLAM建图的衔接建议

雷达跑通之后,下一步通常是做SLAM建图。ROS2 Humble下用Cartographer的话,需要额外装ros-humble-cartographer和ros-humble-cartographer-ros。配置文件里要改几个关键参数:

TRAJECTORY_BUILDER_2D.num_accumulated_range_data = 1 TRAJECTORY_BUILDER_2D.min_range = 0.5 TRAJECTORY_BUILDER_2D.max_range = 50.0 TRAJECTORY_BUILDER_2D.voxel_filter_size = 0.05

max_range设成50米就够了,AT128P虽然能测200米,但远距离点云稀疏,对建图帮助不大,反而增加计算量。voxel_filter_size设0.05到0.1之间,太小计算量大,太大丢细节。

建图飘的问题,除了前面说的校正文件和TF,还有一个常见原因是IMU和雷达的外参没标定。如果你有IMU,建议用lidar_align或者手动标定,把雷达和IMU的旋转平移关系测准。没有IMU的话,纯激光SLAM在长走廊或者空旷区域容易飘,这是原理决定的,不是配置能解决的。

保存地图,Cartographer提供了cartographer_pbstream_to_ros_map工具,能把pbstream转成pgm和yaml:

ros2 run cartographer_ros cartographer_pbstream_to_ros_map -pbstream_filename=map.pbstream -map_filestem=map

生成的map.pgm和map.yaml可以直接给导航模块用。

最后分享一个我自己的习惯:每次调试雷达之前,先把网络配置和驱动启动步骤写成一个shell脚本,下次直接跑脚本,省得重新回忆。脚本里包含设置静态IP、source环境、启动驱动、启动RViz这几步。这样即使换电脑或者重装系统,也能快速恢复环境。

#!/bin/bash sudo ip addr add 192.168.1.100/24 dev enp3s0 source /opt/ros/noetic/setup.bash source ~/catkin_ws/devel/setup.bash roslaunch hesai_lidar hesai_lidar.launch & sleep 3 rviz -d ~/catkin_ws/src/HesaiLidar_General_ROS/rviz/hesai_lidar.rviz

这个脚本不一定适合所有人,但思路你可以参考。把重复劳动脚本化,把精力留给真正需要思考的算法和调参,这是我做了这么多年感知开发最实在的一条经验。

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

5个IO驱动20个LED:188数码管动态扫描与IO复用实战

/* 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 20:47:05

科研组会PPT设计:面向思维表达的结构化模板

/* 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 20:46:24

拆解BOM选型:安世、唯捷创芯、纽迪瑞三类国产芯片实战策略

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

作者头像 李华