ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

禾赛AT128P激光雷达ROS驱动接入与点云调试实战

禾赛AT128P激光雷达ROS驱动接入与点云调试实战 1. 从拆箱到点云AT128P接入ROS的真实链路禾赛AT128P这款激光雷达在自动驾驶和机器人感知圈子里热度一直不低128线的垂直分辨率、200米左右的探测距离、加上比较成熟的SDK生态让它成为不少SLAM和感知项目的首选传感器。但很多人拿到雷达之后卡在第一步——雷达上电了网线插了ROS驱动也装了rostopic list里就是看不到点云话题。问题往往不在驱动本身而在网络配置这一层。这篇内容面向的是刚拿到AT128P、准备在Ubuntu ROS环境下把它跑起来的开发者也适合那些驱动装好了但点云死活出不来、或者点云出来了但帧率不稳的人。我会把从网络规划、驱动编译、参数配置到点云验证的完整链路拆开讲重点放在网络配置这个最容易翻车的地方。整个流程基于ROS1 Noetic Ubuntu 20.04的组合来写ROS2的思路类似差异点我会单独标注。先说清楚AT128P的工作模式。它通过以太网输出点云数据雷达本身有一个固定的出厂IP你的主机需要配置一个同网段的静态IP才能和它通信。雷达的数据端口和HTTP配置端口是分开的点云走UDP组播或单播配置走HTTP。很多人以为插上网线就能通实际上主机的网卡如果还在DHCP模式或者被NetworkManager接管着静态IP根本配不上去这就是第一个大坑。我个人的习惯是在动ROS之前先用ping把雷达的Web界面打通。这一步过了后面驱动的问题就只剩参数层面的事。下面按实际操作的顺序展开。2. 网络配置AT128P驱动能不能跑起来的分水岭2.1 雷达出厂网络参数与主机网段规划AT128P的出厂默认IP通常是192.168.1.201子网掩码255.255.255.0数据目的端口默认是2368配置端口是80。不同批次的固件可能有细微差异拿到雷达后第一件事是确认它的实际IP可以问供应商也可以用禾赛的Web控制台工具扫描。主机这边你需要给连接雷达的那块网卡配一个同网段的静态IP比如192.168.1.100。这里有个关键点不要用你平时上网的那块网卡去连雷达。如果你只有一块网卡那就得接受连雷达的时候上不了外网或者用USB网卡单独接雷达。我见过有人把WiFi和有线网卡都配成192.168.1.x结果路由表冲突雷达时通时不通。网段规划建议单独划一个比如192.168.1.0/24只给雷达用。如果你的项目里有多台雷达每台的IP要错开主机网卡可以配多个IP别名或者用交换机把雷达都接进来主机配一个网段内的IP即可。2.2 Ubuntu下静态IP配置的三种方式与踩坑对比Ubuntu下配静态IP有好几种路子不同版本、不同桌面环境行为不一样这里把常见的三种列出来对比。配置方式适用场景优点坑点NetworkManager图形界面桌面版Ubuntu直观改完即生效重启后可能被DHCP覆盖IPv4设置里要选手动netplanUbuntu 18.04 服务端/桌面官方推荐配置集中YAML缩进敏感改完要netplan apply传统/etc/network/interfaces老版本或精简系统简单直接新版Ubuntu默认不装ifupdown可能不生效我实测下来桌面版用NetworkManager最省事但有个细节在IPv4设置里把方法改成手动之后地址、掩码、网关都要填。网关这一栏如果雷达网段没有网关可以留空或者填主机自己的IP但不要填你平时上网的网关否则默认路由会被抢走。netplan的配置长这样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.100 metric: 100注意renderer这一项如果写networkd桌面环境下NetworkManager可能会和它打架。我一般桌面版统一用NetworkManager作为renderer避免两套服务抢网卡。改完配置后用ip addr show enp3s0确认IP生效然后ping 192.168.1.201。如果ping不通先别急着怀疑雷达检查网线是不是插在正确的网口上有些工控机有多个网口编号和系统里的名字不一定对应。2.3 防火墙、组播与多网卡路由的隐蔽问题ping通了不代表数据能进来。Ubuntu默认的ufw防火墙如果开着可能会拦UDP数据包。用sudo ufw status看一眼如果是active临时关掉测试sudo ufw disable。生产环境里建议加规则放行2368/udp而不是直接关防火墙。组播是另一个隐蔽点。AT128P默认可能用组播方式发数据如果主机没有加入对应的组播组或者交换机不支持IGMP snooping数据就到不了应用层。禾赛的驱动一般支持配置单播模式把雷达的数据目的IP直接设成主机IP这样最稳。在Web控制台里把Destination IP改成主机IP模式选单播。多网卡路由的问题我在2.1提过这里展开说。当主机同时有WiFi默认路由和雷达网卡时系统会根据路由表决定数据从哪块网卡出去。雷达的响应包如果走了WiFi网卡就回不来了。解决办法是给雷达网段加一条明确的路由指定从雷达网卡出去sudo ip route add 192.168.1.0/24 dev enp3s0 src 192.168.1.100这条路由的metric要比默认路由低确保优先级。用ip route show确认路由表里雷达网段指向了正确的网卡。提示每次重启后手动加的路由会丢失建议写进netplan的routes里或者做成开机脚本。3. 驱动编译与参数配置让点云话题真正出现3.1 禾赛ROS驱动的获取与依赖处理禾赛官方在GitHub上维护了HesaiLidar_General_ROS这个驱动包支持AT128系列。ROS1和ROS2的仓库是分开的别下错。ROS1的包名一般是hesai_lidar。拿到源码后放到你的catkin工作空间的src目录下然后catkin_make。依赖方面驱动依赖pcl_ros、roscpp、sensor_msgs这些常规包一般ROS完整版都带了。如果编译报错找不到PCL装一下libpcl-dev。编译过程中有个常见报错是C标准的问题。新版驱动可能要求C14或C17在CMakeLists.txt里加一行set(CMAKE_CXX_STANDARD 14)如果用的是鱼香ROS一键安装的ROS环境基础依赖基本都齐了编译一般比较顺。但鱼香ROS装的是ROS本体雷达驱动还是得自己编译别指望一键脚本把驱动也装了。3.2 配置文件里的IP、端口与坐标系参数驱动跑起来之前要改配置文件。ROS1的驱动通常有一个config.yaml或者param.yaml里面几个关键参数lidar_ip雷达的IP比如192.168.1.201host_ip主机在雷达网段的IP比如192.168.1.100data_port数据端口默认2368frame_id点云的坐标系名字比如hesai_lidarpublish_type发布类型可选both、pointcloud、rawcoordinate_correction坐标修正一般设为trueframe_id这个参数要和你的TF树对上。如果你后面要接Cartographer或者LOAM做建图frame_id必须和URDF里定义的雷达link名字一致否则TF查不到建图直接飘。publish_type如果选raw发布的是原始数据包需要额外处理选pointcloud直接出sensor_msgs/PointCloud2最省事。我一般先用pointcloud验证数据通不通再考虑要不要原始数据。3.3 启动驱动并验证点云话题配置改好后source devel/setup.bash然后roslaunch hesai_lidar hesai_lidar.launch如果一切正常rostopic list里会出现/hesai_lidar/points或者类似的话题。用rostopic hz /hesai_lidar/points看频率AT128P正常应该在10Hz或20Hz取决于配置。如果频率是0或者话题不存在回到网络层排查。用rviz加载点云Fixed Frame设成hesai_lidar添加PointCloud2Topic选对应的话题。正常情况下能看到一圈一圈的扫描线。如果点云是空的检查rostopic echo有没有数据没有数据就是网络问题有数据但rviz不显示就是frame_id或rviz配置问题。注意rviz里如果Fixed Frame设成了map或odom而TF树里没有这些frame到雷达frame的变换点云不会显示。验证阶段直接用雷达自己的frame_id最稳。4. 点云出来了但不稳这些坑我替你踩过了4.1 点云断续、丢包与MTU的关系点云能出来但时不时断一下或者rostopic hz显示频率忽高忽低大概率是网络丢包。AT128P的数据量不小128线全开的时候每秒几十兆普通百兆网卡扛不住必须千兆。检查网卡协商速率ethtool enp3s0 | grep Speed确认是1000Mb/s。MTU也是个因素。默认1500的MTU在数据量大时可能触发分片增加丢包概率。可以尝试把雷达网卡的MTU调到9000巨帧前提是交换机和雷达都支持sudo ip link set enp3s0 mtu 9000改完MTU后要重新测试有些雷达固件不支持巨帧改了反而更糟。我一般先不动MTU丢包严重了再试。4.2 时间同步与点云时间戳异常AT128P支持PTP时间同步如果项目里对时间戳精度要求高需要配置PTP。普通SLAM应用里用雷达自己的时间戳一般够用但要注意ROS的时间系统和雷达时间戳的对应关系。如果点云时间戳出现跳变或者负值检查驱动的timestamp相关参数。有些驱动默认用主机时间给点云打时间戳有些用雷达内部时间。混用会导致TF变换出错建图时表现为轨迹突然跳一下。4.3 多雷达场景下的IP冲突与端口复用项目里用两台以上AT128P时每台的IP必须不同数据端口如果都用2368主机的驱动要能区分不同来源。禾赛驱动支持配置多个雷达实例每个实例绑定不同的雷达IP和端口。如果端口冲突可以把第二台雷达的数据端口改成2369驱动里对应改。多雷达的frame_id也要区分开比如hesai_front和hesai_rearTF树里分别配置外参。外参标定是另一个话题这里不展开但记住多雷达的点云合并之前外参必须准否则建图会重影。5. 从驱动到建图AT128P接Cartographer的衔接要点5.1 点云格式转换与话题重映射Cartographer默认吃的是sensor_msgs/PointCloud2AT128P驱动直接发布的就是这个格式所以不需要额外转换。但话题名字要对上Cartographer的配置里num_point_clouds和point_cloud_topic要指向雷达话题。如果驱动发布的话题是/hesai_lidar/pointsCartographer的lua配置里就写这个。有时候需要重映射remap frompoints to/hesai_lidar/points /5.2 IMU融合与建图飘的排查思路纯激光雷达建图在长廊或者特征少的环境里容易飘加IMU能明显改善。AT128P本身不带IMU需要外接。IMU和雷达的外参要标定时间戳要同步。建图飘的常见原因按概率排外参不准、时间戳不同步、点云丢帧、运动过快导致帧间匹配失败。排查的时候先看rostopic hz确认点云频率稳定再看TF树里雷达到base_link的变换是否正确最后才怀疑算法参数。Cartographer的TRAJECTORY_BUILDER_3D相关参数里min_range和max_range要根据AT128P的实际探测范围调设太大把噪声点也吃进去设太小丢有效点。AT128P有效距离200米但建图时一般用30到50米就够了远处的点噪声大。5.3 保存地图与后续验证Cartographer建完图用rosservice call /write_state保存pbstream再用cartographer_pbstream_to_ros_map转成pgm和yaml。验证地图质量的时候重点看墙壁是不是直的、回环有没有闭合。如果墙壁是弯的说明外参或者时间同步有问题。我一般会先用小场景跑一遍确认整个链路通了再去大场景。小场景里如果有问题排查成本低很多。6. 一些让部署更顺手的个人习惯我在多个项目里用AT128P慢慢形成了一套自己的检查清单。拿到雷达先确认固件版本和出厂IP用Web界面改单播、改目的IP然后配主机静态IPping通之后再动驱动。驱动编译完先不改参数用默认配置跑一遍看话题出不出来出来了再逐项调。网络配置这块我强烈建议单独用一块网卡接雷达不要和上网网卡混用。如果只能用一块网卡那就接受切换网络的不便别想着同时上网和连雷达路由冲突会让你怀疑人生。还有个小技巧把雷达的配置参数和主机的网络配置写成一个脚本换机器的时候一键执行省得每次重新配。脚本里包含ip addr add、ip route add、ufw规则这些跑完直接启动驱动。最后说一句AT128P的驱动和固件更新比较频繁遇到奇怪的问题先去禾赛的GitHub issues里搜一下很可能别人已经踩过了。固件升级有时候能解决一些莫名其妙的丢包问题但升级有风险升之前确认好回滚方案。
返回列表