1. 硬件选择与树莓派5的独特挑战

树莓派5作为最新一代的单板计算机,性能相比前代有了显著提升,但对于ROS Noetic这个ROS 1的最终版本来说,却带来了不少兼容性挑战。我实际测试中发现,树莓派5的ARM Cortex-A76架构和更新的PCIe接口虽然提升了性能,但在ROS 1环境下需要特别注意驱动兼容性问题。

核心硬件清单需要特别注意这些点:

  • 树莓派5B:建议选择8GB内存版本,因为SLAM建图过程中内存占用很容易超过4GB
  • 激光雷达:RPLIDAR C1是个不错的选择,但要注意树莓派5的USB控制器升级到了PCIe,需要重新编译驱动
  • 电机驱动模块:TB6612FNG确实好用,但树莓派5的GPIO引脚排列有所变化,接线时需要特别注意
  • 电源管理:树莓派5的功耗更高,建议使用官方推荐的27W PD电源,否则可能遇到随机重启的问题

我在第一次搭建时就栽了跟头——用的还是树莓派4的5V/3A电源,结果建图到一半就突然重启。后来换了官方电源才稳定下来。

2. Ubuntu 24.04系统安装与优化

树莓派5目前官方支持的Ubuntu版本是24.04,这个版本默认使用Wayland显示协议,但ROS Noetic的很多工具对X11兼容性更好。安装完成后第一件事就是切换显示协议:

sudo vim /etc/gdm3/custom.conf

取消WaylandEnable=false的注释,然后重启。这个步骤很关键,否则远程桌面可能无法正常使用。

系统优化的几个实用技巧:

  • 扩展文件系统:sudo raspi-config → Advanced Options → Expand Filesystem
  • 禁用不必要的服务:sudo systemctl disable bluetooth.service
  • 设置交换分区:建议设置2GB的交换分区,避免内存不足
sudo dphys-swapfile setup
sudo dphys-swapfile swapon

3. ROS Noetic安装的坑与解决方案

树莓派5上安装ROS Noetic确实比前代麻烦很多,主要是编译工具链和依赖库的兼容性问题。我最开始直接按照官方教程安装,结果编译到一半就报错。

关键安装步骤:

先解决GitHub访问问题,否则下载依赖包会非常慢:

nslookup github.com
nslookup github.global.ssl.fastly.net

将获取的IP地址添加到/etc/hosts文件中,能显著提升下载速度。

编译环境配置:

sudo apt-get install python3-rosdep python3-rosinstall-generator \
python3-vcstools python3-vcstool build-essential

最重要的一个坑: ROS Noetic的很多包默认使用C++11标准,但树莓派5的编译器需要升级到C++17。需要手动修改所有CMakeLists.txt文件:

import os

def fix_cmakelist(cmakelist_path):
    with open(cmakelist_path, 'r') as f:
        content = f.read()
    
    content = content.replace('-std=c++11', '-std=c++17')
    content = content.replace('CMAKE_CXX_STANDARD 11', 'CMAKE_CXX_STANDARD 17')
    
    with open(cmakelist_path, 'w') as f:
        f.write(content)

# 遍历所有CMakeLists.txt并修改
for root, dirs, files in os.walk('./src'):
    for file in files:
        if file == 'CMakeLists.txt':
            fix_cmakelist(os.path.join(root, file))

编译过程中遇到rosconsole包报错是最常见的,需要手动修改源码中的几个智能指针相关的问题。我在GitHub上找到了修复后的包,直接替换即可。

4. 硬件驱动与传感器配置

激光雷达驱动配置:

RPLIDAR C1的驱动需要重新编译,因为树莓派5的内核版本更新了USB驱动栈:

cd ~/catkin_ws/src
git clone https://github.com/slamtec/rplidar_ros.git
cd rplidar_ros
sudo chmod 777 /dev/ttyUSB0  # 给雷达赋权

IMU传感器配置:

MPU6050通过I2C接口连接,需要先启用树莓派的I2C功能:

sudo raspi-config
# 选择 Interfacing Options → I2C → Yes
sudo apt-get install i2c-tools libi2c-dev python3-smbus

电机驱动配置:

TB6612FNG的接线需要特别注意树莓派5的GPIO引脚变化:

TB6612引脚树莓派5 GPIO功能
PWMAGPIO5左电机PWM
PWMBGPIO10右电机PWM
AIN1GPIO14左电机方向
AIN2GPIO15左电机方向
BIN1GPIO22右电机方向
BIN2GPIO27右电机方向
STBYGPIO17使能引脚

5. SLAM建图实战与多传感器融合

URDF模型配置:

创建正确的小车URDF模型是SLAM的基础。需要定义好各个传感器之间的坐标变换关系:

