用树莓派4B和RPLIDAR A1,从零搭建一个ROS2 Humble室内导航机器人(保姆级避坑指南)

张开发
2026/4/12 3:45:34 15 分钟阅读

分享文章

用树莓派4B和RPLIDAR A1,从零搭建一个ROS2 Humble室内导航机器人(保姆级避坑指南)
树莓派4B与RPLIDAR A1打造ROS2 Humble室内导航机器人从硬件组装到避障实战去年夏天我在实验室角落里发现了一台积灰的树莓派4B和RPLIDAR A1激光雷达这让我萌生了搭建室内导航机器人的想法。经过三个月的反复调试踩遍了所有能想到的坑之后终于让这个小家伙能在办公室里自如地穿梭避障。本文将分享这段从零开始的完整历程特别是那些官方文档没写清楚的细节问题。1. 硬件选型与组装避坑指南市面上常见的机器人底盘主要分三类差速驱动、全向轮和麦克纳姆轮。对于室内导航项目差速驱动底盘是最经济实惠的选择两个带编码器的直流电机加上万向轮就能满足基本需求。我使用的是某宝上200元左右的铝合金底盘套件包含电机、轮子和支架。激光雷达方面RPLIDAR A1的性价比在入门级项目中无可挑剔。但要注意购买时确认是正版A1M8版本扫描频率8Hz市面上有些山寨货会标注A1但实际性能缩水。以下是核心硬件清单组件型号预算注意事项主控板树莓派4B 4GB400元必须加装散热风扇激光雷达RPLIDAR A1M8800元检查扫描频率是否为8Hz电机驱动板TB6612FNG50元支持PWM调速IMU传感器MPU605030元需校准陀螺仪偏移电源系统12V锂电池降压模块150元建议容量≥5000mAh组装时最容易出问题的是电机接线。有次我接反了极性上电瞬间就闻到焦糊味——驱动芯片烧毁了。正确的接线顺序应该是先断开所有电源连接将电机线接入驱动板OUT1/OUT2用万用表确认没有短路最后接电源激光雷达的安装高度也有讲究。经过实测离地15-20cm是最佳位置既能扫描到家具底部又能避开地面杂物。可以用亚克力板制作一个简单的支架# 安装必要的工具 sudo apt-get install laser-cut-acrylic # 设计文件已上传至GitHub仓库 git clone https://github.com/username/rplidar_mount.git2. ROS2 Humble系统配置的七个关键步骤官方安装指南往往假设网络环境完美但国内用户常会遇到依赖下载慢的问题。推荐使用清华源进行基础安装sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo sed -i s|http://.*archive.ubuntu.com|https://mirrors.tuna.tsinghua.edu.cn|g /etc/apt/sources.list sudo sed -i s|http://.*security.ubuntu.com|https://mirrors.tuna.tsinghua.edu.cn|g /etc/apt/sources.list安装ROS2时最常见的报错是Unable to locate package ros-humble-desktop。这通常是因为没正确添加ROS仓库sudo apt install software-properties-common sudo add-apt-repository universe sudo apt update sudo apt install curl 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配置工作空间时建议单独创建nav_ws用于导航项目。这样当需要测试其他功能时不会产生冲突mkdir -p ~/nav_ws/src cd ~/nav_ws rosdep install -i --from-path src --rosdistro humble -y colcon build --symlink-install重要提示每次打开新终端都要source安装文件可以将其加入.bashrcecho source /opt/ros/humble/setup.bash ~/.bashrc echo source ~/nav_ws/install/local_setup.bash ~/.bashrc3. 激光雷达与树莓派的深度集成RPLIDAR A1的驱动安装看似简单但有几个隐藏坑点串口权限问题会导致设备无法识别扫描数据坐标系需要正确设置扫描频率与ROS2消息频率要匹配首先解决串口权限问题。将用户加入dialout组后需要重启生效sudo usermod -a -G dialout $USER sudo reboot验证设备是否被识别ls -l /dev | grep ttyUSB # 正常应该看到类似输出 # crw-rw---- 1 root dialout 188, 0 Jul 10 14:30 ttyUSB0安装官方ROS2驱动时建议从源码编译以确保兼容性cd ~/nav_ws/src git clone https://github.com/Slamtec/rplidar_ros2.git cd ~/nav_ws colcon build --packages-select rplidar_ros2驱动启动配置需要特别注意frame_id参数它必须与URDF模型中的激光雷达链接名称一致。这是我的启动文件配置from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node( packagerplidar_ros2, executablerplidar_node, namerplidar_node, parameters[{ serial_port: /dev/ttyUSB0, serial_baudrate: 115200, frame_id: laser_link, angle_compensate: True, scan_mode: Standard }], outputscreen ) ])测试扫描数据是否正常ros2 launch rplidar_ros2 rplidar_launch.py ros2 run rviz2 rviz2 -d $(ros2 pkg prefix rplidar_ros2)/share/rplidar_ros2/rviz/rplidar.rviz在RViz中添加LaserScan显示应该能看到周围环境的点云数据。如果出现数据跳动或缺失检查电源是否稳定——RPLIDAR A1对电压波动非常敏感。4. URDF模型与TF树的正确姿势机器人模型的精度直接决定导航效果。常见的URDF建模错误包括关节类型选择错误fixed vs continuous坐标系朝向不统一物理参数与实际不符这是我优化后的底盘URDF片段特别注意轮关节的定义joint nameleft_wheel_joint typecontinuous parent linkbase_link/ child linkleft_wheel/ origin xyz0 0.15 0.05 rpy0 0 0/ axis xyz0 1 0/ dynamics damping0.1 friction0.5/ /joint重要提示所有link都必须定义惯性参数否则物理引擎会报错。简单立方体的惯性矩阵可以这样计算# 计算长方体惯性矩阵 mass 0.5 # kg lx, ly, lz 0.1, 0.2, 0.05 # 尺寸(m) ixx mass*(ly**2 lz**2)/12 iyy mass*(lx**2 lz**2)/12 izz mass*(lx**2 ly**2)/12验证TF树是否正确发布ros2 run tf2_tools view_frames.py evince frames.pdf应该看到清晰的树状结构base_link作为根节点laser_link和wheel_link作为子节点。常见的TF错误是时间戳不同步可以通过以下命令诊断ros2 run tf2_ros tf2_monitor5. Nav2导航栈的实战配置Nav2的默认参数针对仿真环境优化真实机器人需要调整以下关键参数代价地图更新频率机器人轮廓尺寸全局/局部规划器参数创建自定义配置文件nav2_params.yamlcontroller_server: ros__parameters: controller_frequency: 10.0 min_x_velocity_threshold: 0.01 progress_checker: required_movement_radius: 0.5 movement_time_allowance: 10.0 planner_server: ros__parameters: expected_planner_frequency: 1.0 planner_plugins: [GridBased] GridBased: plugin: nav2_navfn_planner/NavfnPlanner tolerance: 0.5 use_astar: true启动导航测试前必须确保以下服务都处于活跃状态ros2 service list | grep -E (global_costmap|local_costmap|planner|controller)常见的导航失败原因包括地图分辨率与代价地图不匹配机器人轮廓尺寸设置过小导致碰撞传感器数据延迟超过容忍阈值调试时可以可视化各种成本地图ros2 run nav2_costmap_2d nav2_costmap_2d_markers_viewer6. SLAM建图过程中的五个典型问题使用SLAM Toolbox建图时我遇到过这些典型问题及解决方案地图出现鬼影调整laser_max_range参数设置为略大于实际环境尺寸建图时机器人定位漂移启用IMU数据融合在slam_toolbox配置中添加use_scan_matching: true use_odom: true use_imu: true imu_topic: /imu/data地图边缘不闭合建图时让机器人在边界区域多停留几秒动态物体留影设置map_update_interval为较小值如0.5秒大场景内存不足修改slam_toolbox的内存参数max_map_size: 100000 resolution: 0.05保存地图的正确姿势ros2 run nav2_map_server map_saver_cli -f ~/maps/my_map --ros-args -p save_map_timeout:100007. 实战调试从理论到现实的跨越在实验室测试完美的代码搬到真实环境总会出各种意外。分享几个血泪教训案例1机器人总是撞上透明玻璃原因激光穿透透明物体解决加装超声波传感器作为补充案例2地毯区域导航失败原因轮子打滑导致里程计不准解决调整odom_alpha参数并增加IMU权重案例3狭窄转角卡死原因局部规划器参数过于保守解决修改DWB的sim_time参数DWB: sim_time: 1.5 # 原值2.0 max_vel_x: 0.4 min_vel_x: -0.15最后推荐一个实用的调试命令组合可以同时查看传感器数据、TF变换和导航状态ros2 launch nav2_bringup rviz_launch.py ros2 run rqt_graph rqt_graph ros2 topic echo /amcl_pose

更多文章