
这台组合其实不是官方现成方案需要自己把驱动、话题、外参全串起来才行。这篇文章我会把手上的配置过程、踩坑点和调参思路完整写出来包括PandarXT-16的驱动配置、LpmsIG1的IMU数据接入、外参标定、lio-sam参数修改以及最后跑通的一整套流程。如果你是实验室里想用国产雷达配工业IMU跑lio-sam的人这篇文章应该能帮你省下不少时间。在动手之前先把整体架构想清楚PandarXT-16负责出16线点云LpmsIG1负责出九轴原始数据和姿态四元数两个数据在驱动层就要抓好时间戳然后喂给lio-sam做紧耦合的激光惯导SLAM。lio-sam对IMU的外参和频率非常敏感这一步如果凑合了后面建图很容易飘。1. 硬件平台与整体架构设计1.1 为什么选这套传感器组合先说结论这套组合的核心优势就六个字低成本、够验证。PandarXT-16是16线机械式雷达测距范围大概在100米左右垂直视场角覆盖-6度到16度附近水平360度扫描10Hz出帧单帧点数大约在10万级别。这些参数对于低速机器人和室外园区场景完全够用。阿努比LpmsIG1是一款带内卡尔曼姿态解算的工业级IMU支持串口和CAN口输出能直接出100Hz以上的加速度、角速度和四元数不需要在软件里再写复杂的姿态融合算法这对快速集成是很大的便利。如果你用的是Pandar64或者128线的Pandar系列那这套方案同样适用只需要在后续配置里把线数和话题名改掉即可。但对于刚入门SLAM或者要快速验证算法效果的人来说16线雷达加千元级IMU基本是性价比最优的组合。至于为什么选lio-sam而不是LIO-SAM的老版本LOAM或者FAST-LIO、LIO-SAM的其他变体我后面在算法选型部分会展开。先记住一点lio-sam把激光里程计的结果做了因子图优化地图和位姿的整体一致性比纯滤波方案强很多如果你的场景里有环形路口需要回环检测优势更明显。1.2 系统框架和数据流梳理整个系统可以拆成四个模块传感器驱动层、消息中间层、SLAM核心层、可视化与存储层。传感器驱动层由PandarXT-16的官方ros驱动和自写的LpmsIG1驱动节点组成分别发布PointCloud2格式点云和sensor_msgs/Imu格式的IMU数据。消息中间层主要处理时间同步和坐标变换这一步直接决定lio-sam能不能稳定跑起来。SLAM核心层运行lio-sam它同时订阅点云和IMU数据经过点云特征提取、IMU预积分、scan-to-map配准和因子图优化这几个环节最终输出机器人的位姿和增量式地图。可视化层通常在rviz里完成同时通过tf树把map、odom、base_link、laser_link或者sensor_frame这几个坐标系关联起来。数据流的顺序是这样的雷达和IMU各自采集数据打上时间戳分别发布到对应的topiclio-sam的两个回调函数在收到消息后做时间对齐。如果两个设备的时钟不同步或者驱动里没有做时间戳修正lio-sam内部的scan-to-map配准就会把点云配成扭曲的这在后面排错时非常容易踩到。1.3 LIO-SAM算法选型分析lio-samTightly-coupled Lidar Inertial Odometry via Smoothing and Mapping是一款在LeGO-LOAM基础上扩展形成的紧耦合激光惯导SLAM框架最大的特点是引入了GTSAM因子图做全局优化。它的核心思想是先利用IMU做高频运动估计对点云去畸变再提取面特征和角特征做scan-to-submap配准最后把IMU预积分因子、激光里程计因子、回环检测因子一起放入因子图里优化。这里说一下为什么不用纯雷达方案。PandarXT-16在快速转弯和上下坡的时候如果只有点云信息匹配非常容易退化尤其是在长直走廊或者空旷操场这种场景几何特征不足会导致位姿漂移。加上IMU后即使点云匹配退化IMU预积分也能在一段时间内维持较好的位姿估计。lio-sam的另一个优势是对16线雷达做了专门的特征提取逻辑通过地面分割和聚类把每帧点云分成地面点、非地面特征点和噪声点再分别做配准计算负担相对可控。这个框架也有两个明显的坑一是对外参非常敏感雷达到IMU的外参如果差个三度建图就会明显重影或扭曲二是对IMU频率有最低要求如果IMU只有10Hz预积分效果会很差跑起来大概率飘。LpmsIG1本身支持高频率输出这点是能满足的唯一要操心的就是把驱动调对。2. 驱动配置与时间同步实战2.1 PandarXT-16官方驱动安装与话题配置禾赛官方提供了两个驱动包pandar_pointcloud和pandar_driver。建议直接用pandar_pointcloud它包含了原始点云解析和点云转换功能能直接输出sensor_msgs/PointCloud2同时还会输出/pandar开头的几个坐标话题。安装前需要确认系统里装了libpcap-dev、yaml-cpp和pcl-ros否则编译会报错。mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone https://github.com/HesaiTechnology/pandar_pointcloud.git cd ~/catkin_ws catkin_make编译完成后启动雷达驱动有两种方式。第一种是直接跑launch文件需要修改pandar_pointcloud/launch/pandar_xt16.launch里的参数包括雷达IP地址、目标端口、数据端口、坐标帧名以及是否发布点云话题launch node namepandar_node pkgpandar_pointcloud typepandar_node outputscreen param namepandar_ip value192.168.1.201 / param nameframe_id valuelidar_link / param namepublish_pointcloud valuetrue / param namepublish_raw_pointcloud valuefalse / param namepublish_scan valuefalse / /node /launch雷达的默认IP通常是192.168.1.201你需要在电脑网卡上配一个同网段的静态IP比如192.168.1.100然后直接网线连接。启动之后先别急着开lio-sam先在rviz里把/pandar或你设置的点云话题显示出来确认点云无断层、没有大面积黑点和错位再继续往下走。雷达驱动话题名我建议改成/velodyne_points或者/points_raw这样和lio-sam的默认参数更接近后面改动更少。在rviz里看到的点云如果出现半圈有半圈没有的情况先查网线接触和交换机流量这个问题几乎都是链路丢包导致的和驱动版本关系不大。2.2 LpmsIG1的IMU驱动开发思路LpmsIG1的官方驱动不一定直接适配ROS版本很多场景下需要自己写一个ROS节点来解析串口数据帧。这块比较关键我详细说说思路。首先确认通信方式LpmsIG1通常支持串口TTL和RS232两种我用的是USB转串口模块在Linux下的设备名一般是/dev/ttyUSB0。接着确认输出协议LpmsIG1支持文本协议和二进制协议二进制协议的数据帧以帧头开始里面包含加速度、角速度、磁力计、四元数等字段。建议优先用二进制协议解析效率高、帧率稳定文本协议在30Hz以上容易丢帧。初始化时向串口发送指令配置输出频率和数据内容。假设你想让IMU输出100Hz的加速度和角速度有的设备需要分两次配置先设频率再设数据项。注意完成配置后最好回读一下寄存器或者看返回帧确认配置生效否则有些模块会因配置未保存而重启后恢复默认参数。接下来写一个简单的ROS节点核心逻辑如下#include ros/ros.h #include sensor_msgs/Imu.h #include serial/serial.h int main(int argc, char** argv) { ros::init(argc, argv, lpms_imu_node); ros::NodeHandle nh; ros::Publisher imu_pub nh.advertisesensor_msgs::Imu(/imu/data_raw, 100); serial::Serial ser; ser.setPort(/dev/ttyUSB0); ser.setBaudrate(921600); ser.setTimeout(serial::Timeout::max(), 200, 0, 200, 0); ser.open(); std::vectoruint8_t buffer; while (ros::ok()) { if (ser.available()) { uint8_t byte 0; ser.read(byte, 1); // 这里根据协议帧头判断 buffer.push_back(byte); // 检测到完整一帧后解析 if (buffer.size() FRAME_LEN buffer[0] 0xAA) { // 解析函数提取acc和gyro sensor_msgs::Imu msg; msg.header.stamp ros::Time::now(); msg.header.frame_id imu_link; msg.linear_acceleration.x acc_x; // ... imu_pub.publish(msg); buffer.clear(); } } } }上面的代码只是一个框架实际解析时要根据LpmsIG1的数据手册里的字段顺序来比如有的协议是先输出加速度后输出角速度有的先角速度后加速度字段顺序错了数据就完全对不上。发布IMU话题时加速度单位必须是m/s^2角速度单位必须是rad/s这非常关键。很多IMU驱动默认输出的是g重力单位和°/s如果没有做单位换算lio-sam跑起来会直接发散后端的robot_localization甚至会把位姿解算出飞。LpmsIG1的原始输出单位建议好好看手册如果默认是g和°/s在代码里乘上9.8和π/180就能解决。2.3 时间戳同步的三种方案对比激光雷达和IMU的时间戳不对齐是lio-sam跑飞的常见原因。PandarXT-16的点云时间戳默认取自接收时刻LpmsIG1如果用串口接收时间戳也来自系统启动时刻。这两者之间没有硬件PPS同步那就只能在软件层面做近似。有三种方案可以选我按推荐优先级排列方案原理适合阶段注意事项A. 软件时间戳对齐在驱动回调里直接用ros::Time::now()打戳快速验证两台设备共用同一台电脑时误差较小B. 雷达PTP IMU软件打戳雷达通过PTP同步到主机时钟IMU依然软件打戳正式建图需要雷达支持PTP且交换机组播配置正确C. 硬件同步触发雷达提供PPS秒脉冲IMU通过外部引脚接收并同步高精度场景实现复杂需要IMU支持外部同步输入我实测下来在室内机器人低速场景方案A完全够用时间戳偏差在20ms内lio-sam都能通过IMU预积分做一定程度的补偿。方案B更稳如果雷达支持PTP强烈建议配起来因为PandarXT-16点云帧里的每个点其实都有自己的时间偏移驱动可以根据点的时间戳做去畸变这个在车辆高速运动时作用明显。无论选择哪种方案都要记住一个原则时间戳系统必须单调递增。如果发现建图时地图在同一个地方反复错位先看imu数据的时间戳是否有回退串口缓冲偶尔会把老数据延迟很久才发布出来这个问题排查起来很隐蔽数据量大时尤其容易触发。3. 外参标定与坐标系配置3.1 雷达到IMU外参标定的三种路径外参标定是lio-sam里最容易被忽略又最影响结果的环节。所谓外参就是雷达坐标系和IMU坐标系之间的旋转矩阵和平移向量。lio-sam在config/params.yaml里通过extrinsicRot和extrinsicTrans两个参数来配置。有三种方式可以拿到外参第一种是直接测量法。用卷尺或者卡尺在设备外壳上量出IMU的中心位置相对雷达旋转中心的距离旋转量根据安装面的几何关系估算。这个方法最粗糙只能作为初值误差通常在几厘米到几度但可以给后续优化提供一个不错的起点。第二种是手动调参法。把lio-sam跑起来观察建图效果若发现点云在直线运动时正常、转弯时层叠说明旋转外参里对应的轴向偏了。手动反复调整yaw、pitch、roll这几个角度直到建图不再出现重影。这个过程可能耗时几小时但不需要额外工具适合没有标定板的情况。第三种是自动标定法。目前社区里最有名的是MIT的lidar_IMU_calib工具包它利用连续帧的雷达点云和IMU数据做联合优化能够同时估计旋转和平移外参以及时间偏移。这个工具在室外环境下效果尚可但在室内结构化不足的场景容易退化。另一种思路是利用lio-sam自带的在线外参估计功能把extrinsicEstimation设为true然后在运行初期外参会自动收敛到你设定的初值附近。官方文档也提到在线标定只能在系统启动阶段开启不要长期开着跑否则协方差估计会慢慢不稳定。3.2 标定实操从初值到收敛的完整流程我强烈建议你先用测量法拿到初值再开lio-sam的在线外参估计跑一段“8字”轨迹最后把收敛后的外参写进配置文件固定下来。这样做的原因很简单在线外参估计对初始值比较敏感如果你给的初值偏差太大优化的结果可能收敛到局部最优解反而比真实外参更差。具体做法是先在设备安装面上定好三个基准点量出IMU安装平面到雷达底面的高度差再量出IMU的x方向和雷达正前方的夹角。PandarXT-16的坐标系是z轴向上、x轴朝前有的版本是x轴朝某个固定方向建议以驱动文档为准IMU的坐标系通常是x轴朝前、y轴朝左或右。这样整理出来的平移量可以控制在2cm以内旋转量可以控制在2度以内作为初值足够了。然后启动lio-sam把extrinsicEstimation设为true在室外找一片有树木、路灯、围墙的场景让机器人走几个大的“8字”和“S弯”速度不要太快但一定要有转弯。运行结束后lio-sam的日志里会打印出估计出的外参或者在tf树中看body坐标系和lidar_link坐标系的变换把这个结果替换掉extrinsicRot和extrinsicTrans然后关闭在线估计重新建图。我个人的习惯是第一次关掉在线估计跑一遍看地图有没有大的漂移第二次开在线估计再跑一遍对比两次的差异。如果两次结果的轨迹误差明显说明外参收敛方向不对反过来检查初值是否给错了特别是PandarXT-16的yaw方向因为机械式雷达比较难以从外观上直接判断哪个方向是正前方。3.3 坐标系的定义与TF树配置lio-sam正常运行需要的坐标系有map全局坐标系建图的参考系。odom里程计坐标系由lio-sam内部的因子图优化输出。base_link机器人本体坐标系对应IMU的安装位置。lidar_link雷达坐标系。imu_linkIMU坐标系驱动里发布的坐标帧。在驱动里我把点云的frame_id设成lidar_linkIMU的frame_id设成imu_link然后在lio-sam的launch文件里修改变换关系。需要注意lio-sam内部通过tf树维护map - odom - base_link的变换而base_link到sensor雷达和IMU的变换需要你额外提供通常用一个static_transform_publisher发布。node pkgtf2_ros typestatic_transform_publisher namebase_link_to_lidar_link args0 0 0.2 0 0 0 base_link lidar_link / node pkgtf2_ros typestatic_transform_publisher namebase_link_to_imu_link args0.03 0 0.05 0 0 0 base_link imu_link /这里的平移和旋转要和外参配置保持一致否则lio-sam内部维护的坐标变换和tf树对不上rviz里显示的地图和点云会明显分离。最省事的做法是把base_link直接设在IMU中心再单独发布雷达到IMU的变换这样后续接入机器人底盘时只需再发布一个底盘到IMU的变换即可。4. lio-sam配置修改与建图参数调优4.1 修改params.yaml的核心参数下载lio-sam源码后进入config/目录编辑params.yaml。很多朋友在这里只改了雷达和IMU的话题名结果跑起来点云显示正常但地图完全不成形问题往往出在以下几个参数上。sensor: points_topic改成你的点云话题名比如/points_raw。imu_topic改成你的IMU话题名比如/imu/data_raw。scanPeriod雷达旋转一圈的周期。PandarXT-16是10Hz所以设成0.1如果雷达设成20Hz则改成0.05。N_SCANS雷达线数这里必须设成16。minimumRange最小有效测距一般设为0.2太小会把机器人自身壳体上的点也算进去干扰特征提取。maximumRange最大有效测距可以设成100超出这个距离的点直接滤除减少动态物体干扰。extrinsicTrans用上一步标定得到的平移量顺序是x、y、z。extrinsicRot是旋转向量用轴角形式表示不是欧拉角注意单位是弧度。这里非常容易出错如果你把欧拉角的度数直接填进去整个系统的坐标变换就会彻底错乱。extrinsicEstimation先设成true做在线估计收敛后改回false。savePCD如果想把建好的地图保存为点云PCD文件设成true同时指定savePCDDirectory。我习惯把downsampleRate保持默认或设为1因为PandarXT-16本身点数不算多如果设成2会丢掉一半点后面的特征提取容易不稳定。4.2 launch文件的关键节点lio-sam的launch/run.launch文件里除了lio_sam_imuPreintegration和lio_sam_imageProjection这两个重要节点外还有lio_sam_mapOptimization负责因子图优化和地图发布。这三个节点缺一不可。在launch里还需要给lio_sam_imuPreintegration节点设置参数use_sim_time和bag_filename。如果你打算离线跑bag包就把use_sim_time设为true并指定bag文件路径如果是实时在线运行保持false。另外launch文件里默认会启动一个rviz它会读取lio-sam自带的rviz配置文件里面帮你预设好了地图、路径、点云这几个显示面板非常方便。但注意不要在资源受限的板载电脑上开rviz最好把rviz跑在笔记本上通过局域网共享ROS环境数据会稍微增加一点延迟但对建图影响不大。启动命令分两步# 终端1运行驱动节点 roslaunch pandar_pointcloud pandar_xt16.launch roslaunch lpms_imu_node lpms_imu.launch # 终端2运行lio-sam roslaunch lio_sam run.launch启动后观察lio-sam节点的日志正常情况会看到Initialization finished和mapOptimization ...的输出。如果长时间卡在Initialization阶段没有输出里程计信息多半是IMU话题没有数据或者点云和IMU的时间戳偏差太大先去rostopic hz /imu/data_raw和rostopic hz /points_raw确认频率。4.3 建图参数的实际调优经验调参这件事是最难在文档里说得清的因为不同场景差异很大。我分享几个实战经验第一16线雷达的垂直视场角有限建图时最好让雷达保持大致水平仰角过大会导致远处地面点全部丢失scan-to-map匹配容易退化。安装时如果雷达自带底座有倾角建议在params.yaml里通过外参的旋转量做补偿。第二在室内长走廊场景控制移动速度在0.5m/s以内同时注意不要做太急促的转弯。lio-sam的IMU预积分可以消除大部分运动畸变但如果瞬间角速度过大还是可能出现点云分层。第三遇到地面反光的停车场或镜面场景建议把groundRemovalAngle适当调大一点或者把segmentation的参数微调保证地面点的数量足够。这个参数如果太小地面分割会把太多点算作障碍物配准时容易把地面点也参与特征匹配导致建图倾斜。第四保存地图时用Map主题的PCD输出这个地图是增量式构建的全局地图。我通常会一边建图一边往场景里多走两圈让回环检测能把漂移拉回来保存出来的PCD地图质量会高很多。5. 常见问题与排查技巧实录5.1 点云显示正常但建图发散怎么办这是最典型的故障现象rviz里点云看起来是对的但地图上轨迹逐渐漂移最后完全乱掉。先检查IMU话题有没有数据rostopic hz /imu/data_raw如果显示0说明驱动没起或串口没通。再看rostopic echo /imu/data_raw -n 3确认加速度数值在一两个g附近角速度在静止时接近0。如果加速度都在0附近漂移单位肯定是错的乘以9.8即可。还有可能是外参的平移和旋转符号不对尤其是z轴方向。很多人在量好高度差后遗漏了重力加速度方向问题导致IMU的加速度计读数被当成反向预积分结果反了。这时候在建图启动后几秒内就会看到位姿一直往下掉或者往上飞直接看imu原始数据的重力方向是否和点云坐标系一致就能判断。5.2 IMU数据噪声和频率不达标我在实际使用中发现LpmsIG1在串口波特率配置较低时最高只能稳定输出50Hz左右这会导致lio-sam的IMU预积分更新频率不足建图时转弯段会出现明显的相位延迟感特征匹配频频失败。解决方法是把波特率调到921600并确认IMU的输出频率确实达到100Hz以上不要只看驱动里配置的值要用rostopic hz实测。IMU的输出如果带了低通滤波需要在驱动配置里关闭或降低滤波等级。lio-sam需要的是原始高频数据而不是经过平滑的“美化数据”过度滤波会降低对外部激励的响应速度导致建图在颠簸路段出现明显的跟踪滞后。5.3 launch启动报错和坐标变换异常常见的报错有两类一是TF_OLD_DATA这说明某两个坐标系之间的变换长时间未更新通常是静态坐标变换发布的时间戳落后于当前时间二是Frame id /lidar_link not found说明tf树里没有这个坐标系或者名字大小写不一致。建议先把rviz左侧的TF面板打开看所有坐标系的父子关系确认map - odom - base_link - sensor这棵树是完整的。还有一类隐蔽问题是launch文件里启动顺序导致的。lio-sam的初始化阶段会订阅tf如果驱动还没有发布雷达和IMU的坐标变换lio-sam会直接等在那里。建议先启动驱动节点等tf树稳定出现后再启动lio-sam。5.4 回环检测不生效或者误检PandarXT-16的16线结构导致点云稀疏在纯几何特征不足的场景里回环检测很容易误检。如果在实验结果里发现漂移没有被有效约束先降低回环检测的loopClosureDistThreshold比如从默认的6米改成4米提高触发难度减少误检。还可以调整icpThreshold默认的0.0625在16线雷达上可能会漏检可以适当放松到0.1附近但这个值太大会导致错误的回环被加入因子图反而把地图搞乱。如果回环明明检测到了但地图在回环附近出现“撕裂”的感觉多半是IMU的外参不够准确回环约束和IMU预积分之间有较大的矛盾。这时候先别急着调回环参数回头把外参再精标一遍效果会更直接。5.5 实机运行中的其他幺蛾子雷达在工作一段时间后建图突然卡顿先看系统CPU占用率。PandarXT-16驱动本身占用不高但lio-sam三个节点加起来的CPU占用在i5级别的工控机上可能达到80%以上这时可以通过降低点云的发布频率或者在驱动里降低点云密度来缓解。串口插拔后设备名变化导致IMU驱动启动失败。可以用udev绑定USB设备的vendor和product ID固定生成/dev/lpms_imu这个设备名避免每次插拔都去改驱动配置。在强光或者雨雾天气工作雷达点云会出现明显噪点。如果是室内场景少见如果是室外建图尽量选在阴天或者傍晚或者开启驱动里的滤波选项把强度值低于阈值的点滤除。6. 建图质量评估与后续扩展6.1 画轨迹评估几何精度建图完成之后参考的客观指标就是轨迹精度。比较简单的办法是让机器人沿着地面上一条已知长度的直线走对比lio-sam输出的位姿位移和真实位移的偏差。我用过的流程是在起点放置一个标志物遥控机器人以0.3m/s的速度沿直线走20米然后停止记录lio-sam的轨迹终点坐标。偏差在1%以内是比较好的结果。另一个方法是重叠映射在同一片区域建两遍图把两张PCD导入CloudCompare用ICP把两片点云对齐看均方根误差。如果重叠区域的误差在20cm内说明建图效果已经可以接受。当然这种方法没有真正的RTK真值那么严谨但对于快速验证完全够用。6.2 保存PCD地图并在其他工具中使用lio-sam跑完把/map这个topic存成PCD文件命令如下rosrun pcl_ros pointcloud_to_pcd input:/map生成的PCD文件可以用CloudCompare打开也可以转成PLY格式导入Blender或MeshLab进行后续的模型处理。这里有件小事要提醒lio-sam在保存地图时点的强度值可能没有实际参考意义如果想要高质量的地图最好在建图时让雷达的强度信息保留下来然后后续基于强度值做滤波。6.3 接入导航与机器人底盘如果你建图的下一步是要做导航那需要把lio-sam输出的odom话题转发到navigation栈里或者把lio-sam的位姿估计作为map到base_link的tf发布出来。注意lio-sam默认输出的odom是map - base_link还是odom - base_link取决于launch里的相关系数设置。一般在接入move_base前我会把lio_sam_odom这个topic重新map到odom话题同时把map固定在原点这样move_base的costmap才不至于和全局定位冲突。如果你要接入的是AGV或者轮式机器人建议在lio-sam之外加一个robot_localization做滤波融合把轮式里程计和lio-sam输出的位姿一起做融合这样即使在激光退化、雷达短暂遮挡的场景里机器人也能保持一定的位姿估计稳定性。6.4 还有哪些算法可以接着玩这套硬件组合除了lio-sam之外也完全可以跑FAST-LIO2和Point-LIO。FAST-LIO2同样紧耦合激光和IMU而且在特征提取上更加轻量对算力要求更低适合部署到树莓派或者NVIDIA Jetson这类小型算力平台上。Point-LIO则把IMU的作用发挥到极致对高动态场景的适应性更强如果你后续要让机器人跑得更快、场景更颠簸值得试试。根据我个人的使用体验lio-sam在综合效果和可调试性上确实最优因为它提供了非常清晰的中间变量和可视化面板出了问题你能很直观地看到是前端配准出错还是后端优化发散。7. 写在最后的一些体会这套“PandarXT-16 LpmsIG1 lio-sam”的组合我断断续续调了两三周才达到比较稳定的效果中间踩过最多的就是外参和时间同步两个坑。如果一开始就把外参初值量准、把IMU频率和单位调对整个流程大概率一两天的调试就能跑通。回看整段经历最觉得值得沉淀的经验是遇到建图漂移不要急着调算法参数先回去把数据层和坐标变换层的问题排查干净很多看似算法的问题其实是硬件和配置的问题。另外16线雷达的垂直视场角注定能提取的特征不如64线丰富所以在设计实验路线时尽量让机器人走在有建筑、路灯、树木交替出现的区域这样才能给回环检测和特征匹配提供足够约束。如果手头有更高线的雷达这套流程完全可以直接平移过去使用。