ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

镭神N10P在ROS2下的驱动、数据可视化与SLAM建图实战

镭神N10P在ROS2下的驱动、数据可视化与SLAM建图实战 1. 镭神N10P这颗雷达到底值不值得折腾先说结论如果你手里正好有一台镭神N10P又想通过它把ROS2的驱动、数据可视化、SLAM建图这条链路完整跑通那这篇文章就是给你写的。如果你还没买正在纠结选哪一款入门雷达N10P也确实是目前性价比很高、资料相对齐全的一个选择。镭神N10P本质上是一颗360度扫描的2D激光雷达采用TOF飞行时间测距原理测距范围一般在0.1米到30米左右扫描频率典型设置在10Hz。相比三角测距原理的雷达比如常见的RPLIDAR A系列TOF雷达在强光下的表现更好测距也更远不过价格通常也要贵一截。N10P在镭神的产品线里定位是入门级TOF雷达所以它在二手市场和开发板套餐里出现频率很高很多做教学机器人、室内移动底盘的朋友都会用到它。在ROS1时代镭神官方就提供了lslidar驱动系列社区反响不错。到了ROS2时代官方和社区也都维护了对应的ROS2驱动版本主要是lslidar_driver的ROS2分支或ros2_lslidar_driver。但这里有一个很现实的问题ROS2的生态和ROS1差别很大从底层通信DDS、节点生命周期管理到参数系统都不一样驱动编译、串口权限、launch文件写法这些环节每一步都可能踩坑。网上关于N10P的教程很多还停留在ROS1阶段直接照着做在ROS2里根本跑不起来。这篇文章是我自己在ROS2下从零驱动N10P、并且最终跑通SLAM建图的全过程记录。内容包括环境规划、驱动编译、参数配置、数据验证、SLAM选型和实际建图最后附上我踩过的坑。如果你用的是其他型号的镭神雷达比如N10、N301、C16等大部分内容同样有参考价值因为驱动框架是共通的。2. 环境规划别一上来就装最新的ROS22.1 ROS2版本与Ubuntu版本的匹配关系很多人拿到雷达的第一步就是装ROS2这本身没错但错在没想清楚自己要用什么版本的ROS2。ROS2的版本和Ubuntu版本严格绑定装错组合会导致依赖地狱。以我实际测试过的组合为例Ubuntu版本对应的ROS2版本支持状态个人评价Ubuntu 20.04Foxy Fitzroy已停止维护稳定但偏老不少新包不兼容Ubuntu 22.04Humble Hawksbill维护中长期支持目前最推荐的ROS2 LTS版本Ubuntu 24.04Jazzy Jalisco维护中太新部分驱动源码需要自己patch我自己用的是Ubuntu 22.04 ROS2 Humble。为什么选Humble而不是最新版原因很简单镭神驱动的ROS2版本在Humble上测试最充分。虽然ROS2的API设计相对稳定但不同发行版之间编译工具的版本差异会导致源码编译报错。Humble用的是gcc 11.2Jazzy用gcc 13老代码在新编译器下经常会出现一些头文件兼容性的问题。如果你不想把时间花在修驱动源码上就老老实实选Humble。2.2 一键安装脚本和手动安装怎么取舍ROS2的安装方式有两种主流路径一是官方二进制的apt安装二是鱼香ROS的一键安装脚本。很多新手图省事直接用一键脚本我不反对但我建议你在用脚本之前先明白它在干什么。鱼香ROS一键安装脚本其实就是帮你自动添加ROS2的apt源、设置密钥、执行apt更新和安装核心包然后帮你配置环境变量省去了手动敲那十几条命令的麻烦。它的本质是“把官方步骤自动化”。但问题是脚本执行过程中如果碰到网络问题或者源的问题它会重试过程中的报错信息容易被刷屏冲掉你很难判断到底哪一步出了问题。我更推荐的做法是# 设置编码 sudo apt update sudo apt install locales sudo locale-gen en_US en_US.UTF-8 # 添加ROS2源 sudo apt install software-properties-common curl sudo add-apt-repository universe sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release echo $UBUNTU_CODENAME) main | sudo tee /etc/apt/sources.list.d/ros2.list /dev/null # 安装ROS2 Humble桌面版包含Rviz2和demo sudo apt update sudo apt install ros-humble-desktop桌面版已经包含了Rviz2、demo节点、tf2等SLAM建图需要的基础工具不需要再额外装太多东西。装完以后记得把环境变量写进.bashrcecho source /opt/ros/humble/setup.bash ~/.bashrc source ~/.bashrc2.3 串口权限驱动能装的通不代表雷达能启动这一步是整个环境配置里最容易被忽视、但报错率最高的一环。N10P雷达通过串口转USB模块常见的是CP2102或CH340芯片和电脑连接然后映射为Linux下的/dev/ttyUSB0设备节点。问题在于默认情况下/dev/ttyUSB0的权限属于dialout组普通用户没有读写权限。如果你不以sudo权限运行ROS2节点驱动在打开串口的时候会直接报错类似Failed to open serial port /dev/ttyUSB0: Permission denied很多初学者这时候开始怀疑驱动有问题反复重编译浪费时间。解决办法有两个我的建议是把两个都做了第一种把当前用户加入dialout组sudo usermod -a -G dialout $USER执行完必须重新登录或者重启终端组权限才会生效。第二种写udev规则让系统在插入雷达的时候自动赋予权限。这一步更重要尤其是你以后要把雷达接到树莓派或者Jetson这种嵌入式板子上重复拔插的时候能少很多麻烦。sudo nano /etc/udev/rules.d/99-lslidar.rules写入以下内容KERNELttyUSB*, ATTRS{idVendor}10c4, ATTRS{idProduct}ea60, MODE0666, GROUPdialout这里10c4是CP2102芯片的厂商IDea60是产品ID。如果你用的是CH340芯片厂商ID是1a86产品ID是7523。不确定的话插入雷达后运行lsusb看一眼就能确认。保存后执行sudo udevadm control --reload-rules sudo udevadm trigger然后重新插拔雷达。这时候再看ls -l /dev/ttyUSB0应该能看到权限已经是crw-rw-rw-这说明普通用户可以直接访问串口了。2.4 工作空间和编译工具链的准备ROS2的源码编译统一用colcon这跟ROS1时代的catkin_make是两套不同的体系。sudo apt install python3-colcon-common-extensions然后创建你的工作空间mkdir -p ~/n10p_ws/src cd ~/n10p_ws colcon build这个空编译主要是为了验证工作空间本身没毛病顺便生成install/setup.bash等文件。之后你每次在这个工作空间里编译新包都在~/n10p_ws目录下执行colcon build编译完记得source ~/n10p_ws/install/setup.bash这里有一个经验教训ROS2的package依赖解析比ROS1严格得多。如果你编译某个包时报错说找不到某个依赖不要硬编先用rosdep装依赖sudo apt install python3-rosdep sudo rosdep init rosdep update cd ~/n10p_ws rosdep install -i --from-path src --rosdistro humble -yrosdep会扫描src目录下所有包的package.xml自动把缺失的ROS依赖全部装好。这一步能解决大概80%的编译错误。3. 驱动获取与源码编译N10P的ROS2驱动到底怎么装3.1 lslidar系列的ROS2驱动结构镭神雷达的ROS2驱动在GitHub上有多个仓库命名方式比较混乱新手容易搞不清哪个才是自己需要的。我实测下来最可靠的是官方仓库LSLidar_ROS2_driver有些地方也叫ros2_lslidar或lslidar_driver的ROS2分支这个仓库支持镭神全系列的TOF雷达包括N10、N10P、N301、C16、C32等。仓库里主要包含几个包包名作用lslidar_driver驱动核心负责串口/网络数据解析、点云生成、tf发布lslidar_msgs自定义消息类型主要定义雷达原始数据格式lslidar_launchlaunch文件包含各种型号雷达的启动配置你需要把整个仓库clone下来而不是单独clone某一个包因为lslidar_driver依赖lslidar_msgs分开clone会导致依赖缺失。cd ~/n10p_ws/src git clone -b ros2 https://github.com/LSLidar_ROS2_driver/LSLidar_ROS2_driver.git注意分支名。有些仓库的默认分支是ROS1的你必须切换到ros2分支才能用。clone下来之后用ls确认一下分支git branch -a如果显示当前在ros2分支就继续。如果不在执行git checkout ros2切换。3.2 源码编译和常见报错编译之前先确认依赖cd ~/n10p_ws rosdep install -i --from-path src --rosdistro humble -y然后开始编译colcon build --symlink-install--symlink-install这个参数建议加上它的作用是让编译产物以符号链接的方式指向源码目录。好处是你改了Python脚本或者launch文件之后不用重新编译重启节点就生效。对于驱动调试阶段来说这个特性非常省时间。编译过程中我遇到过两个比较典型的报错。第一个是编译lslidar_driver时报缺少rclcpp头文件。这个本质上是因为ROS2基础库没有完整安装只装了ros-humble-ros-base而不是ros-humble-desktop。解决办法把桌面版补装上。第二个报错跟ament_cmake版本有关报错信息类似Could NOT find ament_cmake (missing: ament_cmake_DIR)这时候需要检查你的编译环境变量是否污染因为如果你之前装过ROS1source /opt/ros/noetic/setup.bash这类环境变量会和ROS2冲突。我的解决方法是开一个全新的终端确认.bashrc里只source了ROS2的setup文件然后再编译。3.3 launch文件参数详解每个数字都不是随便写的编译成功之后真正决定雷达能不能正常工作的其实是launch文件里的参数。进到lslidar_launch包的launch目录里面有针对不同型号的launch文件。以N10P为例你看到的launch文件内容大致是这样的from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node( packagelslidar_driver, executablelslidar_driver_node, namelslidar_driver, outputscreen, parameters[{ device_ip: , device_port: 2368, frame_id: laser_frame, scan_angle: 360.0, publish_scan: True, publish_pointcloud: True, min_range: 0.1, max_range: 30.0, baud_rate: 921600, }] ) ])这里有几个参数需要根据你的实际硬件来调整不能盲抄。首先是frame_id。这个参数定义了雷达点云数据的坐标系名称SLAM建图时所有传感器数据必须统一到一个坐标系下雷达的frame_id会作为tf树的叶子节点。如果你的机器人底盘的坐标系是base_link你需要一个静态变换把laser_frame和base_link关联起来。这里提前规划好命名后面省很多事。其次是publish_scan和publish_pointcloud。N10P既能输出2D激光扫描数据sensor_msgs/LaserScan也能输出3D点云数据sensor_msgs/PointCloud2。对于2D SLAM来说只需要LaserScan就够了点云数据其实是多线雷达才需要用到的。但把publish_pointcloud开着也没坏处Rviz2里可视化会直观一些。最重要的是scan_angle这个参数。N10P是360度扫描的雷达但驱动允许你裁剪扫描范围。这个参数的作用就是屏蔽掉一些不需要的角度比如安装在机器人上时雷达扫描到机身本身的那部分数据会产生固定的噪点通过裁剪可以消除掉。注意这个值的单位是角度而不是弧度360.0就代表全向扫描。如果你设置成270雷达就会少输出90度的数据。最后是max_range和min_range。N10P的官方测距范围是0.1米到30米但实际使用中超过20米的部分数据点会比较稀疏。关键是把min_range设置合理因为雷达本身存在一段盲区在这个距离内的数据是不可靠的。我一般设0.1米起步但如果你雷达安装得比较高盲区更大可以适当调高到0.3米减少灰尘和边缘反射产生的噪点。3.4 修改串口参数N10P是串口版还是网口版N10P有两个版本一个是串口版通过USB转串口连接一个是网口版通过网线和UDP协议通信。这两个版本的驱动参数完全不同你要先确认自己手上的是哪个版本。对串口版来说launch参数里不需要device_ip和device_port取而代之的是串口设备路径和波特率device: /dev/ttyUSB0, baud_rate: 921600,N10P串口版的默认波特率通常是921600但有些早期固件可能用的是115200。如果你发现雷达驱动节点能启动但收不到数据第一反应就应该是波特率不匹配。怎么排查看串口设备的波特率输出或者用串口调试工具直接监听如果能看到乱码说明雷达在发数据但解释不了。对网口版来说你需要把电脑的网口IP配到和雷达同一个网段然后在launch里指定雷达的IP和端口device_ip: 192.168.1.222, device_port: 2368,镭神网口雷达默认IP大多为192.168.1.222电脑端的IP需要设为192.168.1.xx不能是222子网掩码255.255.255.0。配置好之后用ping 192.168.1.222验证一下网络通不通。注意网口版雷达的数据是UDP广播如果电脑开了防火墙UDP端口可能会被屏蔽导致节点启动正常也收不到数据这是网口版最诡异的坑之一。4. 雷达数据验证别急着SLAM先确认点云真的准4.1 启动驱动后的预期输出驱动配置好之后启动节点source ~/n10p_ws/install/setup.bash ros2 launch lslidar_launch lslidar_n10p_launch.py如果一切正常终端会刷出类似下面的日志[lslidar_driver_node]: Start lslidar driver [lslidar_driver_node]: Init lslidar driver success [lslidar_driver_node]: Start publishing data这时候雷达的电机应该已经在转了你可以听到细微的转动声。然后打开第二个终端验证话题是否正常发布source /opt/ros/humble/setup.bash ros2 topic list预期能看到的话题有/laser_scan /pointcloud /tf此时查看话题频率ros2 topic hz /laser_scan如果雷达的扫描频率是10Hz这里应该显示average rate: 10.0左右。如果频率明显偏低比如几Hz可能是USB转串口芯片的缓存跟不上或者CPU处理瓶颈。可以先降低雷达的扫描帧率试一试后面性能优化部分我会展开讲。4.2 Rviz2可视化怎么判断点云数据是准的驱动正常运行只是第一步数据准不准才是关键。我强烈建议在跑SLAM之前先在Rviz2里认真看一眼点云效果这一步能帮你提前发现很多问题。ros2 run rviz2 rviz2打开Rviz2之后需要手动添加LaserScan显示组件。在左侧的Display窗口点击Add选择By topic找到/laser_scan话题添加进去。然后还需要在左侧的Global Options里把Fixed Frame设置为laser_frame。如果一切正常你会看到雷达扫描出的环境轮廓屋里物体的边缘应该是清晰的线条墙是直的桌角是锐利的。如果看到的效果是轮廓扭曲、形状怪异或者大量噪点分布在雷达周围那就说明数据质量有问题这时候不要盲目跑SLAM否则建出来的地图也会是歪的。这里分享一个我自己的判断方法拿着一个硬纸板或者一本书也行站在雷达前方1米处在Rviz2里观察纸板对应的点云应该比较密集地聚成一小段如果纸板反射点非常稀疏且跳跃说明雷达接收光路可能被遮挡或者反射率检测有问题。4.3 点云和LaserScan的区别为什么SLAM用的是Scan而不是PointCloud很多新手会困惑一个问题N10P明明能输出点云数据为什么SLAM建图的时候用的是/laser_scan而不是/pointcloud这要从2D SLAM的算法原理说起。2D SLAM算法包括Gmapping、Cartographer的2D模式、slam_toolbox等本质上是在二维平面里恢复机器人的位姿和环境地图。它需要的输入是“在一个固定高度平面上每个角度上障碍物到雷达的距离”这就是LaserScan的数学模型一个角度数组和一个对应距离数组。PointCloud2虽然包含更多的3D信息但对2D SLAM来说是多余的而且处理起来更费算力。所以驱动把雷达数据同时发布成两种格式你只需要关注/laser_scan就对了。5. SLAM建图实战slam_toolbox和Cartographer该怎么选5.1 主流2D SLAM工具在ROS2里的成熟度对比ROS2里常用的2D SLAM方案我按照“开箱即用程度”排个序工具ROS2支持情况建图质量回环检测上手难度slam_toolbox官方支持Humble上直接apt安装中等偏上强基于图优化低Cartographer社区维护ROS2版本需源码编译高强中高Nav2自带的AMCL定位适合已有地图的定位不适合纯建图---如果是第一次用ROS2做SLAM我强烈建议用slam_toolbox起步。为什么首先安装极其简单sudo apt install ros-humble-slam-toolbox其次它默认的launch文件就能跑参数比较少不需要像Cartographer那样配置上百行的lua文件。Carographer虽然理论上在回环检测方面表现更优适合大场景、环形路径的建图但它的ROS2版本需要从源码编译依赖一堆protobuf和ceres库新手很容易在这个环节消耗掉两三天时间。等你在slam_toolbox上把整个流程跑通、理解了SLAM的坐标系变换和数据流关系再考虑是否引入Cartographer这是更平滑的学习路径。5.2 slam_toolbox的launch文件编写slam_toolbox的最小启动配置如下from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node( packageslam_toolbox, executablesync_slam_toolbox_node, nameslam_toolbox, outputscreen, parameters[{ use_sim_time: False, base_frame: base_link, odom_frame: odom, map_frame: map, scan_topic: /laser_scan, max_laser_range: 30.0, minimum_travel_distance: 0.2, minimum_travel_heading: 0.5, loop_match_minimum_respond_distance: 0.5, scan_period: 0.1, }] ) ])这里有几个参数我重点说。base_frame、odom_frame、map_frame是SLAM的三大坐标系base_frame是机器人本体的坐标系odom_frame是里程计坐标系map_frame是地图坐标系。行为体来说整个SLAM过程就是在不断维护map - odom - base_link - laser_frame这条tf树。如果你只是做雷达静态建图也就是后续被我称为“手工推车建图”的模式没有真实底盘和轮式里程计那么slam_toolbox也能跑只不过它会认为机器人一直静止地图效果取决于雷达本身在环境中的扫描一致性。scan_period这个参数要特别注意它是激光雷达的扫描周期单位是秒10Hz对应0.1秒。如果这里你设成0.05但雷达实际只有10Hzslam_toolbox内部的延迟估计会错乱建出来的图会出现弧线形畸变。minimum_travel_distance是触发一次建图更新所需的机器人移动最小距离默认0.2米。在手动推着雷达走的时候如果你推得非常慢单次移动距离可能小于这个阈值地图更新就会很稀疏。我建议在纯手工建图模式下把这个值调小到0.1。5.3 遥控机器人还是手工推静态建图的两种实现方式如果你的场景是“雷达固定在一个小车上小车被人为推着在房间里走一圈”那你需要解决的是频率和角度连续性的问题。SLAM对输入数据的连续性要求很高你推的时候不能大幅度转弯或者高速甩动雷达否则帧间的数据关联容易丢失地图会出现重影。一个比较适合新手的操作方案是把雷达固定在桌子上然后抱着桌子缓慢平移前提是桌子够轻。这样虽然很原始但可以确保雷达的姿态变化非常平滑两条腿走路的速度差异不会太大建图的成功率会显著提高。等这个方案跑通了再去接真正的底盘用cmd_vel话题发速度指令控制底盘运动把里程计接入SLAM效果会更好。5.4 保存地图和载入地图的坑建图完成后保存地图是很多人翻车的一个环节。slam_toolbox没有提供统一的命令行保存工具你必须依靠Nav2的map_saver组件。保存的命令是ros2 run nav2_map_server map_saver_cli -f my_map --ros-args -p save_map_timeout:10.0这个命令会生成my_map.pgm和my_map.yaml两个文件前者是图片后者是配置。很多人的地图保存下来是纯黑色的或者是一片空白原因多半是保存时map话题没有更新。导航过程中要用的地图加载方式是ros2 run nav2_map_server map_server my_map.yamlyaml文件里有一个重要参数是resolution表示每个像素对应的物理长度单位米/像素。slam_toolbox建图时默认分辨率一般是0.05米/像素如果你的雷达扫描范围很大低于这个分辨率的小物体会在图上消失这是正常现象不用慌。6. 实际建图效果调优从“能出图”到“图好看”6.1 手动推着雷达建图的实操流程我个人测试时采用的是最朴素的方案雷达固定在一个移动底盘上底盘不通电我手动推着它在房间里缓慢走了一圈。你可能会觉得这不是机器人该有的操作但用来验证雷达数据和slam_toolbox的配合这个方案完全够用而且排除掉了底盘里程计误差这个变量。操作步骤启动雷达驱动节点启动slam_toolbox节点启动Rviz2添加Map显示组件主题是/map在Rviz2里确认看到雷达扫描轮廓之后开始手动推着雷达缓慢前进沿着房间边缘走一圈走到起点附近时稍微停顿几秒给回环检测留出时间。这个过程有几个细节值得注意推行的速度要控制在每秒0.3米以内转弯要缓慢整个过程尽量保持雷达高度不变。如果雷达在推的过程中倾斜了扫描平面就不水平了点云会有一侧偏高、一侧偏低建出的地图会带有裙边效应。回环的时候不要走一半就急着看地图等停到起点附近观察Rviz2里的地图是否和当前位置的雷达扫描轮廓对齐。如果对齐说明回环成功地图整体会被校正变得非常规整。如果没对齐地图会出现明显的错位。6.2 常见地图问题的根因和修正问题现象可能原因解决办法地图整体歪斜推车路线不水平或扫描到了不同高度的障碍物控制推行高度固定雷达支架地图出现双层边雷达帧率不稳scan_period设置错误检查hz输出校准scan_period墙壁有锯齿状雷达数据噪点多或建图最小移动距离过小调高minimum_travel_distance启用滤波地图局部缺失雷达盲区较大紧贴墙根的部分扫不到离墙保持30cm以上推行回环后地图错位严重回环匹配失效路径重叠部分太少增加重叠路径降低推进速度6.3 雷达点云的预处理滤波在实际测试中我发现N10P在室内环境下产生的噪点比预期的多一些尤其是靠近窗户的位置阳光中的红外线会干扰TOF测距。另外墙角的边缘会产生少量飞点就是点云中突然出现一个远离墙面、呈放射状的点。应对策略有两种一种是驱动层面的输出滤波另一种是SLAM层面的过滤。我测试下来最实用的是在接收端加一个sensor_filters节点利用laser_filters包里的RangeFilter和ScanShadowsFilter插件对LaserScan数据进行预处理sudo apt install ros-humble-laser-filters然后在launch文件中添加一个Filter节点配置一个YAML文件scan_filter_chain: - name: range type: laser_filters/LaserScanRangeFilter params: lower_threshold: 0.1 upper_threshold: 29.0 - name: shadows type: laser_filters/LaserScanShadowsFilter params: min_angle: 5 max_angle: 355 window: 1RangeFilter的作用是把距离过近和过远的点直接滤除ShadowsFilter用来消除边缘阴影和飞点。实测在靠近墙角的场景下加了滤波之后地图质量提升很明显边缘轮廓干净了不少。7. 高频问题排查与会话日志分析7.1 驱动节点启动了但没数据输出这个问题排在所有问题里的第一名。现象是驱动节点正常启动终端没有报错但ros2 topic hz /laser_scan显示no new messages。排查链路如下先用ls -l /dev/ttyUSB0确认串口设备存在且有权限。然后再看日志我强烈建议在启动驱动的时候把日志级别调成DEBUG看数据流解析到哪一步断了export RCUTILS_LOGGING_MIN_SEVERITYDEBUG ros2 launch lslidar_launch lslidar_n10p_launch.py如果终端显示驱动已经初始化成功但没有读数据多半是串口参数不对。用lsusb确认芯片型号再在launch里核对波特率。如果显示在接收数据但发布不出来有可能是publish_scan参数被设成了False检查一下launch。网口版的话先用ping确认网络通然后检查是否有其他进程占用了监听端口尤其是有没有同时开两个驱动节点。7.2 Rviz2看不到点云Rviz2里看不到点云有几种可能性Fixed Frame设置不对是最常见的。Rviz2界面的Global Options里有一个Fixed Frame选项如果你把Fixed Frame设成了map但当前还没有启动SLAM节点map帧不存在Rviz2就会报“Fixed Frame [map] does not exist”点云自然显示不出来。这时候把Fixed Frame改成laser_frame就能看到了。另一种可能是tf树断裂。如果你启动SLAM时雷达的frame_id和slam_toolbox里配置的base_frame不匹配tf树建立不起来Rviz2也会拒绝显示点云。解决办法是检查ros2 run tf2_ros tf2_echo laser_frame base_link是否正常输出。7.3 建图过程中地图突然发散地图发散就是Rviz2里地图突然变成一大片雪花点或者全是黑色这种情况我遇到过两次。第一次是雷达在推行中USB线松动了导致一帧数据里的某个点云丢失slam_toolbox错误地把这帧数据当成了大位移变化优化的配准结果发散。第二次是雷达窗口被灰尘遮挡导致短时间内扫描范围骤减帧间的重叠区域不足。预防措施建图前检查USB接头建图时不要大幅度甩动雷达雷达的透光窗口用软布擦干净。如果地图已经发散不要继续建直接重启SLAM节点重新来过。8. 经验总结这套链路最值钱的三个认知折腾完整个流程我的体会有三点。第一ROS2环境下驱动雷达的核心门槛不在雷达本身而在于你对ROS2工具链的熟悉程度。会看ros2 topic、会看tf树、会读懂launch参数这些问题都能迎刃而解。如果你第一次接触ROS2就直接上手雷达成像建议先花半天时间把ros2 topic、ros2 node、ros2 param这几个命令玩熟。第二SLAM建图的效果不是由SLAM算法单方面决定的雷达数据的质量起到了决定性作用。在雷达数据不干净硬件不稳定的情况下再好的算法也救不回来。所以建图前认真调一次雷达姿态、滤波参数收益远大于反复调SLAM参数。第三整个链路中最耗时间的不是编译和配置而是对各种参数之间关系的理解。比如雷达的scan_angle设置只影响数据覆盖范围而slam_toolbox的minimum_travel_distance影响建图更新的触发频率两者互相影响共同决定地图的精细度。如果只盯着一个参数调很难调到理想效果。最后分享一个习惯每次调试前把当前有效的launch参数、雷达安装高度、推行速度都记录在一个文本文件里。我因为偷懒跳过这个步骤无数次在调参调崩之后回不到之前的可用状态。建图和驱动这种事参数组合的记忆很脆弱记录下来等于给自己的每一次成功做了备份。
返回列表