树莓派5上跑ROS2?别再被依赖和架构坑了!一文搞定从系统刷机到节点运行的全流程
你是不是也曾在树莓派5上尝试安装ROS2时,卡在“Unable to locate package ros-humble-desktop”这行错误前束手无策?又或者好不容易装上了,编译工作空间直接内存爆掉、系统冻结重启?
别急——这不是你的问题,而是树莓派5 + ROS2 这个组合本身就藏着不少“暗坑”:操作系统选错版本、架构不匹配、swap太小、散热跟不上……每一个都可能让你白忙半天。
本文将带你一步步穿越这些陷阱,从最基础的系统选择开始,到最终在树莓派5上成功运行一个自定义的ROS2发布者节点。全程基于实测环境(Ubuntu Server 22.04 LTS + ROS2 Humble),拒绝“理论上可行”,只讲你能复现的操作。
为什么非得用 Ubuntu 而不是 Raspberry Pi OS?
很多人第一反应是:“我用惯了Raspberry Pi OS,图形界面友好,驱动齐全。”
但如果你要在上面跑ROS2,那这条路几乎走不通。
关键原因只有一个:ROS2官方根本不支持Debian系的Raspberry Pi OS
- ROS2 Humble Hawksbill 明确要求Ubuntu 22.04 Jammy Jellyfish
- Raspberry Pi OS 基于 Debian Bookworm/Bullseye,软件源完全不同
- 即使你强行添加ROS2的APT源,也会因为架构(armhf vs aarch64)或依赖库版本冲突而失败
📌 简单说:你想在树莓派5上跑ROS2,就得接受它是一台“小型服务器”——放弃桌面GUI,拥抱Ubuntu Server ARM64。
第一步:准备系统镜像——刷入 Ubuntu Server 22.04 LTS(ARM64)
推荐系统版本
Ubuntu Server 22.04.3 LTS (Preinstalled Server image for Raspberry Pi)✅ 官方支持 | ✅ 内核优化 | ✅ APT完整 | ✅ 支持aarch64
⚠️ 不推荐使用 Ubuntu Desktop 版本:图形占用资源多,且对树莓派5显卡支持尚不稳定。
刷机工具推荐: Raspberry Pi Imager
- 打开Imager →
Choose OS→Other general-purpose OS - 展开 →
Ubuntu→Ubuntu Server 22.04 LTS (64-bit) Choose Storage→ 选择你的SD卡(建议≥32GB Class 10)- 点击右上角齿轮图标,启用高级选项:
- 设置主机名(如ros-pi5)
- 启用SSH(推荐使用密码登录+公钥认证)
- 配置Wi-Fi(可选,有线更稳定)
- 设置用户名和密码(别用默认pi/ubuntu) - 写入镜像
📌 提示:写完后不要急着拔卡!确保boot分区可见后再安全弹出。
上电启动后必做的五件事
插入SD卡,连接电源(务必使用5V/5A Type-C官方电源),等待约30秒后通过路由器查看设备IP,然后SSH登录:
ssh your_user@<raspberry_pi_ip>1. 更新系统并安装基础工具
sudo apt update && sudo apt full-upgrade -y sudo apt install curl gnupg2 lsb-release neofetch htop -y👉 推荐运行neofetch看一眼当前系统信息,确认架构为aarch64,代号为jammy。
2. 检查系统架构与版本(关键!)
echo "Arch: $(dpkg --print-architecture)" echo "Codename: $(lsb_release -cs)"✅ 正确输出应为:
Arch: aarch64 Codename: jammy❌ 如果显示armhf或bullseye,说明你刷错了系统!
添加ROS2官方源——别跳过GPG密钥验证!
很多教程直接让你add-apt-repository,但在ARM64环境下必须手动处理GPG密钥,否则会报签名错误。
添加密钥和软件源
# 安装必要工具 sudo apt install curl gnupg2 lsb-release -y # 下载并信任ROS2 GPG密钥 curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key | \ sudo gpg --dearmor -o /usr/share/keyrings/ros-archive-keyring.gpg # 添加ROS2 Humble源 echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] \ http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" | \ sudo tee /etc/apt/sources.list.d/ros-latest.list > /dev/null📌 注意事项:
-signed-by=必须指定路径,否则APT不会信任该源
- URL不能加s(即用http://而非https://),某些旧版curl不支持HTTPS代理
更新包索引
sudo apt update如果出现类似“无法获取 http://packages.ros.org/…”的错误,请检查网络是否能访问国外站点,或尝试更换DNS(如Google DNS8.8.8.8)。
安装ROS2:根据用途选择合适版本
方案一:完整桌面版(适合调试开发)
sudo apt install ros-humble-desktop -y包含:
- rclpy / rclcpp
- RViz2 可视化工具
- Gazebo仿真
- ros2cli 工具集(topic,node,param等)
方案二:最小运行环境(适合部署上线)
sudo apt install ros-humble-ros-base -y仅包含核心通信库和CLI工具,体积小、启动快,适合嵌入式场景。
💡 小贴士:如果你打算后续自己编译包,建议额外安装构建工具:
sudo apt install python3-colcon-common-extensions -y初始化ROS2环境变量——让命令随时可用
每次打开终端都要手动source太麻烦?我们把它写进.bashrc。
自动配置脚本(可直接复制执行)
cat << 'EOF' >> ~/.bashrc # Source ROS2 Humble if [ -f /opt/ros/humble/setup.bash ]; then source /opt/ros/humble/setup.bash fi # Enable colcon autocomplete if [ -f /usr/share/colcon_argcomplete/hook/colcon-argcomplete.bash ]; then source /usr/share/colcon_argcomplete/hook/colcon-argcomplete.bash fi EOF # 立即生效 source ~/.bashrc现在你可以直接使用ros2 --version查看是否安装成功:
$ ros2 --version ros2 command version 0.14.0创建第一个ROS2工作空间
mkdir -p ~/ros2_ws/src cd ~/ros2_ws colcon build --symlink-install首次构建时间较长(约2~5分钟),完成后你会看到:
Summary: 0 packages finished这是正常的,因为我们还没放任何包进去。
🔍
--symlink-install的作用是创建符号链接,修改Python脚本后无需重新编译即可生效,极大提升开发效率。
激活环境:
source install/setup.bash建议也将这句加入.bashrc,避免每次都要手动输入。
写一个简单的发布者节点(Python版)
让我们动手写一个能持续发送消息的节点,验证整个链路是否通畅。
1. 创建包目录结构
cd ~/ros2_ws/src ros2 pkg create my_publisher --build-type ament_python --dependencies rclpy std_msgs生成的结构如下:
my_publisher/ ├── my_publisher/ │ └── publisher_node.py ├── package.xml ├── setup.py └── resource/my_publisher2. 编辑主节点代码
# my_publisher/my_publisher/publisher_node.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 # 每0.5秒发一次 self.timer = self.create_timer(timer_period, self.timer_callback) self.i = 0 def timer_callback(self): msg = String() msg.data = f'Hello ROS2 World: {self.i}' self.publisher_.publish(msg) self.get_logger().info(f'Published: "{msg.data}"') self.i += 1 def main(args=None): rclpy.init(args=args) node = MinimalPublisher() rclpy.spin(node) rclpy.shutdown() if __name__ == '__main__': main()3. 修改 entry_points(让命令行可调用)
编辑setup.py,找到entry_points字段:
entry_points={ 'console_scripts': [ 'talker = my_publisher.publisher_node:main', ], },这样就可以用ros2 run my_publisher talker启动节点。
构建并运行你的第一个ROS2节点!
cd ~/ros2_ws colcon build --packages-select my_publisher source install/setup.bash ros2 run my_publisher talker你应该会看到不断输出:
[INFO] [1712345678.123] [minimal_publisher]: Published: "Hello ROS2 World: 0" [INFO] [1712345678.623] [minimal_publisher]: Published: "Hello ROS2 World: 1" ...🎉 成功了!你已经在树莓派5上运行起了自己的ROS2节点。
常见问题与实战避坑指南
❌ 问题1:E: Unable to locate package ros-humble-*
排查步骤:
1. 检查lsb_release -cs是否返回jammy
2. 检查dpkg --print-architecture是否为aarch64
3. 检查/etc/apt/sources.list.d/ros-latest.list内容是否正确
4. 执行sudo apt update时是否有来自ROS源的索引下载记录
⚠️ 最常见原因是用了Raspberry Pi OS 或 32位系统。
❌ 问题2:编译时报错 “Killed” 或 “Out of memory”
树莓派5虽然有4GB/8GB内存,但默认swap只有100MB,colcon build很容易撑爆。
解决方案:扩大swap文件
# 关闭当前swap sudo dphys-swapfile swapoff # 修改配置 sudo sed -i 's/CONF_SWAPSIZE=100/CONF_SWAPSIZE=2048/g' /etc/dphys-swapfile # 重建并启用 sudo dphys-swapfile setup sudo dphys-swapfile swapon📌 建议设置为2048MB(2GB),尤其是你要编译OpenCV、PCL这类大包时。
❌ 问题3:节点通信延迟高、丢包严重
尤其是在WiFi环境下,tf变换抖动大,RViz显示异常。
优化建议:
- 使用有线以太网替代WiFi
- 在PC端和Pi端关闭防火墙:
bash sudo ufw disable - 对非关键话题使用
best_effortQoS策略:python from rclpy.qos import QoSProfile qos = QoSProfile(depth=10) qos.reliability = ReliabilityPolicy.BEST_EFFORT self.create_subscription(String, 'sensor_data', callback, qos)
❌ 问题4:开机过热降频,性能下降
树莓派5满载功耗可达8W以上,被动散热不够看。
应对措施:
- 安装金属散热外壳(推荐官方款)
- 在
/boot/firmware/config.txt中添加温控策略:
# 温度控制:60°C开始降温,70°C强制限频 temp_soft_limit=60 temp_hard_limit=70- 监控温度:
watch -n 1 vcgencmd measure_temp理想运行温度应在60°C以下。
实战场景:把树莓派5变成移动机器人主控大脑
想象一下这个典型架构:
[树莓派5] ├── USB摄像头 → 图像采集 → image_transport ├── RPLIDAR A1 → 激光扫描 → SLAM Toolbox ├── TB6612电机驱动(GPIO PWM)→ 控制底盘运动 ├── MPU6050(I²C)→ IMU数据融合 → robot_localization └── Nav2导航栈 → 接收目标点 → 自主导航避障所有模块通过ROS2话题互联,状态统一监控,真正实现“轻量级全栈机器人”。
你可以进一步接入:
- TensorFlow Lite模型做物体识别
- Micro-ROS连接STM32下位机
- MQTT桥接云端指令
这一切的基础,就是你现在完成的这套树莓派5 + ROS2环境。
结语:你已经迈出了机器人工程师的第一步
当你在树莓派5上成功运行第一个ros2 run命令时,你就不再是“爱好者”了——你是能落地系统的开发者。
本文没有堆砌术语,也没有跳过任何一个看似微不足道的细节。因为我们知道,正是那些“明明照着做却不行”的瞬间,最让人沮丧。
而现在,你有了完整的知识链:
- 知道该用什么系统
- 知道怎么配源
- 知道如何避免内存爆炸
- 知道怎么写出可运行的节点
- 更重要的是,你知道出了问题该怎么查
下一步,不妨试试把摄像头接上,跑通usb_cam驱动,再用cv_bridge把图像转成OpenCV格式处理。你会发现,整个机器人世界的大门,正在缓缓打开。
如果你在实践中遇到新问题,欢迎留言讨论。毕竟,真正的技术,永远生长在真实的问题土壤里。