树莓派5装ROS2,避坑指南:从零开始打造机器人开发平台
你是不是也正打算在树莓派5上跑ROS2?想做个小车导航、视觉识别或者多机通信项目,却发现环境配到一半卡住了?
别急。我最近刚把一台全新的树莓派5从“裸板”折腾成能跑rviz2和Nav2的完整ROS2开发机,中间踩了无数坑——GPG密钥导入失败、包找不到、节点发现不了、编译爆内存……但最终搞定了。
今天这篇文,不讲虚的,只说最关键、最实用、最容易出错的几个环节,帮你绕开那些官方文档里没写清楚的“暗礁”,一口气把ROS2稳稳当当装上去。
为什么是树莓派5 + ROS2 Humble?
先回答一个问题:为啥非得用树莓派5装ROS2?不能用4代吗?
当然可以,但体验差很多。
树莓派5不只是频率从1.8GHz提到了2.4GHz那么简单。它有几个关键升级,直接决定了你能不能流畅运行现代ROS2系统:
- AArch64(64位)原生支持更强:ROS2从Foxy开始就推荐64位系统,而Pi5出厂即默认支持64位Raspberry Pi OS,避免32位系统的内存寻址瓶颈。
- PCIe接口+NVMe启动:你可以接个M.2 SSD当系统盘,读写速度提升10倍以上,再也不怕ROS2日志疯狂刷写把SD卡干报废。
- 双HDMI输出+GPU性能翻倍:VideoCore VII支持OpenGL ES 3.1,意味着你能直接在Pi上跑
rviz2看点云、轨迹,不用每次都连远程电脑。 - 实时时钟RTC支持:对
tf2时间同步、消息时间戳一致性至关重要,尤其适合多传感器融合场景。
所以如果你真打算拿树莓派做点正经事——比如SLAM建图、路径规划、机械臂控制——那树莓派5是目前性价比最高的入门级ROS2硬件平台之一。
而软件端我们选ROS2 Humble Hawksbill,它是LTS版本(长期支持),维护到2027年,社区资源丰富,工具链成熟,最重要的是——官方提供arm64预编译包。
一句话总结:
硬件选Pi5,系统用64位Raspberry Pi OS,ROS2装Humble Desktop,这条路最稳。
第一步:系统准备,别省这三件事
很多人一上来就冲去下镜像烧卡,结果后面各种依赖报错。其实前期准备比安装本身更重要。
✅ 必做清单:
使用 Raspberry Pi Imager 刷写 “Raspberry Pi OS (64-bit) with desktop”
- 不要选Lite版!虽然轻量,但缺Python组件、GUI库、X11服务,后续装rviz2会哭着回来重装。
- 推荐勾选“Advanced options”里的“Set hostname / Enable SSH”,提前配置好网络和远程登录。启用USB启动,把系统迁移到SSD(强烈建议)
- SD卡寿命短、速度慢,ROS2一写日志就卡顿。
- 在Pi5上开启“Boot from USB”非常简单:进一次系统,终端执行:bash sudo rpi-eeprom-config --edit
把BOOT_ORDER=0xf41改成BOOT_ORDER=0xf21(优先尝试USB启动),保存后刷入:bash sudo rpi-eeprom-update -d -f ./pieeprom.bin
- 然后用USB转NVMe线把系统克隆过去,重启就能从SSD跑了。加散热片或主动风扇
- ROS2多节点并发时CPU负载高,A76核心很容易过热降频。
- 我测过:无风扇下连续运行ros2 run demo_nodes_cpp talker+listener,几分钟内温度飙到75°C以上,性能下降明显。
- 花十几块钱买个带风扇的金属外壳,稳如老狗。
第二步:换源 + 导密钥,解决90%的安装失败问题
绝大多数“无法找到ros-humble-*”错误,都出在这一步。
📌 正确操作流程(含国内镜像加速)
# 1. 更新系统 sudo apt update && sudo apt full-upgrade -y # 2. 安装基础工具 sudo apt install wget gnupg lsb-release ubuntu-keyring -y接下来是重点:添加ROS2软件源并导入GPG密钥
# 下载并安装ROS2官方GPG公钥 wget -qO - https://raw.githubusercontent.com/ros/rosdistro/master/ros.key | sudo gpg --dearmor -o /usr/share/keyrings/ros-archive-keyring.gpg# 添加软件源(注意这里是 jammy,对应Ubuntu 22.04) echo "deb [signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu jammy main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null⚠️ 注意:尽管你的系统叫“Raspberry Pi OS”,但它底层基于Debian,ABI兼容Ubuntu 22.04,因此可以用jammy仓库。这是能成功安装的关键前提!
不过国外源太慢怎么办?换成中科大镜像:
# 替换为国内镜像(推荐) sudo sed -i 's|http://packages.ros.org|https://mirrors.ustc.edu.cn/ros2|g' /etc/apt/sources.list.d/ros2.list然后更新索引:
sudo apt update🔍 如果这时还报错NO_PUBKEY,说明密钥没导入成功,检查/usr/share/keyrings/目录下是否有ros-archive-keyring.gpg文件,并确认权限正确:
ls -l /usr/share/keyrings/ros-archive-keyring.gpg # 应该看到类似:-rw-r--r-- 1 root root ...如果文件不存在,重新执行上面的wget | gpg --dearmor命令。
第三步:安装ROS2,选对包很关键
现在可以正式安装了。
有两个方案,看你用途:
方案一:初学者 → 装完整桌面版(省心)
sudo apt install ros-humble-desktop -y这个包包含了:
- 所有核心运行时库
-rclpy/rclcpp
-rviz2可视化工具
-ros2cli命令行工具(如topic,node,param)
- 示例节点和教程包
优点:一键到位,适合学习调试。
缺点:体积大,约2.5GB,对存储小的设备不太友好。
方案二:进阶用户 → 最小安装 + 按需扩展
sudo apt install ros-humble-ros-base ros-humble-rviz2 ros-humble-navigation2 python3-colcon-common-extensions -y拆开来看:
-ros-humble-ros-base:最小运行环境(不含GUI)
-rviz2:可视化必备
-navigation2:如果你想跑自主导航
-colcon:构建工具,后面自己写包要用
这种方式更灵活,节省空间,推荐用于产品原型或部署阶段。
第四步:初始化环境与依赖管理
安装完别急着跑程序,还得走两步“仪式感”操作。
1. 初始化 rosdep(重要!)
rosdep是用来自动解析ROS包第三方依赖的工具,很多新手跳过这步,导致后面编译自定义包时报错。
sudo rosdep init rosdep update首次运行可能提示“cannot download default sources list”,多半是网络问题。可以临时走代理,或者换源:
# 修改 rosdep 源地址为国内镜像(可选) cd /etc/ros/rosdep/ sudo wget https://raw.githubusercontent.com/flynneva/rosdistro/master/rosdep/sources.list.d/20-default.list -O 20-default.list rosdep update2. 配置环境变量
让终端每次启动都能识别ROS2命令:
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc source ~/.bashrc验证是否生效:
env | grep ROS你应该能看到一堆以ROS_开头的环境变量,比如ROS_DISTRO=humble,ROS_VERSION=2。
第五步:跑第一个节点,验证通信正常
来吧,激动人心的时刻到了。
创建工作空间
mkdir -p ~/ros2_ws/src cd ~/ros2_ws colcon build --symlink-install第一次构建会生成build/、install/、log/目录,--symlink-install表示软链接安装,改代码不用反复拷贝。
写一个简单的发布者节点(talker)
在~/ros2_ws/src/my_talker/新建目录,放入以下三个文件:
talker.py
import rclpy from rclpy.node import Node from std_msgs.msg import String class MinimalPublisher(Node): def __init__(self): super().__init__('minimal_publisher') self.publisher_ = self.create_publisher(String, 'chatter', 10) timer_period = 0.5 self.timer = self.create_timer(timer_period, self.timer_callback) def timer_callback(self): msg = String() msg.data = 'Hello from Raspberry Pi 5! %d' % self.get_clock().now().nanoseconds self.publisher_.publish(msg) self.get_logger().info(f'Publishing: "{msg.data}"') def main(args=None): rclpy.init(args=args) node = MinimalPublisher() rclpy.spin(node) rclpy.shutdown() if __name__ == '__main__': main()package.xml
<?xml version="1.0"?> <package format="3"> <name>my_talker</name> <version>0.0.1</version> <description>A simple talker node for learning ROS2 on Pi5</description> <maintainer email="pi@raspberrypi.local">Pi User</maintainer> <license>MIT</license> <exec_depend>rclpy</exec_depend> <exec_depend>std_msgs</exec_depend> <export> <build_type>ament_python</build_type> </export> </package>setup.py
from setuptools import setup setup( name='my_talker', version='0.0.1', packages=[], py_modules=['talker'], data_files=[ ('share/ament_index/resource_index/packages', ['resource/my_talker']), ('share/my_talker', ['package.xml']) ], install_requires=['setuptools'], zip_safe=True, author='Pi User', maintainer='Pi User', description='A minimal talker for ROS2 on Pi5', license='MIT', entry_points={ 'console_scripts': [ 'talker = talker:main' ] } )构建并运行
cd ~/ros2_ws colcon build --packages-select my_talker source install/setup.bash ros2 run my_talker talker另开一个终端,监听话题:
source /opt/ros/humble/setup.bash ros2 topic echo /chatter std_msgs/msg/String如果看到输出:
data: "Hello from Raspberry Pi 5! 123456789" ---恭喜!你已经完成了树莓派5上的第一个ROS2通信测试。
常见问题与“坑点”秘籍
❌ 问题1:ModuleNotFoundError: No module named 'rclpy'
原因:没有正确source环境。
✅ 解决方法:
- 每次新开终端都要执行:bash source /opt/ros/humble/setup.bash
- 或者确保.bashrc中已写入该行。
建议写个别名加快速切换:
alias ros2env='source /opt/ros/humble/setup.bash'❌ 问题2:两个节点互相发现不了(Node not found)
尤其是跨设备通信时常见。
可能原因:
- 多播被禁用
- 防火墙阻挡
- DDS配置冲突
✅ 解决方案:
临时打开ICMP广播(允许发现):
sudo sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=0设置DDS为UDP模式(推荐Cyclone DDS):
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp你可以在.bashrc中永久加上这一句,因为Cyclone DDS更适合嵌入式设备,延迟低、资源占用少。
❌ 问题3:colcon build编译失败,提示内存不足
树莓派5只有4GB或8GB RAM,而C++包编译时瞬时内存需求可能超过2GB。
✅ 解决办法:
限制并行编译数量:
colcon build --packages-select my_talker --cmake-args -DCMAKE_BUILD_TYPE=Release --parallel-workers 1或者使用交换分区(swap):
# 创建2GB swap文件 sudo fallocate -l 2G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile⚠️ 注意:频繁读写swap会影响SD卡寿命,建议在SSD上操作。
后续怎么玩?这些方向值得尝试
你现在有了一个能跑ROS2的树莓派5,下一步可以做什么?
🔧 接入真实传感器
- USB摄像头 +
usb_cam驱动 +image_view显示图像 - IMU模块(如MPU6050)+
imu_compass_node获取姿态角 - Lidar雷达(如RPLIDAR A1)+
slam_toolbox实现建图
🤖 跑自主导航
- 安装
navigation2和nav2_bringup - 搭配差速小车底盘,实现AMCL定位 + DWA Planner路径规划
- 用
rviz2远程可视化地图与轨迹
📡 多机协作
- 树莓派5作为边缘计算节点,负责感知处理
- 主控PC运行决策逻辑
- 通过Wi-Fi局域网实现ROS2多机通信(记得统一
ROS_DOMAIN_ID)
结语:别怕复杂,动手才是捷径
说实话,树莓派5安装ROS2这件事,听起来挺唬人,什么架构适配、源码编译、DDS通信……但只要你按步骤一步步来,其实两三个小时就能搞定。
关键在于:
- 用对系统(64位带桌面)
- 换对源(国内镜像)
- 装对包(desktop or base)
- 记得source和rosdep
剩下的就是不断试错、调试、优化的过程。
别等“完全准备好”再开始,最好的学习方式就是边做边学。
你现在就可以拿起手边的树莓派5,照着这篇文章,把它变成一台真正的机器人“大脑”。
如果你在过程中遇到其他坑,欢迎留言交流,我们一起填平它。