ARTICLE DETAIL

资讯详情

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

树莓派4B+Ubuntu 22.04+RPLIDAR C1 ROS2二维建图

树莓派4B+Ubuntu 22.04+RPLIDAR C1 ROS2二维建图 树莓派4B、Ubuntu 22.04、思岚 RPLIDAR C1 激光雷达这三样东西凑在一起最适合做一台小型移动机器人的二维建图与避障平台。它不追求炫酷的复杂三维感知而是用一颗低成本二维雷达把周围环境的轮廓扫出来再配合 ROS2 里的建图节点让一台小底盘知道自己身处什么位置。这套组合适合刚开始接触机器人操作系统的朋友也适合已经玩过单片机、想往 SLAM 方向走一截的开发者。它解决的问题很明确把雷达数据接进系统把数据变成地图再把地图保存下来后面不管是做导航、避障还是单纯验证算法都有了基础。整套东西不复杂但坑集中在系统安装、串口权限、TF 坐标和建图参数上下面我就按实际折腾顺序把每一步拆开讲清楚。1. 项目整体思路与方案选型1.1 为什么是树莓派4B、Ubuntu 22.04 和 RPLIDAR C1我选树莓派4B不是因为它是性能最强的板子而是因为它在社区里的资料厚度足够。ROS2 Humble 官方支持 Ubuntu 22.04而树莓派4B的 arm64 架构在 Ubuntu 22.04 上有现成镜像装 ROS2 的二进制包时少走很多弯路。RPLIDAR C1 的定位也很清楚它比早期 A1 更便宜接口简单适合教育、原型验证和小型机器人。三者放在一起硬件成本可控软件栈又是主流出了问题能搜到答案。如果你手头是树莓派4B的 2GB 内存版本也能跑但建图时尽量别开桌面最好用 Ubuntu Server 版本。4GB 或 8GB 版本会更从容尤其是同时跑雷达驱动、Cartographer、RViz 或 Foxglove 的时候。Ubuntu 22.04 是 LTS 版本支持周期长ROS2 Humble 也是 LTS二者对应关系明确。有人会问为什么不选 Ubuntu 20.04 配 ROS2 Foxy原因很简单新项目没必要从旧版本起步Humble 的包更全官方维护也更积极。至于 Ubuntu 24.04 配 ROS2 Jazzy树莓派上的生态还在完善新手容易遇到包缺失所以这个项目我仍然优先推荐 22.04 Humble。1.2 硬件清单与供电上的关键取舍除了树莓派4B、SD卡、电源、RPLIDAR C1你还需要一个 USB 转 TTL 模块。思岚雷达套件里通常会带 CP2102 或 CH340 芯片的转接板直接插树莓派 USB 口就能识别成/dev/ttyUSB0。但这里有个容易忽略的点雷达启动瞬间电流会冲一下如果树莓派本身供电余量不足会出现雷达转两下停住、系统掉电重启或 USB 设备反复重连。我的做法是雷达用独立 5V 电源或者至少用质量好的 5V/3A 电源给树莓派避免和屏幕、风扇抢电。SD卡至少 32GB最好选 A2 级别随机读写对系统流畅度影响很大。外壳和风扇不是装饰品树莓派4B跑建图时 CPU 会长时间高负载温度冲到 80 度以上就会降频表现就是地图突然飘、RViz 卡顿。风扇可以接 5V 常转也可以接 GPIO14 做温控但要注意风扇电压不要接错针脚。网线或 Wi-Fi 都行如果做移动机器人Wi-Fi 更方便但 SSH 操作时最好保持网络可靠。雷达安装位置要高于底盘边缘避免支架和轮子进入扫描平面否则地图上会多出固定障碍。1.3 软件栈选择ROS2、Cartographer 还是 slam_toolbox软件栈我分成两层底层用 ROS2 Humble 做通信和节点管理上层建图用 Cartographer 或 slam_toolbox。Cartographer 是热词里经常出现的方案它的回环检测和子图机制对二维激光建图很成熟保存地图的流程也清晰。缺点是树莓派4B上资源占用偏高参数不调好会卡。slam_toolbox 更轻启动快适合刚开始验证数据链路。我的建议是先用 slam_toolbox 确认雷达、TF、话题都正常再切到 Cartographer 做正式建图。这样排查问题时不会把系统问题和建图算法问题混在一起。TF 坐标是这套系统的骨架。雷达发布/scan它只关心自己的坐标系通常是laser。建图节点需要知道laser相对base_link的位置还需要一个map到odom的变换。如果没有底盘里程计Cartographer 可以只靠激光匹配推算但移动速度不能太快环境特征也不能太少。很多人建图飘不是雷达坏了而是 TF 树缺了一段或者雷达和底盘的安装角度没在参数里体现。先把坐标系画明白再调参数效率会高很多。2. Ubuntu 22.04 在树莓派4B上的部署与基础调优2.1 镜像烧录、首次启动和 SSH 连接树莓派4B装 Ubuntu 22.04最省事的路子是去 Ubuntu 官方镜像站下载ubuntu-22.04.x-preinstalled-server-arm64raspi.img.xz用 Raspberry Pi Imager 或 balenaEtcher 写入 SD 卡。写完之后别急着拔卡如果用的是 Raspberry Pi Imager可以在高级设置里预置 Wi-Fi、用户名、SSH 公钥和主机名。要是用其他工具就在 boot 分区里放user-data和network-config这是 cloud-init 的配置方式。第一次开机通常要等几分钟系统会扩展分区、生成密钥别看到黑屏就以为坏了。开机后先确认网络ip a看有没有拿到地址ping外网看通不通。SSH 登录可以用ssh ubuntu树莓派IP默认用户有时是ubuntu有时是你预置的名字。登录后第一件事是改密码和更新系统sudo apt update sudo apt full-upgrade -y。如果 Wi-Fi 没起来检查/etc/netplan/下的 yaml 文件树莓派 Ubuntu 22.04 常用 netplan 管网络改完执行sudo netplan apply。注意不要随便套用 x86 虚拟机的网络教程树莓派无线网卡驱动和桌面环境差异很大配置文件位置也不一样。2.2 串口、风扇、自动休眠和性能设置雷达走 USB 转串口不需要动树莓派 GPIO 串口但你要知道系统里串口设备的权限规则。用户要加入dialout组否则每次插上雷达都提示打不开设备。命令是sudo usermod -aG dialout $USER执行后注销重登。风扇如果接在 GPIO14 上可以用脚本控制但更简单的做法是接 5V 和 GND 常转。Ubuntu 下没有树莓派官方桌面那样的风扇控制面板所以别指望图形界面帮你调直接硬件解决最省心。自动休眠要关掉否则 SSH 会断长时间建图也可能被挂起。执行sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target再把sudo systemctl disable unattended-upgrades按需处理避免建图时后台更新抢资源。性能方面sudo apt install cpufrequtils后可以把 governor 设为performance但要注意散热。更有效的做法是关闭不需要的服务用 Server 版系统不跑桌面。如果你必须用桌面尽量用轻量窗口管理器RViz 不要常驻树莓派放到另一台电脑上远程看。2.3 安装 ROS2 Humble 和常用依赖ROS2 Humble 在 Ubuntu 22.04 arm64 上有官方 apt 包。先设置 locale再添加 ROS2 源和密钥然后安装ros-humble-ros-base、ros-humble-ros-dev-tools、ros-humble-rviz2按需。完整桌面版在树莓派上太重我一般只装基础版RViz 放到笔记本。安装完成后把source /opt/ros/humble/setup.bash写进~/.bashrc这样每次登录都能用ros2命令。检查安装是否成功可以跑ros2 run demo_nodes_cpp talker和listener两个终端能通信就说明中间件没问题。建图还需要一些工具包比如ros-humble-tf2-tools、ros-humble-nav2-map-server、ros-humble-cartographer、ros-humble-cartographer-ros。如果 apt 里没有 arm64 的 Cartographer 包再考虑源码编译。编译前装好rosdep执行rosdep update和rosdep install。树莓派上编译 Cartographer 会比较慢建议加交换分区或者用colcon build --parallel-workers 1降低内存峰值。别小看这一步很多人编译到一半卡死其实是内存不够不是代码有错。3. RPLIDAR C1 接入供电、串口、权限和数据验证3.1 C1 的接口特性与接线方案RPLIDAR C1 是二维激光雷达扫描平面内测距输出极坐标点。它通常通过 UART 通信配套转接板把 TTL 串口转成 USB。接线时注意转接板的 TX 接雷达的 RXRX 接雷达的 TXVCC 和 GND 不要反。如果套件里已经是一体化 USB 适配器直接插树莓派 USB 口即可。供电方面雷达标称 5V启动电流比工作电流大最好独立供电或者用带外部供电的 USB HUB。插上后执行dmesg | tail看有没有识别成cp210x或ch341设备再执行ls -l /dev/ttyUSB*。如果识别不到先换 USB 口再换线最后怀疑供电。树莓派4B的 USB 口供电能力有限尤其是同时插了摄像头、无线网卡和固态硬盘时。雷达线太长也会导致压降出现能识别但一启动就掉线。我的经验是调试阶段用短线和独立电源装车后再整理线束别一上来就把线捆得死死的出了问题不好换。雷达安装要水平扫描面尽量和地面平行倾斜几度就会导致地图边缘分层看起来像重影。3.2 串口权限、udev 规则和波特率确认默认情况下/dev/ttyUSB0属于dialout组普通用户没权限。临时办法是sudo chmod 666 /dev/ttyUSB0但每次插拔都会变正式做法是写 udev 规则。先查芯片 IDlsusbCP2102 通常是10c4:ea60CH340 是1a86:7523。然后创建/etc/udev/rules.d/99-rplidar.rules内容类似KERNELttyUSB*, ATTRS{idVendor}10c4, ATTRS{idProduct}ea60, MODE0666, SYMLINKrplidar保存后执行sudo udevadm control --reload-rules sudo udevadm trigger重新插拔雷达应该出现/dev/rplidar。之后启动雷达时固定用这个符号链接不管它枚举成 ttyUSB0 还是 ttyUSB1。波特率方面C1 常用 460800具体以你手上的手册和驱动默认值为准。如果驱动里写的是 115200数据会乱码或收不到。可以用stty -F /dev/rplidar 460800做基础测试但最好直接用 ROS2 驱动验证。3.3 驱动编译、话题查看和可视化ROS2 下常用rplidar_ros驱动。建工作空间mkdir -p ~/ros2_ws/src cd ~/ros2_ws/src git clone https://github.com/Slamtec/rplidar_ros.git -b ros2 cd ~/ros2_ws rosdep install --from-paths src --ignore-src -r -y colcon build --symlink-install source install/setup.bash如果编译报找不到某依赖先确认 ROS2 环境已经 source再检查分支是不是ros2。启动前确认串口名和波特率常见启动命令类似ros2 launch rplidar_ros rplidar.launch.py serial_port:/dev/rplidar serial_baudrate:460800 frame_id:laser不同版本的 launch 文件名可能不同有的包会提供rplidar_c1_launch.py你可以ls launch/看一眼再决定。启动后另开终端执行ros2 topic list应该能看到/scan。用ros2 topic hz /scan看频率C1 一般在 10Hz 左右用ros2 topic echo /scan --once看一帧数据里有没有ranges。如果频率很低或者数据为空优先查供电和波特率。可视化可以用 RViz2Fixed Frame 设为laser添加 LaserScan 话题/scan能看到一圈点就说明数据链路通了。4. 激光雷达建图ROS2 配合 Cartographer 与 slam_toolbox4.1 TF 坐标系、话题和启动顺序建图前必须把 TF 树搭好。最简单的结构是map - odom - base_link - laser。没有里程计时Cartographer 可以发布map - odom但odom - base_link仍然需要一个来源。如果底盘没有轮式里程计可以先用静态 TF 把base_link到laser固定住再让 Cartographer 的provide_odom_frame参数决定是否补 odom。实际操作中我建议先只发布base_link - laser的静态变换ros2 run tf2_ros static_transform_publisher 0 0 0.2 0 0 0 base_link laser这表示雷达在底盘中心正上方 0.2 米没有旋转。如果你的雷达装在前方x、y 要相应改。启动顺序也重要先开雷达确认/scan有数据再开建图节点。反过来的话建图节点可能因为等不到 TF 或激光数据而报错。检查 TF 用ros2 run tf2_tools view_frames它会生成 PDF看树是不是连在一起。缺 TF 的典型表现是 RViz 里点云位置乱跳或者建图节点提示 Lookup would require extrapolation。4.2 Cartographer 配置文件和参数拆解Cartographer 的配置是 lua 文件。可以复制官方backpack_2d.lua改成适合 C1 的版本。关键参数包括include map_builder.lua include trajectory_builder.lua options { map_builder MAP_BUILDER, trajectory_builder TRAJECTORY_BUILDER, map_frame map, tracking_frame base_link, published_frame base_link, odom_frame odom, provide_odom_frame true, publish_frame_projected_to_2d true, use_odometry false, use_nav_sat false, use_landmarks false, num_laser_scans 1, num_multi_echo_laser_scans 0, num_subdivisions_per_laser_scan 1, num_point_clouds 0, lookup_transform_timeout_sec 0.2, submap_publish_period_sec 0.3, pose_publish_period_sec 5e-3, trajectory_publish_period_sec 30e-3, rangefinder_sampling_ratio 1., odometry_sampling_ratio 1., fixed_frame_pose_sampling_ratio 1., imu_sampling_ratio 1., landmarks_sampling_ratio 1., } TRAJECTORY_BUILDER_2D.min_range 0.05 TRAJECTORY_BUILDER_2D.max_range 12.0 TRAJECTORY_BUILDER_2D.missing_data_ray_length 5.0 TRAJECTORY_BUILDER_2D.use_imu_data false TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching true TRAJECTORY_BUILDER_2D.motion_filter.max_angle_radians math.rad(0.1) MAP_BUILDER.use_trajectory_builder_2d true TRAJECTORY_BUILDER_2D.num_accumulated_range_data 1min_range和max_range要覆盖 C1 的实际量程太近的噪点可以滤掉。missing_data_ray_length决定没有回波的方向怎么处理设太小会让空旷区域更新慢设太大容易把噪声拉成墙。tracking_frame一般用base_link或laser但必须和 TF 树一致。use_odometry没有轮速计就设 false有轮速计就设 true 并接/odom。树莓派4B上num_subdivisions_per_laser_scan保持 1能降低计算量。4.3 启动建图、保存地图和地图后处理启动 Cartographer 时指定配置目录和 lua 文件名ros2 launch cartographer_ros cartographer.launch.py \ configuration_directory:$HOME/ros2_ws/src/cartographer_config \ configuration_basename:rplidar_c1_2d.lua如果包里有单独的 occupancy grid 节点再启动它发布/map。用 RViz 看map和/scan手推小车或让底盘慢慢走一圈。建图时不要原地快速旋转也不要贴着墙走速度尽量匀。保存地图用 nav2 的 map_saverros2 run nav2_map_server map_saver_cli -f $HOME/maps/my_map成功后会得到my_map.pgm和my_map.yaml。如果保存出来是空图检查/map话题有没有数据、map_saver 是否在正确命名空间。地图后处理可以用 GIMP 或 Python 脚本清理噪点但别过度修改尤其是障碍物边界改多了会影响后续导航。保存后重新加载地图可以用nav2_map_server在 RViz 里确认地图和实际环境对得上。5. 常见问题排查与实战避坑5.1 雷达不转、无数据、权限报错雷达不转先查供电很多 USB 口在雷达启动瞬间电压跌落表现就是转一下停一下。换独立电源或带供电 HUB 后大概率解决。无数据先看/dev/rplidar是否存在权限是不是crw-rw-rw-。报错Permission denied就检查用户组和 udev 规则。如果串口存在但读不到数据检查波特率C1 常用 460800有些驱动默认 115200。用ros2 topic hz /scan看有没有频率用ros2 topic echo /scan --once看 ranges 是否全为 0。全 0 可能是雷达保护、转速不够或通信半双工接错。还有一种情况是 USB 设备反复重连dmesg里看到USB disconnect。这通常是电源或线材问题换成短线、屏蔽线或者把雷达和树莓派分开供电。别忽略机械安装雷达如果被支架挡住一圈数据里会出现固定扇形缺口。可以先用手持方式测试确认雷达本身正常再装到车上。5.2 建图飘、重影、断边怎么处理建图飘的根因通常分三类TF 不对、移动太快、环境特征太少。TF 不对时地图会整体旋转或漂移检查base_link - laser的安装位置和角度。移动太快时激光匹配来不及收敛尤其是原地急转Cartographer 容易丢。把速度降到 0.2m/s 左右转角速度放慢。环境特征少比如长走廊、空旷大厅激光看到的多是平行墙匹配会退化可以增加一些临时障碍物或者改用手推方式慢慢建。重影常见于雷达倾斜或安装不牢。雷达平面不水平扫同一面墙时前后帧对不上地图边缘就会出现双层。断边可能是回环没闭合走一圈回到起点后不要马上停多走几米让回环检测生效。Cartographer 的optimize_every_n_nodes和constraint_builder参数会影响回环树莓派性能不足时不要调得太激进。如果地图一直飘先用 slam_toolbox 对比确认是不是雷达数据本身的问题。5.3 树莓派性能瓶颈、散热和系统卡顿树莓派4B跑 Cartographer 时 CPU 占用高很正常尤其是地图变大后。表现是 RViz 卡、/scan频率下降、地图更新慢。解决办法有几个用 Server 系统、关桌面、把 RViz 放到笔记本、降低地图分辨率、限制雷达采样率。Cartographer 的TRAJECTORY_BUILDER_2D.submaps.num_range_data可以适当调小减少单张子图数据量但太小会影响闭环。散热方面加风扇和散热片保持温度低于 75 度。电源要足低于 5V/3A 会导致降频和 USB 掉线。另外SD 卡慢也会拖累系统。建图时日志和地图写入频繁A2 卡比普通卡好很多。如果系统已经卡到 SSH 都延迟先top看是谁占 CPU再vcgencmd measure_temp看温度最后dmesg看有没有 USB 错误。别一味调算法参数先把系统资源问题解决。5.4 常见问题速查表现象可能原因排查动作处理建议雷达不转供电不足、线序错换电源、查 VCC/GND独立 5V 供电短线连接无 /scan串口名错、权限不足ls /dev/rplidar、groups加 dialout写 udev 规则数据乱码波特率不对查手册和启动参数改为 460800 再试地图飘TF 错、速度太快view_frames、降速修正静态 TF慢速移动地图重影雷达倾斜、安装松动检查水平和支架重新固定保持水平CPU 满载建图参数重、桌面常驻top、vcgencmd关桌面降分辨率加散热保存地图为空话题不对、命名空间错ros2 topic list用 map_saver_cli 指定正确话题这张表是我自己在调试时最常翻的基本覆盖了八成问题。每次遇到异常先按表走一遍比盲目重装系统快得多。6. 从二维建图到后续应用的可扩展方向6.1 点云滤波、聚类和避障逻辑雷达数据拿到后除了建图还能做避障。/scan是二维极坐标数据避障时通常取前方一定角度扇区判断最小距离。如果地面有噪点先做中值滤波或距离阈值过滤把小于 0.05 米和大于 12 米的点去掉。聚类可以用简单的角度分割也可以用 DBSCAN把相邻点归成一个障碍物。树莓派4B上跑轻量聚类没问题但别一上来就上深度学习。先把规则避障调通再考虑更复杂的感知。如果要做点云处理可以用laser_geometry把 LaserScan 转成 PointCloud2再用 PCL 或 Open3D 滤波。常见操作包括体素下采样、统计离群点移除、平面分割。二维雷达只有一个扫描面所以点云本质是一层线不适合做三维目标检测。BEVFusion 这类三维感知方案需要多线雷达和相机树莓派4B带不动别被热词带偏。6.2 与底盘、导航栈结合时的注意事项建图只是第一步后面接导航要加载地图、配置代价地图、设置全局和局部规划器。底盘如果没有里程计导航会很难做至少要加编码器或 IMU。ROS2 Nav2 的配置项很多树莓派上建议先用小分辨率地图局部代价地图范围别太大。雷达安装位置要写进 URDF不然避障会误判。车体轮廓参数也要设否则规划器会以为机器人是一个点容易擦墙。如果底盘是差速驱动odom和base_link的变换由底盘驱动发布建图时use_odometry可以打开地图会更稳。没有里程计时Cartographer 纯激光建图在慢速下也能用但导航时效果差。我的经验是建图可以凑合导航不能凑合。先解决里程计再谈路径规划。6.3 我在这套组合里踩过的几个坑第一个坑是 Ubuntu 22.04 树莓派版默认没有raspi-config网上很多树莓派教程直接复制会找不到命令。需要自己装或者改配置文件。第二个坑是 udev 规则里的 VID/PIDCP2102 和 CH340 不一样抄错就用不了。第三个坑是 Cartographer 的 lua 配置里tracking_frame和 TF 树不一致启动不报错但地图飘。第四个坑是雷达供电桌面调试点亮装车后一跑就掉线最后换了独立电源才解决。第五个坑是树莓派散热一开始没装风扇建图十分钟后 CPU 降频地图更新明显变慢。这些坑都不算高级问题但很耗时间。我的建议是每接一个模块就单独验证先确认串口再确认/scan再确认 TF再启动建图。每一步都有明确的成功标志不要一口气把所有节点拉起来。雷达数据是地基地基不稳后面算法再强也白搭。地图保存后最好用同一个环境重新加载一次看障碍物位置是否一致这一步能提前发现很多坐标问题。
返回列表