<robot name="smartcar">
    <link name="base_footprint"/>
    
    <link name="base_link">
        <visual>
            <geometry>
                <box size="0.25 0.25 0.1"/>
            </geometry>
        </visual>
    </link>
    
    <link name="laser">
        <visual>
            <geometry>
                <cylinder length="0.05" radius="0.03"/>
            </geometry>
        </visual>
    </link>
    
    <joint name="base_footprint_to_base_link" type="fixed">
        <parent link="base_footprint"/>
        <child link="base_link"/>
        <origin xyz="0 0 0.01" rpy="1.571 0 0"/>
    </joint>
    
    <joint name="base_link_to_laser" type="fixed">
        <parent link="base_link"/>
        <child link="laser"/>
        <origin xyz="0 0 0.15" rpy="0 0 0"/>
    </joint>
</robot>

多传感器数据融合:

使用robot_pose_ekf包融合里程计和IMU数据:

sudo apt-get install ros-noetic-robot-pose-ekf

修改robot_pose_ekf.launch文件,启用IMU数据融合:

<param name="imu_used" value="true"/>
<param name="output_frame" value="odom"/>

GMAPPING建图配置:

编译安装gmapping包:

cd ~/catkin_ws/src
git clone https://github.com/ros-perception/slam_gmapping.git
cd ~/catkin_ws
catkin_make

6. 实战中的常见问题与解决方案

问题1:TF树异常

经常遇到TF树不完整的问题,可以通过以下命令诊断:

rosrun tf view_frames
evince frames.pdf  # 查看TF树结构

问题2:里程计数据不准

如果没有编码器,可以模拟里程计数据,但精度会受影响。建议还是使用带编码器的电机:

#!/usr/bin/env python3
import rospy
from nav_msgs.msg import Odometry

def simulated_odom():
    pub = rospy.Publisher('/odom', Odometry, queue_size=10)
    rospy.init_node('simulated_odometry')
    rate = rospy.Rate(10)  # 10Hz
    
    while not rospy.is_shutdown():
        odom_msg = Odometry()
        odom_msg.header.stamp = rospy.Time.now()
        odom_msg.header.frame_id = "odom"
        odom_msg.child_frame_id = "base_footprint"
        
        # 这里填充模拟的里程计数据
        # ...
        
        pub.publish(odom_msg)
        rate.sleep()

问题3:内存不足

树莓派5虽然性能提升,但运行ROS+SLAM还是可能内存不足:

  • 增加交换分区大小
  • 关闭不必要的节点和服务
  • 使用zram压缩内存
sudo apt-get install zram-config

7. 完整启动文件与系统集成

创建一个完整的launch文件,一次性启动所有需要的节点:

<launch>
    <!-- 底盘控制节点 -->
    <node pkg="car_pkg" type="wheel_base_node.py" name="wheel_base" output="screen"/>
    
    <!-- 激光雷达 -->
    <include file="$(find rplidar_ros)/launch/rplidar_c1.launch"/>
    
    <!-- IMU节点 -->
    <node pkg="mpu6050_driver" type="imu_node.py" name="imu_driver" output="screen"/>
    
    <!-- 里程计模拟 -->
    <node pkg="simulator_pkg" type="odom_simulator.py" name="odom_simulator" output="screen"/>
    
    <!-- 多传感器融合 -->
    <include file="$(find robot_pose_ekf)/robot_pose_ekf.launch"/>
    
    <!-- GMAPPING建图 -->
    <node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen">
        <param name="base_frame" value="base_footprint"/>
        <param name="odom_frame" value="odom"/>
        <param name="map_frame" value="map"/>
    </node>
    
    <!-- 静态坐标变换 -->
    <node pkg="tf2_ros" type="static_transform_publisher" 
          name="base_to_laser" args="0 0 0.15 0 0 0 base_link laser"/>
</launch>

8. 性能优化与调试技巧

系统监控:

使用htop和rosrun rqt_graph rqt_graph实时监控系统状态和节点关系。

网络优化:

如果使用多机通信,建议使用千兆以太网而不是WiFi,因为SLAM数据量很大。

存储优化:

使用高速TF卡,建议A2级别的卡,读写速度更快:

# 监控磁盘IO
iostat -x 1

调试工具:

  • rviz:可视化传感器数据和地图
  • rqt:各种调试工具集合
  • rosbag:录制和回放数据包
# 录制数据包
rosbag record -a -O slam_data.bag

# 回放数据包
rosbag play slam_data.bag

在实际项目中,我发现最重要的不是一次成功,而是学会如何调试和解决问题。每个硬件环境都有所不同,需要根据实际情况调整参数。树莓派5的性能虽然强大,但想要稳定运行ROS Noetic和SLAM,还是需要不少调优工作。

建议先从简单的功能开始测试,逐步增加复杂度。先确保电机控制正常,再测试传感器数据,最后才进行SLAM建图。这样分层调试可以快速定位问题所在。

更多推荐